אירועים ב-Service Workers

סקריפטים של Service Worker לתוספים תומכים באירועים של Service Worker רגיל ובאירועים רבים בממשקי ה-API של התוספים. בקטע הזה מוסבר מהן האפשרויות הזמינות ומוצגים טיפים לשימוש בהן.

הצהרה על אירועים של תוספים

צריך להצהיר על הגורמים המטפלים באירועים ב-Service Workers בהיקף הגלובלי, כלומר הם צריכים להיות ברמה העליונה של הסקריפט ולא להיות מוטמעים בתוך פונקציות. כך הם נרשמים באופן סינכרוני בהרצת הסקריפט הראשונית, ו-Chrome יכול לשלוח אירועים ל-service worker ברגע שהוא מתחיל לפעול. לדוגמה:

לא מומלץ
browser.storage.local.get(["badgeText"], ({ badgeText }) => {
  browser.action.setBadgeText({ text: badgeText });
  browser.action.onClicked.addListener(handleActionClick);
});
טוב יותר
browser.action.onClicked.addListener(handleActionClick);

browser.storage.local.get(["badgeText"], ({ badgeText }) => {
  browser.action.setBadgeText({ text: badgeText });
});

אירועים נפוצים

קובצי שירות של תוספים תומכים באירועים בממשקי API ספציפיים. בהמשך מפורטות כמה סיבות נפוצות לכך. חשוב לדעת: חלק מממשקי ה-API האלה דורשים הרשאות לשימוש, ובחלקם יש אירועים, שיטות או מאפיינים שלא זמינים בכל הגרסאות של Chrome. פרטים נוספים מופיעים במסמכי העזרה של ה-API שמקושרים כאן, במיוחד בנושא האירועים, השיטות או המאפיינים שבהם רוצים להשתמש.

browser.action
האירוע מופעל בתגובה לאינטראקציה של משתמש עם סמל סרגל הכלים של התוסף, בין אם הפעולה מתבצעת בדף ספציפי (כרטיסייה) או בתוסף כולו.
browser.management
מספק אירועים שקשורים להתקנה, להסרה, להפעלה ולהשבתה של תוספים.
browser.notifications
מספק אירועים שקשורים לאינטראקציה של המשתמש עם התראות מערכת שנוצרו על ידי התוסף.
browser.permissions
מציין מתי המשתמש העניק או ביטל את ההרשאות של התוסף.
browser.runtime
מספק אירועים שקשורים למחזור החיים של התוסף, הודעות שנשלחות מחלקים אחרים של התוסף והתראות על עדכון זמין של תוסף או של Chrome.
browser.storage.onChanged
האירוע מופעל בכל פעם שאובייקט StorageArea כלשהו מתרוקן, או כשמשנים או מגדירים את הערך של מפתח. שימו לב שלכל מופע StorageArea יש אירוע onChanged משלו.
browser.webNavigation
מספק מידע על הסטטוס של בקשות ניווט שנמצאות בתהליך.

מסננים

כדי להגביל את האירועים למקרה שימוש ספציפי או לבטל קריאות מיותרות לאירועים, צריך להשתמש בממשקי API שתומכים במסנני אירועים. לדוגמה, נניח שיש תוסף שמקשיב לאירוע tabs.onUpdated כדי לזהות מתי משתמש עובר לאתר ספציפי. האירוע הזה יופעל בכל ניווט בכל כרטיסייה. במקום זאת, אפשר להשתמש ב-webNavigation.onCompleted עם מסנן. לדוגמה:

const filter = {
  url: [
    {
      urlMatches: 'https://www.google.com/',
    },
  ],
};

browser.webNavigation.onCompleted.addListener(() => {
  console.info("The user has loaded my favorite website!");
}, filter);

אירועים של service worker באתר

סקריפטים של Service Worker לתוספים תומכים ביותר אירועים של מחזור החיים שמתוארים במקום אחר.

ServiceWorkerGlobal.fetch

האירוע מופעל כשמאחזרים משהו מחבילת התוסף או כשקוראים לפונקציות fetch() ו-XMLHttpRequest() מסקריפט של תוסף או מחלון קופץ. (שיחות מסקריפטים של תוכן לא נחסמות על ידי handler של service worker‏ fetch). במקרים האחרונים, צריך להוסיף את כתובות ה-URL של הדפים שרוצים לאחזר למפתח "host_permissions" ב-manifest.json.

ServiceWorkerGlobal.message

העברת הודעות של Service Worker זמינה בנוסף להעברת הודעות של תוספים, אבל שתי המערכות לא יכולות לפעול יחד. המשמעות היא שהודעות שנשלחות באמצעות sendMessage() (שזמין מכמה ממשקי API של תוספים) לא נחסמות על ידי מטפלי הודעות של Service Worker. באופן דומה, הודעות שנשלחות באמצעות postMessage() לא נחסמות על ידי רכיבי handler של הודעות תוסף. יש תמיכה בשני סוגי מטפלי ההודעות – כלומר גם ServiceWorkerGlobal.message וגם browser.runtime.onMessage – בסקריפט שירות של תוסף.

מומלץ להשתמש בהעברת הודעות בין תוספים, אלא אם יש לכם סיבה ספציפית להשתמש בהעברת הודעות של Service Worker.