Доброго времени суток.
Есть такая задача. Получить название всех вкладок мозиллы и соответственно сами ссылки этих вкладок.
Пытаюсь получить их с помощью EnumChildWindows. Ничего хорошего не выходит. при получении хендла возвращается пустое название окна.
Подскажите как можно разрешить эту проблему.
Заранее всем спасибо.

Люди добрые. Этот вопрос действительно очень важен для меня.
Жду от ветов и советов.

На http://developer.mozilla.org смотрели документацию?

spaider84
сомневаюсь, что с помощью EnumChildWindows удастся получить что-то.
лучше открыть файл закладок "напрямую" из профиля и разпарсить его стандартными методами DOM

shutnik. Совет хороший.
Ноя никогда не писал под mozilla. Может есть пример подобного действия?

spaider84
всё, что нужно с примерами можно найти в MDC
можно взять код прямо из кода браузера (вооружившитсь предварительно архиватором и хорошим редактором), это будет ещё проще ;)
если бы сказали что и на каком языке пытаетесь написать, то советов было бы больше :)

shutnik
Пишу на Delphi.

spaider84
парсим profiles.ini компонентом для работы с ini-файлами (названия не знаю, но в стандартном комплекте компонентов он имеется) и определяем количество и местоположения профилей.
открываем bookmarks.html из каждого профиля (ну или как вы захотите) и парсим их компонентом для работы с xml-файлами (опть же, есть в стандартном наборе компонентов), получаем нужные данные.
полезная информация о профилях есть тут.
дополнительные вопросы лучше задать на форумах, посвящённых делфи.

shutnik
Спасибо большое. Суть решения проблемы понятно. А остальное уже дело техническое

shutnik пишет

лучше открыть файл закладок "напрямую" из профиля и разпарсить его стандартными методами DOM

1. вкладки != закладки
2. даже если и нужны именно закладки (в чём я сомневаюсь), этот способ не подойдёт для fx3; там sqlite.

Mash пишет

1. вкладки != закладки

а ведь действительно, в заголовке темы вкладки :rolleyes:
никто даже не заметил :P

Mash

2. даже если и нужны именно закладки (в чём я сомневаюсь), этот способ не подойдёт для fx3; там sqlite.

Нужны именно вкладки. Во второй версии создается временный файл. который описывает все сессию полностью. Поэтому в данном моменте проблема решена. А что такого в fx3? Можно поподробнее?

spaider84 пишет

Во второй версии создается временный файл. который описывает все сессию полностью.

1. Но имя его далеко не bookmarks.html, так ведь? Я говорил именно про bookmarks.html и про то, что хранение закладок в Fx3 отлично от Fx2.

2. О каком временном файле идёт речь? О sessionstore.js? Если да, то это не универсальное решение; начиная с того, что есть browser.sessionstore.enabled. Или речь о другом?

Добавлено Втр 07 Авг 2007 10:34:54 :
accapi.png

На картинке - то, что показал AccExplorer

Я мало знаком с Cpp и прочими Дельфями. :) Видимо, как-то надо добраться до MozillaContentWindowClass и достать нужные свойства.

М.б. ещё эта ссылка поможет -- http://wiki.mozilla.org/Accessibility/AT-Windows-API
Ну и гуглmozilla.dev.accessibility

2. О каком временном файле идёт речь? О sessionstore.js? Если да, то это не универсальное решение; начиная с того, что есть browser.sessionstore.enabled. Или речь о другом?

Речь идет о sessionstore.js.
Можно поподробнее про "MozillaContentWindowClass и достать нужные свойства"

А если просто тупо сделать что-нибудь вроде

Выделить код

Код:

var tabs = document.getElementsByTagName('tab');
var tls = new Array;
for(var i = 0; i < tabs.length; i++) {
    var tab = tabs[i];
    if(tab.hasAttribute('class') && tab.getAttribute('class') == 'tabbrowser-tab') // или tab.getAttribute('class').match(/tabbrowser-tab/) – для верности
        tls.push(tab.getAtribute('label'));
}

?

А вот с получением ссылок потруднее будет...

Infocatcher
Спасибо большое. Но как для начала подключиться к mozilla?

Infocatcher
да получить лучше так

Выделить код

Код:

var tabs = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow("navigator:browser").getBrowser().browsers;

var arrUrls=new Array();
var arrTitles=new Array();

for(var index=0,length=tabs.length;index<length;index++){
  arrUrls[index]=tabs[index].currentURI.spec;
  arrTitles[index]=tabs[index].contentTitle;
}

alert(arrTitles);
alert(arrUrls);

только тут на делфи пишут :)

spaider84 пишет

Можно поподробнее про "MozillaContentWindowClass и достать нужные свойства"

Посмотрел бегло. У меня не получилось достать.
pAccessible->QueryInterface(IID_ISimpleDOMNode, (void**)&pSimpleDOMNode);
pSimpleDOMNode после этого пуст. Может и не так что делаю,.. не знаю, времени нет совершенно.

Попробуйте в сети поискать и на xpoint спросить, может там знающие люди найдутся и подскажут решение (и не обязательно связанное с MozillaContentWindowClass).

С другой стороны, если вас устраивает sessionstore.js, то почему бы и нет. Просто, afaik,
- хранение данных о сессии пользователь может отключить (browser.sessionstore.enabled);
- я не уверен в актуальности данных, получаемых таким способом (смущает browser.sessionstore.interval; надо код смотреть). Но могу и ошибаться.

spaider84 пишет

Можно поподробнее про "MozillaContentWindowClass и достать нужные свойства"

Суперклассинг стандартных GUI окон, оконная процедура каждого окна находится в экземпляре класса nsWinow.

при получении хендла возвращается пустое название окна.при получении хендла возвращается пустое название окна.

Что если попробовать отправить окнам, хендлы которых получает callback EnumChildWindows сообщение WM_GETTEXT ?