rep*_*vsd 3 c++ xpcom firefox-addon tabbed-browsing
我应该使用哪些XPCOM接口来检测选项卡的打开,关闭和切换,还可以从firefox扩展中获取相关的URL?我已经看到了在JS中管理选项卡的代码实例,但是从C++开始呢?
您可以编写小型JS组件,使用nsIObserverService将选项卡事件重新路由到C++组件.
在C++代码中,您可以使用此代码段将组件注册为用户定义事件的观察者,该事件用于重新路由选项卡事件.
NS_IMETHODIMP MyCppComponent::Observe(nsISupports *aSubject,
const char *aTopic,
const PRUnichar *aData)
{
if( !strcmp( aTopic, "xpcom-startup" ) )
{
nsCOMPtr<nsIObserverService> observerService =
do_GetService( "@mozilla.org/observer-service;1" );
observerService->AddObserver( this, "my-tab-open", false );
observerService->AddObserver( this, "my-tab-close", false );
observerService->AddObserver( this, "my-tab-select", false );
}
else if( !strcmp( aTopic, "my-tab-open" ) )
{
/* . . . */
}
else if( !strcmp( aTopic, "my-tab-close" ) )
{
/* . . . */
}
else if( !strcmp( aTopic, "my-tab-select" ) )
{
/* . . . */
}
/* . . . */
}
Run Code Online (Sandbox Code Playgroud)
在helper JS组件中,您应该订阅tab事件,在事件处理程序中,您可以提取所需的数据并引发用户定义的事件来执行C++代码.
function tabOpened(event) {
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
obsSvc.notifyObservers(event.target.linkedBrowser.contentWindow,
"my-tab-open", "some data");
}
function tabClosed(event) {
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
obsSvc.notifyObservers(event.target.linkedBrowser.contentWindow,
"my-tab-close", "some data");
}
function tabSelected(event) {
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
obsSvc.notifyObservers(event.target.linkedBrowser.contentWindow,
"my-tab-select", "some data");
}
function contentWndLoad(event) {
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
var browser = getMostRecentBrowserWindow().getBrowser();
browser.tabContainer.addEventListener("TabOpen", tabOpened, false);
browser.tabContainer.addEventListener("TabClose", tabClosed, false);
browser.tabContainer.addEventListener("TabSelect", tabSelected, false);
}
MyJsComponent.prototype = {
/* . . . */
observe: function(aSubject, aTopic, aData) {
switch(aTopic) {
case "xpcom-startup":
var obsSvc = CC["@mozilla.org/observer-service;1"].
getService(CI.nsIObserverService);
obsSvc.addObserver(this, "toplevel-window-ready", false);
break;
case "toplevel-window-ready":
aSubject.addEventListener("load", contentWndLoad, false);
break;
}
}
/* . . . */
}
Run Code Online (Sandbox Code Playgroud)
此外,您还应添加一些其他代码来处理特定情况.例如,当用户关闭浏览器窗口时,您将不会在该窗口中收到已打开选项卡的TabClose事件...并且当您不再需要时,不要忘记取消注册您的观察者.
归档时间: |
|
查看次数: |
2406 次 |
最近记录: |