说明
chrome.debugger
API 可用作 Chrome 远程调试协议的备用传输协议。使用 chrome.debugger
附加到一个或多个标签页,以插桩网络互动、调试 JavaScript、修改 DOM 和 CSS 等。使用 Debuggee
属性 tabId
通过 sendCommand
定位到标签页,并通过 onEvent
回调中的 tabId
路由事件。
权限
debugger
您必须在扩展程序的清单中声明 "debugger"
权限,才能使用此 API。
{
"name": "My extension",
...
"permissions": [
"debugger",
],
...
}
概念和用法
连接后,您可以使用 chrome.debugger
API 向给定目标发送 Chrome 开发者工具协议 (CDP) 命令。本文档无法详细介绍 CDP,如需详细了解 CDP,请参阅 CDP 官方文档。
目标
目标代表要调试的内容,这可能包括标签页、iframe 或工作器。每个目标都由 UUID 标识,并具有关联的类型(例如 iframe
、shared_worker
等)。
在一个目标内,可能存在多个执行上下文;例如,同一个进程的 iframe 不会获得唯一的目标,而是表示为可从单个目标访问的不同上下文。
受限网域
出于安全考虑,chrome.debugger
API 不提供对所有 Chrome DevTools 协议网域的访问权限。可用的网域包括:无障碍、审核、CacheStorage、控制台、CSS、数据库、调试程序、DOM、DOMDebugger、DOMSnapshot、模拟、Fetch、IO、输入、检查器、日志、网络、叠加层、网页、性能、性能分析器、运行时、存储空间、目标、跟踪、WebAudio 和 WebAuthn。
使用帧
帧与目标之间没有一对一的映射。在单个标签页中,多个相同的进程帧可以共享相同的目标,但使用不同的执行上下文。另一方面,系统可能会为进程外 iframe 创建一个新目标。
如需附加到所有帧,您需要分别处理每种类型的帧:
监听
Runtime.executionContextCreated
事件,以识别与相同进程帧关联的新执行上下文。按照相应步骤附加到相关目标,以识别进程外帧。
附加到相关目标
连接到目标后,您可能需要连接到更多相关目标,包括进程外子帧或关联的 worker。
从 Chrome 125 开始,chrome.debugger
API 支持平面会话。这样,您就可以将其他目标作为子级添加到主调试程序会话,并向它们发送消息,而无需再次调用 chrome.debugger.attach
。不过,您可以在调用 chrome.debugger.sendCommand
时添加 sessionId
属性,以标识要向其发送命令的子目标。
如需自动附加到进程外子帧,请先为 Target.attachedToTarget
事件添加监听器:
chrome.debugger.onEvent.addListener((source, method, params) => {
if (method === "Target.attachedToTarget") {
// `source` identifies the parent session, but we need to construct a new
// identifier for the child session
const session = { ...source, sessionId: params.sessionId };
// Call any needed CDP commands for the child session
await chrome.debugger.sendCommand(session, "Runtime.enable");
}
});
然后,发送 Target.setAutoAttach
命令并将 flatten
选项设置为 true
,以启用自动附加:
await chrome.debugger.sendCommand({ tabId }, "Target.setAutoAttach", {
autoAttach: true,
waitForDebuggerOnStart: false,
flatten: true,
filter: [{ type: "iframe", exclude: false }]
});
自动附加仅会附加到目标知晓的帧,这些帧仅限于与其关联的帧的直接子帧。例如,如果帧层次结构为 A -> B -> C(其中所有帧都是跨源帧),则针对与 A 关联的目标调用 Target.setAutoAttach
会导致会话也附加到 B。不过,这不是递归调用,因此还需要调用 Target.setAutoAttach
,以便 B 将会话附加到 C。
示例
如需试用此 API,请从 chrome-extension-samples 代码库安装调试程序 API 示例。
类型
Debuggee
调试对象标识符。必须指定 tabId、extensionId 或 targetId
属性
-
extensionId
字符串(选填)
您打算调试的扩展程序的 ID。只有在使用
--silent-debugger-extension-api
命令行开关时,才能附加到扩展程序后台页面。 -
tabId
编号(可选)
您打算调试的标签页的 ID。
-
targetId
字符串(选填)
调试目标的不透明 ID。
DebuggerSession
调试程序会话标识符。必须指定 tabId、extensionId 或 targetId 之一。此外,您还可以提供可选的 sessionId。如果为从 onEvent
发送的参数指定了 sessionId,则表示事件来自根调试程序会话中的子协议会话。如果在传递给 sendCommand
时指定了 sessionId,则它会定位到根调试会话中的子协议会话。
属性
-
extensionId
字符串(选填)
您打算调试的扩展程序的 ID。只有在使用
--silent-debugger-extension-api
命令行开关时,才能附加到扩展程序后台页面。 -
sessionId
字符串(选填)
Chrome DevTools Protocol 会话的不透明 ID。标识由 tabId、extensionId 或 targetId 标识的根会话中的子会话。
-
tabId
编号(可选)
您打算调试的标签页的 ID。
-
targetId
字符串(选填)
调试目标的不透明 ID。
DetachReason
连接终止原因。
枚举
"target_closed"
"canceled_by_user"
TargetInfo
调试目标信息
属性
-
已挂接
布尔值
如果调试程序已连接,则为 true。
-
extensionId
字符串(选填)
扩展程序 ID,如果 type = 'background_page',则需要指定。
-
faviconUrl
字符串(选填)
目标网站图标网址。
-
id
字符串
目标 ID。
-
tabId
编号(可选)
标签页 ID,如果 type == 'page',则需要定义。
-
title
字符串
目标网页标题。
-
目标类型。
-
网址
字符串
目标网址。
TargetInfoType
目标类型。
枚举
"page"
"background_page"
"worker"
“other”
方法
attach()
chrome.debugger.attach(
target: Debuggee,
requiredVersion: string,
callback?: function,
)
将调试程序附加到给定目标。
参数
-
目标
您要附加的调试目标。
-
requiredVersion
字符串
必需的调试协议版本(“0.1”)。只能附加到具有匹配主要版本且次要版本不低于该主要版本的调试程序。如需查看协议版本列表,请点击此处。
-
callback
函数(可选)
callback
参数如下所示:() => void
返回
-
Promise<void>
Chrome 96 及更高版本清单 V3 及更高版本支持 Promise,但为了实现向后兼容性,我们提供了回调。您不能在同一函数调用中同时使用这两种方法。promise 的解析结果与传递给回调的类型相同。
参数
-
目标
您要分离的调试目标。
-
callback
函数(可选)
callback
参数如下所示:() => void
返回
-
Promise<void>
Chrome 96 及更高版本清单 V3 及更高版本支持 Promise,但为了实现向后兼容性,我们提供了回调。您不能在同一函数调用中同时使用这两种方法。promise 的解析结果与传递给回调的类型相同。
getTargets()
chrome.debugger.getTargets(
callback?: function,
)
返回可用调试目标的列表。
参数
-
callback
函数(可选)
callback
参数如下所示:(result: TargetInfo[]) => void
-
结果
与可用调试目标对应的 TargetInfo 对象数组。
-
返回
-
Promise<TargetInfo[]>
Chrome 96 及更高版本清单 V3 及更高版本支持 Promise,但为了实现向后兼容性,我们提供了回调。您不能在同一函数调用中同时使用这两种方法。promise 的解析结果与传递给回调的类型相同。
sendCommand()
chrome.debugger.sendCommand(
target: DebuggerSession,
method: string,
commandParams?: object,
callback?: function,
)
将给定命令发送到调试目标。
参数
-
您要向其发送命令的调试目标。
-
method
字符串
方法名称。应为远程调试协议定义的方法之一。
-
commandParams
对象(可选)
包含请求参数的 JSON 对象。此对象必须符合给定方法的远程调试参数架构。
-
callback
函数(可选)
callback
参数如下所示:(result?: object) => void
-
结果
对象(可选)
包含响应的 JSON 对象。响应的结构因方法名称而异,由远程调试协议中命令说明的“returns”属性定义。
-
返回
-
Promise<object | undefined>
Chrome 96 及更高版本清单 V3 及更高版本支持 Promise,但为了实现向后兼容性,我们提供了回调。您不能在同一函数调用中同时使用这两种方法。promise 的解析结果与传递给回调的类型相同。
事件
onDetach
chrome.debugger.onDetach.addListener(
callback: function,
)
当浏览器终止标签页的调试会话时触发。当关闭标签页或针对附加的标签页调用 Chrome 开发者工具时,就会发生这种情况。
参数
-
callback
函数
callback
参数如下所示:(source: Debuggee, reason: DetachReason) => void
-
来源
-
reason
-
onEvent
chrome.debugger.onEvent.addListener(
callback: function,
)
每当调试目标发出插桩事件时触发。
参数
-
callback
函数
callback
参数如下所示:(source: DebuggerSession, method: string, params?: object) => void
-
method
字符串
-
params
对象(可选)