ti-enxame.com

chrome.tabs retorna indefinido no script de conteúdo

o chrome.tabs retorna indefinido, apesar de eu definir guias no bloco de permissões.

"permissions": [
    "tabs",
    "http://*/*",
    "https://*/*"
],
"content_scripts": [
    {
        "matches": [
            "http://*/*",
            "https://*/*"
        ],
        "js": [
            "js/myScript.js"
        ],
        "all_frames": true
    }
],

Mas no myScript.js o seguinte retorna indefinido.

chrome.tabs   
33
Guy Korland

Como o script de conteúdo tem suas próprias limitações,

chrome.tabs está disponível apenas em scripts em segundo plano e scripts pop-up.

Se você quiser usar chrome.tabs passe a mensagem do content_script para o script em segundo plano e jogue com chrome.tabs.

56
Raghvendra Parashar

Scripts de conteúdo têm acesso limitado apenas às APIs do Chrome. Esse acesso não inclui a API que você está tentando usar (por exemplo, chrome.tabs). Se você precisar usar essa API, precisará fazê-lo em um script em segundo plano1 1.

Conforme listado na documentação dos scripts de conteúdo , as APIs disponíveis para um script de conteúdo são [Coloquei métodos obsoletos em tachado formato]:

Algumas das APIs listadas estão obsoletas e já estão há algum tempo. Aqueles que foram descontinuados foram movidos para locais diferentes (também listados acima):

Embora não esteja oficialmente obsoleto, extension.lastError também está disponível como runtime.lastError . Neste ponto, geralmente é referido nesse local:

Particione sua extensão em scripts em segundo plano e scripts de conteúdo

Você precisará separar seu código no que precisa estar em um script em segundo plano e no que precisa estar em scripts de conteúdo, com base nos recursos disponíveis para cada tipo de script. Os scripts de conteúdo têm acesso ao DOM da página da web na qual eles são injetados, mas acesso limitado às APIs de extensão. Os scripts em segundo plano têm acesso total às APIs de extensão, mas não têm acesso ao conteúdo da página da web. Você deve ler a Visão geral da extensão do Chrome e as páginas vinculadas a partir daí, para ter uma idéia de qual funcionalidade deve estar localizada em qual tipo de script.

É comum precisar se comunicar entre os scripts de conteúdo e os scripts em segundo plano. Para fazer isso, você pode usar mensagem passando . Isso permite que você comunique informações entre os dois scripts para realizar coisas que não são possíveis usando apenas um tipo de script. Por exemplo, em seu script de conteúdo, você pode precisar de informações que estão disponíveis apenas em uma das outras APIs Chrome, ou precisa de algo que possa ser feito de maneira mais apropriada (ou apenas) por meio de uma das outras Chrome. Nesses casos, você precisará enviar uma mensagem para o script em segundo plano, usando chrome.runtime.sendMessage() , para informar o que precisa ser feito, fornecendo informações suficientes para que seja possível. Seu script em segundo plano pode retornar as informações desejadas, se houver, para o script de conteúdo. Como alternativa, você terá momentos em que o processamento será realizado principalmente no script em segundo plano. O script em segundo plano pode injetar um script de conteúdo, ou apenas enviar uma mensagem para um script já injetado, para obter informações de uma página ou fazer alterações na página da Web.


  1. Script de segundo plano significa qualquer script que esteja no contexto de segundo plano. Além dos scripts background reais , isso inclui páginas pop-up e opções, etc. No entanto, a única página que você pode ter certeza de ter disponível de forma consistente para receber mensagens de um conteúdo script são seus background scripts definidos em manifest.json . Outras páginas podem estar disponíveis em alguns momentos como resultado da interação do usuário com o navegador, mas elas não estão disponíveis de forma consistente.

Esta resposta foi movida de pergunta duplicada e depois modificada.

8
Makyen

https://developer.chrome.com/extensions/tabs#method-getSelected mostra

getSelected

chrome.tabs.getSelected (número inteiro windowId, função de retorno de chamada)
Descontinuado desde Chrome 33). Use tabs.query {active: true}.
Obtém a guia selecionada na janela especificada.

Talvez você deva usar chrome.tabs.query em popup.js como este

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
    console.log(tabs[0].url);
});

, recarregue sua extensão e verifique o resultado no elemento de inspeção da sua extensão.

imagem do resultado

imagem de código

https://developer.chrome.com/extensions/tabs#type-Tab mostra que O URL que a guia está exibindo. Essa propriedade está presente apenas se o manifesto da extensão incluir a permissão "guias". (Apenas para lembrar que alguém esqueceu. Eu a esqueci quando a testei.)

1
真能逗我笑