Pasar mensajes al script de contenido desde el fondo

En mi extensión, estoy pasando un mensaje de mi background.js a content.js usar chrome.tabs.sendMessage. Para un válido tabId (Imprimo su valor, no es negativo), en algún momento el contenido imprime las alertas después de la alerta en background.js pero no la mayoría de las veces. Aquí está el código de ejemplo. ¿Me estoy perdiendo algo en el código? Estoy esperando, cada vez que se muestra la alerta en background.js, debe haber una alerta en content.js. Estoy enviando un mensaje cuando la solicitud se está procesando y la página aún no se muestra por completo.

fondo.js

...

if(url == "http://example.com"){
   alert("In background");
   chrome.tabs.sendMessage(tabId, {msg: "HELLO"});          
}

...

contenido.js

chrome.runtime.onMessage.addListener(
        function (request, sender, sendResponse) {    
          alert("In content");
        });

manifest.json

  "content_scripts": [  
        {
            "matches": [
                "http://*/*",
                "https://*/*"
            ],
            "js": ["content.js"],
            "all_frames": true,
            "run_at": "document_end"
        }
    ],

Adicional

Solo para recordarles, quiero cambiar las URL de las imágenes en DOM a http (de http para forzar el redireccionamiento a http) después de las solicitudes por primera vez, redirigido a https en onBeforeRquest, fallar. Esto no funciona porque me di cuenta de que el script de contenido no recibe todos los mensajes. Como prueba simple en el siguiente código, espero que cada vez que se imprima el mensaje "In onErrorOccurred", debe ser seguido por "In content" en la consola, pero no funciona de esta manera. Cualquier sugerencia es bienvenida. Primero confirmo si el contenido está listo y luego envío el mensaje. Aquí está el código:

contenido.js:

chrome.extension.sendRequest({contentStatus: "activated"});

chrome.runtime.onMessage.addListener(
   function (request, sender, sendResponse) {
      console.log(request.srcurl);  //or console.log("In content");
});

fondo.js:

var contentActive = {}  
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {   
   chrome.tabs.getSelected(null, function(tabs) {       
      if (request.contentStatus == "activated")
          contentActive[tabs.id] = true;    
   });    
});

chrome.webRequest.onErrorOccurred.addListener(
   function(details){ 
      if(details.type == 'image' && details.url == "https://example.com/image1.jpg") {     
         if(contentActive[details.tabId]){
           console.log("In onErrorOccurred");
              chrome.tabs.sendMessage(details.tabId, {srcurl: "In content"});       
        }
     }
}, {urls: ['https://*/*']});

preguntado el 21 de septiembre de 13 a las 12:09

No estoy seguro de entender la pregunta. Creo que siempre deberías ver alertas desde la página de fondo. si lo cierra lo suficientemente rápido antes de que se cargue el documento de la página web, no verá la alerta del script de contenido en absoluto. También puede ver alertas de cada iframe en la página (si corresponde). No estoy seguro de cómo activa el par en la página de fondo, pero podría notar una alerta retrasada de estos marcos antes de que el código de fondo comenzara a ejecutarse:

@Andrey Estoy enviando la URL del subrecurso fallido desde el fondo y reemplazando (modificando DOM) en el contenido. Esto no sucede cada vez que falla una solicitud. La alerta es para la depuración y no se imprime por contenido, incluso si uso console.log. Además, en algún momento muestra la alerta del contenido. -

Entonces, para aclarar: ¿ve la salida (alerta o consola) de la página de fondo pero no siempre ve la salida de los scripts de contenido? La razón más probable es que el script de contenido no se configura en el oyente de Mensajes (su página de fondo envía un mensaje antes de que esto suceda) -

Sí. No entiendo por '... el script de contenido no se configura en el oyente de Mensajes...'. Yo creo, run_at establecido en document_end, debería ser suficiente para inyectar contenido (hacer que los oyentes estén listos y deberían escuchar) antes de que se carguen los recursos. Estoy activando el envío de mensajes en segundo plano cuando se recibe una respuesta de subrecurso. -

Chrome garantiza el punto después del cual carga sus secuencias de comandos, pero ofrece alguna garantía cuando su secuencia de comandos se cargará realmente. Para asegurarse de que su controlador onMessage esté configurado antes de su llamada, debe enviar un mensaje desde el script de contenido a la página de fondo:

0 Respuestas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.