תיאור
chrome.debugger API משמש כהעברה חלופית לפרוטוקול ניפוי הבאגים מרחוק של Chrome. אפשר להשתמש ב-chrome.debugger כדי לצרף לכרטיסייה אחת או יותר כדי למדוד אינטראקציה ברשת, לנפות באגים ב-JavaScript, לשנות את ה-DOM וה-CSS ועוד. משתמשים במאפיין Debuggee tabId כדי לטרגט כרטיסיות באמצעות sendCommand ולנתב אירועים לפי tabId מהקריאות החוזרות (callbacks) של onEvent.
הרשאות
debuggerכדי להשתמש ב-API הזה, צריך להצהיר על ההרשאה "debugger" במניפסט של התוסף.
{
"name": "My extension",
...
"permissions": [
"debugger",
],
...
}
הגבלות מדיניות של Enterprise
במכשירים ארגוניים, כללי מדיניות מסוימים יכולים להגביל תוספים מלצרף את מנקה הבאגים באמצעות מודל של "הכול או כלום" בזמן הצירוף (browser.debugger.attach()):
- מארחים מוגבלים: אם מדיניות הארגון
ExtensionSettingsמגדירה מארחים חסומים (runtime_blocked_hosts) לתוסף,browser.debugger.attach()נחסם בכל היעדים עם השגיאה"Host access is restricted by policy."(גם אם מקורות ספציפיים נמצאים ב-runtime_allowed_hosts). - כללי מדיניות של צילומי מסך ו-DLP: אם מדיניות הארגון
DisableScreenshotsמשביתה את צילום המסך או שכללי מניעת אובדן נתונים (DLP) חלים על היעד, הפעולהbrowser.debugger.attach()נכשלת עם השגיאה"Screenshot capture is restricted by policy.".
מושגים ושימוש
אחרי החיבור, ה-API של browser.debugger מאפשר לשלוח פקודות של פרוטוקול כלי הפיתוח ל-Chrome (CDP) ליעד מסוים. הסבר מעמיק על CDP חורג מהיקף המסמך הזה. למידע נוסף על CDP, עיינו במסמכים הרשמיים של CDP.
יעדים
יעדים מייצגים משהו שעובר ניפוי באגים – זה יכול להיות כרטיסייה, iframe או worker. כל יעד מזוהה באמצעות UUID ומשויך לסוג מסוים (כמו iframe, shared_worker ועוד).
בתוך יעד, יכולים להיות כמה הקשרים של הפעלה. לדוגמה, רכיבי iframe של אותו תהליך לא מקבלים יעד ייחודי, אלא מיוצגים כהקשרים שונים שאפשר לגשת אליהם מיעד אחד.
דומיינים מוגבלים
מטעמי אבטחה, ה-API של browser.debugger לא מספק גישה לכל הדומיינים של פרוטוקול כלי הפיתוח ל-Chrome. הדומיינים הזמינים הם: Accessibility, Audits, 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כדי לזהות הקשרי הרצה חדשים שמשויכים לאותם פריימים של תהליכים.כדי לזהות פריימים מחוץ לתהליך, פועלים לפי השלבים לצירוף ליעדים קשורים.
צירוף ליעדים קשורים
אחרי שמתחברים ליעד, אפשר להתחבר ליעדים קשורים נוספים, כולל מסגרות צאצא מחוץ לתהליך או וורקרים משויכים.
החל מגרסה 125 של Chrome, ה-API של browser.debugger תומך בסשנים שטוחים. כך אפשר להוסיף עוד יעדים כצאצאים לסשן הראשי של מנפה הבאגים ולשלוח להם הודעות בלי צורך בקריאה נוספת ל-browser.debugger.attach. במקום זאת, אפשר להוסיף מאפיין sessionId כשקוראים ל-browser.debugger.sendCommand כדי לזהות את יעד הצאצא שאליו רוצים לשלוח פקודה.
כדי לצרף באופן אוטומטי למסגרות צאצא מחוץ לתהליך, קודם צריך להוסיף מאזין לאירוע 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.
דוגמאות
כדי לנסות את ה-API הזה, מתקינים את הדוגמה של debugger API ממאגר chrome-extension-samples.
סוגים
Debuggee
מזהה של רכיב שעובר ניפוי באגים. צריך לציין tabId, extensionId או targetId
מאפיינים
-
extensionId
מחרוזת אופציונלי
המזהה של התוסף שרוצים לנפות בו באגים. אפשר לצרף לדף רקע של תוסף רק כשמשתמשים במתג שורת הפקודה
--silent-debugger-extension-api. -
tabId
מספר אופציונלי
המזהה של הכרטיסייה שרוצים לנפות בה באגים.
-
targetId
מחרוזת אופציונלי
המזהה האטום של יעד ניפוי הבאגים.
DebuggerSession
מזהה הסשן של מנפה הבאגים. צריך לציין אחד מהבאים: tabId, extensionId או targetId. אפשר גם לספק sessionId אופציונלי. אם sessionId מצוין לארגומנטים שנשלחים מ-onEvent, המשמעות היא שהאירוע מגיע מסשן של פרוטוקול צאצא בתוך סשן הבאגים הבסיסי. אם מציינים את sessionId כשמעבירים אותו אל sendCommand, הוא מטרגט סשן של פרוטוקול צאצא בתוך הסשן של ניפוי הבאגים ברמה הבסיסית (root).
מאפיינים
-
extensionId
מחרוזת אופציונלי
המזהה של התוסף שרוצים לנפות בו באגים. אפשר לצרף לדף רקע של תוסף רק כשמשתמשים במתג שורת הפקודה
--silent-debugger-extension-api. -
sessionId
מחרוזת אופציונלי
המזהה הלא שקוף של הסשן של פרוטוקול כלי הפיתוח ל-Chrome. מזהה סשן צאצא בתוך סשן הבסיס שמזוהה באמצעות tabId, extensionId או targetId.
-
tabId
מספר אופציונלי
המזהה של הכרטיסייה שרוצים לנפות בה באגים.
-
targetId
מחרוזת אופציונלי
המזהה האטום של יעד ניפוי הבאגים.
DetachReason
הסיבה לסגירת החיבור.
טיפוסים בני מנייה (enum)
"target_closed"
"canceled_by_user"
TargetInfo
מידע על יעד ניפוי הבאגים
מאפיינים
-
מצורף
בוליאני
הערך True אם מנפה הבאגים כבר מצורף.
-
extensionId
מחרוזת אופציונלי
מזהה התוסף, מוגדר אם type = 'background_page'.
-
faviconUrl
מחרוזת אופציונלי
כתובת ה-URL של סמל האתר המטורגט.
-
id [מזהה]
מחרוזת
מזהה היעד.
-
tabId
מספר אופציונלי
מזהה הכרטיסייה, מוגדר אם type == 'page'.
-
title
מחרוזת
כותרת דף היעד.
-
סוג
סוג היעד.
-
url
מחרוזת
כתובת ה-URL של היעד.
TargetInfoType
סוג היעד.
טיפוסים בני מנייה (enum)
"page"
"background_page"
"worker"
"other"
Methods
attach()
browser.debugger.attach(
target: Debuggee,
requiredVersion: string,
): Promise<void>
מצרף את מנפה הבאגים ליעד הנתון.
פרמטרים
-
יעד
יעד ניפוי הבאגים שאליו רוצים לצרף.
-
requiredVersion
מחרוזת
גרסת פרוטוקול ניפוי הבאגים הנדרשת ("0.1"). אפשר לצרף רק ל-debuggee עם גרסה ראשית תואמת וגרסה משנית גדולה או שווה. כאן אפשר למצוא רשימה של גרסאות הפרוטוקול.
החזרות
-
Promise<void>
Chrome 96 ואילך browser.* מגרסה 148 של Chromeהפעולה מסתיימת כשהצירוף מצליח או נכשל. ה-promise מסתיים ללא ערך. אם הצירוף נכשל, ה-promise יידחה.
פרמטרים
-
יעד
יעד ניפוי הבאגים שרוצים לנתק.
החזרות
-
Promise<void>
Chrome 96 ואילך browser.* מגרסה 148 של Chromeהפעולה מסתיימת כשפעולת הניתוק מצליחה או נכשלת. ה-promise מסתיים ללא ערך. אם הניתוק נכשל, ה-promise יידחה.
getTargets()
browser.debugger.getTargets(): Promise<TargetInfo[]>
החזרת רשימה של יעדי ניפוי באגים זמינים.
החזרות
-
Promise<TargetInfo[]>
Chrome 96 ואילך browser.* מגרסה 148 של Chrome
sendCommand()
browser.debugger.sendCommand(
target: DebuggerSession,
method: string,
commandParams?: object,
): Promise<object | undefined>
שליחת הפקודה שצוינה ליעד ניפוי הבאגים.
פרמטרים
-
יעד
יעד ניפוי הבאגים שאליו רוצים לשלוח את הפקודה.
-
method
מחרוזת
שם השיטה. צריכה להיות אחת מהשיטות שמוגדרות על ידי פרוטוקול ניפוי הבאגים מרחוק.
-
commandParams
object optional
אובייקט JSON עם פרמטרים של בקשה. האובייקט הזה חייב להתאים לסכימת הפרמטרים של ניפוי הבאגים מרחוק של השיטה הנתונה.
החזרות
-
Promise<object | undefined>
Chrome 96 ואילך browser.* מגרסה 148 של Chromeגוף התגובה. אם תתרחש שגיאה במהלך פרסום ההודעה, ההבטחה תידחה.
אירועים
onDetach
browser.debugger.onDetach.addListener(
callback: function,
)
מופעל כשהדפדפן מסיים את סשן ניפוי הבאגים בכרטיסייה. זה קורה כשהכרטיסייה נסגרת או כשכלי הפיתוח ל-Chrome מופעלים בכרטיסייה המצורפת.
פרמטרים
-
callback
פונקציה
הפרמטר
callbackנראה כך:(source: Debuggee, reason: DetachReason) => void
-
source
-
reason
-
onEvent
browser.debugger.onEvent.addListener(
callback: function,
)
מופעל בכל פעם שיעד ניפוי הבאגים מפעיל אירוע אינסטרומנטציה.
פרמטרים
-
callback
פונקציה
הפרמטר
callbackנראה כך:(source: DebuggerSession, method: string, params?: object) => void
-
source
-
method
מחרוזת
-
פרמטרים
object optional
-