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