使用C++ XPCOM扩展在Firefox中访问选项卡

3

我该使用哪些XPCOM接口在Firefox扩展中检测标签页的打开、关闭和切换,以及获取它们关联的URL?我看过一些用JS管理标签页的代码实例,但是在C++中怎么做呢?


为什么?你绝对应该从JS中做这个。 - Nickolay
1个回答

5
你可以编写一个小的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" ) )
    {
        /* . . . */
    }

    /* . . . */
}

在帮助 JS 组件中,您应该订阅选项卡事件,并在事件处理程序中提取所需数据并触发用户定义的事件以执行 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;
        }
    }

    /* . . . */
}

此外,还有一些额外的代码需要添加以处理特定情况。例如,当用户关闭浏览器窗口时,您将无法接收到该窗口中打开的选项卡的TabClose事件...而且不要忘记在不再需要观察者时注销它们。


太好了,这正是我所需要的,示例代码将为我节省大量时间!!! 非常感谢!!! - rep_movsd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接