Qual è il modo migliore per chiamare un contenuto script' di funzione da sfondo script in una estensione di Firefox?

0

Domanda

Voglio chiamare una funzione implementata nel contenuto script di un'estensione, che viene selezionato il testo da pagine web, da una funzione in background script che verrà in seguito chiamato in un listener collegato ad una voce di menu.

È possibile, e quale sarebbe il modo più rapido per farlo?

Qui sono i frammenti di codice:

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();
  });

Ovviamente, il codice sopra non funziona come il "evidenziato" la funzione è ora visibile dal fondo di script.

Allora, che cosa è il modo più veloce / più breve modo per rendere il codice?

1

Migliore risposta

1

OK. Mi sto divertendo a questo presepe da uno dei miei privata, le estensioni, ma il succo del discorso è questo:

Sullo sfondo script impostare il menu, e di assegnare una funzione onclick prop:

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

Ancora nello stesso script ottenere l'attuale scheda informazioni e inviare un messaggio al contenuto dello 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' });
}

Il contenuto di script per l'ascolto del messaggio:

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

E una volta che il trattamento viene fatto passare un nuovo messaggio a sfondo script.

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

E in un altro sfondo script ho qualcosa di simile al seguente:

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

Il schede.getCurrent() funziona in background script nel codice? Ho un Uncaught (in promessa) TypeError: tabInfo è definito errore. Ho letto nelle schede.getCurrent() documentazione: Nota: Questa funzione è utile solo in contesti in cui c'è una scheda del browser, come ad esempio una pagina di opzioni. Se si chiama da un background di script o un popup, verrà restituito undefined.
Costas

La mia estensione non funziona se non l'ha fatto. Il mio codice è solo un esempio di come dovrebbe funzionare, e che funziona con il mio background di script. Quali dati sono sempre da tabs.getCurrent()?
Andy

@Costas ho aggiunto un po ' del mio codice che mancava (il getCurrentTab funzione). Spero che sarà di aiuto.
Andy

Mi è stato sempre undefined ovviamente, a causa tabs.getCurrent() era di ritorno undefined. Il codice corretto l'errore. Ora mi sto un Uncaught (in promise) Error: Could not establish connection. Receiving end does not exist da questa linea di codice: browser.tabs.sendMessage(tabId, { trigger: 'downloadImages' }); Ho questo codice: browser.runtime.onMessage.addListener(({ trigger }) => { if (trigger === 'downloadImages') doSomething(); }); il contenuto dello script, ma ovviamente non è visto da sfondo script.
Costas

Hai chiesto un esempio, ho dato uno. Mostra le informazioni di base su di messaggistica che è quello che hai chiesto. Questo codice potrebbe non essere adatto alle vostre esigenze in particolare - solo per aggirare un po ' per adattarsi al tuo codice. Non basta sollevare il codice da questa risposta e si aspettano di lavorare. Pensare che si possa adattare il codice si adatta alle vostre esigenze.
Andy

Ho appena dato un'occhiata alla estensione di nuovo un paio di minuti fa... Nel debugger, in Devtools vedo solo lo sfondo script è caricato! Quindi, questo è il problema. Il contenuto dello script non carica affatto. Non capisco perché, però, come non vedo problemi nel manifest.json file.
Costas

In altre lingue

Questa pagina è in altre lingue

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