شرح
API chrome.debugger بهعنوان انتقال جایگزین برای پروتکل اشکالزدایی از دور Chrome عمل میکند. از chrome.debugger برای پیوستن به یک یا چند برگه برای ابزاربندی تعامل شبکه، اشکالزدایی جاوا اسکریپت، جهش DOM و CSS، و غیره استفاده کنید. از دارایی Debuggee tabId برای هدفیابی برگهها با sendCommand و مسیریابی رویدادها براساس tabId از onEvent پادзвоن استفاده کنید.
اجازهها
debuggerبرای استفاده از این «میانای برنامهسازی کاربردی»، باید اجازه "debugger" را در مانیفست افزونهتان اعلام کنید.
{
"name": "My extension",
...
"permissions": [
"debugger",
],
...
}
محدودیتهای خطمشی سازمانی
در دستگاههای سازمانی، برخیاز خطمشیها میتوانند افزونهها را از پیوست کردن اشکالزدا بااستفاده از مدل همهیاهیچ در زمان پیوست کردن محدود کنند
(browser.debugger.attach()):
- محدودیتهای میزبان: اگر خطمشی سازمانی
ExtensionSettingsمیزبانهای مسدودشده (runtime_blocked_hosts) را برای افزونهای پیکربندی کند،browser.debugger.attach()در همه هدفها با خطای"Host access is restricted by policy."مسدود میشود (حتی اگر مبدأهای فردی درruntime_allowed_hostsباشد). - خطمشیهای «جلوگیری از ازدست رفتن دادهها» و نماگرفت: اگر خطمشی سازمانی
DisableScreenshotsضبط نماگرفت را غیرفعال کند یا قوانین «جلوگیری از ازدست رفتن دادهها» (DLP) برای هدف اعمال شود،browser.debugger.attach()با خطای"Screenshot capture is restricted by policy."ناموفق خواهد بود.
مفاهیم و استفاده
پساز پیوست کردن، میانای برنامهسازی کاربردی browser.debugger به شما امکان میدهد فرمانهای پروتکل Chrome DevTools
(CDP) را به هدف مشخصی ارسال کنید. توضیح دقیق CDP خارج از محدوده این اسناد است—برای کسب اطلاعات بیشتر درباره CDP،
اسناد رسمی CDP را بررسی کنید.
هدفها
هدف نشاندهنده چیزی است که درحال اشکالزدایی است—این میتواند شامل برگه،
iframe، یا کارگر باشد. هر هدف با یک «شناسه منحصربهفرد جهانی» (UUID) شناسایی میشود و نوع مرتبطی دارد (مثل iframe، shared_worker، و غیره).
درون یک هدف، ممکن است چندین زمینه اجرا وجود داشته باشد—برای مثال، iframeهای فرایند یکسان هدف یکتایی دریافت نمیکنند، بلکه بهعنوان زمینههای متفاوتی نمایش داده میشوند که میتوان از یک هدف واحد به آنها دسترسی داشت.
دامنههای محدودشده
بهدلایل امنیتی، «میانای برنامهسازی کاربردی» browser.debugger دسترسی به همه «حوزههای پروتکل» Chrome DevTools را فراهم نمیکند. دامنههای دردسترس عبارتاند از: دسترسیپذیری،
ممیزیها، CacheStorage، Console،
CSS، Database، Debugger، DOM،
DOMDebugger، DOMSnapshot،
Emulation، Fetch، IO، Input،
Inspector، Log، Network، Overlay،
Page، Performance،
Runtime، Storage، Target، Tracing،
WebAudio، و WebAuthn.
کار کردن با قابها
نگاشت یکبهیک قابها به هدفها وجود ندارد. در یک برگه، چندین چارچوب فرایند یکسان ممکن است هدف یکسانی را همرسانی کنند اما از زمینه اجرای متفاوتی استفاده کنند. ازطرف دیگر، ممکن است هدف جدیدی برای iframe خارج از فرایند ایجاد شود.
برای پیوست کردن به همه قابها، باید هر نوع قاب را بهطور جداگانه مدیریت کنید:
به رویداد
Runtime.executionContextCreatedگوش دهید تا زمینههای اجرای جدید مرتبط با قابهای فرایند یکسان را شناسایی کنید.مراحل پیوستن به هدفهای مرتبط را برای شناسایی چارچوبهای خارج از فرایند دنبال کنید.
پیوست کردن به هدفهای مرتبط
پساز اتصال به هدف، ممکن است بخواهید به اهداف مرتبط دیگر ازجمله چارچوبهای فرزند خارج از فرایند یا کارگران مرتبط متصل شوید.
از Chrome 125، میانای برنامهسازی کاربردی browser.debugger از جلسههای مسطح پشتیبانی میکند. این
به شما امکان میدهد هدفهای بیشتری را بهعنوان فرزند به جلسه اشکالزدایی اصلیتان اضافه کنید و
بدون نیاز به فراخوانی دیگری به browser.debugger.attach به آنها پیام دهید. درعوض،
میتوانید هنگام فراخوانی browser.debugger.sendCommand،
دارایی sessionId را اضافه کنید تا کودک هدفی را که میخواهید فرمان را به او ارسال کنید شناسایی کنید.
برای پیوست کردن خودکار به چارچوبهای فرزند خارج از فرایند، ابتدا شنوندهای برای رویداد Target.attachedToTarget اضافه کنید:
browser.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 browser.debugger.sendCommand(session, "Runtime.enable");
}
});
سپس، با ارسال فرمان Target.setAutoAttach با گزینه flatten تنظیمشده روی true، پیوست خودکار را فعال کنید:
await browser.debugger.sendCommand({ tabId }, "Target.setAutoAttach", {
autoAttach: true,
waitForDebuggerOnStart: false,
flatten: true,
filter: [{ type: "iframe", exclude: false }]
});
پیوست خودکار فقط به چارچوبهایی پیوست میشود که هدف از آنها آگاه است، که محدود به چارچوبهایی است که فرزندان مستقیم چارچوب منسوب به آن هستند. برای مثال،
با سلسلهمراتب قاب A -> B -> C (که همه مبدأ مشترک دارند)، فراخوانی
Target.setAutoAttach برای هدف مرتبط با A باعث میشود
جلسه به B نیز پیوست شود. بااینحال، این کار بازگشتی نیست، بنابراین
Target.setAutoAttach نیز باید برای پیوست کردن جلسه B به C فراخوانی شود.
مثالها
برای امتحان کردن این «میانای برنامهسازی کاربردی»، نمونه میانای برنامهسازی کاربردی اشکالزدا را از مخزن chrome-extension-samples نصب کنید.
انواع
Debuggee
شناسه اشکالزداییشونده. باید tabId، extensionId، یا targetId مشخص شود
مشخصات
-
extensionId
رشته اختیاری
شناسه افزونهای که میخواهید اشکالزدایی کنید. پیوستن به صفحه پسزمینه افزونه فقط زمانی امکانپذیر است که از کلید خط فرمان
--silent-debugger-extension-apiاستفاده شود. -
tabId
عدد اختیاری
شناسه برگهای که میخواهید اشکالزدایی کنید.
-
targetId
رشته اختیاری
شناسه مبهم هدف اشکالزدایی.
DebuggerSession
شناسه جلسه اشکالزدا. یکی از tabId، extensionId، یا targetId باید مشخص شود. علاوهبراین، میتوان یک sessionId اختیاری ارائه کرد. اگر sessionId برای آرگومانهای ارسالشده از onEvent مشخص شده باشد، یعنی رویداد از جلسه پروتکل فرزند در جلسه اشکالزدایی ریشه میآید. اگر sessionId هنگام ارسال به sendCommand مشخص شده باشد، جلسه پروتکل فرزند را در جلسه اشکالزدایی ریشه هدفیابی میکند.
مشخصات
-
extensionId
رشته اختیاری
شناسه افزونهای که میخواهید اشکالزدایی کنید. پیوستن به صفحه پسزمینه افزونه فقط زمانی امکانپذیر است که از کلید خط فرمان
--silent-debugger-extension-apiاستفاده شود. -
sessionId
رشته اختیاری
شناسه مبهم جلسه «پروتکل Chrome DevTools». جلسه کودک را در جلسه ریشه شناساییشده توسط tabId، extensionId، یا targetId شناسایی میکند.
-
tabId
عدد اختیاری
شناسه برگهای که میخواهید اشکالزدایی کنید.
-
targetId
رشته اختیاری
شناسه مبهم هدف اشکالزدایی.
DetachReason
دلیل فسخ اتصال.
شمارشی
"target_closed"
"canceled_by_user"
TargetInfo
اطلاعات هدف اشکالزدایی
مشخصات
-
پیوستشده
بولی
اگر اشکالزدا ازقبل پیوست شده باشد درست است.
-
extensionId
رشته اختیاری
شناسه افزونه، اگر نوع = «صفحه_پسزمینه» تعریف شده باشد.
-
faviconUrl
رشته اختیاری
نشانی وب نماد وبسایت هدف.
-
id
رشته
شناسه هدف.
-
tabId
عدد اختیاری
شناسه زبانه، اگر نوع == «صفحه» تعریف شده باشد.
-
عنوان
رشته
عنوان صفحه هدف.
-
نوع
نوع هدف.
-
نشانی وب
رشته
نشانی وب هدف.
TargetInfoType
نوع هدف.
شمارشی
«صفحه»
"background_page"
«کارگر»
«دیگر»
روشها
attach()
chrome.debugger.attach(
target: Debuggee,
requiredVersion: string,
): Promise<void>
اشکالزدا را به هدف دادهشده پیوست میکند.
پارامترها
-
هدف
هدف اشکالزدایی که میخواهید به آن پیوست کنید.
-
requiredVersion
رشته
نسخه پروتکل اشکالزدایی الزامی («۰.۱»). فقط میتوان با نسخه اصلی منطبق و نسخه جزئی بزرگتر یا مساوی به اشکالزداییشونده پیوست کرد. فهرست نسخههای پروتکل را میتوانید اینجا دریافت کنید.
بازگشتیها
-
Promise<void>
Chrome نسخه ۹۶ و بالاتروقتی عملیات پیوست موفق یا ناموفق باشد، مشکل برطرف میشود. وعده بدون مقدار حل میشود. اگر پیوست ناموفق باشد، قول رد خواهد شد.
detach()
chrome.debugger.detach(
target: Debuggee,
): Promise<void>
اشکالزدا را از هدف دادهشده جدا میکند.
پارامترها
-
هدف
هدف اشکالزدایی که میخواهید از آن جدا شوید.
بازگشتیها
-
Promise<void>
Chrome نسخه ۹۶ و بالاتروقتی عملیات جدا کردن موفق یا ناموفق باشد، برطرف میشود. وعده بدون مقدار حل میشود. اگر جدا کردن ناموفق باشد، وعده رد خواهد شد.
getTargets()
chrome.debugger.getTargets(): Promise<TargetInfo[]>
فهرست هدفهای اشکالزدایی دردسترس را برمیگرداند.
بازگشتیها
-
Promise<TargetInfo[]>
Chrome نسخه ۹۶ و بالاتر
sendCommand()
chrome.debugger.sendCommand(
target: DebuggerSession,
method: string,
commandParams?: object,
): Promise<object | undefined>
فرمان دادهشده را به هدف اشکالزدایی ارسال میکند.
پارامترها
-
هدف
هدف اشکالزدایی که میخواهید فرمان را به آن ارسال کنید.
-
روش
رشته
نام روش. باید یکی از روشهای تعریفشده توسط پروتکل اشکالزدایی از دور باشد.
-
commandParams
شیء اختیاری
شیء JSON با پارامترهای درخواست. این شیء باید با طرحواره پارامترهای اشکالزدایی از دور برای روش دادهشده مطابقت داشته باشد.
بازگشتیها
-
Promise<object | undefined>
Chrome نسخه ۹۶ و بالاترمتن پاسخ. اگر هنگام پست کردن پیام خطایی رخ دهد، قول رد خواهد شد.
رویدادها
onDetach
chrome.debugger.onDetach.addListener(
callback: function,
)
وقتی مرورگر جلسه اشکالزدایی برگه را خاتمه میدهد، این رویداد راهاندازی میشود. این اتفاق زمانی روی میدهد که یا برگه بسته میشود یا Chrome DevTools برای برگه پیوستشده فراخوانده میشود.
پارامترها
-
بازخوانی
تابع
پارامتر
callbackبهصورت زیر است:(source: Debuggee, reason: DetachReason) => void
-
منبع
-
دلیل
-
onEvent
chrome.debugger.onEvent.addListener(
callback: function,
)
هرگاه رویداد ابزار دقیق مشکلات هدف اشکالزدایی راهاندازی شود، این رویداد اجرا میشود.
پارامترها
-
بازخوانی
تابع
پارامتر
callbackبهصورت زیر است:(source: DebuggerSession, method: string, params?: object) => void
-
منبع
-
روش
رشته
-
پارامترها
شیء اختیاری
-