Chrome 浏览器 Manifest V3 版本中 scripting API 解析
使用
chrome.scripting API
在不同上下文中执行脚本。
可以使用
chrome.scripting API
将JavaScript
和CSS
注入网站。
scripting
Manifest
配置使用 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"));
CSS
function 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
)ContentScriptFilter
ids:string[]
可选
getRegisteredContentScripts
将仅返回具有此列表中指定的 ID
的脚本CSSInjection
css: string
可选
CSS
的字符串。files: string[]
可选
CSS
文件的路径(相对于扩展程序的根目录)。必须指定 files
和 css
中的一个。origin: StyleOrigin
可选
AUTHOR
。target: InjectionTarget
CSS
的目标的详细信息。ExecutionWorld
要在其中执行脚本的
JavaScript
环境。
ISOLATED
MAIN
DOM
的主环境,与托管网页的 JavaScript
共享的执行环境。InjectionResult
documentId: string
frameId: number
result: any
可选
InjectionTarget
allFrames: boolean
可选
false
。如果指定了 frameIds
,则此值不能为 true
。documentIds: string[]
可选
documentId
的 ID
。如果已设置 frameIds
,则不能设置此字段。frameIds: number[]
可选
ID
。tabId: number
ID
。RegisteredContentScript
allFrames: 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
。ScriptInjection
args: 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-agent
User
Author
Methods
)executeScript()
将脚本注入目标上下文。该脚本将在
document_idle
运行。如果脚本的计算结果是一个promise
,则浏览器将等待该promise
得到解决并返回结果值。
chrome.scripting.executeScript(
injection:
ScriptInjection,
callback?:
function,
)
injection: ScriptInjection
callback: function
可选
(results: InjectionResult[])=>void
Promise
getRegisteredContentScripts()
返回此扩展程序中与指定过滤器匹配的所有动态注册的内容脚本。
chrome.scripting.getRegisteredContentScripts(
filter?:
ContentScriptFilter,
callback?:
function,
)
filter: ContentScriptFilter
可选
callback: function
可选
(scripts: RegisteredContentScript[])=>void
Promise
insertCSS()
将
CSS
样式表插入目标上下文。如果指定了多个帧,系统会忽略不成功的注入。
chrome.scripting.insertCSS(
injection:
CSSInjection,
callback?:
function,
)
injection: CSSInjection
callback: function
可选
()=>void
Promise
registerContentScripts()
为此扩展程序注册一个或多个内容脚本。
chrome.scripting.registerContentScripts(
scripts:
RegisteredContentScript[],
callback?:
function,
)
scripts: RegisteredContentScript[]
callback: function
可选
()=>void
Promise
removeCSS()
从目标上下文中移除此扩展程序之前插入的
CSS
样式表。
chrome.scripting.removeCSS(
injection:
CSSInjection,
callback?:
function,
)
injection: CSSInjection
callback: function
可选
()=>void
Promise
unregisterContentScripts()
Promise Chrome 96 及更高版本
为此扩展程序取消注册内容脚本。
chrome.scripting.unregisterContentScripts(
filter?:
ContentScriptFilter,
callback?:
function,
)
filter: ContentScriptFilter
可选
callback: function
可选
()=>void
Promise
updateContentScripts()
更新此扩展程序的一个或多个内容脚本。
chrome.scripting.updateContentScripts(
scripts:
RegisteredContentScript[],
callback?:
function,
)
scripts: RegisteredContentScript
callback: function
可选
()=>void
Promise