scripting.executeScript()
Fügt ein Skript in einen Zielkontext ein. Das Skript wird standardmäßig bei document_idle ausgeführt.
Hinweis: Diese Methode ist in Chrome und ab Firefox 101 mit Manifest V3 oder höher verfügbar. In Safari und ab Firefox 102 ist sie auch mit Manifest V2 verfügbar.
Um diese API zu verwenden, benötigen Sie die scripting-Berechtigung und eine Berechtigung für die URL des Ziels – entweder ausdrücklich als Host-Berechtigung oder über die activeTab-Berechtigung.
In Firefox und Safari kann die Ausführung auch dann erfolgreich sein, wenn Host-Berechtigungen teilweise fehlen. Das aufgelöste Promise enthält dann Teilergebnisse. In Chrome verhindert jede fehlende Berechtigung die Ausführung vollständig (siehe Issue 1325114).
Die eingefügten Skripte werden als Content-Skripte bezeichnet.
Erweiterungen können Content-Skripte nicht auf Erweiterungsseiten ausführen. Wenn eine Erweiterung Code dynamisch auf einer Erweiterungsseite ausführen möchte, kann sie ein Skript in das Dokument einbinden. Dieses Skript enthält den auszuführenden Code und registriert einen runtime.onMessage-Listener, über den sich der Code ausführen lässt. Die Erweiterung kann dann eine Nachricht an den Listener senden, um die Ausführung auszulösen.
Syntax
let results = await browser.scripting.executeScript(
details // object
)
Parameter
details-
Ein Objekt, das das einzufügende Skript beschreibt. Es enthält die folgenden Eigenschaften:
argsOptional-
Ein Array von Argumenten, die an die Funktion übergeben werden. Dies ist nur gültig, wenn der Parameter
funcangegeben ist. Die Argumente müssen JSON-serialisierbar sein. filesOptional-
arrayvonstring. Ein Array mit Pfaden zu den einzufügenden JS-Dateien, relativ zum Stammverzeichnis der Erweiterung. Genau eine der Eigenschaftenfilesundfuncmuss angegeben werden. funcOptional-
function. Eine einzufügende JavaScript-Funktion. Diese Funktion wird zur Einfügung serialisiert und anschließend deserialisiert. Dabei gehen gebundene Parameter und der Ausführungskontext verloren. Genau eine der Eigenschaftenfilesundfuncmuss angegeben werden.Die Funktion wird anhand ihres Quelltexts serialisiert, der ein gültiger Funktionsausdruck sein muss. Verwenden Sie eine Funktionsdeklaration, einen Funktionsausdruck oder eine Pfeilfunktion. Eine mit Methodensyntax definierte Funktion, etwa
method() {}in einem Objektliteral oder einer Klasse, lässt sich nicht als gültiger Funktionsausdruck serialisieren und kann daher nicht ausgeführt werden. Firefox gibt einenSyntaxErrorin der EigenschafterrordesInjectionResultzurück, während Chrome den Fehler nur in der Konsole des Ziel-Tabs meldet. injectImmediatelyOptional-
boolean. Gibt an, ob die Einfügung in das Ziel so früh wie möglich ausgelöst wird, jedoch nicht unbedingt vor dem Laden der Seite. target-
scripting.InjectionTarget. Angaben zum Ziel, in das das Skript eingefügt werden soll. worldOptional-
scripting.ExecutionWorld. Die Ausführungsumgebung des Skripts.
Rückgabewert
Ein Promise, das mit einem Array von InjectionResult-Objekten erfüllt wird. Diese enthalten das Ergebnis des eingefügten Skripts in jedem Frame, in den es eingefügt wurde.
Das Promise wird zurückgewiesen, wenn die Einfügung fehlschlägt, beispielsweise weil das Ziel ungültig ist. Sobald die Einfügung begonnen hat, wird das Promise auch dann erfüllt, wenn das Skript nicht geparst werden kann oder einen Fehler auslöst. In diesem Fall enthält das InjectionResult des betreffenden Frames den Fehler in seiner Eigenschaft error statt eines result. Um alle Fehler zu behandeln, fangen Sie das zurückgewiesene Promise ab und prüfen Sie die Eigenschaft error jedes Ergebnisses.
Jedes InjectionResult-Objekt hat die folgenden Eigenschaften:
documentId-
string. Das Dokument, das der Einfügung zugeordnet ist. Weitere Informationen finden Sie im Artikel Mit documentId arbeiten. frameId-
number. Die Frame-ID, die der Einfügung zugeordnet ist. resultOptional-
any. Das Ergebnis der Skriptausführung. errorOptional-
any. Wenn ein Fehler auftritt, enthält diese Eigenschaft den Wert, den das Skript ausgelöst oder mit dem es das Promise zurückgewiesen hat. Üblicherweise ist dies ein Fehlerobjekt mit einer Nachrichten-Eigenschaft, es kann aber ein beliebiger Wert sein (einschließlich primitiver Werte und undefined).Chrome unterstützt die Eigenschaft
errornoch nicht (siehe Issue 1271527: Fehler von scripting.executeScript an InjectionResult weitergeben). Alternativ können Laufzeitfehler abgefangen werden, indem Sie den auszuführenden Code in eine try-catch-Anweisung einschließen. Nicht abgefangene Fehler werden außerdem in der Konsole des Ziel-Tabs gemeldet.
Das Ergebnis eines Skripts ist der Wert, den die zuletzt ausgewertete Anweisung erzeugt. Wenn die letzte Anweisung ein Promise erzeugt, ist das Ergebnis der Wert, mit dem dieses Promise abgeschlossen wurde. Das ist vergleichbar mit den Ergebnissen, die Sie bei der Ausführung des Skripts in der Web-Konsole sehen (ohne Ausgaben von console.log()). Betrachten Sie beispielsweise ein Skript wie dieses:
let foo = "my result";
foo;
Hier enthält das Ergebnisarray den String "my result" als Element.
Das Skriptergebnis muss in Firefox ein Wert sein, der sich mit dem Structured-Clone-Algorithmus klonen lässt, und in Chrome ein JSON-serialisierbarer Wert. Der Artikel Chrome-Inkompatibilitäten erläutert diesen Unterschied ausführlicher im Abschnitt Algorithmus zum Klonen von Daten.
Beispiele
Dieses Beispiel führt ein einzeiliges Codefragment im aktiven Tab aus. Es fängt die Zurückweisung des Promise ab, die bei einer fehlgeschlagenen Einfügung auftritt, und prüft jedes Ergebnis auf einen Fehler bei der Skriptausführung:
browser.action.onClicked.addListener(async (tab) => {
try {
const results = await browser.scripting.executeScript({
target: {
tabId: tab.id,
},
func: () => {
document.body.style.border = "5px solid green";
},
});
for (const { frameId, error } of results) {
if (error) {
console.error(`script failed in frame ${frameId}: ${error}`);
}
}
} catch (err) {
console.error(`failed to execute script: ${err}`);
}
});
Dieses Beispiel führt ein Skript aus einer Datei namens "content-script.js" aus, die mit der Erweiterung ausgeliefert wird. Das Skript wird im aktiven Tab sowohl in Unterframes als auch im Hauptdokument ausgeführt:
browser.action.onClicked.addListener(async (tab) => {
try {
await browser.scripting.executeScript({
target: {
tabId: tab.id,
allFrames: true,
},
files: ["content-script.js"],
});
} catch (err) {
console.error(`failed to execute script: ${err}`);
}
});
Beispielerweiterungen
Browser-Kompatibilität
Hinweis:
Diese API basiert auf Chromiums chrome.scripting-API.