2010-01-20 7 views
9

est-il possible que l'extension Firefox (barre d'outils) accède aux variables du document? explication détaillée suit ..Accéder à la variable javascript du document depuis l'extension firefox

document chargé:

<script type="text/javascript"> 
var variableForExtension = 'something'; 
</script> 

extension:

var win = window.top.getBrowser().selectedBrowser.contentWindow; 
alert(win.variableForExtension); // undefined 

était première chose à faire, et il est inaccessible ainsi que des mécanismes de sécurité (XPCNativeWrapper). J'ai lu sur l'accès à travers wrappedJSObject et en utilisant événements (ajout de l'écouteur à l'événement de document et d'expédition de l'extension), mais pas de chance. n'a pas essayé trop dur, cependant. donc, avant de creuser plus profond («méthode des événements» sonne comme un moyen d'aller) je voudrais savoir est-ce possible?

grâce

Répondre

15

Oui, l'accès à une variable JS contenu est et a toujours été possible. Faire cela de manière naïve n'était pas sûr (dans le sens où une page web malveillante pourrait obtenir des privilèges de chrome) dans les versions plus anciennes de Firefox.

1) Si vous contrôlez la page Web et que vous souhaitez transmettre des informations à l'extension, vous devez utiliser le events technique. Cela a fonctionné et était/est sûr dans toutes les versions de Firefox.

2) Si vous voulez lire une valeur du document de contenu, vous pouvez simplement contourner le XPCNativeWrapper:

var win = window.top.getBrowser().selectedBrowser.contentWindow; 
// By the way, this could just be 
// var win = content; 
// or 
// var win = gBrowser.contentWindow; 
alert(win.variableForExtension); // undefined 
win.wrappedJSObject.variableForExtension // voila! 

C'était dangereux avant Firefox 3. Firefox 3 et plus tard, il est correct d'utiliser , vous obtenez un autre type de wrapper (XPCSafeJSObjectWrapper), qui ressemble à l'objet de la page de contenu à votre code, mais s'assure que la page de contenu ne sera pas en mesure de faire quelque chose de malveillant.

3) Si vous devez appeler une fonction dans une page Web de contenu ou exécuter votre propre code dans le contexte de la page, c'est plus compliqué. Il a été demandé et répondu ailleurs plusieurs fois, mais malheureusement jamais documenté complètement. Puisque ceci n'est pas lié à votre question, je n'entrerai pas dans les détails.

+0

merci de répondre, nickolay. :) J'ai fait le travail d'une manière un peu sale, mais je vais essayer (à nouveau) à la fois 1 et 2 (je n'ai pas besoin de 3, encore), maintenant que je sais que c'est possible. – parserr

+0

@Nickolay. Je dois faire face à # 3; Puis-je vous demander un pointeur (ce serait utile pour la communauté ici aussi). Je dois lire et exécuter des actions sur la page de contenu (toute page Web qu'un utilisateur peut visiter). Vous avez dit "pas complètement documenté mais a répondu tant de fois", pouvez-vous me diriger vers un bon pointeur? Creusé la documentation pendant quelques jours et ne pouvait toujours pas le faire fonctionner. Si vous êtes curieux: http://stackoverflow.com/questions/21923438/how-to-allow-addons-content-script-access-javascript-variables-from-the-current – CppLearner

3

pas si dur :)

en extension:

var jso=window.content.document.defaultView.wrappedJSObject; 

maintenant vous pouvez accéder à une fonction ou une variable globale dans la page web de l'extension:

alert(jso.pagevar); 

jso.pagefunction("hey"); 
0

Si vous travaillez avec les nouveaux SDK de haut niveau, alors accessing the variable via content scripts est un peu différent. Vous ne pouvez pas accéder aux objets JavaScript directement à partir du code d'ajout, mais vous pouvez les atteindre à partir des scripts de contenu qui ont été attachés à une page ouverte via l'objet unsafeWindow.Par exemple:

require("sdk/tabs").open({ 
    url: 'http://www.example.com/some/page/', 
    onOpen: function(tab) { 
    var worker = tab.attach({ 
     contentScript: 'unsafeWindow.variableForExtension = 1000;' 
    }); 
    } 
}); 

Pour lire les variables que vous aurez besoin d'utiliser la variable Port méthodes sur le des travailleurs comme décrit dans Mozilla's content script article.

Notez qu'il existe certaines restrictions de sécurité lorsqu'ils traitent avec des objets et fonctions. Voir les articles pour plus de détails.

Questions connexes