2010-01-20 10 views
9

¿Es posible que la extensión de Firefox (barra de herramientas) acceda a las variables del documento? explicación detallada sigue ..Acceso a la variable javascript del documento desde la extensión de Firefox

documento cargado:

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

extensión:

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

era primero que hay que tratar, y es inaccesible esta manera debido a los mecanismos de seguridad (XPCNativeWrapper). He leído sobre cómo acceder a él a través del envueltoJSObject y usando eventos (agregando oyente para documentar y enviar eventos desde la extensión), pero no tuve suerte. sin embargo, no lo intentó demasiado. así que, antes de profundizar (el "método de eventos" suena como un camino por recorrer), me gustaría saber si esto es posible.

gracias

Respuesta

15

Sí, el acceso a una variable JS en el contenido es y siempre fue posible. Hacer esto de la manera ingenua no era seguro (en el sentido de que una página web maliciosa podía obtener privilegios de Chrome) en versiones anteriores de Firefox.

1) Si controla la página web y desea pasar información a la extensión, debe utilizar el events technique. Esto funcionó y fue/es seguro en todas las versiones de Firefox.

2) Si quieres leer un valor en el documento de contenido, que sólo puede pasar por alto la 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! 

Esto no era seguro antes de Firefox 3. En Firefox 3 y posteriores que está bien usar , obtiene otro tipo de contenedor (XPCSafeJSObjectWrapper), que se ve igual que el objeto desde la página de contenido a su código, pero asegura que la página de contenido no podrá hacer nada malicioso.

3) Si necesita llamar a una función en una página web de contenido o ejecutar su propio código en el contexto de la página, es más complicado. Se le preguntó y respondió en otro lugar muchas veces, pero desafortunadamente nunca se documentó completamente. Dado que esto no está relacionado con su pregunta, no entraré en detalles.

+0

gracias por responder, nickolay. :) He hecho el trabajo de una manera un poco sucia, pero intentaré (nuevamente) tanto 1 como 2 (no necesito 3, aún), ahora que sé que es posible. – parserr

+0

@Nickolay. Necesito lidiar con el # 3; Puedo pedirle un puntero (también sería útil para la comunidad aquí). Necesito leer y realizar acciones en la página de contenido (cualquier página web que un usuario pueda visitar). Dijiste "no documentado en su totalidad, pero respondiste tantas veces", ¿puedes dirigirme a un buen puntero? Excavó la documentación durante unos días y aún no pudo hacer que funcione. Si tiene curiosidad: http://stackoverflow.com/questions/21923438/how-to-allow-addons-content-script-access-javascript-variables-from-the-current – CppLearner

3
no

tan duro :)

en extensión:

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

ahora se puede acceder a cualquier función o variable global en la página web de la extensión:

alert(jso.pagevar); 

jso.pagefunction("hey"); 
0

Si está trabajando con los nuevos SDK de alto nivel, entonces accessing the variable via content scripts es un poco diferente. No puede acceder a los objetos de JavaScript directamente desde el código de agregar, pero puede acceder a ellos desde los scripts de contenido que se han adjuntado a una página abierta a través del objeto inseguroWindow.Por ejemplo:

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

Para leer las variables que necesita para utilizar el puerto métodos en la variable detrabajador como se describe en Mozilla's content script article.

Tenga en cuenta que hay algunas restricciones de seguridad cuando se trata de objetos y funciones Ver los artículos para más detalles.

Cuestiones relacionadas