activeTab-Berechtigung
Die Berechtigung activeTab gibt einer Erweiterung vorübergehend Zugriff auf den Tab, in dem eine Person gerade arbeitet. Sie wird als Reaktion auf eine ausdrückliche Benutzeraktion erteilt, beispielsweise auf einen Klick auf die Symbolleistenschaltfläche der Erweiterung. Der Zugriff ist auf diesen Tab beschränkt und besteht, bis der Tab zu einer anderen Seite navigiert.
Damit können Erweiterungen den häufigen Anwendungsfall „Auf Anforderung etwas mit der aktuellen Seite tun“ erfüllen, ohne weitreichende Berechtigungen zu benötigen. Stellen Sie sich beispielsweise eine Erweiterung vor, die ein Skript auf der aktuellen Seite ausführen soll, wenn jemand auf ihre Symbolleistenschaltfläche klickt. Ohne activeTab müsste sie die Host-Berechtigung <all_urls> anfordern. Diese würde ihr erheblich mehr Rechte einräumen 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 eingeschränkten 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 die Berechtigung zur Laufzeit mit permissions.request() anfordern. Sie gehört zu den Berechtigungen, die ohne Nachfrage beim Benutzer erteilt werden.
Hinweis:
activeTab gewährt Rechte für einen Tab. Die Berechtigung allein gewährt 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 jemand mit der Erweiterung interagiert. Diese Interaktionen werden als Benutzeraktionen bezeichnet. Dazu gehört:
- ein Klick auf die Symbolleistenschaltfläche oder eine Page Action der Erweiterung;
- die Auswahl eines Eintrags im Kontextmenü der Erweiterung, wodurch das Ereignis
menus.onClickedausgelöst wird; - die Verwendung eines von der Erweiterung über die
commands-API definierten Tastaturkürzels, wodurch das Ereigniscommands.onCommandausgelöst wird; - ein Klick auf einen Vorschlag der Erweiterung in der Adressleiste (Omnibox), wodurch das Ereignis
omnibox.onInputEnteredausgelöst wird (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 angezeigt wird, wenn jemand das Kontextmenü eines Tabs in der Tableiste öffnet. Wird dieser Eintrag ausgewählt, erhält die Erweiterung activeTab für den angeklickten Tab, auch wenn dieser nicht aktiv ist.
Was activeTab ermöglicht
Solange activeTab für einen Tab erteilt ist, kann die Erweiterung:
- JavaScript oder CSS mit der
scripting-API in den Tab einfügen (oder in Manifest V2 mittabs.executeScript()undtabs.insertCSS()). Siehe Content Scripts laden. - Die geschützten Eigenschaften des
tabs.Tab-Objekts des Tabs auslesen:url,titleundfavIconUrl. Andernfalls erfordern diese Eigenschaften die Berechtigung"tabs"oder eine passende Host-Berechtigung. - Den Inhalt des Tabs mit
tabs.captureVisibleTab()erfassen (ab Firefox 126). - Die für den Tab zutreffenden Regeln mit
declarativeNetRequest.getMatchedRules()auslesen, ohne die Berechtigung"declarativeNetRequestFeedback"zu benötigen.
Umfang des Zugriffs
activeTab gewährt Zugriff zum Ausführen von Skripten auf der obersten Seite im Tab und in Frames derselben Origin. Das Ausführen von Skripten oder Ändern von Stilen in Cross-Origin-Frames erfordert zusätzliche Host-Berechtigungen.
Die Einschränkungen und Beschränkungen, die für bestimmte Websites und URI-Schemata gelten, gelten auch für activeTab. Auf einigen speziellen Seiten können keine Skripte eingefügt werden. Dazu gehören die Leseansicht, die Quelltextansicht, der PDF-Viewer 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 Benutzeraktion vorhanden waren. Wenn der Tab zu einer anderen Seite navigiert, verliert die Erweiterung die Zugriffsberechtigung. Sie muss ihre Arbeit mit dem Tab daher abschließen oder die benötigten Daten erfassen, solange die Berechtigung besteht. Benötigt sie später erneut Zugriff, muss die Benutzeraktion wiederholt werden.
Der Zeitpunkt, zu dem der Zugriff endet, unterscheidet sich je nach Browser. Siehe Wann der Zugriff entzogen wird.
Beispiel
Diese Erweiterung fügt ein Skript in die aktuelle Seite ein, wenn jemand 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 Eigenschaften des Tabs lesbar. tab.url und tab.title enthalten daher tatsächliche Werte statt undefined.
Weitere Beispiele
Die folgenden Beispiele aus dem Repository mit 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 ermöglicht den Zugriff auf die Seite, damit der Link in die Zwischenablage kopiert werden kann. |
| history-deleter | Liest die URL des aktiven Tabs aus, um die Domain zu bestimmen, deren Verlauf gelöscht werden soll. |
| menu-demo | Ein Klick auf einen Menüeintrag ermöglicht der Menü-Demo den Zugriff auf den aktiven Tab. |
| menu-remove-element | Ein Klick auf einen Menüeintrag ermöglicht den Zugriff auf die Seite, 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 Bedingungen für die Erteilung, die damit verbundenen Möglichkeiten und der Zeitpunkt des Entzugs.
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 eines Tastaturkürzels der Erweiterung | Ja | Ab Firefox 63 | Ja |
| Auswahl 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 die Origin des Hauptframes des Tabs | Nein (Firefox-Bug 1617479) | Unbekannt |
Auch der Zugriff, den Browser mit activeTab gewähren, unterscheidet sich:
- Firefox gewährt nur Zugriff auf den aktiven Tab.
- Chrome und Safari gewähren die aus der URL des Tabs abgeleiteten Host-Berechtigungen.
Chrome und Safari können damit mehr Zugriff ermöglichen als Firefox, zum Beispiel:
- In Chrome können Skripte auch in einem anderen Tab mit derselben Origin ausgeführt werden, in Firefox nicht.
- Ein Erweiterungsskript, etwa 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 erfordert Host-Berechtigungen, um auf Cookies bestimmter Domains zuzugreifen. Chrome erlaubt dies mitactiveTab, Firefox nicht.
Diese Liste ist nicht vollständig.
Wann der Zugriff entzogen wird
In allen Browsern wird der Zugriff entzogen, wenn der Tab geschlossen wird. Navigationen innerhalb desselben Dokuments, etwa eine Änderung des Fragments (Hash) oder ein Aufruf von History.pushState(), entziehen den Zugriff dagegen nicht: Das Dokument und seine Origin bleiben unverändert.
Bei Navigationen, die ein neues Dokument laden, unterscheidet sich das Verhalten:
- Chrome: Der Zugriff bleibt bestehen, solange der Tab auf derselben Origin bleibt, auch beim Neuladen. Er wird entzogen, wenn der Tab zu einer anderen Origin navigiert.
- Safari: Der Zugriff ist an das Dokument gebunden, das sich zum Zeitpunkt der Benutzeraktion im Tab befand. Er wird entzogen, 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. Danach muss die Benutzeraktion wiederholt werden. Wird das Dokument aus dem Back/Forward-Cache wiederhergestellt, erhält es seinen Zugriff zurück.
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 beim ersten Zugriffsversuch auf eine Website nach. Dabei stehen Für einen Tag erlauben und Immer erlauben zur Auswahl. MitactiveTabentfällt diese Nachfrage, da Safari die Interaktion mit der Erweiterung als Erteilung der Berechtigung wertet. - Manifest V2 und V3: In Manifest V3 funktioniert
activeTabin den Browsern auf dieselbe Weise. In Firefox mit Manifest V2 ermöglichtactiveTabzusätzlich, dassscripting.executeScript()auf einen iframe mit einer anderen Origin zugreift (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 Berechtigung „activeTab“ in der Dokumentation zu Chrome-Erweiterungen