chrome.debugger

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

debugger

Sie 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 ExtensionSettings blockierte Hosts (runtime_blocked_hosts) für eine Erweiterung konfiguriert sind, wird chrome.debugger.attach() für alle Ziele mit dem Fehler "Host access is restricted by policy." blockiert (auch wenn einzelne Ursprünge in runtime_allowed_hosts enthalten sind).
  • Richtlinien für Screenshots und DLP: Wenn die Unternehmensrichtlinie DisableScreenshots die Aufnahme von Screenshots deaktiviert oder Regeln zum Schutz vor Datenverlust (Data Loss Prevention, DLP) auf das Ziel angewendet werden, schlägt chrome.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.

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-api verwendet wird.

  • tabId

    Zahl optional

    Die ID des Tabs, den Sie debuggen möchten.

  • targetId

    String optional

    Die intransparente ID des Debugziels.

DebuggerSession

Chrome 125+

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-api verwendet 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

Chrome 44+

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.

  • Zieltyp.

  • url

    String

    Ziel-URL.

TargetInfoType

Chrome 44+

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

sendCommand()

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

Sendet den angegebenen Befehl an das Debugziel.

Parameter

  • 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

onEvent

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

Wird ausgelöst, wenn das Debugziel ein Instrumentierungsereignis ausgibt.

Parameter

  • callback

    Funktion

    Der Parameter callback sieht so aus:

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