תיאור
ה-API של chrome.debugger
משמש ככלי תחבורה חלופי לפרוטוקול לניפוי באגים מרחוק של Chrome. אפשר להשתמש ב-chrome.debugger
כדי לצרף כרטיסייה אחת או יותר כדי לבדוק את האינטראקציה עם הרשת, לנפות באגים ב-JavaScript, לשנות את DOM ו-CSS ועוד. משתמשים במאפיין tabId
של Debuggee
כדי לטרגט כרטיסיות באמצעות sendCommand
ולנתב אירועים לפי tabId
מקרי קריאה חוזרת (callbacks) של onEvent
.
הרשאות
debugger
כדי להשתמש ב-API הזה, צריך להצהיר על ההרשאה "debugger"
במניפסט של התוסף.
{
"name": "My extension",
...
"permissions": [
"debugger",
],
...
}
מושגים ושימוש
לאחר הקישור, ממשק ה-API chrome.debugger
מאפשר לשלוח פקודות של פרוטוקול כלי הפיתוח של Chrome (CDP) ליעד נתון. הסבר מפורט על CDP חורג מהיקף המסמך הזה. למידע נוסף על CDP, אפשר לעיין במסמכי התיעוד הרשמיים של CDP.
יעדים
מטרות מייצגות משהו שמתבצע בו ניפוי באגים – זה יכול להיות כרטיסייה, iframe או עובד. כל יעד מזוהה באמצעות UUID ויש לו סוג משויך (כמו iframe
, shared_worker
ועוד).
בתוך יעד יכולים להיות כמה הקשרי ביצוע – לדוגמה, ל-iframe באותו תהליך לא מוקצה יעד ייחודי, אלא הוא מיוצג כהקשרים שונים שאפשר לגשת אליהם מיעד יחיד.
דומיינים מוגבלים
מטעמי אבטחה, ממשק ה-API chrome.debugger
לא מספק גישה לכל הדומיינים של פרוטוקול Chrome DevTools. הדומיינים הזמינים הם: 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 ו-WebAuthn.
עבודה עם מסגרות
אין מיפוי אחד לאחד של פריימים ליעדים. בכרטיסייה אחת, יכול להיות שפריימים של תהליכים זהים ישתפו את אותו יעד, אבל ישתמשו בהקשר ביצוע שונה. לעומת זאת, יכול להיות שייווצר יעד חדש ל-iframe מחוץ לתהליך.
כדי לצרף את הקוד לכל המסגרות, צריך לטפל בכל סוג של מסגרת בנפרד:
אפשר להאזין לאירוע
Runtime.executionContextCreated
כדי לזהות הקשרי ביצוע חדשים שמשויכים לאותו מסגרת תהליך.פועלים לפי השלבים לצירוף ליעדים קשורים כדי לזהות מסגרות מחוץ לתהליך.
צירוף ליעדים קשורים
אחרי שמתחברים ליעד, כדאי להתחבר ליעדים קשורים נוספים, כולל מסגרות צאצא מחוץ לתהליך או עובדים משויכים.
החל מגרסה 125 של Chrome, ממשק ה-API chrome.debugger
תומך בסשנים רגילים. כך תוכלו להוסיף עוד מטרות כצאצאים לסשן הניפוי הבאגים הראשי ולשלוח להן הודעות בלי צורך בקריאה נוספת ל-chrome.debugger.attach
. במקום זאת, אפשר להוסיף את הנכס sessionId
בזמן הקריאה ל-chrome.debugger.sendCommand
כדי לזהות את יעד הצאצא שאליו רוצים לשלוח את הפקודה.
כדי לצרף באופן אוטומטי לפריימים צאצאים מחוץ לתהליך, קודם צריך להוסיף מאזין לאירוע 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");
}
});
לאחר מכן, מפעילים את הצירוף האוטומטי על ידי שליחת הפקודה Target.setAutoAttach
עם הערך true
באפשרות flatten
:
await chrome.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 הזה, מתקינים את הדוגמה ל-API של מנתח הבאגים מהמאגר chrome-extension-samples.
סוגים
Debuggee
מזהה הקוד לניפוי באגים. צריך לציין את tabId, extensionId או targetId
מאפיינים
-
extensionId
מחרוזת אופציונלי
המזהה של התוסף שרוצים לנפות בו באגים. אפשר לצרף את התג לדף הרקע של התוסף רק כשמשתמשים במתג שורת הפקודה
--silent-debugger-extension-api
. -
tabId
מספר אופציונלי
המזהה של הכרטיסייה שרוצים לנפות באגים בה.
-
targetId
מחרוזת אופציונלי
המזהה האטום של יעד ניפוי הבאגים.
DebuggerSession
מזהה הסשן של מנתח הבאגים. צריך לציין אחד מהפרמטרים הבאים: tabId, extensionId או targetId. בנוסף, אפשר לספק מזהה סשן אופציונלי. אם צוין sessionId לארגומנטים שנשלחים מ-onEvent
, המשמעות היא שהאירוע מגיע מסשן של פרוטוקול צאצא בתוך סשן ניפוי הבאגים ברמה הבסיסית. אם מציינים את sessionId כשהוא מועבר אל sendCommand
, הוא מטרגט סשן פרוטוקול צאצא בסשן של ה-debuggee ברמה הבסיסית.
מאפיינים
-
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 של היעד.
TargetInfoType
סוג היעד.
Enum
"page"
"background_page"
"worker"
"other"
Methods
attach()
chrome.debugger.attach(
target: Debuggee,
requiredVersion: string,
callback?: function,
)
הצמדת מנתח הבאגים ליעד הנתון.
פרמטרים
-
יעד
היעד לניפוי באגים שאליו רוצים לצרף את הקוד.
-
requiredVersion
מחרוזת
גרסת הפרוטוקול הנדרשת לניפוי באגים ('0.1'). אפשר לצרף את הקוד לבדיקה רק אם הגרסה הראשית תואמת לגרסה הראשית של הקוד לבדיקה, והגרסה המשנית תואמת או גדולה יותר. כאן אפשר למצוא רשימה של גרסאות הפרוטוקול.
-
callback
פונקציה אופציונלי
הפרמטר
callback
נראה כך:() => void
החזרות
-
Promise<void>
גרסה 96 ואילך של Chromeיש תמיכה ב-Promises ב-Manifest V3 ואילך, אבל פונקציות קריאה חוזרת (callbacks) ניתנות לצורך תאימות לאחור. אי אפשר להשתמש בשניהם באותה קריאה לפונקציה. הפתרון של ההבטחה יהיה באותו סוג שהוענק ל-callback.
detach()
chrome.debugger.detach(
target: Debuggee,
callback?: function,
)
ניתוק מנתח הבאגים מהיעד הנתון.
פרמטרים
-
יעד
יעד ניפוי הבאגים שממנו רוצים לנתק.
-
callback
פונקציה אופציונלי
הפרמטר
callback
נראה כך:() => void
החזרות
-
Promise<void>
גרסה 96 ואילך של Chromeיש תמיכה ב-Promises ב-Manifest V3 ואילך, אבל פונקציות קריאה חוזרת (callbacks) ניתנות לצורך תאימות לאחור. אי אפשר להשתמש בשניהם באותה קריאה לפונקציה. הפתרון של ההבטחה יהיה באותו סוג שהוענק ל-callback.
getTargets()
chrome.debugger.getTargets(
callback?: function,
)
הפונקציה מחזירה את רשימת היעדים הזמינים לניפוי באגים.
פרמטרים
-
callback
פונקציה אופציונלי
הפרמטר
callback
נראה כך:(result: TargetInfo[]) => void
-
תוצאה
מערך של אובייקטים מסוג TargetInfo שתואמים ליעדים הזמינים לניפוי באגים.
-
החזרות
-
Promise<TargetInfo[]>
גרסה 96 ואילך של Chromeיש תמיכה ב-Promises ב-Manifest V3 ואילך, אבל פונקציות קריאה חוזרת (callbacks) ניתנות לצורך תאימות לאחור. אי אפשר להשתמש בשניהם באותה קריאה לפונקציה. הפתרון של ההבטחה יהיה באותו סוג שהוענק ל-callback.
sendCommand()
chrome.debugger.sendCommand(
target: DebuggerSession,
method: string,
commandParams?: object,
callback?: function,
)
שליחת הפקודה שצוינה ליעד לניפוי הבאגים.
פרמטרים
-
יעד
היעד לניפוי באגים שאליו רוצים לשלוח את הפקודה.
-
method
מחרוזת
שם השיטה. צריכה להיות אחת מהשיטות שמוגדרות בפרוטוקול לניפוי באגים מרחוק.
-
commandParams
אובייקט אופציונלי
אובייקט JSON עם פרמטרים של בקשה. האובייקט הזה חייב להתאים לסכימה של הפרמטרים לניפוי באגים מרחוק בשיטה נתונה.
-
callback
פונקציה אופציונלי
הפרמטר
callback
נראה כך:(result?: object) => void
-
תוצאה
אובייקט אופציונלי
אובייקט JSON עם התגובה. המבנה של התגובה משתנה בהתאם לשם השיטה, והוא מוגדר לפי המאפיין 'returns' (החזרים) של תיאור הפקודה בפרוטוקול ניפוי הבאגים מרחוק.
-
החזרות
-
Promise<object | undefined>
גרסה 96 ואילך של Chromeיש תמיכה ב-Promises ב-Manifest V3 ואילך, אבל פונקציות קריאה חוזרת (callbacks) ניתנות לצורך תאימות לאחור. אי אפשר להשתמש בשניהם באותה קריאה לפונקציה. הפתרון של ההבטחה יהיה באותו סוג שהוענק ל-callback.
אירועים
onDetach
chrome.debugger.onDetach.addListener(
callback: function,
)
האירוע מופעל כשהדפדפן מסיים את סשן ניפוי הבאגים של הכרטיסייה. זה קורה כשסוגרים את הכרטיסייה או כשמפעילים את Chrome DevTools בכרטיסייה המצורפת.
פרמטרים
-
callback
פונקציה
הפרמטר
callback
נראה כך:(source: Debuggee, reason: DetachReason) => void
-
source
-
סיבה
-
onEvent
chrome.debugger.onEvent.addListener(
callback: function,
)
האירוע הזה מופעל בכל פעם שמופעל אירוע של מכשיר למדידת ביצועים לצורך ניפוי באגים ביעדים.
פרמטרים
-
callback
פונקציה
הפרמטר
callback
נראה כך:(source: DebuggerSession, method: string, params?: object) => void
-
source
-
method
מחרוזת
-
params
אובייקט אופציונלי
-