Comunicación de un script inyectado al script de contenido con una respuesta.

Siguiendo esta pregunta , la comunicación entre un script inyectado y un script de contenido se puede hacer de la siguiente manera:

// Content script window.addEventListener("getChromeData", function(data) { // do Chrome things; }, false); // Injected script window.dispatchEvent(new CustomEvent("getChromeData", {data: 'whatever'})); 

¿Quería saber si hay una manera de utilizar los datos devueltos en el script inyectado, utilizando una promesa o un mecanismo de callback?

La comunicación de nuevo se realiza de nuevo con un evento. Puede utilizar un oyente de un disparo para lograr una respuesta basada en la promesa.

Pasaré una ID de solicitud adicional para que los oyentes de un disparo no se confundan accidentalmente; tal vez es una exageración

Guión de contenido:

 window.addEventListener("getChromeData", function(evt) { var request = evt.detail; var response = {requestId: request.id}; // do Chrome things with request.data, add stuff to response.data window.dispatchEvent(new CustomEvent("sendChromeData", {detail: response})); }, false); 

Guión inyectado:

 var ChromeRequest = (function(){ var requestId = 0; function getData(data) { var id = requestId++; return new Promise(function(resolve, reject) { var listener = function(evt) { if(evt.detail.requestId == id) { // Deregister self window.removeEventListener("sendChromeData", listener); resolve(evt.detail.data); } } window.addEventListener("sendChromeData", listener); var payload = { data: data, id: id }; window.dispatchEvent(new CustomEvent("getChromeData", {detail: payload})); }); } return { getData: getData }; })(); ChromeRequest.getData("whatever").then(function(data){/* ... */}); 

Tenga en cuenta que tiene que usar el atributo de detail de un CustomEvent , no es una propiedad arbitraria.

    Intereting Posts