Descripción
La API de chrome.debugger
funciona como un transporte alternativo para el protocolo de depuración remota de Chrome. Usa chrome.debugger
para adjuntar una o más pestañas para instrumentar la interacción de la red, depurar JavaScript, mutar el DOM y CSS, y mucho más. Usa la propiedad Debuggee
tabId
para segmentar pestañas con sendCommand
y enrutar eventos por tabId
desde devoluciones de llamada de onEvent
.
Permisos
debugger
Debes declarar el permiso "debugger"
en el manifiesto de tu extensión para usar esta API.
{
"name": "My extension",
...
"permissions": [
"debugger",
],
...
}
Conceptos y uso
Una vez que se adjunta, la API de chrome.debugger
te permite enviar comandos del Chrome DevTools Protocol (CDP) a un destino determinado. Explicar el CDP en detalle está fuera del alcance de esta documentación. Para obtener más información sobre el CDP, consulta la documentación oficial del CDP.
Destinos
Los destinos representan algo que se está depurando, lo que podría incluir una pestaña, un iframe o un worker. Cada objetivo se identifica con un UUID y tiene un tipo asociado (como iframe
, shared_worker
y muchos más).
Dentro de un destino, puede haber varios contextos de ejecución. Por ejemplo, los iframe del mismo proceso no obtienen un destino único, sino que se representan como contextos diferentes a los que se puede acceder desde un solo destino.
Dominios restringidos
Por motivos de seguridad, la API de chrome.debugger
no proporciona acceso a todos los dominios del protocolo de Herramientas para desarrolladores de Chrome. Los dominios disponibles son: 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 y WebAuthn.
Trabaja con fotogramas
No hay una asignación uno a uno de los fotogramas a los objetivos. Dentro de una sola pestaña, varios fotogramas del mismo proceso pueden compartir el mismo destino, pero usar un contexto de ejecución diferente. Por otro lado, se puede crear un destino nuevo para un iframe fuera del proceso.
Para adjuntar el objeto a todos los fotogramas, debes controlar cada tipo de fotograma por separado:
Espera el evento
Runtime.executionContextCreated
para identificar nuevos contextos de ejecución asociados con los mismos marcos de proceso.Sigue los pasos para adjuntar a destinos relacionados y, así, identificar los fotogramas fuera del proceso.
Adjunta a destinos relacionados
Después de conectarte a un destino, es posible que desees conectarte a otros destinos relacionados, incluidos los marcos secundarios fuera del proceso o los trabajadores asociados.
A partir de Chrome 125, la API de chrome.debugger
admite sesiones planas. Esto te permite agregar destinos adicionales como secundarios a tu sesión de depuración principal y enviarles mensajes sin necesidad de otra llamada a chrome.debugger.attach
. En su lugar, puedes agregar una propiedad sessionId
cuando llames a chrome.debugger.sendCommand
para identificar el destino secundario al que deseas enviar un comando.
Para adjuntar automáticamente a los marcos secundarios fuera del proceso, primero agrega un objeto de escucha para el evento 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");
}
});
Luego, habilita la conexión automática enviando el comando Target.setAutoAttach
con la opción flatten
establecida en true
:
await chrome.debugger.sendCommand({ tabId }, "Target.setAutoAttach", {
autoAttach: true,
waitForDebuggerOnStart: false,
flatten: true,
filter: [{ type: "iframe", exclude: false }]
});
La vinculación automática solo se vincula a los fotogramas de los que el destino tiene conocimiento, lo que se limita a los fotogramas que son elementos secundarios inmediatos de un fotograma asociado a él. Por ejemplo, con la jerarquía de marcos A -> B -> C (en la que todos son de origen cruzado), llamar a Target.setAutoAttach
para el destino asociado con A haría que la sesión también se adjuntara a B. Sin embargo, esto no es recursivo, por lo que también se debe llamar a Target.setAutoAttach
para que B adjunte la sesión a C.
Ejemplos
Para probar esta API, instala el ejemplo de la API del depurador desde el repositorio chrome-extension-samples.
Tipos
Debuggee
Es el identificador del elemento depurado. Se debe especificar tabId, extensionId o targetId.
Propiedades
-
extensionId
cadena opcional
Es el ID de la extensión que deseas depurar. Solo es posible adjuntar a una página en segundo plano de la extensión cuando se usa el parámetro de configuración de línea de comandos
--silent-debugger-extension-api
. -
tabId
número opcional
Es el ID de la pestaña que deseas depurar.
-
targetId
cadena opcional
Es el ID opaco del destino de depuración.
DebuggerSession
Identificador de sesión del depurador. Se debe especificar uno de los siguientes parámetros: tabId, extensionId o targetId. Además, se puede proporcionar un sessionId opcional. Si se especifica sessionId para los argumentos enviados desde onEvent
, significa que el evento proviene de una sesión de protocolo secundaria dentro de la sesión de depuración raíz. Si se especifica sessionId cuando se pasa a sendCommand
, se segmenta una sesión de protocolo secundaria dentro de la sesión de depuración raíz.
Propiedades
-
extensionId
cadena opcional
Es el ID de la extensión que deseas depurar. Solo es posible adjuntar a una página en segundo plano de la extensión cuando se usa el parámetro de configuración de línea de comandos
--silent-debugger-extension-api
. -
sessionId
cadena opcional
Es el ID opaco de la sesión del Protocolo de Herramientas para desarrolladores de Chrome. Identifica una sesión secundaria dentro de la sesión raíz identificada por tabId, extensionId o targetId.
-
tabId
número opcional
Es el ID de la pestaña que deseas depurar.
-
targetId
cadena opcional
Es el ID opaco del destino de depuración.
DetachReason
Es el motivo de la finalización de la conexión.
Enum
"target_closed"
"canceled_by_user"
TargetInfo
Información del destino de depuración
Propiedades
-
se conecte el disco
booleano
Es verdadero si el depurador ya está adjunto.
-
extensionId
cadena opcional
Es el ID de la extensión, que se define si el tipo es "background_page".
-
faviconUrl
cadena opcional
Es la URL del ícono de página de destino.
-
id
string
Es el ID del objetivo.
-
tabId
número opcional
Es el ID de la pestaña, que se define si type == "page".
-
título
string
Es el título de la página de destino.
-
tipo
Es el tipo de objetivo.
-
url
string
Es la URL de destino.
TargetInfoType
Es el tipo de objetivo.
Enum
"page"
"background_page"
"worker"
"other"
Métodos
attach()
chrome.debugger.attach(
target: Debuggee,
requiredVersion: string,
): Promise<void>
Adjunta el depurador al destino determinado.
Parámetros
-
objetivo
Es el destino de depuración al que deseas adjuntar el proceso.
-
requiredVersion
string
Versión del protocolo de depuración requerida (“0.1”). Solo se puede adjuntar al depurador con la versión principal coincidente y la versión secundaria mayor o igual. Puedes obtener la lista de versiones del protocolo aquí.
Muestra
-
Promise<void>
Chrome 96 y versiones posteriores
detach()
chrome.debugger.detach(
target: Debuggee,
): Promise<void>
Desvincula el depurador del destino determinado.
Parámetros
-
objetivo
Es el destino de depuración del que deseas desconectarte.
Muestra
-
Promise<void>
Chrome 96 y versiones posteriores
getTargets()
chrome.debugger.getTargets(): Promise<TargetInfo[]>
Devuelve la lista de destinos de depuración disponibles.
Muestra
-
Promise<TargetInfo[]>
Chrome 96 y versiones posteriores
sendCommand()
chrome.debugger.sendCommand(
target: DebuggerSession,
method: string,
commandParams?: object,
): Promise<object | undefined>
Envía el comando determinado al destino de depuración.
Parámetros
-
objetivo
Es el destino de depuración al que deseas enviar el comando.
-
method
string
Nombre del método. Debe ser uno de los métodos definidos por el protocolo de depuración remota.
-
commandParams
objeto opcional
Objeto JSON con parámetros de solicitud. Este objeto debe cumplir con el esquema de parámetros de depuración remota para el método determinado.
Muestra
-
Promise<object | undefined>
Chrome 96 y versiones posteriores
Eventos
onDetach
chrome.debugger.onDetach.addListener(
callback: function,
)
Se activa cuando el navegador finaliza la sesión de depuración de la pestaña. Esto sucede cuando se cierra la pestaña o se invoca Chrome DevTools para la pestaña adjunta.
Parámetros
-
callback
función
El parámetro
callback
se ve de la siguiente manera:(source: Debuggee, reason: DetachReason) => void
-
source
-
Reason
-
onEvent
chrome.debugger.onEvent.addListener(
callback: function,
)
Se activa cada vez que se registra un evento de instrumentación de problemas del destino de depuración.
Parámetros
-
callback
función
El parámetro
callback
se ve de la siguiente manera:(source: DebuggerSession, method: string, params?: object) => void
-
source
-
method
string
-
params
objeto opcional
-