Descrição
Use a API offscreen para criar e gerenciar documentos fora da tela.
Permissões
offscreenPara usar a API Offscreen, declare a permissão "offscreen" no manifesto da extensão. Exemplo:
{
"name": "My extension",
...
"permissions": [
"offscreen"
],
...
}
Disponibilidade
Conceitos e uso
Os service workers não têm acesso ao DOM, e muitos sites têm políticas de segurança de conteúdo que
limitam a funcionalidade dos scripts de conteúdo. A API Offscreen permite que a extensão use APIs DOM
em um documento oculto sem interromper a experiência do usuário abrindo novas janelas ou
guias. A API runtime é a única API de extensões
compatível com documentos em segundo plano.
As páginas carregadas como documentos fora da tela são processadas de maneira diferente de outros tipos de páginas de extensão.
As permissões da extensão são transferidas para documentos invisíveis, mas com limites no acesso à API
da extensão. Por exemplo, como a API chrome.runtime é a única
API de extensões compatível com documentos offscreen, a troca de mensagens precisa ser processada
usando membros dessa API.
Estas são outras maneiras de os documentos offscreen se comportarem de maneira diferente das páginas normais:
- O URL de um documento fora da tela precisa ser um arquivo HTML estático agrupado com a extensão.
- Não é possível focar documentos fora da tela.
- Um documento fora da tela é uma instância de
window, mas o valor da propriedadeopeneré semprenull. - Embora um pacote de extensão possa conter vários documentos fora da tela, uma extensão instalada só pode ter um aberto por vez. Se a extensão estiver sendo executada no modo dividido com um perfil anônimo ativo, os perfis normal e anônimo poderão ter um documento fora da tela cada um.
Use chrome.offscreen.createDocument() e
chrome.offscreen.closeDocument() para criar e fechar um documento
fora da tela. createDocument() exige o url do documento, um motivo e uma justificativa:
chrome.offscreen.createDocument({
url: 'off_screen.html',
reasons: ['CLIPBOARD'],
justification: 'reason for needing the document',
});
Motivos
Para conferir uma lista de motivos válidos, consulte a seção Motivos. Os motivos são definidos durante a
criação do documento para determinar a vida útil dele. O motivo AUDIO_PLAYBACK define o fechamento do documento após 30 segundos sem reprodução de áudio. Todos os outros motivos não definem limites de duração.
Exemplos
Manter o ciclo de vida de um documento fora da tela
O exemplo a seguir mostra como garantir que um documento fora da tela exista. A função
setupOffscreenDocument() chama runtime.getContexts() para encontrar
um documento invisível existente ou cria o documento se ele ainda não existir.
let creating; // A global promise to avoid concurrency issues
async function setupOffscreenDocument(path) {
// Check all windows controlled by the service worker to see if one
// of them is the offscreen document with the given path
const offscreenUrl = chrome.runtime.getURL(path);
const existingContexts = await chrome.runtime.getContexts({
contextTypes: ['OFFSCREEN_DOCUMENT'],
documentUrls: [offscreenUrl]
});
if (existingContexts.length > 0) {
return;
}
// create offscreen document
if (creating) {
await creating;
} else {
creating = chrome.offscreen.createDocument({
url: path,
reasons: ['CLIPBOARD'],
justification: 'reason for needing the document',
});
await creating;
creating = null;
}
}
Antes de enviar uma mensagem para um documento fora da tela, chame setupOffscreenDocument() para garantir
que o documento exista, como demonstrado no exemplo a seguir.
chrome.action.onClicked.addListener(async () => {
await setupOffscreenDocument('off_screen.html');
// Send message to offscreen document
chrome.runtime.sendMessage({
type: '...',
target: 'offscreen',
data: '...'
});
});
Para exemplos completos, consulte as demonstrações offscreen-clipboard e offscreen-dom no GitHub.
Antes do Chrome 116: verificar se um documento fora da tela está aberto
O runtime.getContexts() foi adicionado no Chrome 116. Em versões anteriores do
Chrome, use clients.matchAll()
para verificar se há um documento fora da tela:
async function hasOffscreenDocument() {
if ('getContexts' in chrome.runtime) {
const contexts = await chrome.runtime.getContexts({
contextTypes: ['OFFSCREEN_DOCUMENT'],
documentUrls: [OFFSCREEN_DOCUMENT_PATH]
});
return Boolean(contexts.length);
} else {
const matchedClients = await clients.matchAll();
return matchedClients.some(client => {
return client.url.includes(chrome.runtime.id);
});
}
}
Tipos
CreateParameters
Propriedades
-
justificativa
string
Uma string fornecida pelo desenvolvedor que explica, em mais detalhes, a necessidade do contexto em segundo plano. O user agent _pode_ usar isso na exibição para o usuário.
-
motivos
Motivo[]
O motivo pelo qual a extensão está criando o documento fora da tela.
-
url
string
O URL (relativo) a ser carregado no documento.
Reason
Enumeração
"TESTING"
Um motivo usado apenas para fins de teste.
"AUDIO_PLAYBACK"
Especifica que o documento fora da tela é responsável pela reprodução de áudio.
"IFRAME_SCRIPTING"
Especifica que o documento fora da tela precisa incorporar e criar um script de iframe para modificar o conteúdo dele.
"DOM_SCRAPING"
Especifica que o documento fora da tela precisa incorporar um iframe e extrair o DOM dele para extrair informações.
"BLOBS"
Especifica que o documento fora da tela precisa interagir com objetos Blob (incluindo URL.createObjectURL()).
"DOM_PARSER"
Especifica que o documento offscreen precisa usar a API DOMParser.
"USER_MEDIA"
Especifica que o documento fora da tela precisa interagir com fluxos de mídia do usuário (por exemplo, getUserMedia()).
"DISPLAY_MEDIA"
Especifica que o documento fora da tela precisa interagir com streams de mídia de mídia de display (por exemplo, getDisplayMedia()).
"WEB_RTC"
Especifica que o documento offscreen precisa usar as APIs WebRTC.
"CLIPBOARD"
Especifica que o documento fora da tela precisa interagir com a API Clipboard.
"LOCAL_STORAGE"
Especifica que o documento fora da tela precisa de acesso ao localStorage.
"WORKERS"
Especifica que o documento fora da tela precisa gerar workers.
"BATTERY_STATUS"
Especifica que o documento fora da tela precisa usar navigator.getBattery.
"MATCH_MEDIA"
Especifica que o documento offscreen precisa usar window.matchMedia.
"GEOLOCATION"
Especifica que o documento fora da tela precisa usar navigator.geolocation.
Métodos
closeDocument()
chrome.offscreen.closeDocument(): Promise<void>
Fecha o documento fora da tela aberto no momento para a extensão.
Retorna
-
Promessa<void>
Promessa que é resolvida quando o documento fora da tela é fechado.
createDocument()
chrome.offscreen.createDocument(
parameters: CreateParameters,
): Promise<void>
Cria um novo documento offscreen para a extensão.
Parâmetros
-
parâmetros
Os parâmetros que descrevem o documento fora da tela a ser criado.
Retorna
-
Promessa<void>
Promessa que é resolvida quando o documento fora da tela é criado e conclui o carregamento inicial da página.