Chrome Extension - Script conteúdo que está sendo injetado várias vezes por carregamento de página única
-
27-10-2019 - |
Pergunta
Eu estou tendo alguns problemas com um script de conteúdo que está sendo injetado para a mesma página várias vezes em minha extensão Chrome.
Eu estou injetar o script de conteúdo de minha página "background.html", sobre a mudança Tab:
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){
... etc
Dentro do script de conteúdo, eu tenho algumas console.log comandos
O problema é que quando eu carregar uma página única, eu estou vendo cada um dos registros aparecem no console 2-4 vezes.
É muito claro para mim que isso está acontecendo por causa do iframe dentro da página, acho que, pelo menos ... Minha pergunta é por quê?
Eu vi na documentação que "all_frames" (o conteúdo da matriz permissões de script no manifesto) deve ser definido como "false" por padrão, resultando no script conteúdo apenas sendo injetado ao quadro superior da página, mas esta é simplesmente não acontece!
Por que é que está sendo injetado várias vezes? Preciso definir fisicamente "all_frames" para falsa?
Em segundo lugar:
Existe alguma maneira de dizer se a página que a extensão está tentando injetar o script de conteúdo para é um iframe ou superior de dentro da página "background.html"?
Eu tentei
if(window.top === window){ console.log('whatever'); }
E descobriu que ele não funciona 100% do tempo. Mesmo quando tenho que condicional em todo o resto do meu bloco de código (cerca de chrome.tabs.executeScript ()), eu ainda estou vendo o script de conteúdo injetado múltiplas vezes ....
Todas as idéias ou sugestões seria muito apreciada! :)
Solução
onUpdated
dispara cada vez que muda o estado de um guia. Isso inclui quando é Carregando e Concluído o carregamento , o que explica as muitas declarações de log.
Você precisa verificar o que mudou (o URL alterado, ele carregado, etc.) cada vez que o evento é acionado.