Страницы: 1
Всем привет. Пришел в разработку тулбара для Лиса после IE. Разрабатываю XPCOM компонент. Мне нужно отслеживать загрузку каждой вкладки. Возникли следующие проблемы:
В IE на каждую вкладку создается поток (т.е. каждая вкладка - это отдельный браузер со своим НЕЗАВИСИМЫМ тулбаром). Соответствующим образом построена и работа - подписка на сообщения о загрузке, обработка функций окон тулбаров.
Кроме того, в DLL (BHO) существуют глобальные объекты, которые могут разделяться этими экземплярами тулбаров.
Но я не понимаю, как такое сделать для Лиса. Не ясно, как и где создать XPCOM объекты, подписаться на события ТОЛЬКО одной вкладки (динамически). Т.е. речь идет о nsIWebProgressListener. Т.е. мне нужен handler для событий в контексте и потоке окна закладки (НЕ браузера).
Если объект создавать в JS из XUL, то он создается один на браузер.
Буду рад помощи.
СУВ, Kuvaldis
Отсутствует
Привет, Kuvaldis.
Можно при открытии вкладки создавать экземпляр объекта и сохранять его в прототипе текущего браузера.
У браузера можно подписаться и на события. При обработке событий нужно только получить ссылку на нужный браузер, а у него уже получить реализуемый нами объект.
Упрощенная иллюстрация:
function Proto(obj) { this.obj = obj; } function OnTabOpened(event) { var browser = event.target.linkedBrowser; var obj = Components.classes["my-xpcom-component"] .createInstance().QueryInterface(Components.interfaces.ImyInterface); browser.prototype = new Proto(obj); } const gMainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIWebNavigation) .QueryInterface(Components.interfaces.nsIDocShellTreeItem) .rootTreeItem .QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIDOMWindow); const TabContainer = gMainWindow.getBrowser().mTabContainer; TabContainer.addEventListener("TabOpen", OnTabOpened, false);
У browser есть webProgress, а у него можно подписаться на события посредством реализации nsIWebProgressListener.
Можно передать webProgress в компонент, а можно реализовать листенер на JavaScript, а из компонента вызывать методы уже как реакцию на события.
Отсутствует
Страницы: 1