/ / Extensão do Chrome: Background.js “Uncaught TypeError” ao tentar obter o url da guia - javascript, google-chrome, google-chrome-extension

Extensão do Chrome: Background.js "TypeError não detectado" ao tentar obter o URL da guia - javascript, google-chrome, google-chrome-extension

Estou recebendo o seguinte aviso / erro de minha extensão ao abrir a ferramenta de depuração (todos os códigos a seguir funcionam perfeitamente, mas está gerando este erro):

TypeError não capturado: não é possível ler a propriedade "onUpdated" de undefined

No meu código abaixo, estou tentando obter o URL da guia atual para o navegador. (Este é um script background.js)

chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab) {
chrome.tabs.getSelected(null,function(tab) {
var tablink = tab.url;
console.log("Website: " + tablink);
});
});

O script acima é meu script de plano de fundo, chamado do manifesto

"background": {
"scripts": ["background.js"]
},

Minha pergunta agora é: por que ocorre um erro quando o código funciona? O erro é exibido no "debugging / inspect-element" do cromo. Como posso remover esse chamado "erro" da depuração?

EDITAR Depois de usar uma chamada "whoami" do script de conteúdo para o script de plano de fundo, recebo o seguinte erro no script de plano de fundo.

providing tab information background.js:3 Error in event handler for runtime.onMessage: Cannot read property "url" of undefined Stack trace: TypeError: Cannot read property "url" of undefined at chrome-extension://hejlnkjmnpomhknnbfjdfnablcmkloid/background.js:4:41 at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14) at EventImpl.dispatchToListener (extensions::event_bindings:397:22) at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14) at Event.publicClass.(anonymous function) [as dispatchToListener] (extensions::utils:89:26) at EventImpl.dispatch_ (extensions::event_bindings:379:35) at EventImpl.dispatch (extensions::event_bindings:403:17) at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14) at Event.publicClass.(anonymous function) [as dispatch] (extensions::utils:89:26) at messageListener (extensions::messaging:190:29) extensions::uncaught_exception_handler:9

Respostas:

1 para resposta № 1

Não sei diretamente por que seu código não funciona, mas:

Primeiro, getSelected agora está obsoleto, consulte o documento https://developer.chrome.com/extensions/tabs#method-getSelected e use tabs.query {active: true};)

Em segundo lugar, aqui há "um tipo de" ambigüidade "na qual a variável" tab "é usada quando você escreve" tab.url "é aquela de getSelected ou do evento Atualizado? (Se for o último, getSelected é inútil )


3 para resposta № 2

Existem alguns pequenos defeitos em seu arquivo de manifesto. Os arquivos de script que você usa em seu pop-up ou página de opções não devem ser declarados como scripts de conteúdo. Incluí-los em seus respectivos arquivos html é suficiente (o que você já está fazendo), considerando que não está planejando injetá-los em outras páginas da web externas.

Popup e páginas de opções não são scripts de conteúdo. Eles têm o privilégio de usar as APIs do Chrome da mesma forma que os scripts de segundo plano.

Os scripts de conteúdo são injetados em outros sites. Se você realmente pretende fazer isso, provavelmente também deve incluir a propriedade "run_at". Então, novamente, depende do que você deseja fazer com ele.

"content_scripts": [{
"matches": ["http://*/*","https://*/*"],
"js": ["jquery.js","chat.js","options.js"],
"run_at": "document_end"
}]

No entanto, os scripts de conteúdo não têm o privilégiopara acessar a API de guias. Usar seus scripts de plano de fundo simultaneamente como scripts de conteúdo leva a esses erros de tipo e pode eventualmente interromper sua extensão, mas ainda pode parecer que sua extensão está funcionando - no escopo dos scripts de plano de fundo (pop-up, opções), pelo menos.

Separe estritamente os scripts de fundo e conteúdo. Se você não precisar injetar código em outros sites, sugiro que você remova-o junto com as permissões - o aviso de permissão ao instalar sua extensão seria desnecessariamente exigente se você pedir permissão para ler e modificar os dados do usuário em todos os sites, de qualquer forma.