אירועים ב-Service Workers

קובצי שירות (service worker) של תוספים תומכים גם באירועים של קובץ שירות רגיל וגם באירועים רבים בממשקי ה-API של התוספים. בקטע הזה מתואר אילו אפליקציות זמינות וניתן טיפים לשימוש בהן.

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

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

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

טובה יותר
chrome.action.onClicked.addListener(handleActionClick);

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

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

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

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

מסננים

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

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

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

אירועים של Web Service Worker

כלי שירות (service worker) של תוספים תומכים במקרים נוספים, מעבר לאירועים במחזור החיים שמתוארים במקום אחר.

ServiceWorkerGlobal.fetch

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

ServiceWorkerGlobal.message

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

עדיף להשתמש בהודעות לגבי תוספים, אלא אם יש סיבה ספציפית לשימוש בהודעות של קובץ השירות (service worker).