2010-07-14 4 views
1

Je crée une extension qui, au chargement de chaque page, crée une instance de mon composant xpcom spécifiquement pour cette page.en utilisant eval.call() dans le composant XPCOM de firefox

Je le fais comme ceci:

var appcontent = document.getElementById("appcontent"); // browser 
if(appcontent) { 
    appcontent.addEventListener("load", onPageLoad, true); 
} 
var onPageLoad = function(aEvent) { 
    var doc = aEvent.originalTarget; //this is the reference to the opened page 
    pages.push(createInstanceOfMyXPCOM(doc)); 
} 

Ma question est, dans le composant XPCOM, comment puis-je utiliser eval() dans le contexte global de ce doc. Si vous voulez simplement faire un javascript régulier en html, vous pouvez faire:

window.eval.call(window, somecode); 

Le problème est que je n'ai pas variable fenêtre dans mon composant XPCOM (ou dois-je), je ne dispose que la référence à la document. Je pourrais passer la fenêtre à mon composant XPCOM lors de la création, mais si j'ai plusieurs pages ouvertes, je ne vois pas comment cela fonctionnerait.

+0

Je pensais que je pouvais localement avoir var window = doc.defaultView. Mais doc.defaultView.eval n'est pas défini pour une raison quelconque, même si je peux le faire par exemple: doc.defaultView.content.document.defaultView.content.document.location.href. Il me manque quelque chose =) – Karolis

Répondre

1

Depuis le XPCOM, vous devriez pouvoir obtenir une référence au fenêtre principale en utilisant:

var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
         .getInterface(Components.interfaces.nsIWebNavigation) 
         .QueryInterface(Components.interfaces.nsIDocShellTreeItem) 
         .rootTreeItem 
         .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
         .getInterface(Components.interfaces.nsIDOMWindow); 

Ensuite, vous pouvez obtenir le document, onglet sélectionné avec:

document = mainWindow.gBrowser.contentDocument; 

vous pouvez nageoire plus d'informations ici:

https://developer.mozilla.org/en/Code_snippets/Tabbed_browser

https://developer.mozilla.org/en/Working_with_windows_in_chrome_code

MISE À JOUR:

Essayez celui-ci, vous devriez être en mesure d'obtenir une référence à la fenêtre la plus récente:

var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] 
        .getService(Components.interfaces.nsIWindowMediator); 
var recentWindow = wm.getMostRecentWindow("navigator:browser"); 

Si vous avez plusieurs onglets, vous utilisez quelque chose comme ça (code de Mozilla Dev Site) pour parcourir tous les documents et accéder à chaque document:

var num = gBrowser.browsers.length; 
for (var i = 0; i < num; i++) { 
    var b = gBrowser.getBrowserAtIndex(i); 
    try { 
    dump(b.currentURI.spec); // dump URLs of all open tabs to console 
    } catch(e) { 
    Components.utils.reportError(e); 
    } 

}

+0

Je ne pense pas que je peux utiliser le premier extrait de code, parce que la variable de fenêtre n'est pas définie dans le monde XPCOM, bien que je puisse me tromper. De plus, la fonction mainWindow m'aidera à exécuter window.eval.call (window, somecode); parce que je pourrais avoir 3 onglets ouverts en même temps où dans chacun d'eux je veux exécuter smth comme window.eval.call (window, somecode) .. J'ai trouvé evalInSandbox (code, context) hier, mais je didn 'didn' t comprendre comment passer le contexte à cela .. – Karolis

+0

Je vois ... juste ajouté quelques idées, j'espère que ça aide. Je vais bientôt travailler avec XPCOM, donc c'est une question très intéressante ... assurez-vous d'écrire une mise à jour ici une fois que vous avez trouvé une solution! – flpmor

+0

désolé je n'ai jamais mis à jour cela avec une solution: - \ je n'ai pas fini d'utiliser eval, parce que c'est généralement évitable;) – Karolis

Questions connexes