Quiero enviar un mensaje desde la consola de la página web al azar a mi extensión de chrome.
chrome.la extensión.sendMessage no parece funcionar.

InformationsquelleAutor dilpreet023 | 2012-07-11

5 Comentarios

  1. 55

    Según el oficial docs debe utilizar postMessage en el remitente y mensaje detector de eventos en el receptor.

    Aquí está un ejemplo:

    De su sitio web page.html

    var data = { type: "FROM_PAGE", text: "Hello from the webpage!" };
    window.postMessage(data, "*");
    

    Contenido del script: (inyectado mediante chrome.tabs.executeScript(tabid, {code:...)

    window.addEventListener("message", function(event) {
        //We only accept messages from ourselves
        if (event.source != window)
            return;
    
        if (event.data.type && (event.data.type == "FROM_PAGE")) {
            console.log("Content script received message: " + event.data.text);
        }
    });
    

    Aquí page.html (que no es una parte de la extensión) envía mensajes a sí mismo, que son interceptados e inspeccionado por el contenido de la secuencia de comandos. El reverso es posible a través de medios similares.

    Pasar de contenido de la secuencia de comandos de extensión, usted tendrá que usar uno de los disponibles de paso de mensajes técnicas.

    Parece complicado y es algo complicado, pero toda esta insensatez es muy seguro.

    • puedo intentar insertar el código en el sitio Web del html para el envío de eventos a lo largo de a través de la ‘chrome.las pestañas.executeScript()’ comando? Me canse de eso y no funciona… dice, «Puerto de Error: no se pudo establecer la conexión: recepción final no existe:
    • Gracias por este. Me preguntaba cómo hacer esto de forma más segura que la ventana.postMessage. Este sería, sin duda tienen menos efectos secundarios, pero lamentablemente todavía podría ser manipulado por una página web malintencionada. Estoy mirando adelante a chrome.en tiempo de ejecución.onMessageExternal lo que permitirá un poco más seguro (con suerte) de canal de comunicación
    • El contenido de los scripts se corrió dentro de su propio contexto, por lo que es aislado de la página web de contexto. El contenido de los scripts tienen acceso al DOM (los elementos HTML), básicamente, puede adjuntar a los oyentes si quieres pasar los datos entre los contextos, puede hacerlo a través de eventos. Sólo tenga en cuenta que hay 3 diferentes contextos: la Extensión, la secuencia de comandos Personalizada, y página web de scripts.
    • Ese primer vínculo menciona el uso de windows.postMessage(...) así que al parecer ni siquiera necesita una costumbre myCustomEventDiv, como lo fueron…
    • Me alegra encontrar este después de una hora de búsqueda. Gracias por la valoración crítica!
  2. 45

    He aquí una cita de la última http://developer.chrome.com/extensions/messaging.html, Es mucho más simple para apoyar este tipo de característica de ahora, he aquí cómo:

    El envío de mensajes de las páginas web

    Similar a la cruz de extensión de mensajería, la aplicación o la extensión del
    recibir y responder a mensajes de páginas web convencionales. El uso de este
    característica, debe primera especificar en su manifest.json de la web
    los sitios que se quiere comunicar. Por ejemplo:

    "externally_connectable": {
      "matches": ["*://*.example.com/*"]
    }
    

    Esto expondrá la API de mensajería a cualquier página que coincide con la URL
    los patrones que usted especifique. El patrón de URL debe contener al menos un
    dominio de segundo nivel, es decir, nombre de host patrones como ««, «.com»,
    «.co.reino unido», y «.appspot.com» y <all_urls> están prohibidos.
    Desde la página web, utiliza el motor de ejecución.sendMessage o en tiempo de ejecución.conecte Api
    para enviar un mensaje a una determinada aplicación o extensión. Por ejemplo:

    //The ID of the extension we want to talk to.
    var editorExtensionId = "abcdefghijklmnoabcdefhijklmnoabc";
    
    //Make a simple request:
    chrome.runtime.sendMessage(editorExtensionId, {openUrlInEditor: url},
      function(response) {
        if (!response.success)
          handleError(url);
      });
    

    De su aplicación o extensión, usted puede escuchar los mensajes de las páginas web
    a través del tiempo de ejecución.onMessageExternal o en tiempo de ejecución.onConnectExternal Api,
    similar a la cruz de extensión de mensajería. Sólo la página web puede iniciar una
    conexión. Aquí está un ejemplo:

    chrome.runtime.onMessageExternal.addListener(
      function(request, sender, sendResponse) {
        if (sender.url == blacklistedWebsite)
          return;  //don't allow this web page access
        if (request.openUrlInEditor)
          openUrl(request.openUrlInEditor);
      });
    
    • Esto funciona para mí. Sin embargo, tengo una pregunta. ¿Cómo encontrar el ID de su extensión? En el momento en que me incluya en el código.
    • cómo ver que el mensaje es recibido por extensión, estoy usando el desempaquetado de extensión. Actualmente estoy desarrollando.
    • la extensión de IDENTIFICACIÓN mecanismo de generación se explica aquí: stackoverflow.com/a/21500707/258772
    • Acabo de añadir un alert en el controlador de eventos en la extensión.
    • este sería el mejor método si no fuera por; 1 – se deben especificar todas las externamente connactable sitios web con al menos 2 nivel de dominio (un problema para mí) y 2 – debe conocer de la aplicación/extensión de identificación por adelantado
    • Esto debe ser aceptado respuesta.
    • Escuchar a los acontecimientos con chrome.runtime.onMessageExternal.addListener()
    • Tenga en cuenta que este método no funciona actualmente en Firefox, como de FF 54. Ver una posible solución: stackoverflow.com/questions/44592605/…
    • No es posible enviar el mensaje de la secuencia de comandos de desconocido dominio como debe ser definido en un manifiesto.json

  3. 5

    Puede cambiar a la JS contexto de ejecución de su contenido de la secuencia de comandos mediante el <page context> menú en la parte inferior de la página del desarrollador JS de la consola, a continuación, utilizar chrome.runtime.sendMessage y otros chrome.* Api, como se haría en el contenido de la secuencia de comandos.

    enviar mensaje a la extensión de chrome de una página web

    • ¿Cuál puede ser la razón de que si el contexto de ejecución de conmutación menú que se muestra en la captura de pantalla no aparece (Chrome v 39.0.2171.95 m, Windows 7)?
    • Apenas para la referencia – puedo acceder al contexto de extensión de la consola mediante la apertura de la página extensiones (chrome://extensions) y haciendo clic en el Inspeccionar puntos de vista: el fondo de la página enlace, por lo que la falta de cambio de contexto el menú no es un gran problema realmente.
    • En una reciente publicación, Cromo combinado de la ejecución menú de contexto con el menú de marco. Si la extensión tiene un contenido de secuencia de comandos en la página, ahora aparece en la lista bajo <top frame>.
    • Gracias por la sugerencia. Por desgracia solo puedo ver <top frame> cuando hago clic en el desplegable, aunque la página script es capaz de comunicarse con la extensión sin problemas. Pero como puedo utilizar el fondo de la página de enlace desde la página extensiones, es sólo un problema cosmético.
    • Fondo de secuencia de comandos != El contenido del script. Hay 3 JS contextos de ejecución aquí: página de secuencia de comandos (lo que se ve en la consola por defecto), el fondo de secuencia de comandos (lo que se ve al examinar el fondo de la página y es universal [instancia] para todas las pestañas de Chrome), y el contenido del script que se ejecuta dentro de un determinado tab + url dada, como se define en el manifiesto.json. Si pones window.foo = 'bar'; en un contenido de la secuencia de comandos, usted no se verá en el fondo de la página a la inspección de la consola. afaics es sólo visible a través de la lista desplegable que jaredjacobs señala aquí (que ahora está en el ‘top’).
  4. 5

    Para elaborar, una más concreate ejemplo: Un problema con chrome.runtime.sendMessage(...) estilo es que usted tiene que especificar la pag en la que está como externally_connectable que no asuma un comodín como «https:///«. Así que si quieres que la habilidad, usted tiene que utilizar el postMessage estilo de comunicación. Capturar el mensaje de la ventana en la contentscript, luego de la contentscript, usted puede enviar a otra parte (si se desea, como a la background.js etc.)

    De manera normal en la página web, o se inyecta fuente que incrustar en la página normal, desde su contentscript.js, envíe un mensaje como este:

    window.postMessage({ type: "FROM_PAGE_TO_CONTENT_SCRIPT", 
         text: "Hello from the webpage!" }, "*");
    

    ex, usted podría agregar a un botón como este:

    document.getElementById("theButton").addEventListener("click",
        function() {
           window.postMessage({ type: "FROM_PAGE_TO_CONTENT_SCRIPT", 
                                text: "Hello from the webpage!" }, "*");
    }, false);
    

    Luego de capturar en el contentscript.js y «enviar» para el resto de la extensión, la única salvedad es que usted sólo desea «, seleccione» mensajes que parecen ser los que te importan:

    window.addEventListener("message", function(event) {
      //We only accept messages from this window to itself [i.e. not from any iframes]
      if (event.source != window)
        return;
    
      if (event.data.type && (event.data.type == "FROM_PAGE_TO_CONTENT_SCRIPT")) {        
        chrome.runtime.sendMessage(event.data); //broadcasts it to rest of extension, or could just broadcast event.data.payload...
      } //else ignore messages seemingly not sent to yourself
    }, false);
    
  5. 3

    Además a @hewigovens , no tengo suficientes puntos para comentar…
    Yo estoy explicando @renatoargh y @sbichenko
    Si el envío de un mensaje de una página web predeterminada –

    1) la página web debe ser citada en el manifiesto. por ejemplo:

    "externally_connectable": {
      "matches": ["http://abcde/abcde/main.aspx*"]
    }
    

    2) la background.js (en el fondo de la página)
    exceptúa a la llamada con onMessageExternal por ejemplo, (llamar a una extensión):

    var host_name = "com.my_chrome_extension.com";
     chrome.runtime.onMessageExternal.addListener(function(message, sender, sendResponse) {
        chrome.runtime.sendNativeMessage(host_name, {"run":message});
        sendResponse({"success": "success"});
        return true;
    });
    

Dejar respuesta

Please enter your comment!
Please enter your name here