Qual é a melhor maneira de chamar um conteúdo scripts' função do fundo de script em uma extensão do Firefox?

0

Pergunta

Eu quero chamar uma função, que é implementado no conteúdo do script de uma extensão, que obtém o texto selecionado a partir de páginas web, a partir de uma função no plano de fundo script que será, mais tarde chamado de um ouvinte ligado a um item de menu.

Isso é possível e o que seria o caminho mais curto para fazê-lo?

Aqui são relevantes trechos de código:

manifesto.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, o código acima não está funcionando como o "destaque" função é agora visível a partir do fundo de script.

Então, qual é a mais rápida / caminho mais curto para tornar o código de trabalho?

1

Melhor resposta

1

OK. Eu estou tendo de presépio isso a partir do meu próprio extensões particular, mas a essência é esta:

No fundo de script configure o menu e atribuir uma função para a onclick prop:

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

Ainda no mesmo script do guia de informações, e enviar uma mensagem para o conteúdo do 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' });
}

O conteúdo do script escuta a mensagem:

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

E uma vez que o processamento é feito passar uma nova mensagem de volta para o fundo de script.

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

E em um plano de fundo separado script de eu ter algo como o seguinte:

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

Faz as guias.getCurrent() trabalhar no fundo de script no seu código? Eu recebo um não identificada (promise) TypeError: tabInfo é indefinido de erro. Eu li nos guias.getCurrent() documentação: Nota: Esta função só é útil em contextos onde existe uma guia do navegador, tais como uma página de opções. Se você chamá-lo a partir de um fundo de script ou um pop-up, ele vai voltar undefined.
Costas

Minha extensão não funciona se ele não. Meu código é apenas um exemplo de como ele deve funcionar, e que funciona com o meu plano script. Os dados que você está recebendo a partir de tabs.getCurrent()?
Andy

@Costas, eu adicionei um pouco de meu código que estava faltando (o getCurrentTab função). Espero que ajude.
Andy

Eu estava ficando undefined obviamente, porque tabs.getCurrent() estava voltando undefined. O código corrigido o erro. Agora eu estou ficando um Uncaught (in promise) Error: Could not establish connection. Receiving end does not exist a partir desta linha de código: browser.tabs.sendMessage(tabId, { trigger: 'downloadImages' }); Eu tenho este código: browser.runtime.onMessage.addListener(({ trigger }) => { if (trigger === 'downloadImages') doSomething(); }); o conteúdo do script, mas, obviamente, ele não é visto a partir do fundo de script.
Costas

Você pediu um exemplo, eu dei-lhe um. Ele mostra o básico sobre sistema de mensagens, que é o que você pediu. Esse código pode não atender aos seus requisitos, especificamente - você só tem que trabalhar em torno dele um pouco para caber seu código. Não basta levantar o código de resposta e esperar que funcione. Pense que você pode adaptar o código para atender aos seus requisitos.
Andy

Eu só tinha uma olhada na extensão, novamente, alguns minutos atrás... No depurador, em Devtools eu ver que o plano de fundo script carregado! Então, esse é o problema. O conteúdo do script não carrega. Eu não entendo por que, como eu, não vê problemas na manifest.json arquivo.
Costas

Em outros idiomas

Esta página está em outros idiomas

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