browser.events

תיאור

מרחב השמות chrome.events מכיל סוגים נפוצים שמשמשים ממשקי API לשליחת אירועים כדי להודיע לכם כשקורה משהו מעניין.

מושגים ושימוש

Event הוא אובייקט שמאפשר לקבל התראה כשקורה משהו מעניין. הנה דוגמה לשימוש באירוע browser.alarms.onAlarm כדי לקבל התראה בכל פעם שאזעקה מסתיימת:

browser.alarms.onAlarm.addListener((alarm) => {
  appendToLog(`alarms.onAlarm -- name: ${alarm.name}, scheduledTime: ${alarm.scheduledTime}`);
});

כפי שרואים בדוגמה, אתם נרשמים לקבלת התראות באמצעות addListener(). הארגומנט של הפונקציה addListener() הוא תמיד פונקציה שאתם מגדירים כדי לטפל באירוע, אבל הפרמטרים של הפונקציה תלויים באירוע שבו אתם מטפלים. בתיעוד של alarms.onAlarm אפשר לראות שהפונקציה כוללת פרמטר יחיד: אובייקט alarms.Alarm שמכיל פרטים על הזמן שחלף מאז ההתראה.

דוגמאות ל-API שמשתמשים באירועים: alarms, ‏ i18n, ‏ identity, ‏ runtime. רוב ממשקי ה-API של Chrome תומכים בכך.

גורמים הצהרתיים שמטפלים באירועים

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

לדוגמה, נעשה שימוש ב-Declarative event handlers ב-Declarative Content API. בדף הזה מוסברים המושגים הבסיסיים של כל ה-event handlers הדקלרטיביים.

כללים

הכלל הפשוט ביותר האפשרי מורכב מתנאי אחד או יותר ומפעולה אחת או יותר:

const rule = {
  conditions: [ /* my conditions */ ],
  actions: [ /* my actions */ ]
};

אם אחד מהתנאים מתקיים, כל הפעולות מבוצעות.

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

const rule = {
  id: "my rule",  // optional, will be generated if not set.
  priority: 100,  // optional, defaults to 100.
  conditions: [ /* my conditions */ ],
  actions: [ /* my actions */ ]
};

אובייקטים של אירועים

יכול להיות שאובייקטים של אירועים תומכים בכללים. אובייקטים של אירועים כאלה לא קוראים לפונקציית קריאה חוזרת כשמתרחשים אירועים, אלא בודקים אם לכלל רשום יש לפחות תנאי אחד שהתקיים, ומבצעים את הפעולות שמשויכות לכלל הזה. לאובייקטים של אירועים שתומכים ב-API הדקלרטיבי יש שלוש שיטות רלוונטיות: events.Event.addRules(),‏ events.Event.removeRules() ו-events.Event.getRules().

הוספת כללים

כדי להוסיף כללים, קוראים לפונקציה addRules() של אובייקט האירוע. הפרמטר הראשון שלה הוא מערך של מופעי כללים, והפרמטר השני הוא פונקציית קריאה חוזרת שמופעלת בסיום.

const rule_list = [rule1, rule2, ...];
addRules(rule_list, (details) => {...});

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

הסרת כללים

כדי להסיר כללים, קוראים לפונקציה removeRules(). היא מקבלת מערך אופציונלי של מזהי כללים כפרמטר הראשון שלה, ופונקציית קריאה חוזרת כפרמטר השני שלה.

const rule_ids = ["id1", "id2", ...];
removeRules(rule_ids, () => {...});

אם rule_ids הוא מערך של מזהים, כל הכללים שמכילים מזהים שמופיעים במערך יוסרו. אם rule_ids מציג מזהה לא מוכר, המערכת מתעלמת ממנו. אם rule_ids הוא undefined, כל הכללים הרשומים של התוסף הזה מוסרים. הפונקציה callback() מופעלת כשהכללים הוסרו.

אחזור כללים

כדי לאחזר רשימה של כללים רשומים, קוראים לפונקציה getRules(). הפונקציה מקבלת מערך אופציונלי של מזהי כללים עם אותה סמנטיקה כמו removeRules() ופונקציית קריאה חוזרת.

const rule_ids = ["id1", "id2", ...];
getRules(rule_ids, (details) => {...});

הפרמטר details שמועבר לפונקציה callback() מתייחס למערך של כללים, כולל פרמטרים אופציונליים שמולאו.

ביצועים

כדי להשיג את הביצועים הכי טובים, חשוב לפעול לפי ההנחיות הבאות.

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

במקום
const rule1 = {...};
const rule2 = {...};
browser.declarativeWebRequest.onRequest.addRules([rule1]);
browser.declarativeWebRequest.onRequest.addRules([rule2]);
העדפה
const rule1 = {...};
const rule2 = {...};
browser.declarativeWebRequest.onRequest.addRules([rule1, rule2]);

מעדיף התאמה של תת-מחרוזות על פני ביטויים רגולריים ב-events.UrlFilter. התאמה שמבוססת על מחרוזת משנה היא מהירה מאוד.

במקום
const match = new browser.declarativeWebRequest.RequestMatcher({
  url: {urlMatches: "example.com/[^?]*foo" }
});
העדפה
const match = new browser.declarativeWebRequest.RequestMatcher({
  url: {hostSuffix: "example.com", pathContains: "foo"}
});

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

במקום
const condition1 = new browser.declarativeWebRequest.RequestMatcher({
  url: { hostSuffix: 'example.com' }
});
const condition2 = new browser.declarativeWebRequest.RequestMatcher({
  url: { hostSuffix: 'foobar.com' }
});
const rule1 = { conditions: [condition1],
                actions: [new browser.declarativeWebRequest.CancelRequest()]
              };
const rule2 = { conditions: [condition2],
                actions: [new browser.declarativeWebRequest.CancelRequest()]
              };
browser.declarativeWebRequest.onRequest.addRules([rule1, rule2]);
העדפה
const condition1 = new browser.declarativeWebRequest.RequestMatcher({
  url: { hostSuffix: 'example.com' }
});
const condition2 = new browser.declarativeWebRequest.RequestMatcher({
  url: { hostSuffix: 'foobar.com' }
});
const rule = { conditions: [condition1, condition2],
              actions: [new browser.declarativeWebRequest.CancelRequest()]
             };
browser.declarativeWebRequest.onRequest.addRules([rule]);

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

אירועים מסוננים הם מנגנון שמאפשר ל-listeners לציין קבוצת משנה של אירועים שהם מתעניינים בהם. פונקציית listener שמשתמשת במסנן לא תופעל עבור אירועים שלא עוברים את המסנן, מה שהופך את קוד ה-listener ליעיל יותר וקל יותר להבנה. אין צורך להפעיל service worker כדי לטפל באירועים שלא רלוונטיים לו.

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

במקום
browser.webNavigation.onCommitted.addListener((event) => {
  if (hasHostSuffix(event.url, 'google.com') ||
      hasHostSuffix(event.url, 'google.com.au')) {
    // ...
  }
});
העדפה
browser.webNavigation.onCommitted.addListener((event) => {
  // ...
}, {url: [{hostSuffix: 'google.com'},
          {hostSuffix: 'google.com.au'}]});

אירועים תומכים במסננים ספציפיים שרלוונטיים לאירוע. רשימת המסננים שאירוע תומך בהם מופיעה במסמכי התיעוד של האירוע בקטע filters (מסננים).

כשמבצעים התאמה של כתובות URL (כמו בדוגמה שלמעלה), מסנני אירועים תומכים באותן יכולות של התאמת כתובות URL שאפשר להגדיר באמצעות events.UrlFilter, למעט התאמה של סכימה ויציאה.

סוגים

Event

אובייקט שמאפשר להוסיף ולהסיר פונקציות listener לאירוע ב-Chrome.

מאפיינים

  • addListener

    void

    רושמת קריאה חוזרת (callback) של רכיב event listener לאירוע.

    הפונקציה addListener נראית כך:

    (callback: H) => {...}

    • callback

      H

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

  • addRules

    void

    רושם כללים לטיפול באירועים.

    הפונקציה addRules נראית כך:

    (rules: Rule<anyany>[], callback?: function) => {...}

    • כללים

      כלל<anyany>[]

      כללים שצריך לרשום. הכללים האלה לא מחליפים כללים שנרשמו בעבר.

    • callback

      פונקציה אופציונלי

      הפרמטר callback נראה כך:

      (rules: Rule<anyany>[]) => void

      • כללים

        כלל<anyany>[]

        כללים שנרשמו, והפרמטרים האופציונליים מלאים בערכים.

  • getRules

    void

    הפונקציה מחזירה את הכללים שרשומים כרגע.

    הפונקציה getRules נראית כך:

    (ruleIdentifiers?: string[], callback: function) => {...}

    • ruleIdentifiers

      string[] אופציונלי

      אם מועבר מערך, מוחזרים רק כללים עם מזהים שנכללים במערך הזה.

    • callback

      פונקציה

      הפרמטר callback נראה כך:

      (rules: Rule<anyany>[]) => void

      • כללים

        כלל<anyany>[]

        כללים שנרשמו, והפרמטרים האופציונליים מלאים בערכים.

  • hasListener

    void

    הפונקציה hasListener נראית כך:

    (callback: H) => {...}

    • callback

      H

      ה-listener שסטטוס הרישום שלו ייבדק.

    • החזרות

      בוליאני

      הערך הוא True אם callback רשום לאירוע.

  • hasListeners

    void

    הפונקציה hasListeners נראית כך:

    () => {...}

    • החזרות

      בוליאני

      הערך הוא True אם יש פונקציות event listener שרשומות לאירוע.

  • removeListener

    void

    ביטול הרישום של קריאה חוזרת (callback) של רכיב event listener מאירוע.

    הפונקציה removeListener נראית כך:

    (callback: H) => {...}

    • callback

      H

      ה-listener שיבוטל הרישום שלו.

  • removeRules

    void

    ביטול הרישום של כללים שרשומים כרגע.

    הפונקציה removeRules נראית כך:

    (ruleIdentifiers?: string[], callback?: function) => {...}

    • ruleIdentifiers

      string[] אופציונלי

      אם מועבר מערך, רק כללים עם מזהים שכלולים במערך הזה מבטלים את הרישום שלהם.

    • callback

      פונקציה אופציונלי

      הפרמטר callback נראה כך:

      () => void

Rule

תיאור של כלל הצהרתי לטיפול באירועים.

מאפיינים

  • פעולות

    כל ערך[]

    רשימת הפעולות שמופעלות אם אחד מהתנאים מתקיים.

  • מצבים רפואיים

    כל ערך[]

    רשימה של תנאים שיכולים להפעיל את הפעולות.

  • id [מזהה]

    מחרוזת אופציונלי

    מזהה אופציונלי שמאפשר הפניה לכלל הזה.

  • הקמפיין

    מספר אופציונלי

    עדיפות אופציונלית של הכלל הזה. ברירת המחדל היא 100.

  • תגים

    string[] אופציונלי

    אפשר להשתמש בתגים כדי להוסיף הערות לכללים ולבצע פעולות על קבוצות של כללים.

UrlFilter

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

מאפיינים

  • cidrBlocks

    string[] אופציונלי

    ‫Chrome 123 ואילך

    התאמה מתקבלת אם חלק המארח של כתובת ה-URL הוא כתובת IP והוא נכלל באחד מבלוקי ה-CIDR שצוינו במערך.

  • hostContains

    מחרוזת אופציונלי

    התאמה מתבצעת אם שם המארח של כתובת ה-URL מכיל מחרוזת שצוינה. כדי לבדוק אם לרכיב של שם המארח יש קידומת foo, משתמשים ב-hostContains: '.foo'. התבנית הזו תואמת ל-'www.foobar.com' ול-'foo.com', כי נקודה מרומזת מתווספת בתחילת שם המארח. באופן דומה, אפשר להשתמש ב-hostContains כדי להתאים לסיומת של רכיב (foo.) וכדי להתאים בדיוק לרכיבים (.foo.). צריך לבצע בנפרד התאמה לפי סיומת והתאמה מדויקת לרכיבים האחרונים באמצעות hostSuffix, כי לא מתווספת נקודה מרומזת בסוף שם המארח.

  • hostEquals

    מחרוזת אופציונלי

    ההתאמה מתבצעת אם שם המארח של כתובת ה-URL שווה למחרוזת שצוינה.

  • hostPrefix

    מחרוזת אופציונלי

    התאמה מתקבלת אם שם המארח של כתובת ה-URL מתחיל במחרוזת שצוינה.

  • hostSuffix

    מחרוזת אופציונלי

    ההתאמה מתבצעת אם שם המארח של כתובת ה-URL מסתיים במחרוזת שצוינה.

  • originAndPathMatches

    מחרוזת אופציונלי

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

  • pathContains

    מחרוזת אופציונלי

    ההתאמה מתבצעת אם פלח הנתיב של כתובת ה-URL מכיל מחרוזת שצוינה.

  • pathEquals

    מחרוזת אופציונלי

    ההתאמה מתבצעת אם פלח הנתיב של כתובת ה-URL שווה למחרוזת שצוינה.

  • pathPrefix

    מחרוזת אופציונלי

    ההתאמה מתבצעת אם פלח הנתיב של כתובת ה-URL מתחיל במחרוזת שצוינה.

  • pathSuffix

    מחרוזת אופציונלי

    ההתאמה מתבצעת אם פלח הנתיב של כתובת ה-URL מסתיים במחרוזת שצוינה.

  • ports

    ‫(number | number[])[] אופציונלי

    התאמה מתבצעת אם היציאה של כתובת ה-URL כלולה באחת מרשימות היציאות שצוינו. לדוגמה, [80, 443, [1000, 1200]] מתאים לכל הבקשות ביציאות 80 ו-443 ובטווח 1000-1200.

  • queryContains

    מחרוזת אופציונלי

    ההתאמה מתבצעת אם פלח השאילתה של כתובת ה-URL מכיל מחרוזת שצוינה.

  • queryEquals

    מחרוזת אופציונלי

    ההתאמה מתבצעת אם פלח השאילתה של כתובת ה-URL שווה למחרוזת שצוינה.

  • queryPrefix

    מחרוזת אופציונלי

    התאמה מתקבלת אם פלח השאילתה של כתובת ה-URL מתחיל במחרוזת שצוינה.

  • querySuffix

    מחרוזת אופציונלי

    התאמה מתבצעת אם פלח השאילתה של כתובת ה-URL מסתיים במחרוזת שצוינה.

  • סכמות

    string[] אופציונלי

    התאמה מתקבלת אם הסכימה של כתובת ה-URL שווה לאחת מהסכימות שצוינו במערך.

  • urlContains

    מחרוזת אופציונלי

    התנאי מתקיים אם כתובת ה-URL (ללא מזהה השבר) מכילה מחרוזת שצוינה. מספרי היציאות מוסרים מכתובת ה-URL אם הם תואמים למספר היציאה שמוגדר כברירת מחדל.

  • urlEquals

    מחרוזת אופציונלי

    התאמה מתבצעת אם כתובת ה-URL (ללא מזהה המקטע) שווה למחרוזת שצוינה. מספרי היציאות מוסרים מכתובת ה-URL אם הם תואמים למספר היציאה שמוגדר כברירת מחדל.

  • urlMatches

    מחרוזת אופציונלי

    התנאי מתקיים אם כתובת ה-URL (ללא מזהה הפרגמנט) תואמת לביטוי רגולרי שצוין. מספרי היציאות מוסרים מכתובת ה-URL אם הם תואמים למספר היציאה שמוגדר כברירת מחדל. הביטויים הרגולריים משתמשים בתחביר של RE2.

  • urlPrefix

    מחרוזת אופציונלי

    התנאי מתקיים אם כתובת ה-URL (ללא מזהה פרגמנט) מתחילה במחרוזת שצוינה. מספרי היציאות מוסרים מכתובת ה-URL אם הם תואמים למספר היציאה שמוגדר כברירת מחדל.

  • urlSuffix

    מחרוזת אופציונלי

    ההתאמה מתבצעת אם כתובת ה-URL (ללא מזהה הפרגמנט) מסתיימת במחרוזת שצוינה. מספרי היציאות מוסרים מכתובת ה-URL אם הם תואמים למספר היציאה שמוגדר כברירת מחדל.