Estoy desarrollando una extensión que involucra tanto una secuencia de comandos de fondo como una secuencia de comandos de contenido. La secuencia de comandos de contenido obtiene el texto seleccionado de las páginas web, cuando el usuario hace clic en la entrada de menú relativa de la extensión y luego lo envía a la secuencia de comandos de fondo para su posterior procesamiento.
Aquí está la sección relativa de manifest.json :
"background": { "scripts": ["background.js"] }, "content_scripts": [ { "matches": ["<all_urls>"], "js": ["content.js"] } ]Cargo la extensión en about: depuración > Este Firefox > Cargar complemento temporal... para probarlo.
En el código, envío un mensaje desde el script de fondo al script de contenido, pero arroja un error:
Error no capturado (en promesa): no se pudo establecer la conexión. El extremo receptor no existe
Verifiqué usando el depurador, en about:devtools-toolbox y descubrí que solo se carga el script de fondo.
¿Alguien tiene una idea de qué hace que el script de contenido no se cargue y cuál sería la solución?
La secuencia de comandos de fondo debe enviar un mensaje a la secuencia de comandos de contenido, solicitando el texto seleccionado y luego escuchar el mensaje que recibe. Entonces puede llamar a la función que hace la búsqueda de Google:
function onCreated() { if (browser.runtime.lastError) { console.log(`Error: ${browser.runtime.lastError}`); } else { console.log("Item created successfully"); } } browser.menus.create({ id: "context-entry", title: 'search', contexts: ['all'], onclick: getText }, onCreated); async function getText() { const tabInfo = await getCurrentTab(); const [{ id: tabId }] = tabInfo; browser.tabs.sendMessage(tabId, { trigger: 'getText' }); } browser.runtime.onMessage.addListener(function ({ txt }) { doSearch(txt); }); function doSearch(txt) { var searchURL = `https://www.google.com/search?q=${txt}`; browser.tabs.create({url: searchURL}); }Y la secuencia de comandos de contenido debe escuchar el mensaje de la secuencia de comandos de fondo y devolver el texto seleccionado.
browser.runtime.onMessage.addListener(({ trigger }) => { if (trigger === 'getText') { const selection = window.getSelection(); const txt = selection.toString(); browser.runtime.sendMessage({ trigger: 'foundText', txt }); } });