Spec-Zone.ru › Web Extensions

scripting.executeScript()

Вставляет скрипт в целевой контекст. Скрипт выполняется по умолчанию в document_idle.

Примечание: Этот метод доступен в Manifest V3 или выше в Chrome и Firefox 101. В Safari и Firefox 102+, этот метод также доступен в Manifest V2.

Для использования этого API у вас должна быть "scripting" разрешение и разрешение на URL цели, либо явно как разрешение на хост, либо с использованием разрешения activeTab. Обратите внимание, что некоторые специальные страницы не разрешают это разрешение, включая страницы просмотра чтения, просмотра исходного кода и просмотра PDF.

В Firefox и Safari частичное отсутствие разрешений на хост может привести к успешному выполнению (с частичными результатами в решенном обещании). В Chrome любое отсутствующее разрешение предотвращает любое выполнение (см. Проблему 1325114).

Вставляемые вами скрипты называются скриптами содержимого.

Это асинхронная функция, которая возвращает Promise.

Синтаксис

let results = await browser.scripting.executeScript(
  details             // object
)

Параметры

details

Объект, описывающий вставляемый скрипт. Он содержит следующие свойства:

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

Массив аргументов для передачи в функцию. Это допустимо только в том случае, если указан параметр func. Аргументы должны быть сериализуемыми в JSON.

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

array из string. Массив путей JS-файлов для вставки, относительно корневого каталога расширения. Должен быть указан ровно один из files и func.

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

function. JavaScript-функция для вставки. Эта функция сериализуется и затем десериализуется для вставки. Это означает, что любые связанные параметры и контекст выполнения теряются. Должен быть указан ровно один из files и func.

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

boolean. Указывает, вызывается ли вставка в целевой объект как можно скорее, но не обязательно до загрузки страницы.

target

scripting.InjectionTarget. Детали, определяющие цель для вставки скрипта.

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

scripting.ExecutionWorld. Среда выполнения для выполнения скрипта.

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

A Promise, который выполняется с массивом InjectionResult объектов, представляющих результат вставленного скрипта в каждом вставленном фрейме.

Обещание отклоняется, если вставка завершается неудачей, например, когда целевой объект вставки недействителен. Когда выполнение скрипта началось, его результат включается в результат, будь то успешно (как result) или неудачно (как error).

Каждый InjectionResult объект имеет следующие свойства:

frameId

number. Идентификатор фрейма, связанный с вставкой.

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

any. Результат выполнения скрипта.

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

any. Если возникает ошибка, содержит значение, выброшенное или отклоненное скриптом. Обычно это объект ошибки с свойством message, но это может быть любое значение (включая примитивы и undefined).

Chrome пока не поддерживает свойство error (см. Проблема 1271527: Распространение ошибок из scripting.executeScript в InjectionResult). В качестве альтернативы, ошибки выполнения можно перехватывать, обернув исполняемый код в оператор try-catch. Неперехваченные ошибки также сообщаются в консоль целевого вкладки.

Результатом скрипта является последнее вычисленное выражение, что аналогично результатам, которые вы увидите, если выполните скрипт в Консоли веб-разработчика (без любого console.log() вывода). Например, рассмотрим такой скрипт:

let foo='my result'; foo;

Здесь массив results содержит строку "my result" в качестве элемента.

Значения результатов должны быть структурно клонируемыми (см. Алгоритм клонирования данных).

Примеры

В этом примере выполняется однострочный фрагмент кода в активной вкладке:

browser.action.onClicked.addListener(async (tab) => {
  try {
    await browser.scripting.executeScript({
      target: {
        tabId: tab.id,
      },
      func: () => {
        document.body.style.border = "5px solid green";
      },
    });
  } catch (err) {
    console.error(`failed to execute script: ${err}`);
  }
});

В этом примере выполняется скрипт из файла (упакованного с расширением) под названием "content-script.js". Скрипт выполняется в активной вкладке. Скрипт выполняется во вложенных фреймах и в основном документе:

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

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

Рабочие столы Мобильные устройства
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet
InjectionResult 88 88 102 ? 74
НетSafari возвращает массив с результатами, вместо массива InjectionResults.
? ? 102 ?
НетSafari возвращает массив с результатами, вместо массива InjectionResults.
?
executeScript 88 88 102 ? 74 15.4 ? ? 102 ? 15.4 ?
injectImmediately 88 88 102 ? 74 Нет ? ? 102 ? Нет ?
world 95 95
102Поддерживает только ISOLATED, а не MAIN.
? 81 15.4 ? ?
102Поддерживает только ISOLATED, а не MAIN.
? 15.4 ?

Примечание: Этот API основан на API chrome.scripting 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/scripting/executeScript

Spec-Zone.ru

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