2009-11-18 6 views
3

Quelles interfaces XPCOM dois-je utiliser pour détecter l'ouverture, la fermeture et la commutation des onglets et obtenir leur URL associée à partir d'une extension firefox? J'ai vu des exemples de code qui gèrent des onglets dans JS, mais qu'en est-il de C++?Accès aux onglets sur Firefox avec une extension XPCOM C++

+0

Pourquoi? Vous devriez certainement le faire à partir de JS. – Nickolay

Répondre

5

Vous pouvez écrire un petit composant JS qui redirigera les événements de tabulation vers votre composant C++ à l'aide de nsIObserverService.

Dans le code C++, vous pouvez utiliser cet extrait pour enregistrer votre composant en tant qu'observateur pour les événements définis par l'utilisateur qui sont utilisés pour le réacheminement des événements de tabulation.

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

    /* . . . */ 
} 

Et dans le composant d'aide JS vous devez souscrire à des événements de l'onglet et gestionnaires d'événements, vous pouvez extraire les données souhaitées et déclencher des événements définis par l'utilisateur pour exécuter du code 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; 
     } 
    } 

    /* . . . */ 
} 

De plus, vous devez ajouter du code pour gérer des cas spécifiques. Par exemple, lorsque l'utilisateur ferme la fenêtre du navigateur, vous ne recevrez pas d'événements TabClose pour les onglets ouverts dans cette fenêtre ... Et n'oubliez pas de désinscrire vos observateurs lorsque vous en avez besoin.

+0

Super, c'était exactement ce dont j'avais besoin, l'exemple de code me fera gagner beaucoup de temps !!! Merci un million !!! –

Questions connexes