¿Cuál es la mejor forma de llamar a un contenido de los scripts función de los antecedentes secuencia de comandos en una extensión de Firefox?

0

Pregunta

Quiero llamar a una función que se implementa en el contenido de la secuencia de comandos de una extensión, que obtiene el texto seleccionado desde la página web, a partir de una función en segundo plano secuencia de comandos que se llamó más tarde en un detector conectado a un elemento de menú.

Es posible y lo que sería el camino más corto para hacerlo?

Aquí los fragmentos de código:

de manifiesto.json

 "background": {
    "scripts": ["background.js"]
  },
  
  "content_scripts": [
  {
    "matches": ["<all_urls>"],
    "js": ["content.js"]
  }
]

content.js

var text = "";
    
function highlightedText() {
  text = content.getSelection();
}

background.js

function listenerFunction() {

    highlightedText();
    
    /* Doing various stuff that have to use the text variable */
  }
  
    browser.menus.onClicked.addListener((info, tab) => {
    highlightedText();
  });

Obviamente, el código anterior no funciona como el "destacado" la función es ahora visible desde el fondo de la secuencia de comandos.

Así que, ¿cuál es el más rápido / camino más corto para hacer que el código de trabajo?

1

Mejor respuesta

1

OK. Me voy a la cuna de este uno de mis propias extensiones privadas, pero la esencia es esta:

En el fondo script para configurar el menú, y asignar una función a la onclick prop:

browser.menus.create({
  id: 'images',
  title: 'imageDownload',
  contexts: ['all'],
  onclick: downloadImages
}, onCreated);

Todavía en el mismo script obtener la ficha actual de la información, y enviar un mensaje con el contenido del script.

function getCurrentTab() {
  return browser.tabs.query({ currentWindow: true, active: true });
}

async function downloadImages() {
  const tabInfo = await getCurrentTab();
  const [{ id: tabId }] = tabInfo;
  browser.tabs.sendMessage(tabId, { trigger: 'downloadImages' });
}

El contenido del script escucha el mensaje:

browser.runtime.onMessage.addListener(({ trigger }) => {
  if (trigger === 'downloadImages') doSomething();
});

Y una vez que el procesamiento se hace pasar un mensaje nuevo al fondo de secuencia de comandos.

function doSomething() {
  const data = [1, 2, 3];
  browser.runtime.sendMessage({ trigger: 'downloadImages', data });
}

Y por separado en un segundo plano secuencia de comandos tengo algo como lo siguiente:

browser.runtime.onMessage.addListener(function (data) {
  const { trigger } = data;
  if (trigger === 'downloadImages') ...
});
2021-10-29 12:40:02

¿Las pestañas.getCurrent() trabajo en segundo plano secuencia de comandos en el código? Puedo obtener una Uncaught (en promesa) TypeError: tabInfo es indefinido error. He leído en las pestañas.getCurrent() documentación: Nota: Esta función sólo es útil en contextos donde hay una pestaña del navegador, tales como una página de opciones. Si se llama desde un fondo de secuencia de comandos o una ventana emergente, volverá undefined.
Costas

Mi extensión no funciona si no. Mi código es sólo un ejemplo de cómo se debe trabajar, y que funciona con mi fondo de secuencia de comandos. Qué datos están obteniendo de tabs.getCurrent()?
Andy

@Costas he añadido un poco de mi código que faltaba (el getCurrentTab de la función). Esperemos que se de ayuda.
Andy

Me estaba poniendo undefined obviamente, debido a tabs.getCurrent() era regresar undefined. El código corregido el error. Ahora me estoy poniendo un Uncaught (in promise) Error: Could not establish connection. Receiving end does not exist a partir de esta línea de código: browser.tabs.sendMessage(tabId, { trigger: 'downloadImages' }); Tengo este código: browser.runtime.onMessage.addListener(({ trigger }) => { if (trigger === 'downloadImages') doSomething(); }); en el contenido del script, pero obviamente, no se ve desde el fondo de la secuencia de comandos.
Costas

Usted pidió un ejemplo, me dio uno. Se muestran los conceptos básicos acerca de los mensajes que es lo que usted pidió. Este código puede que no se ajuste a sus necesidades específicas - usted sólo tiene que trabajar alrededor de un poco para que se ajuste a su código. No acaba de levantar el código de esta respuesta y esperar que funcione. Piense que usted puede adaptar el código para que se ajuste a sus necesidades.
Andy

Yo sólo tenía una mirada a la extensión de nuevo un par de minutos... En el depurador, en Devtools veo que sólo el fondo de la secuencia de comandos se ha cargado! Así que ese es el problema. El contenido de la secuencia de comandos no se carga en absoluto. No entiendo por qué a pesar de que, como no veo ningún problema en que el manifest.json archivo.
Costas

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................