2009-11-18 3 views

답변

5

nsIObserverService를 사용하여 탭 이벤트를 C++ 구성 요소로 재 라우팅하는 작은 JS 구성 요소를 작성할 수 있습니다.

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")) 
    { 
     /* . . . */ 
    } 

    /* . . . */ 
} 

그리고 당신은 탭 이벤트에 당신이 원하는 데이터를 추출 및 C++ 코드를 실행하는 사용자 정의 이벤트를 발생시킬 수있는 이벤트 핸들러에 가입하려면해야 도우미 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; 
     } 
    } 

    /* . . . */ 
} 

또한 특정 사례를 처리하기 위해 추가해야하는 몇 가지 추가 코드가 있습니다. 예를 들어 사용자가 브라우저 창을 닫을 때 열린 창에 TabClose 이벤트가 나타나지 않을 때 ... 더 오래 필요로 할 때 옵저버 등록을 잊지 마세요.

+0

위대한, 정확히 내가 원하는, 예제 코드는 많은 시간을 절약 할 것입니다 !!! 감사합니다. –

관련 문제