Beschreibung
Die chrome.debugger
API dient als alternativer Transport für das Remote-Debugging-Protokoll von Chrome. Mit chrome.debugger
können Sie einen oder mehrere Tabs anhängen, um die Netzwerkinteraktion zu erfassen, JavaScript zu debuggen, das DOM und CSS zu verändern und vieles mehr. Verwenden Sie das Debuggee
-Attribut tabId
, um Tabs mit sendCommand
anzusteuern und Ereignisse von onEvent
-Callbacks anhand von tabId
weiterzuleiten.
Berechtigungen
debugger
Sie müssen die Berechtigung "debugger"
im Manifest Ihrer Erweiterung deklarieren, um diese API verwenden zu können.
{
"name": "My extension",
...
"permissions": [
"debugger",
],
...
}
Konzepte und Verwendung
Nach der Verknüpfung können Sie über die chrome.debugger
API Chrome DevTools Protocol-Befehle (CDP) an ein bestimmtes Ziel senden. Eine ausführliche Erklärung der CDP ist in dieser Dokumentation nicht möglich. Weitere Informationen finden Sie in der offiziellen CDP-Dokumentation.
Ziele
Ziele stellen etwas dar, das gerade debuggt wird. Das kann ein Tab, ein IFrame oder ein Worker sein. Jedes Ziel wird durch eine UUID identifiziert und hat einen zugehörigen Typ (z. B. iframe
oder shared_worker
).
Innerhalb eines Ziels kann es mehrere Ausführungskontexte geben. Beispielsweise erhalten iframes desselben Prozesses kein eindeutiges Ziel, sondern werden als unterschiedliche Kontexte dargestellt, auf die über ein einzelnes Ziel zugegriffen werden kann.
Eingeschränkt zulässige Domains
Aus Sicherheitsgründen bietet die chrome.debugger
API keinen Zugriff auf alle Chrome DevTools-Protokolldomains. Die verfügbaren Domains sind: Barrierefreiheit, Audits, CacheStorage, Console, CSS, Datenbank, Debugger, DOM, DOMDebugger, DOMSnapshot, Emulation, Fetch, IO, Input, Inspector, Log, Netzwerk, Overlay, Seite, Leistung, Profiler, Laufzeit, Speicher, Ziel, Tracing, WebAudio und WebAuthn.
Mit Frames arbeiten
Es gibt keine eindeutige Zuordnung von Frames zu Zielen. Innerhalb eines einzelnen Tabs können mehrere Prozessframes dasselbe Ziel haben, aber einen anderen Ausführungskontext verwenden. Andererseits kann ein neues Ziel für einen Out-of-Process-iFrame erstellt werden.
Wenn Sie die Untertitel an alle Frames anhängen möchten, müssen Sie jeden Frame-Typ separat verarbeiten:
Warten Sie auf das Ereignis
Runtime.executionContextCreated
, um neue Ausführungskontexte zu identifizieren, die mit denselben Prozessframes verknüpft sind.Folgen Sie der Anleitung unter An zugehörige Ziele anhängen, um Out-of-Process-Frames zu identifizieren.
An ähnliche Ziele anhängen
Nachdem Sie eine Verbindung zu einem Ziel hergestellt haben, können Sie eine Verbindung zu weiteren zugehörigen Zielen herstellen, einschließlich untergeordneter Out-of-Process-Frames oder verknüpfter Worker.
Ab Chrome 125 unterstützt die chrome.debugger
API flache Sitzungen. So können Sie Ihrer Haupt-Debuggersitzung zusätzliche 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
eine sessionId
-Property hinzufügen, um das untergeordnete Ziel anzugeben, an das ein Befehl gesendet werden soll.
Wenn Sie ein Element automatisch an 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 die automatische Anhängefunktion, indem Sie den Befehl Target.setAutoAttach
mit der Option flatten
= true
senden:
await chrome.debugger.sendCommand({ tabId }, "Target.setAutoAttach", {
autoAttach: true,
waitForDebuggerOnStart: false,
flatten: true,
filter: [{ type: "iframe", exclude: false }]
});
Die automatische Anbringung erfolgt nur an Frames, die dem Ziel bekannt sind. Das ist auf Frames beschränkt, die unmittelbare untergeordnete Elemente eines zugehörigen Frames sind. Bei der Framehierarchie A -> B -> C (alle seitenübergreifend) würde beispielsweise der Aufruf von Target.setAutoAttach
für das mit A verknüpfte Ziel dazu führen, dass die Sitzung auch mit B verknüpft wird. Dies ist jedoch nicht rekursiv. Daher muss Target.setAutoAttach
auch für B aufgerufen werden, damit die Sitzung an C angehängt werden kann.
Beispiele
Wenn Sie diese API ausprobieren möchten, installieren Sie das Debugger API-Beispiel aus dem Repository chrome-extension-samples.
Typen
Debuggee
Kennung der zu debuggenden Komponente. 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-api
verwendet wird. -
tabId
number optional
Die ID des Tabs, den Sie debuggen möchten.
-
targetId
String optional
Die intransparente ID des Debug-Ziels.
DebuggerSession
Debugger-Sitzungs-ID. Es muss eine der Optionen „tabId“, „extensionId“ oder „targetId“ angegeben werden. Optional kann auch eine „sessionId“ angegeben werden. Wenn „sessionId“ für Argumente angegeben ist, die von onEvent
gesendet werden, stammt das Ereignis aus einer untergeordneten Protokollsitzung innerhalb der übergeordneten Debuggee-Sitzung. Wenn „sessionId“ angegeben wird, wenn sie an sendCommand
übergeben wird, wird eine untergeordnete Protokollsitzung innerhalb der übergeordneten Debuggee-Sitzung anvisiert.
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-api
verwendet wird. -
sessionId
String optional
Die verschlüsselte ID der Chrome-Entwicklertools-Protokollsitzung. Identifiziert eine untergeordnete Sitzung innerhalb der über „tabId“, „extensionId“ oder „targetId“ identifizierten Stammsitzung.
-
tabId
number optional
Die ID des Tabs, den Sie debuggen möchten.
-
targetId
String optional
Die intransparente ID des Debug-Ziels.
DetachReason
Grund für die Beendigung der Verbindung.
Enum
„target_closed“
"canceled_by_user"
TargetInfo
Informationen zum Debug-Ziel
Attribute
-
Hinzugefügt
boolean
„True“, wenn der Debugger bereits angehängt ist.
-
extensionId
String optional
Die Erweiterungs-ID, definiert, wenn „type“ = „background_page“ ist.
-
faviconUrl
String optional
Ziel-Favicon-URL.
-
id
String
Ziel-ID.
-
tabId
number optional
Die Tab-ID, definiert, wenn „type“ == „page“ ist.
-
Titel
String
Titel der Landingpage.
-
Typ
Zieltyp
-
URL
String
Ziel-URL
TargetInfoType
Zieltyp
Enum
"page"
"background_page"
"worker"
„Sonstiges“
Methoden
attach()
chrome.debugger.attach(
target: Debuggee,
requiredVersion: string,
callback?: function,
)
Hängt den Debugger an das angegebene Ziel an.
Parameter
-
Ziel
Debug-Ziel, an das Sie eine Verbindung herstellen möchten.
-
requiredVersion
String
Erforderliche Version des Debugging-Protokolls („0.1“). Es kann nur eine Verbindung zum zu überwachenden Programm mit derselben Hauptversion und einer höheren oder gleichwertigen Nebenversion hergestellt werden. Eine Liste der Protokollversionen finden Sie hier.
-
callback
function optional
Der Parameter
callback
sieht so aus:() => void
Ausgabe
-
Promise<void>
Chrome 96 und höherVersprechen werden in Manifest V3 und höher unterstützt, aber Callbacks sind für die Abwärtskompatibilität verfügbar. Sie können nicht beide für denselben Funktionsaufruf verwenden. Das Versprechen wird mit demselben Typ aufgelöst, der an den Rückruf übergeben wird.
detach()
chrome.debugger.detach(
target: Debuggee,
callback?: function,
)
Trennt den Debugger vom angegebenen Ziel.
Parameter
-
Ziel
Debug-Ziel, das Sie trennen möchten.
-
callback
function optional
Der Parameter
callback
sieht so aus:() => void
Ausgabe
-
Promise<void>
Chrome 96 und höherVersprechen werden in Manifest V3 und höher unterstützt, aber Callbacks sind für die Abwärtskompatibilität verfügbar. Sie können nicht beide für denselben Funktionsaufruf verwenden. Das Versprechen wird mit demselben Typ aufgelöst, der an den Rückruf übergeben wird.
getTargets()
chrome.debugger.getTargets(
callback?: function,
)
Liste der verfügbaren Debug-Ziele zurückgeben
Parameter
-
callback
function optional
Der Parameter
callback
sieht so aus:(result: TargetInfo[]) => void
-
Ergebnis
Array von TargetInfo-Objekten, die den verfügbaren Debugzielen entsprechen.
-
Ausgabe
-
Promise<TargetInfo[]>
Chrome 96 und höherVersprechen werden in Manifest V3 und höher unterstützt, aber Callbacks sind für die Abwärtskompatibilität verfügbar. Sie können nicht beide für denselben Funktionsaufruf verwenden. Das Versprechen wird mit demselben Typ aufgelöst, der an den Rückruf übergeben wird.
sendCommand()
chrome.debugger.sendCommand(
target: DebuggerSession,
method: string,
commandParams?: object,
callback?: function,
)
Sendet den angegebenen Befehl an das Debug-Ziel.
Parameter
-
Ziel
Debug-Ziel, an das Sie den Befehl senden möchten.
-
method
String
Methodenname. Muss eine der Methoden sein, die vom Remote-Debugging-Protokoll definiert sind.
-
commandParams
object optional
JSON-Objekt mit Anfrageparametern. Dieses Objekt muss dem Schema für Remote-Debugging-Parameter für die angegebene Methode entsprechen.
-
callback
function optional
Der Parameter
callback
sieht so aus:(result?: object) => void
-
Ergebnis
object optional
JSON-Objekt mit der Antwort. Die Struktur der Antwort variiert je nach Methodenname und wird durch das Attribut „returns“ der Befehlsbeschreibung im Remote-Debugging-Protokoll definiert.
-
Ausgabe
-
Promise<object | undefined>
Chrome 96 und höherVersprechen werden in Manifest V3 und höher unterstützt, aber Callbacks sind für die Abwärtskompatibilität verfügbar. Sie können nicht beide für denselben Funktionsaufruf verwenden. Das Versprechen wird mit demselben Typ aufgelöst, der an den Rückruf übergeben wird.
Ereignisse
onDetach
chrome.debugger.onDetach.addListener(
callback: function,
)
Wird ausgelöst, wenn der Browser die Debug-Sitzung für den Tab beendet. Das passiert, wenn entweder der Tab geschlossen oder die Chrome DevTools für den angehängten Tab aufgerufen werden.
Parameter
-
callback
Funktion
Der Parameter
callback
sieht so aus:(source: Debuggee, reason: DetachReason) => void
-
source
-
reason
-
onEvent
chrome.debugger.onEvent.addListener(
callback: function,
)
Wird ausgelöst, wenn beim Debuggen des Ziels ein Instrumentierungsereignis auftritt.
Parameter
-
callback
Funktion
Der Parameter
callback
sieht so aus:(source: DebuggerSession, method: string, params?: object) => void
-
source
-
method
String
-
params
object optional
-