Descrição
Use a API chrome.mimeHandler para processar streams de tipo MIME em extensões de terceiros.
Disponibilidade
Manifesto
Conceitos e uso
Historicamente, as extensões de terceiros que processam tipos de documentos específicos (como leitores de PDF) dependiam da interceptação de solicitações de rede para capturar navegações e redirecionar os usuários para uma página de extensão. O registro como um gerenciador de MIME evita várias limitações dessa abordagem:
- O URL de origem permanece na barra de endereço em vez de ser substituído por um URL do
chrome-extension://. - A extensão busca a resposta que o Chrome já recebeu, em vez de fazer uma segunda solicitação de rede. Os documentos enviados por solicitações POST ou de URLs de uso único funcionam corretamente.
- Sua extensão pode renderizar documentos carregados em elementos
<embed>,<object>ou<iframe>. - Os arquivos locais (URLs
file://) funcionam sem que o usuário precise ativar manualmente a opção "Permitir acesso a URLs de arquivo" nas configurações da extensão.
Os gerenciadores de MIME se aplicam apenas a documentos que ocupam um frame inteiro: navegações de nível superior e documentos incorporados. Eles nunca se aplicam a sub-recursos inline (por exemplo, elementos <audio>, <img> ou <video>).
Registrar um gerenciador
Para registrar sua extensão como um gerenciador de MIME, declare a chave "mime_types_handler" no manifesto. Cada entrada mapeia um tipo MIME para a página de extensão que o renderiza:
manifest.json:
{
"name": "My PDF Viewer",
...
"mime_types_handler": {
"application/pdf": {
"handler_url": "viewer.html",
"can_embed": true
}
},
...
}
Defina "can_embed" como true para também processar documentos incorporados em elementos <embed>, <object> ou <iframe>. Se omitido, o gerenciador só vai receber navegações de nível superior. A partir do Chrome 151, application/pdf é o único tipo MIME disponível para gerenciadores públicos. Declarar um tipo MIME não compatível causa um aviso de instalação.
Se mais de uma extensão instalada se registrar para o mesmo tipo MIME, a extensão instalada mais recentemente vai processá-lo. Se essa extensão for desinstalada, o gerenciador instalado anteriormente será reativado.
Recuperar informações do stream
Quando um usuário abre um documento de um tipo MIME registrado, o Chrome carrega sua página de gerenciador no lugar do visualizador integrado. Na página do gerenciador, chame getStreamInfo() para recuperar um objeto StreamInfo. Isso inclui o originalUrl acessado pelo usuário, o responseHeaders HTTP, se o documento é carregado em um contexto embedded e um streamUrl que pode ser usado para buscar o conteúdo do documento.
O streamUrl pode ser buscado exatamente uma vez e apenas na origem da extensão. Leia a resposta completa antes de processá-la. Uma segunda busca do mesmo streamUrl vai falhar. Use originalUrl ao exibir o local ou o título do documento, não para buscar o conteúdo, porque a solicitação original pode não ser repetível.
Voltar para o gerenciador nativo
O gerenciador pode encontrar documentos que não podem ser renderizados, como arquivos corrompidos ou protegidos por senha. Chame abortAndFallbackToNativeHandler() para interromper o processamento do documento e devolvê-lo ao visualizador integrado do Chrome, em vez de deixar o usuário em uma página corrompida. O Chrome descarrega a página do gerenciador como parte do substituto. Nenhum código é executado após essa chamada.
O Chrome armazena a resposta em buffer enquanto o gerenciador é executado. Se a resposta tiver sido totalmente recebida quando você chamar esse método, o Chrome vai exibir o visualizador integrado da cópia em buffer sem uma nova solicitação de rede. Caso contrário, o Chrome vai recarregar o documento da rede, o que pode falhar para documentos enviados por POST ou de URLs de uso único. Busque o stream completamente antes de decidir se ele pode ser renderizado. Quando a busca de streamUrl for concluída, o Chrome terá a resposta completa.
Processar a disponibilidade da API
Nas versões do Chrome anteriores à 151, uma extensão que declara "mime_types_handler" ainda é instalada e executada, mas não é registrada como um gerenciador, e browser.mimeHandler fica indefinido. As extensões que estão migrando da interceptação de solicitações de rede podem verificar a API na inicialização e manter a abordagem atual como substituta:
service-worker.js:
if (browser.mimeHandler) {
// Chrome routes registered MIME types to the handler page
// declared in the manifest.
} else {
// Fall back to network request interception.
}
Exemplos
Processar um stream
O exemplo a seguir é executado na página do gerenciador declarada no manifesto. Ele busca o conteúdo do documento e, se a renderização falhar, usa o visualizador integrado do Chrome:
viewer.js:
async function loadDocument() {
const streamInfo = await browser.mimeHandler.getStreamInfo();
// The `embedded` property is true if the document is loaded
// within an <embed>, <object>, or <iframe> element.
if (streamInfo.embedded) {
// Adjust the UI (e.g., hide the top navigation bar).
document.body.classList.add('embedded-view');
}
// Fetch the content using the provided streamUrl. The stream can
// only be consumed once, so read it fully before continuing.
const response = await fetch(streamInfo.streamUrl);
const data = await response.arrayBuffer();
try {
// Render the document (e.g., using PDF.js).
await renderDocument(data);
} catch (e) {
// Can't render this document. Fall back to Chrome's built-in
// viewer; the page unloads and no code runs after this call.
browser.mimeHandler.abortAndFallbackToNativeHandler();
}
}
loadDocument();
Permitir que os usuários alternem o processamento
As opções de gerenciador são armazenadas por tipo MIME. O exemplo a seguir usa getMimeHandlerOptions() e setMimeHandlerOptions() para permitir que os usuários desativem o processamento na página de opções, sem desinstalar a extensão. Enquanto o processamento estiver desativado, os documentos desse tipo não serão mais encaminhados para sua extensão.
options.js:
const checkbox = document.querySelector('#handle-pdfs');
async function initOptions() {
const options =
await browser.mimeHandler.getMimeHandlerOptions('application/pdf');
// Handling is enabled unless it has been explicitly disabled.
checkbox.checked = options.enabled !== false;
}
checkbox.addEventListener('change', async () => {
await browser.mimeHandler.setMimeHandlerOptions('application/pdf', {
enabled: checkbox.checked
});
});
initOptions();
Tipos
MimeHandlerOptions
Propriedades
-
canEmbed
booleano opcional
Chrome 157 ou mais recenteSe esse gerenciador pode ser usado para carregamentos incorporados (iframe, embed, object). O padrão é o valor
can_embedda entrada do manifesto. Não tem efeito enquantoenabledé falso. -
ativado
booleano opcional
Indica se esse gerenciador está ativado. O padrão é o valor
enabledda entrada do manifesto.
StreamInfo
Propriedades
-
incorporado
booleano
Verdadeiro se carregado em um contexto incorporado (iframe/embed/object).
-
mimeType
string
O tipo MIME do conteúdo interceptado.
-
originalUrl
string
O URL de origem que o usuário acessou.
-
responseHeaders
objeto
Cabeçalhos de resposta HTTP como pares de chave-valor.
-
streamUrl
string
O URL para buscar os dados do stream.
-
tabId
número
O ID da guia que contém o documento.
Métodos
abortAndFallbackToNativeHandler()
chrome.mimeHandler.abortAndFallbackToNativeHandler(): Promise<void>
Cancela o processamento do stream atual e entrega o conteúdo ao gerenciador nativo do user agent. Depois dessa chamada, o frame da extensão será desativado. Os autores da chamada não devem esperar mais execuções.
Retorna
-
Promessa<void>
getMimeHandlerOptions()
chrome.mimeHandler.getMimeHandlerOptions(
mimeType: string,
): Promise<MimeHandlerOptions>
Lê as opções de um tipo MIME. Cada membro é o valor definido pela extensão ou o valor da entrada do manifesto, se a extensão não o tiver definido.
Parâmetros
-
mimeType
string
O tipo MIME com as opções a serem lidas. Precisa ser um tipo MIME que a extensão processa usando mime_types_handler.
Retorna
-
Promise<MimeHandlerOptions>
Promessa resolvida com as opções para o tipo MIME.
getStreamInfo()
chrome.mimeHandler.getStreamInfo(): Promise<StreamInfo>
Recupera informações de stream para o contexto atual do gerenciador de MIME. Precisa ser chamado em uma página de extensão do gerenciador de MIME.
Retorna
-
Promise<StreamInfo>
setMimeHandlerOptions()
chrome.mimeHandler.setMimeHandlerOptions(
mimeType: string,
options: MimeHandlerOptions,
): Promise<void>
Define as opções de configuração para um tipo MIME especificado. Se a extensão for executada no modo de navegação anônima dividido, as opções definidas na navegação anônima serão aplicadas apenas a ela e vão durar até o fim da sessão de navegação anônima. As opções não definidas na navegação anônima seguem os valores definidos fora dela.
Parâmetros
-
mimeType
string
O tipo MIME a ser configurado. Precisa ser um tipo MIME que a extensão processa usando mime_types_handler.
-
opções
As opções para mudar.
Retorna
-
Promessa<void>
Promessa resolvida quando a configuração é definida.