Nick Fury
Estoy tratando de hacer que mi extensión de Chrome inyecte algo de javascript con content_scripts
usando este anterior responder como una referencia.
manifiesto.json
"name": "My Chrome Extension",
"version": "1.0",
"manifest_version": 2,
"content_scripts": [{
"matches": ["http://pagetoinject/script/into/*"],
"js": ["contentscript.js"]
}]
contenido.js:
var s = document.createElement('script');
s.src = chrome.extension.getURL("script.js");
(document.head||document.documentElement).appendChild(s);
s.parentNode.removeChild(s);
(También lo intenté este método sin éxito. )
var s = document.createElement('script');
s.src = chrome.extension.getURL("script.js");
s.onload = function() {
this.parentNode.removeChild(this);
};
(document.head||document.documentElement).appendChild(s);
Sigo recibiendo este error de javascript. Aquí está un captura de pantalla.
GET chrome-extension://invalid/
(anonymous function)
robar w
- En su archivo de manifiesto,
"manifest_version": 2
está especificado. Esto activa automáticamente un modo más estricto, en el que todos los archivos de la extensión no están disponibles para las páginas web de forma predeterminada. - Su código original nunca funcionaría, porque el
<script>
El elemento se elimina inmediatamente después de la inyección (el archivo de script no tiene posibilidad de cargarse).
Como resultado de 1., aparece el siguiente error en la consola:
Failed to load resource chrome-extension://invalid/
Para solucionar el problema, agregue script.js
a la lista blanca, "web_accessible_resources"
en tus manifest file
:
{ "name": "Chrome Extension", "version": "1.0", "manifest_version": 2, "content_scripts": [{ "matches": ["http://pagetoinject/script/into/*"], "js": ["contentscript.js"] }], "web_accessible_resources": ["script.js"] }
-
Gracias por la excelente respuesta, todo funcionó exactamente como se mencionó. También gracias por el código original de aquí.
– Nick Fury
10 mayo 2012 a las 18:54
-
pero hay una manera de modificar una propiedad de
window
de un script inyectado de esta manera (o de cualquier otra manera)?– YakovL
7 de febrero de 2020 a las 13:01
-
lo he intentado muchas veces pero esta es la única respuesta que me funciona
– Hiệp Nguyễn
26 de abril de 2020 a las 18:34
Además de las respuestas anteriores, noto que en su contentscript.js
solo está agregando otro script, es decir script.js
¿Por qué no agregas directamente script.js
a través de content_scripts en manifest.json
.
Otra razón para obtener este error es si CORS está bloqueando la URL. Verifique el encabezado de solicitud de red de la página para ver si contiene Política de seguridad de contenido:
Content-Security-Policy: default-src 'self' http://example.com; connect-src http://example.com/; script-src http://example.com/
Puede intentar abrir la URL en una nueva pestaña del navegador para verificar que la URL de la imagen sea correcta:
chrome-extension://mjcbjlencnokpknflpneebajalcnnifo/images/pattern.jpg
Una forma de evitar esto es usar un URI de datos de imagen:
data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7
Repetitivo para la extensión de Chrome:
https://github.com/commanddotcom/boilerplate-chrome-extension-js-injection
El problema aquí es que estás usando manifest_version : 2
. si haces eso manifest-version: 1
no tendras ningun problema. La versión 2 restringe muchas de estas funciones para mejorar la seguridad. Referirse Política de seguridad de contenido de Google para obtener más detalles sobre las restricciones impuestas en la versión 2 del manifiesto. No pude encontrar su caso específico mencionado en el CSP, pero cuando cambié la versión del manifiesto a 1 y ejecuté su código, funcionó bien.
No estoy seguro de lo que está sucediendo, pero ¿por qué no haces esto en su lugar?
"js": ["contentscript.js","script.js"]
– Derek 朕會功夫
10 de mayo de 2012 a las 5:49
Porque
content_scripts
se ejecutan en un entorno aislado. necesito inyectar elscript.js
en el DOM para poder usar ese archivo como si fuera parte de la carpeta js pública. Se explica en la primera sección de esta respuesta.– Nick Fury
10 de mayo de 2012 a las 6:04
Esta respuesta hace lo que intenta en el script de contenido. Puede que sea lo que estás buscando.
– Espárragos
17 de mayo de 2012 a las 0:48