2009-11-18 67 views

回答

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; 
     } 
    } 

    /* . . . */ 
} 

還有一些額外的代碼,你應該添加來處理特定情況。例如,當用戶關閉瀏覽器窗口時,您將不會收到該窗口中打開的選項卡的TabClos​​e事件...並且當您不再需要時,請不要忘記註銷觀察者。

+0

好的,這正是我所需要的,示例代碼將爲我節省很多時間! 非常感謝! –

相關問題