devtools.inspectedWindow.eval()
Führt JavaScript im Fenster aus, an das die Entwicklertools angehängt sind.
Dies ist in gewisser Weise vergleichbar mit der Verwendung von tabs.executeScript(), um ein Inhalts-Skript anzuhängen, jedoch mit zwei Hauptunterschieden:
Erstens kann das JavaScript eine Reihe von speziellen Befehlen verwenden, die Browser typischerweise in ihrer Entwicklertools-Konsole bereitstellen: zum Beispiel die Verwendung von "$0", um auf das derzeit im Inspektor ausgewählte Element zu verweisen.
Zweitens kann das ausgeführte JavaScript alle Änderungen sehen, die von Skripten vorgenommen wurden, die die Seite geladen hat. Dies steht im Gegensatz zu Inhalts-Skripten, die die Seite so sehen, wie sie existieren würde, wenn keine Seitenskripte geladen wären. Beachten Sie jedoch, dass die Isolierung, die Inhalts-Skripte bieten, ein bewusstes Sicherheitsmerkmal ist, das es erschwert, dass bösartige oder unkooperative Webseiten die WebExtensions-APIs verwirren oder untergraben, indem sie DOM-Funktionen und -Eigenschaften neu definieren. Das bedeutet, dass Sie sehr vorsichtig sein müssen, wenn Sie diesen Schutz aufheben, indem Sie eval() verwenden, und Sie sollten Inhalts-Skripte verwenden, es sei denn, Sie müssen eval() verwenden.
Das Skript wird standardmäßig im Haupt-Frame der Seite ausgewertet. Das Skript muss zu einem Wert ausgewertet werden, der als JSON dargestellt werden kann (zum Beispiel darf es nicht zu einer Funktion oder einem Objekt ausgewertet werden, das Funktionen enthält). Standardmäßig sieht das Skript keine an die Seite angehängten Inhalts-Skripte.
Sie können eval() nicht auf privilegierte Browserfenster wie "about:addons" aufrufen.
Sie können optional einen options-Parameter angeben, der Optionen enthält, um das Skript in einem anderen Frame oder im Kontext angehängter Inhalts-Skripte auszuwerten. Beachten Sie, dass Firefox den options-Parameter noch nicht unterstützt.
Die eval()-Funktion gibt ein Promise zurück, das das ausgewertete Ergebnis des Skripts oder einen Fehler auflöst.
Helfer
Das Skript erhält Zugriff auf eine Reihe von Objekten, die dem eingesetzten Skript helfen, mit den Entwicklertools zu interagieren. Die folgenden Helfer werden derzeit unterstützt:
Syntax
let evaluating = browser.devtools.inspectedWindow.eval(
expression, // string
options // object
)
Parameter
expression-
string. Der JavaScript-Ausdruck, der ausgewertet werden soll. Der String muss zu einem Objekt ausgewertet werden, das als JSON dargestellt werden kann, andernfalls wird eine Ausnahme ausgelöst. Zum Beispiel darfexpressionnicht zu einer Funktion ausgewertet werden. optionsOptional-
object. Optionen für die Funktion (Beachtem Sie, dass Firefox diese Optionen noch nicht unterstützt), wie folgt:frameURLOptional-
string. Die URL des Frames, in dem der Ausdruck ausgewertet werden soll. Wenn dies weggelassen wird, wird der Ausdruck im Haupt-Frame des Fensters ausgewertet. useContentScriptContextOptional-
boolean. Wenntrue, wird der Ausdruck im Kontext von Inhalts-Skripten ausgewertet, die diese Erweiterung an die Seite angehängt hat. Wenn Sie diese Option setzen, müssen Sie tatsächlich einige Inhalts-Skripte an die Seite angehängt haben, oder ein Fehler in den Entwicklertools wird ausgelöst. contextSecurityOriginOptional-
string. Den Ausdruck im Kontext eines Inhalts-Skripts auswerten, das von einer anderen Erweiterung angehängt wurde, deren Herkunft mit dem hier angegebenen Wert übereinstimmt. Dies überschreibtuseContentScriptContext.
Rückgabewert
Ein Promise, das mit einem Array erfüllt wird, das zwei Elemente enthält.
Wenn kein Fehler aufgetreten ist, enthält Element 0 das Ergebnis der Auswertung des Ausdrucks, und Element 1 wird undefined sein.
Wenn ein Fehler aufgetreten ist, wird Element 0 undefined sein, und Element 1 wird ein Objekt enthalten, das Details zum Fehler gibt. Zwei verschiedene Arten von Fehlern werden unterschieden:
-
Fehler bei der Auswertung des JavaScripts (zum Beispiel Syntaxfehler im Ausdruck). In diesem Fall enthält Element 1:
- eine boolesche Eigenschaft
isException, die auftruegesetzt ist - eine String-Eigenschaft
value, die mehr Details gibt.
- eine boolesche Eigenschaft
-
andere Fehler (zum Beispiel ein Ausdruck, der sich zu einem Objekt auswertet, das nicht als JSON dargestellt werden kann). In diesem Fall enthält Element 1:
- eine boolesche Eigenschaft
isError, die auftruegesetzt ist - eine String-Eigenschaft
code, die einen Fehlercode enthält.
- eine boolesche Eigenschaft
Beispiele
Dies testet, ob jQuery im inspizierten Fenster definiert ist, und protokolliert das Ergebnis. Beachten Sie, dass dies in einem Inhalts-Skript nicht funktionieren würde, da selbst wenn jQuery definiert wäre, das Inhalts-Skript es nicht sehen würde.
function handleError(error) {
if (error.isError) {
console.log(`DevTools error: ${error.code}`);
} else {
console.log(`JavaScript error: ${error.value}`);
}
}
function handleResult(result) {
console.log(result);
if (result[0] !== undefined) {
console.log(`jQuery: ${result[0]}`);
} else if (result[1]) {
handleError(result[1]);
}
}
const checkJQuery = "typeof jQuery !== 'undefined'";
evalButton.addEventListener("click", () => {
browser.devtools.inspectedWindow.eval(checkJQuery).then(handleResult);
});
Helfer-Beispiele
Dies verwendet den $0-Helfer, um die Hintergrundfarbe des Elements zu setzen, das derzeit im Inspektor ausgewählt ist:
const evalButton = document.querySelector("#reddinate");
const evalString = "$0.style.backgroundColor = 'red'";
function handleError(error) {
if (error.isError) {
console.log(`DevTools error: ${error.code}`);
} else {
console.log(`JavaScript error: ${error.value}`);
}
}
function handleResult(result) {
if (result[1]) {
handleError(result[1]);
}
}
evalButton.addEventListener("click", () => {
browser.devtools.inspectedWindow.eval(evalString).then(handleResult);
});
Dies verwendet den inspect()-Helfer, um das erste <h1>-Element auf der Seite auszuwählen:
const inspectButton = document.querySelector("#inspect");
const inspectString = "inspect(document.querySelector('h1'))";
function handleError(error) {
if (error.isError) {
console.log(`DevTools error: ${error.code}`);
} else {
console.log(`JavaScript error: ${error.value}`);
}
}
function handleResult(result) {
if (result[1]) {
handleError(result[1]);
}
}
inspectButton.addEventListener("click", () => {
browser.devtools.inspectedWindow.eval(inspectString).then(handleResult);
});
Browser-Kompatibilität
Hinweis:
Diese API basiert auf der chrome.devtools API von Chromium.