説明
chrome.debugger
API は、Chrome のリモート デバッグ プロトコルの代替トランスポートとして機能します。chrome.debugger
を使用して 1 つ以上のタブに接続し、ネットワーク インタラクションの計測、JavaScript のデバッグ、DOM と CSS の変更などを行います。Debuggee
プロパティ tabId
を使用して、sendCommand
でタブをターゲットにし、onEvent
コールバックから tabId
でイベントをルーティングします。
権限
debugger
この API を使用するには、拡張機能のマニフェストで "debugger"
権限を宣言する必要があります。
{ "name": "My extension", ... "permissions": [ "debugger", ], ... }
コンセプトと使用方法
アタッチされると、chrome.debugger
API を使用して、特定のターゲットに Chrome DevTools Protocol(CDP)コマンドを送信できます。CDP の詳細な説明はこのドキュメントの対象外です。CDP の詳細については、CDP の公式ドキュメントをご覧ください。
ターゲット
ターゲットは、デバッグ対象を表します。タブ、iframe、ワーカーなどが含まれます。各ターゲットは UUID で識別され、関連付けられたタイプ(iframe
、shared_worker
など)があります。
ターゲット内には複数の実行コンテキストが存在する可能性があります。たとえば、同じプロセス iframe は一意のターゲットを取得しませんが、単一のターゲットからアクセスできる異なるコンテキストとして表されます。
制限付きドメイン
セキュリティ上の理由から、chrome.debugger
API はすべての Chrome DevTools Protocol ドメインへのアクセスを提供しません。使用可能なドメインは、Accessibility、Audits、CacheStorage、Console、CSS、Database、Debugger、DOM、DOMDebugger、DOMSnapshot、Emulation、Fetch、IO、Input、Inspector、Log、Network、Overlay、Page、Performance、Profiler、Runtime、Storage、Target、Tracing、WebAudio、WebAuthn
フレームを操作する
フレームとターゲットの 1 対 1 のマッピングはありません。1 つのタブ内で、複数の同じプロセス フレームが同じターゲットを共有しながら、異なる実行コンテキストを使用することがあります。一方、アウトプロセス iframe 用に新しいターゲットが作成されることもあります。
すべてのフレームにアタッチするには、フレームのタイプごとに個別に処理する必要があります。
Runtime.executionContextCreated
イベントをリッスンして、同じプロセス フレームに関連付けられた新しい実行コンテキストを特定します。手順に沿って関連するターゲットにアタッチし、プロセス外フレームを特定します。
関連するターゲットにアタッチする
ターゲットに接続した後、アウトオブプロセスの子フレームや関連するワーカーなど、関連するターゲットにさらに接続することがあります。
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"); } });
次に、flatten
オプションを true
に設定して Target.setAutoAttach
コマンドを送信し、自動アタッチを有効にします。
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 にも関連付けられます。ただし、これは再帰的ではないため、B がセッションを C にアタッチするには Target.setAutoAttach
も呼び出す必要があります。
例
この API を試すには、chrome-extension-samples リポジトリからデバッガ API のサンプルをインストールします。
型
Debuggee
デバッグ対象の識別子。tabId、extensionId、targetId のいずれかを指定する必要があります
プロパティ
- extensionId
文字列 省略可
デバッグする拡張機能の ID。拡張機能のバックグラウンド ページへのアタッチは、
--silent-debugger-extension-api
コマンドライン スイッチが使用されている場合にのみ可能です。 - tabId
number 省略可
デバッグするタブの ID。
- targetId
文字列 省略可
デバッグ ターゲットの不透明 ID。
DebuggerSession
デバッガ セッション ID。tabId、extensionId、targetId のいずれかを指定する必要があります。オプションの sessionId を指定することもできます。onEvent
から送信された引数に sessionId が指定されている場合、イベントはルート デバッギー セッション内の子プロトコル セッションから発生したことを意味します。sendCommand
に渡されるときに sessionId が指定されている場合、ルート デバッギー セッション内の子プロトコル セッションをターゲットにします。
プロパティ
- extensionId
文字列 省略可
デバッグする拡張機能の ID。拡張機能のバックグラウンド ページへのアタッチは、
--silent-debugger-extension-api
コマンドライン スイッチが使用されている場合にのみ可能です。 - sessionId
文字列 省略可
Chrome DevTools Protocol セッションの不透明な ID。tabId、extensionId、targetId で識別されるルート セッション内の子セッションを識別します。
- tabId
number 省略可
デバッグするタブの ID。
- targetId
文字列 省略可
デバッグ ターゲットの不透明 ID。
DetachReason
接続終了の理由。
列挙型
"target_closed"
"canceled_by_user"
TargetInfo
デバッグ ターゲット情報
プロパティ
- attached
ブール値
デバッガがすでにアタッチされている場合は true。
- extensionId
文字列 省略可
タイプが background_page の場合に定義される拡張機能 ID。
- faviconUrl
文字列 省略可
ターゲットのファビコン URL。
- id
文字列
ターゲット ID。
- tabId
number 省略可
タブ ID(type == 'page' の場合に定義)。
- title
文字列
ターゲット ページのタイトル。
- type
ターゲット タイプ。
- URL
文字列
ターゲット URL。
TargetInfoType
ターゲット タイプ。
列挙型
"page"
"background_page"
"worker"
"other"
メソッド
attach()
chrome.debugger.attach(
target: Debuggee,
requiredVersion: string,
): Promise<void>
指定されたターゲットにデバッガをアタッチします。
パラメータ
- ターゲット
アタッチするデバッグ ターゲット。
- requiredVersion
文字列
必要なデバッグ プロトコルのバージョン(「0.1」)。デバッガは、メジャー バージョンが一致し、マイナー バージョンがそれ以上であるデバッグ対象にのみアタッチできます。プロトコル バージョンのリストは、こちらで取得できます。
戻り値
-
Promise<void>
Chrome 96 以降
パラメータ
- ターゲット
デバッグ ターゲット。
戻り値
-
Promise<void>
Chrome 96 以降
戻り値
-
Promise<TargetInfo[]>
Chrome 96 以降
sendCommand()
chrome.debugger.sendCommand(
target: DebuggerSession,
method: string,
commandParams?: object,
): Promise<object | undefined>
指定されたコマンドをデバッグ ターゲットに送信します。
パラメータ
- ターゲット
コマンドの送信先となるデバッグ ターゲット。
- method
文字列
メソッド名。リモート デバッグ プロトコルで定義されているメソッドのいずれかである必要があります。
- commandParams
オブジェクト 省略可
リクエスト パラメータを含む JSON オブジェクト。このオブジェクトは、指定されたメソッドのリモート デバッグ パラメータ スキーマに準拠している必要があります。
戻り値
-
Promise<object | undefined>
Chrome 96 以降
イベント
onDetach
chrome.debugger.onDetach.addListener(
callback: function,
)
ブラウザがタブのデバッグ セッションを終了したときに呼び出されます。これは、タブが閉じられるか、接続されたタブに対して Chrome DevTools が呼び出されると発生します。
パラメータ
- callback
関数
callback
パラメータは次のようになります。(source: Debuggee, reason: DetachReason) => void
- source
- reason
-
onEvent
chrome.debugger.onEvent.addListener(
callback: function,
)
デバッグ ターゲットの問題の計測イベントが発生するたびに呼び出されます。
パラメータ
- callback
関数
callback
パラメータは次のようになります。(source: DebuggerSession, method: string, params?: object) => void
- source
- method
文字列
- params
オブジェクト 省略可
-