activeTab-Berechtigung
Die Berechtigung activeTab gewährt einer Erweiterung vorübergehend Zugriff auf den Tab, in dem ein Benutzer gerade arbeitet. Sie wird als Reaktion auf eine ausdrückliche Benutzeraktion erteilt, etwa einen Klick auf die Symbolleistenschaltfläche der Erweiterung. Der Zugriff ist auf diesen Tab beschränkt und besteht, bis der Benutzer zu einer anderen Seite navigiert.
Damit können Erweiterungen die häufige Anforderung „etwas mit der aktuellen Seite tun, wenn der Benutzer darum bittet“ erfüllen, ohne weitreichende Berechtigungen zu benötigen. Eine Erweiterung könnte beispielsweise ein Skript auf der aktuellen Seite ausführen wollen, wenn der Benutzer auf ihre Symbolleistenschaltfläche klickt. Ohne activeTab müsste sie die Host-Berechtigung <all_urls> anfordern. Diese würde ihr wesentlich mehr Möglichkeiten geben als nötig: Sie könnte Skripte in jedem Tab und jederzeit ausführen, statt nur im betreffenden Tab und als Reaktion auf eine Benutzeraktion.
Da activeTab nur begrenzten Zugriff gewährt, zeigen Browser bei der Installation der Erweiterung keine Berechtigungswarnung an.
Die activeTab-Berechtigung anfordern
Ihre Erweiterung fordert activeTab über den Manifest-Schlüssel permissions an:
"permissions": ["activeTab"]
activeTab ist eine API-Berechtigung, keine Host-Berechtigung.
Sie können activeTab auch in optional_permissions aufnehmen und zur Laufzeit mit permissions.request() anfordern. Diese Berechtigung wird ohne Nachfrage beim Benutzer erteilt.
Hinweis:
activeTab gewährt Berechtigungen für einen Tab. Es gewährt für sich genommen keinen Zugriff auf eine API. Um beispielsweise ein Skript einzufügen, benötigt Ihre Erweiterung die Berechtigung "scripting", damit sie die scripting-API verwenden kann.
Wie activeTab erteilt wird
Der Browser erteilt activeTab, wenn der Benutzer mit der Erweiterung interagiert. Diese Interaktionen werden als Benutzeraktionen bezeichnet. Dazu gehört, dass der Benutzer:
- auf die Symbolleistenschaltfläche oder Page Action der Erweiterung klickt.
- einen Kontextmenüeintrag der Erweiterung auswählt und dadurch das Ereignis
menus.onClickedauslöst. - eine von der Erweiterung mit der
commands-API definierte Tastenkombination verwendet und dadurch das Ereigniscommands.onCommandauslöst. - auf einen Vorschlag der Erweiterung in der Adressleiste (Omnibox) klickt und dadurch das Ereignis
omnibox.onInputEnteredauslöst (ab Firefox 142).
Normalerweise wird activeTab für den aktiven Tab erteilt. Es gibt eine Ausnahme: Eine Erweiterung kann mit der menus-API einen Menüeintrag erstellen, der erscheint, wenn der Benutzer das Kontextmenü eines Tabs in der Tableiste öffnet. Wählt der Benutzer diesen Eintrag aus, wird activeTab für den angeklickten Tab erteilt, auch wenn dieser nicht der aktive Tab ist.
Was activeTab ermöglicht
Solange activeTab für einen Tab erteilt ist, kann die Erweiterung:
- Mit der
scripting-API JavaScript oder CSS in den Tab einfügen (oder mittabs.executeScript()undtabs.insertCSS()in Manifest V2). Siehe Content Scripts laden. - Die geschützten Eigenschaften
url,titleundfavIconUrldestabs.Tab-Objekts des Tabs lesen. Andernfalls sind dafür die Berechtigung"tabs"oder eine passende Host-Berechtigung erforderlich. - Den Inhalt des Tabs mit
tabs.captureVisibleTab()erfassen (ab Firefox 126). - Mit
declarativeNetRequest.getMatchedRules()die Regeln lesen, die auf den Tab zutreffen, ohne die Berechtigung"declarativeNetRequestFeedback"zu benötigen.
Umfang des Zugriffs
activeTab gewährt Skriptzugriff auf die Seite auf oberster Ebene im Tab und auf Frames innerhalb dieser Seite, die denselben Ursprung haben. Um Skripte in Frames mit anderem Ursprung auszuführen oder deren Stile zu ändern, sind zusätzliche Host-Berechtigungen erforderlich.
Die Einschränkungen und Begrenzungen für bestimmte Websites und URI-Schemata gelten auch für activeTab. Einige spezielle Seiten erlauben das Einfügen von Skripten nicht, darunter die Leseansicht, die Quelltextansicht, der PDF-Betrachter und andere integrierte Seiten der Browseroberfläche.
Wann der Zugriff endet
Die Erweiterung kann nur auf den Tab beziehungsweise die Daten zugreifen, die zum Zeitpunkt der Benutzerinteraktion vorhanden waren. Navigiert der Tab zu einer anderen Seite, verliert die Erweiterung die Zugriffsberechtigung. Sie muss ihre Arbeit mit dem Tab daher innerhalb des gewährten Zeitraums abschließen oder die benötigten Daten in dieser Zeit erfassen. Benötigt sie erneut Zugriff, muss der Benutzer die Aktion wiederholen.
Wann genau der Zugriff endet, hängt vom Browser ab. Siehe Wann der Zugriff widerrufen wird.
Beispiel
Diese Erweiterung fügt ein Skript in die aktuelle Seite ein, wenn der Benutzer auf ihre Symbolleistenschaltfläche klickt. Sie benötigt keine Host-Berechtigungen.
manifest.json:
{
"manifest_version": 3,
"name": "Heading highlighter",
"version": "1.0",
"permissions": ["activeTab", "scripting"],
"action": {
"default_title": "Highlight headings"
},
"background": {
"scripts": ["background.js"]
}
}
background.js:
function highlightHeadings() {
for (const heading of document.querySelectorAll("h1, h2, h3")) {
heading.style.backgroundColor = "yellow";
}
}
browser.action.onClicked.addListener((tab) => {
// activeTab is granted for `tab` because the user clicked the toolbar button.
browser.scripting.executeScript({
target: { tabId: tab.id },
func: highlightHeadings,
});
});
Durch denselben Klick werden auch die geschützten Tab-Eigenschaften lesbar. tab.url und tab.title enthalten daher tatsächliche Werte statt undefined.
Weitere Beispiele
Die folgenden Beispiele aus dem Repository für Beispielerweiterungen unter https://github.com/mdn/webextensions-examples verwenden die Berechtigung activeTab:
| Beispiel | Verwendung von activeTab |
|---|---|
| apply-css |
Ein Klick auf eine Page Action gewährt Zugriff, um CSS im aktiven Tab
einzufügen oder zu entfernen (tabs.insertCSS() und tabs.removeCSS()).
|
| beastify |
Ein Klick auf eine Browser Action gewährt Zugriff für
scripting.executeScript() und scripting.insertCSS()
im aktiven Tab.
|
| context-menu-copy-link-with-types | Ein Klick auf den Kontextmenüeintrag eines Links gibt den Zugriff auf die Seite frei, damit der Link in die Zwischenablage kopiert werden kann. |
| history-deleter | Liest die URL des aktiven Tabs, um die Domain zu bestimmen, deren Verlauf gelöscht werden soll. |
| menu-demo | Ein Klick auf einen Menüeintrag gibt den aktiven Tab für die Demo zur Menümanipulation frei. |
| menu-remove-element | Ein Klick auf einen Menüeintrag gibt den Zugriff auf die Seite frei, um ein Skript einzufügen, das das Element unter dem Mauszeiger entfernt. |
| script-on-click |
Ein Klick auf die Symbolleistenschaltfläche gewährt Zugriff für
scripting.executeScript(), um ohne Host-Berechtigungen
ein Skript im aktiven Tab auszuführen.
|
Browser-Kompatibilität
Firefox, Safari und Chromium-basierte Browser, darunter Chrome und Edge, unterstützen activeTab. Allerdings unterscheiden sich die Browser darin, wann die Berechtigung erteilt wird, welche Möglichkeiten sie bietet und wann sie widerrufen wird.
Aktionen, durch die activeTab erteilt wird
| Benutzeraktion | Chrome | Firefox | Safari |
|---|---|---|---|
| Klick auf die Symbolleistenschaltfläche der Erweiterung | Ja | Ja | Ja |
| Auswahl eines Kontextmenüeintrags der Erweiterung | Ja | Ja | Ja |
| Verwendung einer Tastenkombination der Erweiterung | Ja | Ab Firefox 63 | Ja |
| Annahme eines Vorschlags in der Adressleiste (Omnibox) | Ja | Ab Firefox 142 | Nein, Safari unterstützt die omnibox-API nicht |
| Auswahl eines Menüeintrags für einen Tab in der Tableiste | Ab Chrome 150 | Ab Firefox 63 | Nein, Safari unterstützt den Wert tab von menus.ContextType nicht |
Gewährte Möglichkeiten
| Möglichkeit | Chrome | Firefox | Safari |
|---|---|---|---|
| Programmatisches Einfügen von Skripten und Stylesheets | Ja | Ja | Ja |
Geschützte Eigenschaften von tabs.Tab (url, title, favIconUrl) |
Ja | Ja | Ja |
tabs.captureVisibleTab() |
Ja | Ab Firefox 126 | Ja |
Abfangen der Netzwerkanfragen des Tabs mit den APIs webRequest und declarativeNetRequest |
Ja, für den Ursprung des Haupt-Frames des Tabs | Nein (Firefox-Bug 1617479) | Unbekannt |
Auch der Zugriff, den Browser mit activeTab gewähren, unterscheidet sich:
- Firefox und Safari gewähren ausschließlich Zugriff auf den aktiven Tab.
- Chrome gewährt die Host-Berechtigungen, die sich aus der URL des Tabs ableiten.
Dadurch kann Chrome beispielsweise mehr Zugriff gewähren als Firefox:
- In Chrome kann ein Skript in einem anderen Tab mit demselben Ursprung ausgeführt werden, in Firefox nicht.
- Ein Erweiterungsskript (beispielsweise ein Hintergrundskript oder das Skript eines Popups) kann in Chrome eine Cross-Origin-Anfrage an die URL des Tabs senden, in Firefox nicht.
- Die
cookies-API benötigt Host-Berechtigungen, um auf Cookies bestimmter Domains zuzugreifen. Chrome erlaubt dies mitactiveTab, Firefox nicht.
Diese Liste ist nicht vollständig.
Wann der Zugriff widerrufen wird
In allen Browsern wird der Zugriff widerrufen, wenn der Tab geschlossen wird. Navigationen innerhalb desselben Dokuments, etwa die Änderung eines Fragments (Hash) oder ein Aufruf von History.pushState(), widerrufen ihn dagegen nicht: Das Dokument und sein Ursprung bleiben unverändert, sodass der Zugriff erhalten bleibt.
Bei Navigationen, die ein neues Dokument laden, unterscheidet sich das Verhalten:
- Chrome: Der Zugriff bleibt bestehen, solange der Tab beim selben Ursprung bleibt, auch beim erneuten Laden. Er wird widerrufen, wenn der Tab zu einem anderen Ursprung navigiert.
- Safari: Der Zugriff ist an das Dokument gebunden, das sich zum Zeitpunkt der Benutzeraktion im Tab befand. Er wird widerrufen, wenn der Tab zu einer anderen URL navigiert.
- Firefox: Der Zugriff ist an das Dokument gebunden, das sich zum Zeitpunkt der Benutzeraktion im Tab befand. Jede Navigation, die zu einem neuen Dokument führt, beendet den Zugriff; der Benutzer muss die Aktion wiederholen. Wird das ursprüngliche Dokument aus dem Back/Forward-Cache wiederhergestellt, wird auch sein Zugriff wiederhergestellt.
Weitere Unterschiede
- Berechtigungsabfragen: Firefox und Chrome erteilen einer Erweiterung die angeforderten Host-Berechtigungen bei der Installation. Mit
activeTablässt sich daher eine Warnung bei der Installation vermeiden. Safari setzt Host-Berechtigungen dagegen standardmäßig auf „Nachfragen“ und fragt den Benutzer beim ersten Zugriffsversuch der Erweiterung auf eine Website. Dabei stehen Für einen Tag erlauben und Immer erlauben zur Auswahl. MitactiveTabentfällt diese Nachfrage, da Safari die Interaktion des Benutzers mit der Erweiterung als Berechtigungserteilung wertet. - Manifest V2 und V3: In Browsern funktioniert
activeTabunter Manifest V3 auf dieselbe Weise. In Firefox ermöglichtactiveTabunter Manifest V2 mitscripting.executeScript()zusätzlich den Zugriff auf einen iframe mit anderem Ursprung (siehe Bug 1839200). Dieses Verhalten wurde in MV3 entfernt.
Siehe auch
- Manifest-Schlüssel
permissions - Manifest-Schlüssel
optional_permissions - Benutzeraktionen
- Content Scripts
- Die richtigen Berechtigungen anfordern im Extension Workshop
- Die „activeTab“-Berechtigung in der Dokumentation für Chrome-Erweiterungen