Beschreibung
Verwenden Sie die chrome.mimeHandler API, um MIME-Typ-Streams in Drittanbietererweiterungen zu verarbeiten.
Verfügbarkeit
Manifest
Die folgenden Schlüssel müssen im Manifest deklariert werden, um diese API zu verwenden.
"mime_types_handler"Konzepte und Verwendung
Bisher haben Erweiterungen von Drittanbietern, die bestimmte Dokumenttypen verarbeiten (z. B. PDF-Viewer), das Abfangen von Netzwerkanfragen genutzt, um Navigationen zu erfassen und Nutzer auf eine Erweiterungsseite weiterzuleiten. Durch die Registrierung als MIME-Handler werden mehrere Einschränkungen dieses Ansatzes vermieden:
- Die ursprüngliche URL bleibt in der Adressleiste, anstatt durch eine
chrome-extension://-URL ersetzt zu werden. - Ihre Erweiterung ruft die Antwort ab, die Chrome bereits erhalten hat, anstatt eine zweite Netzwerkanfrage zu stellen. Dokumente, die über POST-Anfragen oder Einmal-URLs bereitgestellt werden, funktionieren ordnungsgemäß.
- Ihre Erweiterung kann Dokumente rendern, die in
<embed>-,<object>- oder<iframe>-Elementen geladen werden. - Lokale Dateien (
file://-URLs) funktionieren, ohne dass der Nutzer in den Einstellungen der Erweiterung manuell „Zugriff auf Datei-URLs zulassen“ aktivieren muss.
MIME-Handler gelten nur für Dokumente, die einen gesamten Frame belegen: Navigationen auf oberster Ebene und eingebettete Dokumente. Sie gelten nie für Inline-Unterressourcen (z.B. <audio>-, <img>- oder <video>-Elemente).
Handler registrieren
Wenn Sie Ihre Erweiterung als MIME-Handler registrieren möchten, deklarieren Sie den Schlüssel "mime_types_handler" im Manifest. Jeder Eintrag ordnet einen MIME-Typ der Erweiterungsseite zu, die ihn rendert:
manifest.json:
{
"name": "My PDF Viewer",
...
"mime_types_handler": {
"application/pdf": {
"handler_url": "viewer.html",
"can_embed": true
}
},
...
}
Setzen Sie "can_embed" auf true, um auch Dokumente zu verarbeiten, die in <embed>-, <object>- oder <iframe>-Elemente eingebettet sind. Wenn Sie ihn weglassen, empfängt Ihr Handler nur Navigationen auf oberster Ebene. Ab Chrome 151 ist application/pdf der einzige MIME-Typ, der für öffentliche Handler verfügbar ist. Wenn Sie einen nicht unterstützten MIME-Typ deklarieren, wird eine Installationswarnung angezeigt.
Wenn sich mehr als eine installierte Erweiterung für denselben MIME-Typ registriert, wird er von der zuletzt installierten Erweiterung verarbeitet. Wenn diese Erweiterung deinstalliert wird, wird der zuvor installierte Handler wieder aktiv.
Streaminformationen abrufen
Wenn ein Nutzer ein Dokument mit einem registrierten MIME-Typ öffnet, lädt Chrome die Handler-Seite anstelle des integrierten Viewers. Rufen Sie auf der Handler-Seite getStreamInfo() auf, um ein StreamInfo-Objekt abzurufen. Dazu gehören die originalUrl, die der Nutzer aufgerufen hat, die HTTP-responseHeaders, ob das Dokument in einem embedded-Kontext geladen wird, und eine streamUrl, mit der der Inhalt des Dokuments abgerufen werden kann.
Der streamUrl kann genau einmal und nur vom Ursprung Ihrer Erweiterung abgerufen werden. Lesen Sie die Antwort vollständig, bevor Sie sie verarbeiten. Ein zweiter Abruf desselben streamUrl schlägt fehl. Verwenden Sie originalUrl, wenn Sie den Speicherort oder Titel des Dokuments anzeigen, nicht um den Inhalt abzurufen, da die ursprüngliche Anfrage möglicherweise nicht wiederholt werden kann.
Fallback auf den nativen Handler
Ihr Handler kann möglicherweise auf Dokumente stoßen, die er nicht rendern kann, z. B. beschädigte oder passwortgeschützte Dateien. Rufen Sie abortAndFallbackToNativeHandler() auf, um die Verarbeitung des Dokuments zu beenden und es an den integrierten Viewer von Chrome zurückzugeben, anstatt den Nutzer auf einer fehlerhaften Seite zu belassen. Chrome entlädt die Handler-Seite im Rahmen des Fallbacks. Nach diesem Aufruf wird kein Code mehr ausgeführt.
Chrome puffert die Antwort, während der Handler ausgeführt wird. Wenn die Antwort vollständig empfangen wurde, wenn Sie diese Methode aufrufen, stellt Chrome den integrierten Viewer aus der gepufferten Kopie bereit, ohne eine neue Netzwerkanfrage zu senden. Andernfalls lädt Chrome das Dokument aus dem Netzwerk neu. Dies kann bei Dokumenten, die über POST oder von Einmal-URLs bereitgestellt werden, fehlschlagen. Rufe den Stream vollständig ab, bevor du entscheidest, ob du ihn rendern kannst. Sobald der Abruf von streamUrl abgeschlossen ist, hat Chrome die vollständige Antwort.
API-Verfügbarkeit verwalten
In Chrome-Versionen vor Chrome 151 wird eine Erweiterung, die "mime_types_handler" deklariert, weiterhin installiert und ausgeführt, aber nicht als Handler registriert und browser.mimeHandler ist nicht definiert. Erweiterungen, die von der Abfangung von Netzwerkanfragen migriert werden, können beim Start nach der API suchen und ihren vorhandenen Ansatz als Fallback beibehalten:
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.
}
Beispiele
Stream verarbeiten
Das folgende Beispiel wird auf der im Manifest deklarierten Handler-Seite ausgeführt. Sie ruft den Inhalt des Dokuments ab und greift auf den integrierten Viewer von Chrome zurück, wenn das Rendering fehlschlägt:
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();
Nutzern erlauben, die Verarbeitung zu aktivieren oder zu deaktivieren
Handler-Optionen werden pro MIME-Typ gespeichert. Im folgenden Beispiel werden getMimeHandlerOptions() und setMimeHandlerOptions() verwendet, damit Nutzer die Verarbeitung auf der Optionsseite deaktivieren können, ohne die Erweiterung zu deinstallieren. Wenn die Verarbeitung deaktiviert ist, werden Dokumente dieses Typs nicht mehr an Ihre Erweiterung weitergeleitet.
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();
Typen
MimeHandlerOptions
Attribute
-
canEmbed
Boolesch optional
Chrome 157 oder höherGibt an, ob dieser Handler für eingebettete Ladevorgänge (iframe, embed, object) verwendet werden darf. Der Standardwert ist der
can_embed-Wert des Manifesteintrags. Hat keine Auswirkungen, wennenabledauf „false“ gesetzt ist. -
aktiviert
Boolesch optional
Gibt an, ob dieser Handler aktiviert ist. Der Standardwert ist der
enabled-Wert des Manifesteintrags.
StreamInfo
Attribute
-
eingebettet
boolean
„True“, wenn in einem eingebetteten Kontext (iframe/embed/object) geladen.
-
mimeType
String
Der MIME-Typ des abgefangenen Inhalts.
-
originalUrl
String
Die ursprüngliche URL, die der Nutzer aufgerufen hat.
-
responseHeaders
Objekt
HTTP-Antwortheader als Schlüssel/Wert-Paare.
-
streamUrl
String
Die URL, von der die Streamdaten abgerufen werden sollen.
-
tabId
Zahl
Die ID des Tabs, der das Dokument enthält.
Methoden
abortAndFallbackToNativeHandler()
chrome.mimeHandler.abortAndFallbackToNativeHandler(): Promise<void>
Bricht die aktuelle Streamverarbeitung ab und übergibt den Inhalt an den nativen Handler des User-Agents. Nach diesem Aufruf wird der Erweiterungs-Frame abgebaut. Aufrufer sollten keine weitere Ausführung erwarten.
Ausgabe
-
Promise<void>
getMimeHandlerOptions()
chrome.mimeHandler.getMimeHandlerOptions(
mimeType: string,
): Promise<MimeHandlerOptions>
Liest die Optionen für einen MIME-Typ. Jedes Mitglied ist der von der Erweiterung festgelegte Wert oder der Wert des Manifesteintrags, wenn die Erweiterung ihn nicht festgelegt hat.
Parameter
-
mimeType
String
Der MIME-Typ, dessen Optionen gelesen werden sollen. Es muss sich um einen MIME-Typ handeln, den die Erweiterung über „mime_types_handler“ verarbeitet.
Ausgabe
-
Promise<MimeHandlerOptions>
Promise mit den Optionen für den MIME-Typ aufgelöst.
getStreamInfo()
chrome.mimeHandler.getStreamInfo(): Promise<StreamInfo>
Ruft Streaminformationen für den aktuellen MIME-Handler-Kontext ab. Muss von einer MIME-Handler-Erweiterungsseite aus aufgerufen werden.
Ausgabe
-
Promise<StreamInfo>
setMimeHandlerOptions()
chrome.mimeHandler.setMimeHandlerOptions(
mimeType: string,
options: MimeHandlerOptions,
): Promise<void>
Legt die Konfigurationsoptionen für einen angegebenen MIME-Typ fest. Wenn die Erweiterung im geteilten Inkognitomodus ausgeführt wird, gelten die im Inkognitomodus festgelegten Optionen nur für den Inkognitomodus und nur bis zum Ende der Inkognitositzung. Optionen, die nicht im Inkognitomodus festgelegt wurden, folgen den Werten, die außerhalb des Inkognitomodus festgelegt wurden.
Parameter
-
mimeType
String
Der zu konfigurierende MIME-Typ. Es muss sich um einen MIME-Typ handeln, den die Erweiterung über „mime_types_handler“ verarbeitet.
-
Optionen
Die zu ändernden Optionen.
Ausgabe
-
Promise<void>
Promise, das aufgelöst wird, wenn die Konfiguration festgelegt wurde.