chrome.debugger

説明

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 で識別され、関連するタイプ(iframeshared_worker など)が割り当てられています。

ターゲット内に複数の実行コンテキストが存在する場合があります。たとえば、同じプロセスの iframe は固有のターゲットを取得せず、単一のターゲットからアクセスできる異なるコンテキストとして表されます。

制限付きドメイン

セキュリティ上の理由から、chrome.debugger API はすべての Chrome DevTools プロトコル ドメインへのアクセスを提供しません。使用可能なドメインは、AccessibilityAuditsCacheStorageConsoleCSSDatabaseDebuggerDOMDOMDebuggerDOMSnapshotEmulationFetchIOInputInspectorLogNetworkOverlayPagePerformanceProfilerRuntimeStorageTargetTracingWebAudioWebAuthn です。

フレームを操作する

フレームとターゲットの間に 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

デバッグ対象の ID。tabId、extensionId、targetId のいずれかを指定する必要があります

プロパティ

  • extensionId

    文字列 省略可

    デバッグする拡張機能の ID。拡張機能のバックグラウンド ページに接続できるのは、--silent-debugger-extension-api コマンドライン スイッチを使用している場合のみです。

  • tabId

    number(省略可)

    デバッグするタブの ID。

  • targetId

    文字列 省略可

    デバッグ ターゲットの不透明 ID。

DebuggerSession

Chrome 125 以降

デバッガのセッション 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

Chrome 44 以降

接続終了の理由。

列挙型

"target_closed"

"canceled_by_user"

TargetInfo

デバッグ対象の情報

プロパティ

  • attached

    ブール値

    デバッガがすでにアタッチされている場合は true。

  • extensionId

    文字列(省略可)

    拡張機能 ID。type = 'background_page' の場合に定義されます。

  • faviconUrl

    文字列 省略可

    ターゲット ファビコンの URL。

  • id

    文字列

    ターゲット ID。

  • tabId

    number(省略可)

    タブ ID。type == 'page' の場合に定義されます。

  • title

    文字列

    ターゲット ページのタイトル。

  • ターゲット タイプ。

  • URL

    文字列

    ターゲット URL。

TargetInfoType

Chrome 44 以降

ターゲット タイプ。

列挙型

「page」

"background_page"

「worker」

「その他」

メソッド

attach()

Promise
chrome.debugger.attach(
  target: Debuggee,
  requiredVersion: string,
  callback?: function,
)

指定されたターゲットにデバッガをアタッチします。

パラメータ

  • ターゲット

    アタッチするデバッグ対象。

  • requiredVersion

    文字列

    必要なデバッグ プロトコルのバージョン(「0.1」)。メジャー バージョンとマイナー バージョンが一致するデバッガにのみアタッチできます。プロトコル バージョンのリストについては、こちらをご覧ください。

  • callback

    function 省略可

    callback パラメータは次のようになります。

    () => void

戻り値

  • Promise<void>

    Chrome 96 以降

    Promise は Manifest V3 以降でサポートされていますが、下位互換性を確保するためにコールバックが用意されています。同じ関数呼び出しで両方を使用することはできません。Promise は、コールバックに渡されるのと同じ型で解決されます。

detach()

Promise
chrome.debugger.detach(
  target: Debuggee,
  callback?: function,
)

指定されたターゲットからデバッガを切断します。

パラメータ

  • ターゲット

    デタッチするデバッグ対象。

  • callback

    function 省略可

    callback パラメータは次のようになります。

    () => void

戻り値

  • Promise<void>

    Chrome 96 以降

    Promise は Manifest V3 以降でサポートされていますが、下位互換性を確保するためにコールバックが用意されています。同じ関数呼び出しで両方を使用することはできません。Promise は、コールバックに渡されるのと同じ型で解決されます。

getTargets()

Promise
chrome.debugger.getTargets(
  callback?: function,
)

使用可能なデバッグ ターゲットのリストを返します。

パラメータ

  • callback

    function 省略可

    callback パラメータは次のようになります。

    (result: TargetInfo[]) => void

    • 件の結果

      使用可能なデバッグ ターゲットに対応する TargetInfo オブジェクトの配列。

戻り値

  • Promise<TargetInfo[]>

    Chrome 96 以降

    Promise は Manifest V3 以降でサポートされていますが、下位互換性を確保するためにコールバックが用意されています。同じ関数呼び出しで両方を使用することはできません。Promise は、コールバックに渡されるのと同じ型で解決されます。

sendCommand()

Promise
chrome.debugger.sendCommand(
  target: DebuggerSession,
  method: string,
  commandParams?: object,
  callback?: function,
)

指定されたコマンドをデバッグ ターゲットに送信します。

パラメータ

  • ターゲット

    コマンドを送信するデバッグ対象。

  • method

    文字列

    メソッド名。リモート デバッグ プロトコルで定義されているメソッドのいずれかである必要があります。

  • commandParams

    オブジェクト(省略可)

    リクエスト パラメータを含む JSON オブジェクト。このオブジェクトは、指定されたメソッドのリモート デバッグ パラメータ スキームに準拠している必要があります。

  • callback

    function 省略可

    callback パラメータは次のようになります。

    (result?: object) => void

    • 件の結果

      オブジェクト(省略可)

      レスポンスを含む JSON オブジェクト。レスポンスの構造はメソッド名によって異なり、リモート デバッグ プロトコルのコマンド記述の「returns」属性によって定義されます。

戻り値

  • Promise<object | undefined>

    Chrome 96 以降

    Promise は Manifest V3 以降でサポートされていますが、下位互換性を確保するためにコールバックが用意されています。同じ関数呼び出しで両方を使用することはできません。Promise は、コールバックに渡されるのと同じ型で解決されます。

イベント

onDetach

chrome.debugger.onDetach.addListener(
  callback: function,
)

ブラウザがタブのデバッグ セッションを終了したときに呼び出されます。これは、タブが閉じられるか、接続されたタブに対して Chrome DevTools が呼び出された場合に発生します。

パラメータ

onEvent

chrome.debugger.onEvent.addListener(
  callback: function,
)

デバッグ対象が計測イベントを発行するたびに呼び出されます。

パラメータ

  • callback

    関数

    callback パラメータは次のようになります。

    (source: DebuggerSession, method: string, params?: object) => void

    • method

      文字列

    • params

      オブジェクト(省略可)