Beschreibung
Die chrome.debugger API dient als alternativer Transport für das Remote-Debugging-Protokoll von Chrome. Mit chrome.debugger können Sie eine Verbindung zu einem oder mehreren Tabs herstellen, um die Netzwerkinteraktion zu instrumentieren, JavaScript zu debuggen, das DOM und CSS zu ändern und vieles mehr. Verwenden Sie die Debuggee-Eigenschaft tabId, um Tabs mit sendCommand anzusprechen und Ereignisse über tabId aus onEvent Callbacks weiterzuleiten.
Berechtigungen
debuggerSie müssen die Berechtigung "debugger" im Manifest Ihrer Erweiterung deklarieren, um diese API zu verwenden.
{
"name": "My extension",
...
"permissions": [
"debugger",
],
...
}
Einschränkungen durch Unternehmensrichtlinien
Auf Unternehmensgeräten können einige Richtlinien verhindern, dass Erweiterungen den Debugger mit einem Alles-oder-Nichts-Modell zum Zeitpunkt des Anhängens
(chrome.debugger.attach()) anhängen:
- Hosteinschränkungen: Wenn in der Unternehmensrichtlinie
ExtensionSettingsblockierte Hosts (runtime_blocked_hosts) für eine Erweiterung konfiguriert sind, wirdchrome.debugger.attach()für alle Ziele mit dem Fehler"Host access is restricted by policy."blockiert (auch wenn einzelne Ursprünge inruntime_allowed_hostsenthalten sind). - Richtlinien für Screenshots und DLP: Wenn die Unternehmensrichtlinie
DisableScreenshotsdie Aufnahme von Screenshots deaktiviert oder Regeln zum Schutz vor Datenverlust (Data Loss Prevention, DLP) auf das Ziel angewendet werden, schlägtchrome.debugger.attach()mit dem Fehler"Screenshot capture is restricted by policy."fehl.
Konzepte und Verwendung
Nach dem Anhängen können Sie mit der chrome.debugger API Befehle des Chrome-Entwicklertools-Protokolls
(Chrome DevTools Protocol, CDP) an ein bestimmtes Ziel senden. Eine detaillierte Erläuterung des CDP würde den Rahmen dieser Dokumentation sprengen
. Weitere Informationen finden Sie in der
offiziellen CDP-Dokumentation.
Ziele
Ziele stellen etwas dar, das debuggt wird. Dazu können ein Tab, ein Iframe oder ein Worker gehören. Jedes Ziel wird durch eine UUID identifiziert und hat einen zugehörigen Typ (z. B. iframe, shared_worker usw.).
Innerhalb eines Ziels kann es mehrere Ausführungskontexte geben. Beispielsweise erhalten Iframes im selben Prozess kein eindeutiges Ziel, sondern werden als verschiedene Kontexte dargestellt, auf die über ein einzelnes Ziel zugegriffen werden kann.
Eingeschränkte Domains
Aus Sicherheitsgründen bietet die chrome.debugger API keinen Zugriff auf alle Chrome-Entwicklertools-Protokolldomains. Die verfügbaren Domains sind: 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 und WebAuthn.
Mit Frames arbeiten
Es gibt keine Eins-zu-eins-Zuordnung von Frames zu Zielen. Auf einem einzelnen Tab, können mehrere Frames im selben Prozess dasselbe Ziel verwenden, aber einen anderen Ausführungskontextnutzen. Andererseits kann für einen Iframe außerhalb des Prozesses ein neues Ziel erstellt werden.
Wenn Sie alle Frames anhängen möchten, müssen Sie jeden Frame-Typ separat verarbeiten:
Achten Sie auf das Ereignis
Runtime.executionContextCreated, um neue Ausführungskontexte zu identifizieren, die mit Frames im selben Prozess verknüpft sind.Folgen Sie der Anleitung zum Anhängen an verknüpfte Ziele, um Frames außerhalb des Prozesses zu identifizieren.
An verknüpfte Ziele anhängen
Nachdem Sie eine Verbindung zu einem Ziel hergestellt haben, können Sie eine Verbindung zu weiteren verknüpften Zielen herstellen, z. B. untergeordneten Frames außerhalb des Prozesses oder zugehörigen Workern.
Ab Chrome 125 unterstützt die chrome.debugger API flache Sitzungen. So können Sie Ihrer Haupt-Debuggersitzung weitere Ziele als untergeordnete Elemente hinzufügen und ihnen Nachrichten senden, ohne chrome.debugger.attach noch einmal aufrufen zu müssen. Stattdessen können Sie beim Aufrufen von chrome.debugger.sendCommand die Eigenschaft sessionId hinzufügen, um das untergeordnete Ziel zu identifizieren, an das Sie einen Befehl senden möchten.
Wenn Sie automatisch untergeordnete Frames außerhalb des Prozesses anhängen möchten, fügen Sie zuerst einen Listener für das Ereignis Target.attachedToTarget hinzu:
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");
}
});
Aktivieren Sie dann das automatische Anhängen, indem Sie den Befehl Target.setAutoAttach senden und die Option flatten auf true setzen:
await chrome.debugger.sendCommand({ tabId }, "Target.setAutoAttach", {
autoAttach: true,
waitForDebuggerOnStart: false,
flatten: true,
filter: [{ type: "iframe", exclude: false }]
});
Beim automatischen Anhängen werden nur Frames angehängt, die dem Ziel bekannt sind. Das sind nur Frames, die unmittelbare untergeordnete Elemente eines zugehörigen Frames sind. Wenn beispielsweise die Frame-Hierarchie A -> B -> C ist (wobei alle ursprungsübergreifend sind), führt der Aufruf von Target.setAutoAttach für das Ziel, das mit A verknüpft ist, dazu, dass die Sitzung auch an B angehängt wird. Dies ist jedoch nicht rekursiv. Daher muss Target.setAutoAttach auch für B aufgerufen werden, um die Sitzung an C anzuhängen.
Beispiele
Wenn Sie diese API testen möchten, installieren Sie das Debugger-API-Beispiel aus dem Repository chrome-extension-samples.
Typen
Debuggee
Debuggee-Kennung. Es muss entweder tabId, extensionId oder targetId angegeben werden.
Attribute
-
extensionId
String optional
Die ID der Erweiterung, die Sie debuggen möchten. Das Anhängen an eine Hintergrundseite der Erweiterung ist nur möglich, wenn der Befehlszeilenschalter
--silent-debugger-extension-apiverwendet wird. -
tabId
Zahl optional
Die ID des Tabs, den Sie debuggen möchten.
-
targetId
String optional
Die intransparente ID des Debugziels.
DebuggerSession
Debugger-Sitzungs-ID. Es muss entweder tabId, extensionId oder targetId angegeben werden. Optional kann auch eine sessionId angegeben werden. Wenn für Argumente, die von onEvent gesendet werden, eine sessionId angegeben ist, stammt das Ereignis aus einer untergeordneten Protokollsitzung innerhalb der Debuggee-Stammsitzung. Wenn beim Übergeben an sendCommand eine sessionId angegeben wird, wird eine untergeordnete Protokollsitzung innerhalb der Debuggee-Stammsitzung angesprochen.
Attribute
-
extensionId
String optional
Die ID der Erweiterung, die Sie debuggen möchten. Das Anhängen an eine Hintergrundseite der Erweiterung ist nur möglich, wenn der Befehlszeilenschalter
--silent-debugger-extension-apiverwendet wird. -
sessionId
String optional
Die intransparente ID der Chrome-Entwicklertools-Protokollsitzung. Identifiziert eine untergeordnete Sitzung innerhalb der Stammsitzung, die durch tabId, extensionId oder targetId identifiziert wird.
-
tabId
Zahl optional
Die ID des Tabs, den Sie debuggen möchten.
-
targetId
String optional
Die intransparente ID des Debugziels.
DetachReason
Grund für die Beendigung der Verbindung.
Enum
"target_closed"
"canceled_by_user"
TargetInfo
Informationen zum Debugziel
Attribute
-
attached
Boolesch
„True“, wenn der Debugger bereits angehängt ist.
-
extensionId
String optional
Die Erweiterungs-ID, definiert, wenn type = 'background_page'.
-
faviconUrl
String optional
Favicon-URL des Ziels.
-
id
String
Ziel-ID.
-
tabId
Zahl optional
Die Tab-ID, definiert, wenn type == 'page'.
-
title
String
Titel der Zielseite.
-
type
Zieltyp.
-
url
String
Ziel-URL.
TargetInfoType
Zieltyp.
Enum
"page"
"background_page"
"worker"
"other"
Methoden
attach()
chrome.debugger.attach(
target: Debuggee,
requiredVersion: string,
): Promise<void>
Hängt den Debugger an das angegebene Ziel an.
Parameter
-
target
Debugziel, an das Sie den Debugger anhängen möchten.
-
requiredVersion
String
Erforderliche Version des Debugging-Protokolls („0.1“). Sie können den Debugger nur an das Debuggee mit der übereinstimmenden Hauptversion und einer höheren oder gleichen Nebenversion anhängen. Eine Liste der Protokollversionen finden Sie hier.
Ausgabe
-
Promise<void>
Chrome 96+Wird aufgelöst, sobald der Anhänge-Vorgang erfolgreich war oder fehlgeschlagen ist. Das Promise wird ohne Wert aufgelöst. Wenn das Anhängen fehlschlägt, wird das Promise abgelehnt.
detach()
chrome.debugger.detach(
target: Debuggee,
): Promise<void>
Trennt den Debugger vom angegebenen Ziel.
Parameter
-
target
Debugziel, von dem Sie den Debugger trennen möchten.
Ausgabe
-
Promise<void>
Chrome 96+Wird aufgelöst, sobald der Trennvorgang erfolgreich war oder fehlgeschlagen ist. Das Promise wird ohne Wert aufgelöst. Wenn das Trennen fehlschlägt, wird das Promise abgelehnt.
getTargets()
chrome.debugger.getTargets(): Promise<TargetInfo[]>
Gibt die Liste der verfügbaren Debugziele zurück.
Ausgabe
-
Promise<TargetInfo[]>
Chrome 96+
sendCommand()
chrome.debugger.sendCommand(
target: DebuggerSession,
method: string,
commandParams?: object,
): Promise<object | undefined>
Sendet den angegebenen Befehl an das Debugziel.
Parameter
-
target
Debugziel, an das Sie den Befehl senden möchten.
-
method
String
Methodenname. Muss eine der Methoden sein, die im Remote-Debugging-Protokoll definiert sind.
-
commandParams
Objekt optional
JSON-Objekt mit Anfrageparametern. Dieses Objekt muss dem Schema für Remote-Debugging-Parameter für die angegebene Methode entsprechen.
Ausgabe
-
Promise<object | undefined>
Chrome 96+Antworttext. Wenn beim Senden der Nachricht ein Fehler auftritt, wird das Promise abgelehnt.
Ereignisse
onDetach
chrome.debugger.onDetach.addListener(
callback: function,
)
Wird ausgelöst, wenn der Browser die Debugging-Sitzung für den Tab beendet. Das passiert, wenn der Tab geschlossen wird oder die Chrome-Entwicklertools für den angehängten Tab aufgerufen werden.
Parameter
-
callback
Funktion
Der Parameter
callbacksieht so aus:(source: Debuggee, reason: DetachReason) => void
-
source
-
reason
-
onEvent
chrome.debugger.onEvent.addListener(
callback: function,
)
Wird ausgelöst, wenn das Debugziel ein Instrumentierungsereignis ausgibt.
Parameter
-
callback
Funktion
Der Parameter
callbacksieht so aus:(source: DebuggerSession, method: string, params?: object) => void
-
source
-
method
String
-
params
Objekt optional
-