Deskripsi
The chrome.debugger API berfungsi sebagai transportasi alternatif untuk protokol proses debug jarak jauh Chrome. Gunakan chrome.debugger untuk melampirkan ke satu atau beberapa tab untuk menginstrumentasi interaksi jaringan, melakukan proses debug JavaScript, mengubah DOM dan CSS, dan lainnya. Gunakan properti Debuggee tabId untuk menargetkan tab dengan sendCommand dan merutekan peristiwa berdasarkan tabId dari callback onEvent.
Izin
debuggerAnda harus mendeklarasikan izin "debugger" dalam manifes ekstensi untuk menggunakan API ini.
{
"name": "My extension",
...
"permissions": [
"debugger",
],
...
}
Pembatasan kebijakan perusahaan
Di perangkat perusahaan, beberapa kebijakan dapat membatasi ekstensi untuk melampirkan debugger menggunakan model semua atau tidak sama sekali pada waktu lampiran
(chrome.debugger.attach()):
- Pembatasan host: Jika kebijakan perusahaan
ExtensionSettingsmengonfigurasi host yang diblokir (runtime_blocked_hosts) untuk ekstensi,chrome.debugger.attach()akan diblokir di semua target dengan error"Host access is restricted by policy."(mesalipun asal individual berada diruntime_allowed_hosts). - Kebijakan screenshot dan DLP: Jika kebijakan perusahaan
DisableScreenshotsmenonaktifkan pengambilan screenshot atau aturan Pencegahan Kebocoran Data (DLP) berlaku untuk target,chrome.debugger.attach()akan gagal dengan error"Screenshot capture is restricted by policy.".
Konsep dan penggunaan
Setelah dilampirkan, chrome.debugger API memungkinkan Anda mengirim perintah Chrome DevTools Protocol
(CDP) ke target tertentu. Penjelasan mendalam tentang CDP berada di luar cakupan
dokumentasi ini. Untuk mempelajari CDP lebih lanjut, lihat
dokumentasi CDP resmi.
Target
Target mewakili sesuatu yang sedang di-debug—hal ini dapat mencakup tab, iframe, atau pekerja. Setiap target diidentifikasi oleh UUID dan memiliki jenis terkait (seperti iframe, shared_worker, dan lainnya).
Dalam target, mungkin ada beberapa konteks eksekusi—misalnya, iframe proses yang sama tidak mendapatkan target unik, tetapi diwakili sebagai konteks berbeda yang dapat diakses dari satu target.
Domain yang dibatasi
Karena alasan keamanan, chrome.debugger API tidak memberikan akses ke semua Domain Chrome DevTools Protocol. Domain yang tersedia adalah: 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, dan WebAuthn.
Bekerja dengan frame
Tidak ada pemetaan frame ke target satu per satu. Dalam satu tab, beberapa frame proses yang sama dapat berbagi target yang sama, tetapi menggunakan konteks eksekusi yang berbeda. Di sisi lain, target baru dapat dibuat untuk iframe di luar proses.
Untuk melampirkan ke semua frame, Anda harus menangani setiap jenis frame secara terpisah:
Dengarkan peristiwa
Runtime.executionContextCreateduntuk mengidentifikasi konteks eksekusi baru yang terkait dengan frame proses yang sama.Ikuti langkah-langkah untuk melampirkan ke target terkait guna mengidentifikasi frame di luar proses.
Melampirkan ke target terkait
Setelah terhubung ke target, Anda mungkin ingin terhubung ke target terkait lebih lanjut, termasuk frame turunan di luar proses atau pekerja terkait.
Mulai Chrome 125, chrome.debugger API mendukung sesi datar. Hal ini memungkinkan Anda menambahkan target tambahan sebagai turunan ke sesi debugger utama dan mengirim pesan tanpa memerlukan panggilan lain ke chrome.debugger.attach. Sebagai gantinya, Anda dapat menambahkan properti sessionId saat memanggil chrome.debugger.sendCommand untuk mengidentifikasi target turunan yang ingin Anda kirimi perintah.
Untuk melampirkan secara otomatis ke frame turunan di luar proses, pertama-tama tambahkan pemroses untuk peristiwa 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");
}
});
Kemudian, aktifkan lampiran otomatis dengan mengirim perintah Target.setAutoAttach dengan
opsi flatten yang ditetapkan ke true:
await chrome.debugger.sendCommand({ tabId }, "Target.setAutoAttach", {
autoAttach: true,
waitForDebuggerOnStart: false,
flatten: true,
filter: [{ type: "iframe", exclude: false }]
});
Lampiran otomatis hanya melampirkan ke frame yang diketahui target, yang terbatas pada frame yang merupakan turunan langsung dari frame yang terkait dengannya. Misalnya, dengan hierarki frame A -> B -> C (dengan semua lintas origin), memanggil Target.setAutoAttach untuk target yang terkait dengan A akan menyebabkan sesi juga dilampirkan ke B. Namun, hal ini tidak bersifat rekursif, sehingga Target.setAutoAttach juga perlu dipanggil untuk B guna melampirkan sesi ke C.
Contoh
Untuk mencoba API ini, instal contoh API debugger dari repositori chrome-extension-samples.
Jenis
Debuggee
ID Debuggee. tabId, extensionId, atau targetId harus ditentukan
Properti
-
extensionId
string opsional
ID ekstensi yang ingin Anda debug. Melampirkan ke halaman latar belakang ekstensi hanya dapat dilakukan jika tombol command line
--silent-debugger-extension-apidigunakan. -
tabId
angka opsional
ID tab yang ingin Anda debug.
-
targetId
string opsional
ID target debug yang tidak transparan.
DebuggerSession
ID sesi debugger. Salah satu dari tabId, extensionId, atau targetId harus ditentukan. Selain itu, sessionId opsional dapat diberikan. Jika sessionId ditentukan untuk argumen yang dikirim dari onEvent, artinya peristiwa tersebut berasal dari sesi protokol turunan dalam sesi debuggee root. Jika sessionId ditentukan saat diteruskan ke sendCommand, sesi tersebut akan menargetkan sesi protokol turunan dalam sesi debuggee root.
Properti
-
extensionId
string opsional
ID ekstensi yang ingin Anda debug. Melampirkan ke halaman latar belakang ekstensi hanya dapat dilakukan jika tombol command line
--silent-debugger-extension-apidigunakan. -
sessionId
string opsional
ID sesi Chrome DevTools Protocol yang tidak transparan. Mengidentifikasi sesi turunan dalam sesi root yang diidentifikasi oleh tabId, extensionId, atau targetId.
-
tabId
angka opsional
ID tab yang ingin Anda debug.
-
targetId
string opsional
ID target debug yang tidak transparan.
DetachReason
Alasan penghentian koneksi.
Enum
"target_closed"
"canceled_by_user"
TargetInfo
Informasi target debug
Properti
-
attached
boolean
Benar jika debugger sudah dilampirkan.
-
extensionId
string opsional
ID ekstensi, ditentukan jika jenis = 'background_page'.
-
faviconUrl
string opsional
URL favicon target.
-
id
string
ID target.
-
tabId
angka opsional
ID tab, ditentukan jika jenis == 'page'.
-
title
string
Judul halaman target.
-
type
Jenis target.
-
url
string
URL target.
TargetInfoType
Jenis target.
Enum
"page"
"background_page"
"worker"
"other"
Metode
attach()
chrome.debugger.attach(
target: Debuggee,
requiredVersion: string,
): Promise<void>
Melampirkan debugger ke target yang diberikan.
Parameter
-
target
Target proses debug yang ingin Anda lampirkan.
-
requiredVersion
string
Versi protokol proses debug yang diperlukan ("0.1"). Anda hanya dapat melampirkan ke debuggee dengan versi utama yang cocok dan versi minor yang lebih besar atau sama dengan. Daftar versi protokol dapat diperoleh di sini.
Hasil
-
Promise<void>
Chrome 96+Di-resolve setelah operasi lampirkan berhasil atau gagal. Promise di-resolve tanpa nilai. Jika lampiran gagal, promise akan ditolak.
detach()
chrome.debugger.detach(
target: Debuggee,
): Promise<void>
Melepaskan debugger dari target yang diberikan.
Parameter
-
target
Target proses debug yang ingin Anda lepaskan.
Hasil
-
Promise<void>
Chrome 96+Di-resolve setelah operasi lepaskan berhasil atau gagal. Promise di-resolve tanpa nilai. Jika pelepasan gagal, promise akan ditolak.
getTargets()
chrome.debugger.getTargets(): Promise<TargetInfo[]>
Menampilkan daftar target debug yang tersedia.
Hasil
-
Promise<TargetInfo[]>
Chrome 96+
sendCommand()
chrome.debugger.sendCommand(
target: DebuggerSession,
method: string,
commandParams?: object,
): Promise<object | undefined>
Mengirim perintah yang diberikan ke target proses debug.
Parameter
-
target
Target proses debug yang ingin Anda kirimi perintah.
-
method
string
Nama metode. Harus salah satu metode yang ditentukan oleh protokol proses debug jarak jauh.
-
commandParams
objek opsional
Objek JSON dengan parameter permintaan. Objek ini harus sesuai dengan skema parameter proses debug jarak jauh untuk metode yang diberikan.
Hasil
-
Promise<object | undefined>
Chrome 96+Isi respons. Jika terjadi error saat memposting pesan, promise akan ditolak.
Acara
onDetach
chrome.debugger.onDetach.addListener(
callback: function,
)
Diaktifkan saat browser menghentikan sesi proses debug untuk tab. Hal ini terjadi saat tab ditutup atau Chrome DevTools dipanggil untuk tab yang dilampirkan.
Parameter
-
callback
fungsi
Parameter
callbackterlihat seperti:(source: Debuggee, reason: DetachReason) => void
-
source
-
reason
-
onEvent
chrome.debugger.onEvent.addListener(
callback: function,
)
Diaktifkan setiap kali target proses debug mengeluarkan peristiwa instrumentasi.
Parameter
-
callback
fungsi
Parameter
callbackterlihat seperti:(source: DebuggerSession, method: string, params?: object) => void
-
source
-
method
string
-
params
objek opsional
-