webextensions tutorial primera extensions extensiones extension crear javascript-events google-chrome-extension tabs firefox-addon firefox-addon-sdk

javascript-events - tutorial - web extensions



cómo implementar la API chrome.tabs.sendMessage de la extensión de Chrome en el complemento de Firefox (1)

Estoy trabajando en un desarrollo de complementos de Firefox con Addon-Builder. No tengo idea de cómo implementar la API chrome.tabs.sendMessage de la extensión de Chrome en el complemento de Firefox. El código es así (el código está en background.js, algo así como main.js en el complemento de Firefox):

function sendMessageToTabs(message, callbackFunc){ chrome.tabs.query({}, function(tabsArray){ for(var i=0; i<tabsArray.length; i++){ //console.log("Tab id: "+tabsArray[i].id); chrome.tabs.sendMessage(tabsArray[i].id,message,callbackFunc); } }); }

Entonces, ¿cómo puedo lograr esto? Gracias.


En la compilación de complementos que utiliza Add-on SDK, las secuencias de comandos de contenido son administradas por main.js. No hay una forma incorporada de acceder a todos los scripts de contenido de tu complemento. Para enviar un mensaje a todas las pestañas, necesita realizar un seguimiento manual de las secuencias de comandos de contenido.

Los mensajes unidireccionales se implementan fácilmente mediante las API existentes . Las rellamadas no están incorporadas, sin embargo.

La biblioteca SDK de mi navegador-acción contiene un módulo llamado " mensajería ", que implementa la API de mensajes de Chrome. En el siguiente ejemplo, el script de contenido y el script principal usan un objeto llamado "extensión". Este objeto expone los métodos onMessage y sendMessage , modelados después de las API de mensajes de extensión de Chrome.

El siguiente ejemplo agrega un script de contenido a cada página en , y al hacer clic, los títulos de las pestañas se registran en la consola (la que se abre usando Ctrl + Shift + J ).

lib/main.js

// https://github.com/Rob--W/browser-action-jplib/blob/master/lib/messaging.js const { createMessageChannel, messageContentScriptFile } = require(''messaging''); const { PageMod } = require(''sdk/page-mod''); const { data } = require(''sdk/self''); // Adds the message API to every page within the add-on var ports = []; var pagemod = PageMod({ include: [''http://.com/*''], contentScriptWhen: ''start'', contentScriptFile: [messageContentScriptFile, data.url(''contentscript.js'')], contentScriptOptions: { channelName: ''whatever you want'', endAtPage: false }, onAttach: function(worker) { var extension = createMessageChannel(pagemod.contentScriptOptions, worker.port); ports.push(extension); worker.on(''detach'', function() { // Remove port from list of workers when the content script is deactivated. var index = ports.indexOf(extension); if (index !== -1) ports.splice(index, 1); }); } }); function sendMessageToTabs(message, callbackFunc) { for (var i=0; i<ports.length; i++) { ports[i].sendMessage(message, callbackFunc); } } // Since we''ve included the browser-action module, we can use it in the demo var badge = require(''browserAction'').BrowserAction({ default_title: ''Click to send a message to all tabs on '' }); badge.onClicked.addListener(function() { sendMessageToTabs(''gimme title'', function(response) { // Use console.error to make sure that the log is visible in the console. console.error(response); }); });

Para el registro, la parte interesante de main.js está dentro del evento onAttach .

data/contentscript.js

extension.onMessage.addListener(function(message, sender, sendResponse) { if (message === ''gimme title'') { sendResponse(document.title); } });