Chrome 浏览器 Manifest V3 版本中 scripting API 解析
使用
chrome.scripting API在不同上下文中执行脚本。
可以使用
chrome.scripting API将JavaScript和CSS注入网站。
scriptingManifest 配置使用 chrome.scripting API,需要在 manifest.json 中声明 scripting 权限,以及要向其注入脚本的网页的主机权限。使用 host_permissions 关键字或 activeTab 权限。
{
"name": "Scripting Extension",
"manifest_version": 3,
"permissions": ["scripting", "activeTab"],
}
target 参数指定要向其注入 JavaScript 或 CSS 的目标。tabId。// 获取 tab ID
function getTabId() { }
// 注入脚本
chrome.scripting.executeScript({
target : {tabId : getTabId()},
files : [ "script.js" ],
}).then(() => console.log("script injected"));
function getTabId() { ... }
function getUserColor() { ... }
function changeBackgroundColor() {
document.body.style.backgroundColor = getUserColor();
}
chrome.scripting.executeScript({
target : {tabId : getTabId()},
func : changeBackgroundColor,
}).then(() => console.log("injected a function"));
function getTabId() { ... }
function getUserColor() { ... }
function changeBackgroundColor(backgroundColor) {
document.body.style.backgroundColor = backgroundColor;
}
chrome.scripting.executeScript({
target : {tabId : getTabId()},
func : changeBackgroundColor,
args : [ getUserColor() ],
}).then(() => console.log("injected a function"));
CSSfunction getTabId() { ... }
const css = "body { background-color: red; }";
chrome.scripting.insertCSS({
target : {tabId : getTabId()},
css : css,
}).then(() => console.log("CSS injected"));
async function unregisterAllDynamicContentScripts() {
try {
const scripts = await chrome.scripting.getRegisteredContentScripts();
const scriptIds = scripts.map(script => script.id);
return chrome.scripting.unregisterContentScripts(scriptIds);
} catch (error) {
const message = [
"An unexpected error occurred while",
"unregistering dynamic content scripts.",
].join(" ");
throw new Error(message, {cause : error});
}
}
Types)ContentScriptFilterids:string[] 可选
getRegisteredContentScripts 将仅返回具有此列表中指定的 ID 的脚本CSSInjectioncss: string可选
CSS 的字符串。files: string[] 可选
CSS 文件的路径(相对于扩展程序的根目录)。必须指定 files 和 css 中的一个。origin: StyleOrigin 可选
AUTHOR。target: InjectionTarget
CSS 的目标的详细信息。ExecutionWorld要在其中执行脚本的
JavaScript环境。
ISOLATED
MAIN
DOM 的主环境,与托管网页的 JavaScript 共享的执行环境。InjectionResultdocumentId: string
frameId: number
result: any 可选
InjectionTargetallFrames: boolean 可选
false。如果指定了 frameIds,则此值不能为 true。documentIds: string[] 可选
documentId 的 ID。如果已设置 frameIds,则不能设置此字段。frameIds: number[] 可选
ID。tabId: number
ID。RegisteredContentScriptallFrames: boolean 可选
true,它将注入所有帧中,即使帧不是标签页中最顶层的帧。系统会单独检查每个框架是否符合网址要求;如果不符合网址要求,该框架将不会注入到子框架中。默认值为 false,表示仅匹配顶部帧。css: string[] 可选
CSS 文件列表。在为网页构建或显示任何 DOM 之前,这些对象会按照它们在此数组中显示的顺序进行注入。excludeMatches: string[] 可选
id: string 必填项
API 调用中指定的内容脚本的 ID。不得以“_”开头,因为该字符已预留为生成的脚本 ID 的前缀。js: string[] 可选
JavaScript 文件的列表。这些引用会按照它们在此数组中出现的顺序进行注入。matchOriginAsFallback: boolean 可选
about:、data:、blob: 或 filesystem:。在这些情况下,系统会检查网址的来源,以确定是否应注入脚本。如果源是 null(与 data: 网址一样),则所使用的源将是创建当前帧的帧或启动到此帧的导航的帧。请注意,该框架可能不是父框架。matches: string[] 可询啊
registerContentScripts 指定。persistAcrossSessions: boolean 可选
true。runAt: RunAt 可选
JavaScript 文件注入网页。默认值为 document_idle。world: ExecutionWorld: 可选
JavaScript world 。默认为 ISOLATED。ScriptInjectionargs: any[] 可选
curry 参数。仅当指定了 func 参数时,此属性才有效。这些参数必须可进行 JSON 序列化。files: string[] 可选
JS 或 CSS 文件的路径(相对于扩展程序的根目录)。必须且只能指定 files 和 func 中的一个。injectImmediately: boolean 可选
target: InjectionTarget 必填项
world: ExecutionWorld 可选
JavaScript world。默认为 ISOLATED。func 可选
JavaScript 函数。系统将对此函数进行序列化,然后进行反序列化以供注入。这意味着所有绑定的参数和执行上下文都将丢失。必须且只能指定 files 和 func 中的一个。func 函数如下所示:
()=> {}
StyleOrigin样式更改的来源。
在 CSS 中,样式更改的来源分为三类。这些类别称为 style origins。它们是 user agent origin, user origin 和 author origin。
User-agentUserAuthorMethods)executeScript()将脚本注入目标上下文。该脚本将在
document_idle运行。如果脚本的计算结果是一个promise,则浏览器将等待该promise得到解决并返回结果值。
chrome.scripting.executeScript(
injection:
ScriptInjection,
callback?:
function,
)
injection: ScriptInjection
callback: function 可选
(results: InjectionResult[])=>voidPromisegetRegisteredContentScripts()返回此扩展程序中与指定过滤器匹配的所有动态注册的内容脚本。
chrome.scripting.getRegisteredContentScripts(
filter?:
ContentScriptFilter,
callback?:
function,
)
filter: ContentScriptFilter 可选
callback: function 可选
(scripts: RegisteredContentScript[])=>voidPromiseinsertCSS()将
CSS样式表插入目标上下文。如果指定了多个帧,系统会忽略不成功的注入。
chrome.scripting.insertCSS(
injection:
CSSInjection,
callback?:
function,
)
injection: CSSInjection
callback: function 可选
()=>voidPromiseregisterContentScripts()为此扩展程序注册一个或多个内容脚本。
chrome.scripting.registerContentScripts(
scripts:
RegisteredContentScript[],
callback?:
function,
)
scripts: RegisteredContentScript[]
callback: function 可选
()=>voidPromiseremoveCSS()从目标上下文中移除此扩展程序之前插入的
CSS样式表。
chrome.scripting.removeCSS(
injection:
CSSInjection,
callback?:
function,
)
injection: CSSInjection
callback: function 可选
()=>voidPromiseunregisterContentScripts()Promise Chrome 96 及更高版本
为此扩展程序取消注册内容脚本。
chrome.scripting.unregisterContentScripts(
filter?:
ContentScriptFilter,
callback?:
function,
)
filter: ContentScriptFilter 可选
callback: function 可选
()=>voidPromiseupdateContentScripts()更新此扩展程序的一个或多个内容脚本。
chrome.scripting.updateContentScripts(
scripts:
RegisteredContentScript[],
callback?:
function,
)
scripts: RegisteredContentScript
callback: function 可选
()=>voidPromise