ניהול אירועים באמצעות סקריפטים ברקע

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

דף רקע נטען כשצריך, ומתנתק כשאין פעילות. דוגמאות לאירועים:

  • בשלב הראשון, התוסף הותקן או עודכן לגרסה חדשה.
  • דף הרקע האזין לאירוע והאירוע נשלח.
  • סקריפט של תוכן או תוסף אחר שולחים הודעה.
  • תצוגה אחרת בתוסף, כמו חלון קופץ, מתקשרת אל runtime.getBackgroundPage.

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

סקריפטים אפקטיביים של רקע נשארים במצב רדום עד שהאירוע שהם מקשיבים לשריפות פועל, מגיבים לפי ההוראות שצוינו ואז פורקים את הנתונים שנטענו.

רישום סקריפטים של רקע

סקריפטים של רקע שרשומים במניפסט מופיעים בשדה "background". הם רשומים במערך אחרי המפתח "scripts", ואת "persistent" צריך לציין כ-FALSE.

{
  "name": "Awesome Test Extension",
  ...
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  ...
}

ניתן לרשום מספר סקריפטים של רקע עבור קוד מודולרי.

{
    "name": "Awesome Test Extension",
    ...
    "background": {
      "scripts": [
        "backgroundContextMenus.js",
        "backgroundOmniBox.js",
        "backgroundOauth.js"
      ],
      "persistent": false
    },
    ...
  }

אם התוסף משתמש כרגע בדף רקע קבוע, עיינו במדריך להעברת רקע כדי לקבל הוראות למעבר למודל שאינו קבוע.

הפעלת התוסף

מאזינים לאירוע runtime.onInstalled כדי לאתחל תוסף במהלך ההתקנה. כדאי להשתמש באירוע הזה כדי להגדיר מצב או לאתחול חד-פעמי, כמו תפריט הקשר.

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

הגדרת פונקציות listener

בניית סקריפטים של רקע סביב אירועים שהתוסף תלוי בהם. הגדרת אירועים רלוונטיים מבחינה פונקציונלית מאפשרת לסקריפטים של רקע להיות במצב רדום עד שהאירועים האלה מופעלים, ומונעת מהתוסף להחמיץ טריגרים חשובים.

המאזינים חייבים להיות רשומים באופן סינכרוני מתחילת הדף.

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

// This will run when a bookmark is created.
chrome.bookmarks.onCreated.addListener(function() {
  // do something
});

אל תרשום מאזינים באופן אסינכרוני, כי הם לא יופעלו כהלכה.

chrome.runtime.onInstalled.addListener(function() {
  // ERROR! Events must be registered synchronously from the start of
  // the page.
  chrome.bookmarks.onCreated.addListener(function() {
    // do something
  });
});

לתוספים יש אפשרות להסיר מאזינים מסקריפטים של הרקע באמצעות קריאה ל-removeListener. אם כל המאזינים לאירוע הוסרו, Chrome לא יטען יותר את סקריפט הרקע של התוסף עבור אותו אירוע.

chrome.runtime.onMessage.addListener(function(message, sender, reply) {
    chrome.runtime.onMessage.removeListener(event);
});

סינון אירועים

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

chrome.webNavigation.onCompleted.addListener(function() {
    alert("This is my favorite website!");
}, {url: [{urlMatches : 'https://www.google.com/'}]});

תגובה למאזינים

המאזינים פועלים כדי להפעיל פונקציונליות ברגע שאירוע מופעל. כדי להגיב לאירוע, צריך לבנות את התגובה הרצויה בתוך אירוע המאזינים.

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message.data == "setAlarm") {
    chrome.alarms.create({delayInMinutes: 5})
  } else if (message.data == "runLogic") {
    chrome.tabs.executeScript({file: 'logic.js'});
  } else if (message.data == "changeColor") {
    chrome.tabs.executeScript(
        {code: 'document.body.style.backgroundColor="orange"'});
  };
});

הסרת הסקריפטים ברקע

צריך לשמור את הנתונים מדי פעם, כדי שמידע חשוב לא יאבד במקרה של קריסת תוסף בלי לקבל onSuspend. אפשר להיעזר ב-storage API.

chrome.storage.local.set({variable: variableInformation});

אם בתוסף נעשה שימוש בהעברת הודעות, יש לוודא שכל היציאות סגורות. סקריפט הרקע לא יוסר עד שכל יציאות ההודעות ייסגרו. האזנה לאירוע runtime.Port.onDisconnect תאפשר לך לדעת מתי יציאות פתוחות נסגרות. סוגרים אותם ידנית באמצעות runtime.Port.disconnect.

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message == 'hello') {
    sendResponse({greeting: 'welcome!'})
  } else if (message == 'goodbye') {
    chrome.runtime.Port.disconnect();
  }
});

ניתן לתעד את משך החיים של סקריפט רקע על ידי מעקב אחר המקרים שבהם רשומה של תוסף מופיעה ונעלמת ממנהל המשימות של Chrome.

ALT_TEXT_HERE

כדי לפתוח את מנהל המשימות, לוחצים על תפריט Chrome, מעבירים את העכבר מעל כלים נוספים ובוחרים באפשרות 'מנהל המשימות'.

סקריפטים של רקע פורקים מעצמם לאחר מספר שניות של חוסר פעילות. אם צריך לבצע ניקוי של הרגע האחרון, מאזינים לאירוע runtime.onSuspend.

chrome.runtime.onSuspend.addListener(function() {
  console.log("Unloading.");
  chrome.browserAction.setBadgeText({text: ""});
});

עם זאת, יש להעדיף נתונים עקביים על פני הסתמכות על runtime.onSuspend. היא לא מאפשרת לצמצם את כמות הניקוי הנדרשת ולא תעזור במקרה של תאונת דרכים.