Spec-Zone.ru › Web Extensions

devtools.inspectedWindow.eval()

Выполняет JavaScript в окне, к которому прикреплены инструменты разработчика.

Это немного похоже на использование tabs.executeScript() для прикрепления скрипта содержимого, но с двумя основными отличиями:

Во-первых, JavaScript может использовать набор специальных команд, которые браузеры обычно предоставляют в консоли инструментов разработчика: например, использовать "$0" для ссылки на элемент, который в данный момент выбран в инспекторе.

Во-вторых, JavaScript, который вы выполняете, может видеть любые изменения, внесённые в страницу скриптами, загруженными на странице. Это в отличие от скриптов содержимого, которые видят страницу такой, какой она была бы, если бы скрипты страницы не были загружены. Однако обратите внимание, что изоляция, обеспечиваемая скриптами содержимого, — это умышленная функция безопасности, призванная затруднить злонамеренным или несотрудничающим веб-страницам вводить в заблуждение или подменять API WebExtensions путём переопределения функций и свойств DOM. Это означает, что вам нужно быть очень внимательными, если вы отказываетесь от этой защиты, используя eval(), и следует использовать скрипты содержимого, если вам не нужно использовать eval().

Скрипт по умолчанию оценивается в основном фрейме страницы. Скрипт должен оцениваться в значение, которое может быть представлено в формате JSON (что означает, что, например, он не может оцениваться в функцию или объект, содержащий какие-либо функции). По умолчанию скрипт не видит какие-либо скрипты содержимого, прикреплённые к странице.

Вы не можете вызвать eval() на привилегированных окнах браузера, таких как "about:addons".

Вы можете необязательно предоставить параметр options, который включает параметры для оценки скрипта в другом фрейме или в контексте прикреплённых скриптов содержимого. Обратите внимание, что Firefox пока не поддерживает параметр options.

Функция eval() возвращает Promise, которая завершается результатом оценки скрипта или ошибкой.

Справочные объекты

Скрипт получает доступ к ряду объектов, которые помогают инжектированному скрипту взаимодействовать с инструментами разработчика. В настоящее время поддерживаются следующие вспомогательные объекты:

$0

Содержит ссылку на элемент, который в данный момент выбран в инспекторе инструментов разработчика.

inspect()

Если переданный объект является элементом DOM на странице, он выбирает его в инспекторе инструментов разработчика; в противном случае он создаёт предварительный просмотр объекта в веб-консоли.

См. примеры.

Синтаксис

let evaluating = browser.devtools.inspectedWindow.eval(
  expression,       // string
  options           // object
)

Параметры

expression

string. JavaScript-выражение для оценки. Строка должна быть оценена в объект, который может быть представлен в формате JSON, в противном случае будет выброшено исключение. Например, expression не должно быть оценено в функцию.

options Необязательно

object. Параметры для функции (обратите внимание, что Firefox пока не поддерживает эти параметры), как указано ниже:

frameURL Необязательно

string. URL фрейма, в котором нужно оценить выражение. Если это опущено, выражение оценивается в основном фрейме окна.

useContentScriptContext Необязательно

boolean. Если true, оценить выражение в контексте любых скриптов содержимого, которые эта надстройка прикрепила к странице. Если вы установили этот параметр, вы должны были прикрепить какие-либо скрипты содержимого к странице, в противном случае будет выброшена ошибка DevTools.

contextSecurityOrigin Необязательно

string. Оценить выражение в контексте скрипта содержимого, прикреплённого другой надстройкой, чьё происхождение соответствует указанному значению. Это переопределяет useContentScriptContext.

Возвращаемое значение

A Promise, который будет выполнен с array, содержащим два элемента.

Если ошибка не произошла, элемент 0 будет содержать результат оценки выражения, а элемент 1 будет undefined.

Если произошла ошибка, элемент 0 будет undefined, а элемент 1 будет содержать объект, дающий подробности об ошибке. Различаются два типа ошибок:

  • ошибки, возникшие при оценке JavaScript (например, синтаксические ошибки в выражении). В этом случае элемент 1 будет содержать:
    • логическое свойство isException, установленное в true
    • строковое свойство value, дающее более подробные сведения.
  • другие ошибки (например, выражение, которое оценивается в объект, который не может быть представлен в формате JSON). В этом случае элемент 1 будет содержать:
    • логическое свойство isError, установленное в true
    • строковое свойство code содержащее код ошибки.

Совместимость с браузерами

Рабочие столы Мобильные устройства
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet
$0 Да 79 55 ? Да 16 ? ? Нет ? Нет ?
eval Да 79 54 ? Да 16 ? ? Нет ? Нет ?
inspect Да 79 55 ? Да 16 ? ? Нет ? Нет ?
options Да 79 Нет ? Да 16 ? ? Нет ? Нет ?

Примеры

Этот пример проверяет, определена ли jQuery в проверяемом окне, и выводит результат. Обратите внимание, что это не сработает в скрипте содержимого, поскольку даже если jQuery будет определена, скрипт содержимого её не увидит.

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);
});

Примеры использования вспомогательных объектов

Этот пример использует вспомогательный объект $0 для изменения цвета фона элемента, который в данный момент выбран в инспекторе:

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);
});

Этот пример использует вспомогательный объект inspect() для выбора первого элемента <h1> на странице:

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);
});

Примечание: Этот API основан на API chrome.devtools от Chromium.

© 2005–2023 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/devtools/inspectedWindow/eval

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API