Полезная информация

В мире Mozilla происходит много интересных событий. Но вам не нужно постоянно посещать новостные сайты, чтобы быть в курсе всех изменений. Зайдите на ленту новостей Mozilla Россия.

№102-02-2009 22:24:03

Kuvaldis
Участник
 
Группа: Members
Зарегистрирован: 19-01-2009
Сообщений: 19
UA: Firefox 3.0

Поток для XPCOM компонента на каждую вкладку

Всем привет. Пришел в разработку тулбара для Лиса после IE. Разрабатываю XPCOM компонент. Мне нужно отслеживать загрузку каждой вкладки. Возникли следующие проблемы:
В IE на каждую вкладку создается поток (т.е. каждая вкладка - это отдельный браузер со своим НЕЗАВИСИМЫМ тулбаром). Соответствующим образом построена и работа - подписка на сообщения о загрузке, обработка функций окон тулбаров.
Кроме того, в DLL (BHO) существуют глобальные объекты, которые могут разделяться этими экземплярами тулбаров.

Но я не понимаю, как такое сделать для Лиса. Не ясно, как  и где создать XPCOM объекты, подписаться на события ТОЛЬКО одной вкладки (динамически).  Т.е. речь идет о nsIWebProgressListener. Т.е. мне нужен handler для событий в контексте и потоке окна закладки (НЕ браузера).
Если объект создавать в JS из XUL, то он создается один на браузер. :(

Буду рад помощи.
СУВ, Kuvaldis

Отсутствует

 

№203-02-2009 12:24:02

Elexander
Участник
 
Группа: Members
Зарегистрирован: 06-10-2008
Сообщений: 54
UA: Opera 9.6

Re: Поток для XPCOM компонента на каждую вкладку

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

Отсутствует

 

№310-02-2009 21:36:54

Kuvaldis
Участник
 
Группа: Members
Зарегистрирован: 19-01-2009
Сообщений: 19
UA: Firefox 3.0

Re: Поток для XPCOM компонента на каждую вкладку

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

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]