Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C+访问Firefox上的选项卡+;XPCOM扩展_C++_Firefox Addon_Xpcom_Tabbed Browsing - Fatal编程技术网

C++ 使用C+访问Firefox上的选项卡+;XPCOM扩展

C++ 使用C+访问Firefox上的选项卡+;XPCOM扩展,c++,firefox-addon,xpcom,tabbed-browsing,C++,Firefox Addon,Xpcom,Tabbed Browsing,我应该使用什么XPCOM接口来检测选项卡的打开、关闭和切换,并从firefox扩展获取它们的关联URL? 我看到过一些代码,它管理JS中的标签,但是从C++ + 如何编写小JS组件,将使用NsiBoServService将tab事件重定向到C++组件。 在C++代码中,可以使用这个代码段将组件作为观察器登记到用于重新定义选项卡事件的用户定义事件。 NS_IMETHODIMP MyCppComponent::Observe(nsISupports *aSubject, const cha

我应该使用什么XPCOM接口来检测选项卡的打开、关闭和切换,并从firefox扩展获取它们的关联URL?
我看到过一些代码,它管理JS中的标签,但是从C++ +

如何编写小JS组件,将使用NsiBoServService将tab事件重定向到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" ) )
    {
        /* . . . */
    }

    /* . . . */
}

此外,还应该添加一些附加代码来处理特定情况。例如,当用户关闭浏览器窗口时,您将不会收到该窗口中已打开选项卡的TabClose事件。。。当您不再需要观察员时,不要忘记注销他们。

为什么?你绝对应该在JS上这样做。太好了,这正是我所需要的,示例代码将为我节省很多时间!!!万分感谢!!!
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;
        }
    }

    /* . . . */
}