Descrição
Use a API chrome.scripting para executar scripts em contextos diferentes.
Permissões
scriptingDisponibilidade
Manifesto
Para usar a API chrome.scripting, declare a permissão "scripting" no manifesto, além das permissões de host para as páginas em que os scripts serão injetados. Use a chave "host_permissions" ou a permissão "activeTab", que concede permissões temporárias de host. O exemplo a seguir usa a permissão "activeTab".
{
  "name": "Scripting Extension",
  "manifest_version": 3,
  "permissions": ["scripting", "activeTab"],
  ...
}
Conceitos e uso
É possível usar a API chrome.scripting para injetar JavaScript e CSS em sites. Isso é semelhante ao que você pode fazer com scripts de conteúdo. Mas, ao usar o namespace chrome.scripting, as extensões
podem tomar decisões durante a execução.
Destinos de injeção
É possível usar o parâmetro target para especificar um destino em que injetar JavaScript ou CSS.
O único campo obrigatório é tabId. Por padrão, uma injeção é executada no
frame principal da guia especificada.
function getTabId() { ... }
chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      files : [ "script.js" ],
    })
    .then(() => console.log("script injected"));
Para executar em todos os frames da guia especificada, defina o booleano allFrames
como true.
function getTabId() { ... }
chrome.scripting
    .executeScript({
      target : {tabId : getTabId(), allFrames : true},
      files : [ "script.js" ],
    })
    .then(() => console.log("script injected in all frames"));
Também é possível injetar em frames específicos de uma guia especificando IDs de frame individuais. Para mais informações sobre IDs de frame, consulte a API chrome.webNavigation.
function getTabId() { ... }
chrome.scripting
    .executeScript({
      target : {tabId : getTabId(), frameIds : [ frameId1, frameId2 ]},
      files : [ "script.js" ],
    })
    .then(() => console.log("script injected on target frames"));
Código injetado
As extensões podem especificar o código a ser injetado usando um arquivo externo ou uma variável de tempo de execução.
Arquivos
Os arquivos são especificados como strings que são caminhos relativos ao diretório
raiz da extensão. O código a seguir vai injetar o arquivo script.js no frame principal da guia.
function getTabId() { ... }
chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      files : [ "script.js" ],
    })
    .then(() => console.log("injected script file"));
Funções de tempo de execução
Ao injetar JavaScript com scripting.executeScript(), é possível especificar uma
função a ser executada em vez de um arquivo. Essa função precisa ser uma variável de função disponível para o contexto de extensão atual.
function getTabId() { ... }
function getTitle() { return document.title; }
chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      func : getTitle,
    })
    .then(() => console.log("injected a function"));
function getTabId() { ... }
function getUserColor() { ... }
function changeBackgroundColor() {
  document.body.style.backgroundColor = getUserColor();
}
chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      func : changeBackgroundColor,
    })
    .then(() => console.log("injected a function"));
Você pode solucionar esse problema usando a propriedade args:
function getTabId() { ... }
function getUserColor() { ... }
function changeBackgroundColor(backgroundColor) {
  document.body.style.backgroundColor = backgroundColor;
}
chrome.scripting
    .executeScript({
      target : {tabId : getTabId()},
      func : changeBackgroundColor,
      args : [ getUserColor() ],
    })
    .then(() => console.log("injected a function"));
Strings de tempo de execução
Se você estiver injetando CSS em uma página, também poderá especificar uma string a ser usada na propriedade
css. Essa opção está disponível apenas para scripting.insertCSS(). Não é possível executar uma string usando scripting.executeScript().
function getTabId() { ... }
const css = "body { background-color: red; }";
chrome.scripting
    .insertCSS({
      target : {tabId : getTabId()},
      css : css,
    })
    .then(() => console.log("CSS injected"));
Processar os resultados
Os resultados da execução do JavaScript são transmitidos para a extensão. Um único resultado é incluído por frame. O frame principal é garantido como o primeiro índice na matriz resultante. Todos os outros frames estão em uma ordem não determinista.
function getTabId() { ... }
function getTitle() { return document.title; }
chrome.scripting
    .executeScript({
      target : {tabId : getTabId(), allFrames : true},
      func : getTitle,
    })
    .then(injectionResults => {
      for (const {frameId, result} of injectionResults) {
        console.log(`Frame ${frameId} result:`, result);
      }
    });
scripting.insertCSS() não retorna nenhum resultado.
Promessas
Se o valor resultante da execução do script for uma promessa, o Chrome vai aguardar a conclusão da promessa e retornar o valor resultante.
function getTabId() { ... }
async function addIframe() {
  const iframe = document.createElement("iframe");
  const loadComplete =
      new Promise(resolve => iframe.addEventListener("load", resolve));
  iframe.src = "https://example.com";
  document.body.appendChild(iframe);
  await loadComplete;
  return iframe.contentWindow.document.title;
}
chrome.scripting
    .executeScript({
      target : {tabId : getTabId(), allFrames : true},
      func : addIframe,
    })
    .then(injectionResults => {
      for (const frameResult of injectionResults) {
        const {frameId, result} = frameResult;
        console.log(`Frame ${frameId} result:`, result);
      }
    });
Exemplos
Cancelar o registro de todos os scripts de conteúdo dinâmico
O snippet a seguir contém uma função que cancela o registro de todos os scripts de conteúdo dinâmico que a extensão registrou anteriormente.
async function unregisterAllDynamicContentScripts() {
  try {
    const scripts = await chrome.scripting.getRegisteredContentScripts();
    const scriptIds = scripts.map(script => script.id);
    return chrome.scripting.unregisterContentScripts({ ids: scriptIds });
  } catch (error) {
    const message = [
      "An unexpected error occurred while",
      "unregistering dynamic content scripts.",
    ].join(" ");
    throw new Error(message, {cause : error});
  }
}
Para testar a API chrome.scripting,
instale a amostra de script do repositório Amostras de extensões do Chrome.
Tipos
ContentScriptFilter
Propriedades
- 
    idsstring[] opcional Se especificado, getRegisteredContentScriptsvai retornar apenas scripts com um ID especificado nessa lista.
CSSInjection
Propriedades
- 
    cssstring opcional Uma string que contém o CSS a ser injetado. É preciso especificar exatamente um entre filesecss.
- 
    arquivosstring[] opcional O caminho dos arquivos CSS a serem injetados, relativo ao diretório raiz da extensão. É preciso especificar exatamente um entre filesecss.
- 
    origemStyleOrigin opcional A origem do estilo para a injeção. O valor padrão é 'AUTHOR'.
- 
    targetDetalhes que especificam o destino em que o CSS será inserido. 
ExecutionWorld
O mundo JavaScript em que um script é executado.
Enumeração
"ISOLATED" 
 Especifica o mundo isolado, que é o ambiente de execução exclusivo dessa extensão.
"MAIN" 
 Especifica o mundo principal do DOM, que é o ambiente de execução compartilhado com o JavaScript da página host.
InjectionResult
Propriedades
- 
    documentIdstring Chrome 106 ou mais recenteO documento associado à injeção. 
- 
    frameIdnúmero Chrome 90 ou mais recenteO frame associado à injeção. 
- 
    resultadoqualquer opcional O resultado da execução do script. 
InjectionTarget
Propriedades
- 
    allFramesbooleano opcional Define se o script deve ser injetado em todos os frames da guia. O padrão é "false". Não pode ser verdadeiro se frameIdsfor especificado.
- 
    documentIdsstring[] opcional Chrome 106 ou mais recenteOs IDs de documentIds específicos a serem injetados. Não pode ser definido se frameIdsestiver definido.
- 
    frameIdsnumber[] opcional Os IDs de frames específicos para inserir. 
- 
    tabIdnúmero O ID da guia em que será feita a injeção. 
RegisteredContentScript
Propriedades
- 
    allFramesbooleano opcional Se for especificado como "true", ele será injetado em todos os frames, mesmo que o frame não seja o mais alto na guia. Cada frame é verificado de forma independente quanto aos requisitos de URL. Ele não será injetado em frames filhos se os requisitos de URL não forem atendidos. O padrão é "false", o que significa que apenas o frame superior é correspondido. 
- 
    cssstring[] opcional A lista de arquivos CSS a serem injetados em páginas correspondentes. Eles são injetados na ordem em que aparecem nessa matriz, antes que qualquer DOM seja construído ou exibido para a página. 
- 
    excludeMatchesstring[] opcional Exclui páginas em que o script de conteúdo seria injetado. Consulte Padrões de correspondência para mais detalhes sobre a sintaxe dessas strings. 
- 
    IDstring O ID do script de conteúdo, especificado na chamada de API. Não pode começar com um "_", já que ele é reservado como prefixo para IDs de script gerados. 
- 
    jsstring[] opcional A lista de arquivos JavaScript a serem injetados nas páginas correspondentes. Eles são injetados na ordem em que aparecem nessa matriz. 
- 
    matchOriginAsFallbackbooleano opcional Chrome 119+Indica se o script pode ser injetado em frames em que o URL contém um esquema não compatível, especificamente: about:, data:, blob: ou filesystem:. Nesses casos, a origem do URL é verificada para determinar se o script deve ser injetado. Se a origem for null(como no caso de URLs de dados), a origem usada será o frame que criou o frame atual ou o frame que iniciou a navegação até ele. Essa não é necessariamente a frame mãe.
- 
    correspondênciasstring[] opcional Especifica em quais páginas o script de conteúdo será injetado. Consulte Padrões de correspondência para mais detalhes sobre a sintaxe dessas strings. Precisa ser especificado para registerContentScripts.
- 
    persistAcrossSessionsbooleano opcional Especifica se este script de conteúdo vai persistir em sessões futuras. O padrão é verdadeiro. 
- 
    runAtRunAt opcional Especifica quando os arquivos JavaScript são injetados na página da Web. O valor preferido e padrão é document_idle.
- 
    mundoExecutionWorld opcional Chrome 102 ou mais recenteO "mundo" do JavaScript em que o script será executado. O valor padrão é ISOLATED.
ScriptInjection
Propriedades
- 
    argsany[] opcional Chrome 92 ou mais recenteOs argumentos a serem transmitidos para a função fornecida. Isso só é válido se o parâmetro funcfor especificado. Esses argumentos precisam ser serializáveis em JSON.
- 
    arquivosstring[] opcional O caminho dos arquivos JS ou CSS a serem injetados, relativo ao diretório raiz da extensão. É preciso especificar exatamente um de filesoufunc.
- 
    injectImmediatelybooleano opcional Chrome 102 ou mais recenteSe a injeção deve ser acionada no destino assim que possível. Isso não garante que a injeção vai ocorrer antes do carregamento da página, já que ela pode ter sido carregada quando o script atingir o destino. 
- 
    targetDetalhes que especificam o destino em que o script será injetado. 
- 
    mundoExecutionWorld opcional Chrome 95+O "mundo" do JavaScript em que o script será executado. O valor padrão é ISOLATED.
- 
    funcvoid optional Chrome 92 ou mais recenteUma função JavaScript a ser injetada. Essa função será serializada e desserializada para injeção. Isso significa que todos os parâmetros vinculados e o contexto de execução serão perdidos. É preciso especificar exatamente um de filesoufunc.A função funcé assim:() => {...}
StyleOrigin
A origem de uma mudança de estilo. Consulte origens de estilo para mais informações.
Enumeração
"AUTHOR" 
 
"USER" 
 
Métodos
executeScript()
chrome.scripting.executeScript(
injection: ScriptInjection,
): Promise<InjectionResult[]>
Injeta um script em um contexto de destino. Por padrão, o script será executado em document_idle ou imediatamente se a página já tiver sido carregada. Se a propriedade injectImmediately estiver definida, o script será injetado sem esperar, mesmo que a página não tenha terminado de carregar. Se o script for avaliado como uma promessa, o navegador vai aguardar a conclusão da promessa e retornar o valor resultante.
Parâmetros
- 
    InjeçãoOs detalhes do script a ser injetado. 
Retorna
- 
            Promise<InjectionResult[]> Chrome 90 ou mais recente
getRegisteredContentScripts()
chrome.scripting.getRegisteredContentScripts(
filter?: ContentScriptFilter,
): Promise<RegisteredContentScript[]>
Retorna todos os scripts de conteúdo registrados dinamicamente para esta extensão que correspondem ao filtro especificado.
Parâmetros
- 
    filtrarContentScriptFilter opcional Um objeto para filtrar os scripts registrados dinamicamente da extensão. 
Retorna
- 
            Promise<RegisteredContentScript[]> 
insertCSS()
chrome.scripting.insertCSS(
injection: CSSInjection,
): Promise<void>
Insere uma folha de estilos CSS em um contexto de destino. Se vários frames forem especificados, as injeções sem sucesso serão ignoradas.
Parâmetros
- 
    InjeçãoOs detalhes dos estilos a serem inseridos. 
Retorna
- 
            Promise<void> Chrome 90 ou mais recente
registerContentScripts()
chrome.scripting.registerContentScripts(
scripts: RegisteredContentScript[],
): Promise<void>
Registra um ou mais scripts de conteúdo para esta extensão.
Parâmetros
- 
    scriptsContém uma lista de scripts a serem registrados. Se houver erros durante a análise do script/validação de arquivo ou se os IDs especificados já existirem, nenhum script será registrado. 
Retorna
- 
            Promise<void> 
removeCSS()
chrome.scripting.removeCSS(
injection: CSSInjection,
): Promise<void>
Remove uma folha de estilo CSS que foi inserida anteriormente por essa extensão de um contexto de destino.
Parâmetros
- 
    InjeçãoOs detalhes dos estilos a serem removidos. As propriedades css,fileseoriginprecisam corresponder exatamente à folha de estilo inserida porinsertCSS. A tentativa de remover uma folha de estilo inexistente não causa nenhum efeito.
Retorna
- 
            Promise<void> 
unregisterContentScripts()
chrome.scripting.unregisterContentScripts(
filter?: ContentScriptFilter,
): Promise<void>
Cancela o registro de scripts de conteúdo para esta extensão.
Parâmetros
- 
    filtrarContentScriptFilter opcional Se especificado, cancela apenas o registro dos scripts de conteúdo dinâmico que correspondem ao filtro. Caso contrário, todos os scripts de conteúdo dinâmico da extensão serão cancelados. 
Retorna
- 
            Promise<void> 
updateContentScripts()
chrome.scripting.updateContentScripts(
scripts: RegisteredContentScript[],
): Promise<void>
Atualiza um ou mais scripts de conteúdo para essa extensão.
Parâmetros
- 
    scriptsContém uma lista de scripts a serem atualizados. Uma propriedade só é atualizada para o script atual se for especificada neste objeto. Se houver erros durante a análise do script/validação do arquivo ou se os IDs especificados não corresponderem a um script totalmente registrado, nenhum script será atualizado. 
Retorna
- 
            Promise<void>