Estensione Chrome: lo script del contenuto viene iniettato più volte per ogni caricamento di una singola pagina
-
27-10-2019 - |
Domanda
Riscontro alcuni problemi con uno script di contenuto iniettato più volte nella stessa pagina nella mia estensione per Chrome.
Sto inserendo lo script del contenuto dalla mia pagina "background.html", al cambio di scheda:
chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab){
chrome.tabs.getSelected(null,function(tab){
// Do some stuff
chrome.tabs.executeScript(null, { code: code}, function(result){
... ecc
All'interno dello script del contenuto, ho alcuni comandi console.log
Il problema è che quando carico una SINGOLA pagina, vedo che ciascuno dei log viene visualizzato nella console 2-4 volte.
È abbastanza chiaro per me che questo sta accadendo a causa degli iframe all'interno della pagina, penso almeno ... La mia domanda è PERCHÉ?
Ho visto nella documentazione che "all_frames" (array dei permessi dello script del contenuto nel manifest) dovrebbe essere impostato su "false" per impostazione predefinita, con il risultato che lo script del contenuto viene iniettato solo nel frame superiore della pagina, ma questo è semplicemente non sta accadendo!
Perché viene iniettato più volte? Devo impostare fisicamente "all_frames" su false?
In secondo luogo:
Esiste un modo per sapere se la pagina in cui l'estensione sta tentando di inserire lo script di contenuto è un iframe o una parte superiore dell'INTERNO della pagina "background.html"?
Ho provato
if(window.top === window){ console.log('whatever'); }
E ha scoperto che NON funziona il 100% delle volte. Anche quando ho quella condizione per il resto del mio blocco di codice (intorno a chrome.tabs.executeScript ()), vedo ancora lo script di contenuto iniettato più volte ...
Qualsiasi idea o suggerimento sarebbe molto apprezzato! :)
Soluzione
onUpdated
si attiva ogni volta che lo stato di una scheda cambia.Ciò include quando è caricamento e caricamento completato , il che spiega le molte istruzioni di registro.
Devi controllare cosa è cambiato (l'URL è cambiato, è stato caricato, ecc.) Ogni volta che si verifica l'evento.