2011-02-12 17 views
25

Estoy escribiendo una extensión de Chrome que necesita modificar páginas en un dominio específico de acuerdo con algún parámetro dado, que necesita XSS para poder obtenerse, por lo que simplemente parece imposible utilizar un script de contenido. Por lo tanto, he decidido inyectar el script usando tabs.executeScript.tabs.executeScript - ¿pasa parámetros y usa librerías?

Ahora necesito saber dos cosas: Primero, ¿cómo puedo pasar parámetros al script cuando se usa executeScript? Supongo que puedo usar mensajes, pero ¿no hay una forma más directa de pasar el parámetro mientras se inyecta el script?

En segundo lugar, mi script usa jQuery, así que tengo que incluir jQuery de alguna manera. Es tonto, pero no estoy seguro de cómo hacerlo. Hasta ahora, incrustó jQuery en la página HTML que estaba escribiendo (por ejemplo, background.html).

+1

Relacionados/duplicados: [Pasar un parámetro a un script de contenido inyectado utilizando chrome.tabs.executeScript()] (// stackoverflow.com/q/17567624) e [Inyectar varios scripts mediante executeScript en Google Chrome] (// stackoverflow.com/q/21535233) – Makyen

+0

Para futuros lectores (el OP probablemente aprendió esto en los años intermedios): por favor, escriba Preguntas para tener solo una pregunta (o las que están * muy * estrechamente relacionadas). Esto permite que las Respuestas estén más enfocadas y la Pregunta sea apuntada a un duplicado o se use como un objetivo duplicado para preguntas futuras. Tener múltiples preguntas dentro de una Pregunta hace que la Pregunta sea menos valiosa para los lectores futuros. – Makyen

Respuesta

45

Si no desea utilizar la mensajería a continuación:

chrome.tabs.executeScript(tabId, {file: "jquery.js"}, function(){ 
    chrome.tabs.executeScript(tabId, {code: "var scriptOptions = {param1:'value1',param2:'value2'};"}, function(){ 
     chrome.tabs.executeScript(tabId, {file: "script.js"}, function(){ 
      //all injected 
     }); 
    }); 
}); 

(jquery.js se debe colocar en la carpeta de extensión). Las opciones de script estarán disponibles dentro de la variable scriptOptions en el script.js.

con la mensajería que es igual de fácil:

chrome.tabs.executeScript(tabId, {file: "jquery.js"}, function(){ 
    chrome.tabs.executeScript(tabId, {file: "script.js"}, function(){ 
     chrome.tabs.sendMessage(tabId, {scriptOptions: {param1:'value1',param2:'value2'}}, function(){ 
      //all injected 
     }); 
    }); 
}); 

que tendría que añadir una solicitud oyente a script.js:

chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { 
    var scriptOptions = message.scriptOptions; 
    console.log('param1', scriptOptions.param1); 
    console.log('param2', scriptOptions.param2); 
    doSomething(scriptOptions.param1, scriptOptions.param2); 
}); 
+1

Entonces, ¿todas las llamadas 'executeScript' ponen código en el mismo * mundo aislado * en la pestaña? [Pensé que no]] (http://code.google.com/chrome/extensions/content_scripts.html#execution-environment): "Los mundos aislados permiten que cada script de contenido realice cambios en su entorno de JavaScript sin preocuparse por el conflicto con la página o con otros scripts de contenido " –

+1

@Kragen' executeScript' es igual a declarar un script de contenido en el manifiesto. No se ejecuta en un mundo aislado de una pestaña, se ejecuta en un mundo aislado de un script de contenido. – serg

+1

Bueno, mira, eso es lo que pensé: un mundo de script de contenido aislado para esa pestaña. El caso es que si tienes dos scripts de contenido en el manifiesto, terminan en dos mundos aislados distintos. Pero aquí parece que tiene dos llamadas 'executeScript' separadas que terminan en el * mismo * mundo aislado. –

1

Tomando como base el método directo arriba, yo era capaz de inyectar código en una nueva pestaña directamente desde la secuencia de comandos de fondo en mi extensión de Chrome. Sin embargo, tenga en cuenta que la sección de código del comando executeScript no solo tomará variables, sino solo una cadena. Por lo tanto, después de experimentar, descubrí que debemos configurar la secuencia de comandos de antemano e incluir las variables que queremos. De esta manera:

var sendCode = 'document.getElementsByClassName("form-control n-gram")[0].value = "' + TMObj.brand + '";'; 

var TMUrl = "http://website.com"; 
chrome.tabs.create({ url: TMUrl }, function(tab){ 
      chrome.tabs.executeScript(null, {code: sendCode}); 
     }); 
}); 

Esto funcionó bien!

Cuestiones relacionadas