chrome.debugger

Описание

API chrome.debugger служит альтернативным транспортом для протокола удалённой отладки Chrome. Используйте chrome.debugger для подключения к одной или нескольким вкладкам для мониторинга сетевого взаимодействия, отладки JavaScript, изменения DOM и CSS и других задач. Используйте свойство tabId объекта Debuggee для выбора вкладок с помощью sendCommand и маршрутизации событий по tabId из обратных вызовов onEvent .

Разрешения

debugger

Для использования этого API необходимо объявить разрешение "debugger" в манифесте вашего расширения.

{   "name": "My extension",   ...   "permissions": [     "debugger",   ],   ... } 

Концепции и использование

После подключения API chrome.debugger позволяет отправлять команды Chrome DevTools Protocol (CDP) заданному целевому объекту. Подробное описание CDP выходит за рамки данной документации. Подробнее о CDP можно узнать в официальной документации CDP .

Цели

Цели представляют собой отлаживаемый объект, например вкладку, iframe или воркер. Каждая цель идентифицируется UUID и имеет связанный с ней тип (например, iframe , shared_worker и т. д.).

В рамках одной цели может быть несколько контекстов выполнения — например, одни и те же фреймы процесса не получают уникальную цель, а вместо этого представлены как разные контексты, к которым можно получить доступ из одной цели.

Ограниченные домены

Из соображений безопасности API chrome.debugger не предоставляет доступ ко всем доменам протокола Chrome DevTools. Доступны следующие домены: 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 .

Работа с кадрами

Кадры не имеют однозначного соответствия с целями. В пределах одной вкладки несколько кадров одного и того же процесса могут использовать одну и ту же цель, но разный контекст выполнения . С другой стороны, для внепроцессного iframe может быть создана новая цель.

Чтобы прикрепить ко всем рамкам, необходимо обрабатывать каждый тип рамы отдельно:

  • Прослушивайте событие Runtime.executionContextCreated , чтобы определить новые контексты выполнения, связанные с теми же кадрами процесса.

  • Выполните шаги по присоединению к связанным целям , чтобы определить кадры, выходящие за рамки процесса.

После подключения к цели вам может потребоваться подключиться к другим связанным целям, включая дочерние фреймы вне процесса или связанные с ними рабочие процессы.

Начиная с Chrome 125, API chrome.debugger поддерживает плоские сеансы. Это позволяет добавлять дополнительные цели в качестве дочерних элементов к основному сеансу отладчика и отправлять им сообщения без необходимости повторного вызова chrome.debugger.attach . Вместо этого можно добавить свойство sessionId при вызове chrome.debugger.sendCommand , чтобы указать дочернюю цель, которой требуется отправить команду.

Чтобы автоматически прикрепляться к дочерним фреймам вне процесса, сначала добавьте прослушиватель для события 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 (где все фреймы кросс-источниковые), вызов Target.setAutoAttach для целевого объекта, связанного с A, приведёт к тому, что сеанс также будет прикреплён к объекту B. Однако это не рекурсивно, поэтому для присоединения сеанса к объекту C также необходимо вызвать Target.setAutoAttach для объекта B.

Примеры

Чтобы опробовать этот API, установите пример API отладчика из репозитория chrome-extension-samples .

Типы

Debuggee

Идентификатор отлаживаемого объекта. Необходимо указать tabId, extensionId или targetId.

Характеристики

  • extensionId

    строка необязательная

    Идентификатор расширения, которое вы собираетесь отлаживать. Присоединение к фоновой странице расширения возможно только при использовании ключа командной строки --silent-debugger-extension-api .

  • tabId

    номер необязательно

    Идентификатор вкладки, которую вы собираетесь отладить.

  • targetId

    строка необязательная

    Непрозрачный идентификатор цели отладки.

DebuggerSession

Хром 125+

Идентификатор сеанса отладчика. Необходимо указать один из следующих вариантов: tabId, extensionId или targetId. Кроме того, можно указать необязательный sessionId. Если для аргументов, отправляемых функцией onEvent , указан sessionId , это означает, что событие исходит из сеанса дочернего протокола внутри корневого сеанса отлаживаемого объекта. Если sessionId указан при передаче в sendCommand , он будет направлен на сеанс дочернего протокола внутри корневого сеанса отлаживаемого объекта.

Характеристики

  • extensionId

    строка необязательная

    Идентификатор расширения, которое вы собираетесь отлаживать. Присоединение к фоновой странице расширения возможно только при использовании ключа командной строки --silent-debugger-extension-api .

  • sessionId

    строка необязательная

    Непрозрачный идентификатор сеанса протокола Chrome DevTools. Идентифицирует дочерний сеанс внутри корневого сеанса, определяемого tabId, extensionId или targetId.

  • tabId

    номер необязательно

    Идентификатор вкладки, которую вы собираетесь отладить.

  • targetId

    строка необязательная

    Непрозрачный идентификатор цели отладки.

DetachReason

Хром 44+

Причина разрыва соединения.

Перечисление

"target_closed"

"отменено_пользователем"

TargetInfo

Отладочная целевая информация

Характеристики

  • прикрепил

    булев

    True, если отладчик уже подключен.

  • extensionId

    строка необязательная

    Идентификатор расширения, определяемый, если type = 'background_page'.

  • faviconUrl

    строка необязательная

    URL-адрес целевого значка.

  • идентификатор

    нить

    Идентификатор цели.

  • tabId

    номер необязательно

    Идентификатор вкладки, определяемый, если type == 'page'.

  • заголовок

    нить

    Заголовок целевой страницы.

  • Тип цели.

  • URL-адрес

    нить

    Целевой URL.

TargetInfoType

Хром 44+

Тип цели.

Перечисление

"страница"

"background_page"

"работник"

"другой"

Методы

attach()

chrome.debugger.attach(
  target: Debuggee,
  requiredVersion: string,
)
: Promise<void>

Присоединяет отладчик к указанной цели.

Параметры

  • Цель отладки, к которой вы хотите присоединитьс.

  • requiredVersion

    нить

    Требуемая версия протокола отладки ("0.1"). Подключиться можно только к отлаживаемому объекту с совпадающей основной версией и большей или равной ей дополнительной версией. Список версий протокола можно получить здесь .

Возврат

  • Обещание<void>

    Хром 96+

detach()

chrome.debugger.detach(
  target: Debuggee,
)
: Promise<void>

Отключает отладчик от заданной цели.

Параметры

  • Цель отладки, от которой вы хотите отсоединиться.

Возврат

  • Обещание<void>

    Хром 96+

getTargets()

chrome.debugger.getTargets(): Promise<TargetInfo[]>

Возвращает список доступных целей отладки.

Возврат

sendCommand()

chrome.debugger.sendCommand(
  target: DebuggerSession,
  method: string,
  commandParams?: object,
)
: Promise<object | undefined>

Отправляет заданную команду в цель отладки.

Параметры

  • цель

    Цель отладки, которой вы хотите отправить команду.

  • метод

    нить

    Имя метода. Должно быть одним из методов, определённых протоколом удалённой отладки .

  • commandParams

    объект необязательный

    JSON-объект с параметрами запроса. Этот объект должен соответствовать схеме параметров удалённой отладки для данного метода.

Возврат

  • Обещание<объект | неопределенный>

    Хром 96+

События

onDetach

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

Возникает, когда браузер завершает сеанс отладки для вкладки. Это происходит либо при закрытии вкладки, либо при вызове Chrome DevTools для прикреплённой вкладки.

Параметры

onEvent

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

Запускается всякий раз, когда отладочная цель выдает событие инструментирования.

Параметры

  • перезвонить

    функция

    Параметр callback выглядит так:

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

    • источник
    • метод

      нить

    • параметры

      объект необязательный