Всем привет. Пришел в разработку тулбара для Лиса после 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, а из компонента вызывать методы уже как реакцию на события.

Elexander сиба, буду пробовать.
P.S. Сорри, что сразу не ответил