Описание
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
Идентификатор сеанса отладчика. Необходимо указать один из следующих вариантов: tabId, extensionId или targetId. Кроме того, можно указать необязательный sessionId. Если для аргументов, отправляемых функцией onEvent
, указан sessionId , это означает, что событие исходит из сеанса дочернего протокола внутри корневого сеанса отлаживаемого объекта. Если sessionId указан при передаче в sendCommand
, он будет направлен на сеанс дочернего протокола внутри корневого сеанса отлаживаемого объекта.
Характеристики
- extensionId
строка необязательная
Идентификатор расширения, которое вы собираетесь отлаживать. Присоединение к фоновой странице расширения возможно только при использовании ключа командной строки
--silent-debugger-extension-api
. - sessionId
строка необязательная
Непрозрачный идентификатор сеанса протокола Chrome DevTools. Идентифицирует дочерний сеанс внутри корневого сеанса, определяемого tabId, extensionId или targetId.
- tabId
номер необязательно
Идентификатор вкладки, которую вы собираетесь отладить.
- targetId
строка необязательная
Непрозрачный идентификатор цели отладки.
DetachReason
Причина разрыва соединения.
Перечисление
"target_closed" "отменено_пользователем"
TargetInfo
Отладочная целевая информация
Характеристики
- прикрепил
булев
True, если отладчик уже подключен.
- extensionId
строка необязательная
Идентификатор расширения, определяемый, если type = 'background_page'.
- faviconUrl
строка необязательная
URL-адрес целевого значка.
- идентификатор
нить
Идентификатор цели.
- tabId
номер необязательно
Идентификатор вкладки, определяемый, если type == 'page'.
- заголовок
нить
Заголовок целевой страницы.
- тип
Тип цели.
- URL-адрес
нить
Целевой URL.
TargetInfoType
Тип цели.
Перечисление
"страница" "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[]>
Возвращает список доступных целей отладки.
Возврат
Обещание< TargetInfo []>
Хром 96+
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 для прикреплённой вкладки.
Параметры
- перезвонить
функция
Параметр
callback
выглядит так:(source: Debuggee, reason: DetachReason) => void
- источник
- причина
onEvent
chrome.debugger.onEvent.addListener(
callback: function,
)
Запускается всякий раз, когда отладочная цель выдает событие инструментирования.
Параметры
- перезвонить
функция
Параметр
callback
выглядит так:(source: DebuggerSession, method: string, params?: object) => void
- источник
- метод
нить
- параметры
объект необязательный