החלפת פונקציות ה-listener של בקשות אינטרנט חוסמות

שינוי בקשות רשת במניפסט V3

מניפסט מגרסה V3 משנה את האופן שבו תוספים מטפלים בשינויים של בקשות רשת. במקום ליירט בקשות רשת ולשנות אותן בזמן ריצה באמצעות chrome.webRequest, התוסף מציין כללים שמתארים פעולות שצריך לבצע כשיש עמידה בקבוצת תנאים נתונה. אפשר לעשות זאת באמצעות Declarative Net Request API.

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

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

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

עדכון ההרשאות

מבצעים את השינויים הבאים בשדה "permissions" בmanifest.json.

  • אם אין לך יותר צורך לדאוג לבקשות מהרשת, צריך להסיר את ההרשאה "webRequest".
  • העברת דפוסי ההתאמה מ-"permissions" אל "host_permissions".

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

יצירת כללי בקשות נטו מוצהרות

כדי ליצור כללי בקשות נטו מוצהרים, צריך להוסיף אובייקט "declarative_net_request" ל-manifest.json. הבלוק "declarative_net_request" מכיל מערך של "rule_resource" אובייקטים שמפנים לקובץ כלל. קובץ הכללים מכיל מערך של אובייקטים שמציינים פעולה ואת התנאים שבהם הפעולות האלה מופעלות.

תרחישים נפוצים לדוגמה

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

חסימה של כתובת URL אחת

אחד התרחישים הנפוצים במניפסט מגרסה V2 היה חסימת בקשות אינטרנט באמצעות האירוע onBeforeRequest בסקריפט הרקע.

סקריפט רקע של מניפסט מגרסה V2
chrome.webRequest.onBeforeRequest.addListener((e) => {
    return { cancel: true };
}, { urls: ["https://www.example.com/*"] }, ["blocking"]);

במניפסט מגרסה V3, צריך ליצור כלל declarativeNetRequest חדש עם סוג הפעולה "block". שימו לב לאובייקט "condition" בכלל לדוגמה. ה-"urlFilter" שלו מחליף את האפשרות urls שהועברה אל ה-listener webRequest. מערך "resourceTypes" מציין את הקטגוריה של המשאבים לחסימה. דוגמה זו חוסמת רק את דף ה-HTML הראשי, אך ניתן, למשל, לחסום רק גופנים.

קובץ כללי של מניפסט מגרסה V3
[
  {
    "id" : 1,
    "priority": 1,
    "action" : { "type" : "block" },
    "condition" : {
      "urlFilter" : "||example.com",
      "resourceTypes" : ["main_frame"]
    }
  }
]

כדי שהתהליך הזה יפעל, עליך לעדכן את ההרשאות של התוסף. בשדה manifest.json צריך להחליף את ההרשאה "webRequestBlocking" בהרשאה "declarativeNetRequest". שימו לב שכתובת ה-URL תוסר מהשדה "permissions" כי חסימת תוכן לא מחייבת הרשאות מארח. כפי שמתואר למעלה, קובץ הכללים מציין את המארח או המארחים שעליהם חלה בקשת נטו מוצהרת.

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

מניפסט מגרסה 2
  "permissions": [
    "webRequestBlocking",
    "https://*.example.com/*"
  ]
מניפסט מגרסה V3
  "permissions": [
    "declarativeNetRequest",
  ]

הפניה אוטומטית למספר כתובות URL

עוד תרחיש נפוץ במניפסט מגרסה V2 היה שימוש באירוע BeforeRequest כדי להפנות בקשות אינטרנט לכתובות אחרות.

סקריפט רקע של מניפסט מגרסה V2
chrome.webRequest.onBeforeRequest.addListener((e) => {
    console.log(e);
    return { redirectUrl: "https://developer.chrome.com/docs/extensions/mv3/intro/" };
  }, { 
    urls: [
      "https://developer.chrome.com/docs/extensions/mv2/"
    ]
  }, 
  ["blocking"]
);

במניפסט מגרסה V3, צריך להשתמש בסוג הפעולה "redirect". כמו קודם, "urlFilter" מחליף את האפשרות url שהועברה ל-Listener webRequest. שימו לב שבדוגמה הזו, האובייקט "action" של קובץ הכלל מכיל שדה "redirect" שמכיל את כתובת ה-URL להחזרה במקום את כתובת ה-URL שעוברת סינון.

קובץ כללי של מניפסט מגרסה V3
[
  {
    "id" : 1,
    "priority": 1,
    "action": {
      "type": "redirect",
      "redirect": { "url": "https://developer.chrome.com/docs/extensions/mv3/intro/" }
    },
    "condition": {
      "urlFilter": "https://developer.chrome.com/docs/extensions/mv2/",
      "resourceTypes": ["main_frame"]
    }
  }

תרחיש זה מחייב שינויים גם בהרשאות של התוסף. כמו קודם, צריך להחליף את ההרשאה "webRequestBlocking" בהרשאה "declarativeNetRequest". כתובות ה-URL שוב מועברות מ-manifest.json לקובץ כלל. לתשומת ליבך: כדי להפנות לכתובת אחרת, צריך גם את ההרשאה "declarativeNetRequestWithHostAccess" בנוסף להרשאות המארח.

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

מניפסט מגרסה 2
  "permissions": [
    "webRequestBlocking",
    "https://developer.chrome.com/docs/extensions/*",
    "https://developer.chrome.com/docs/extensions/reference"
  ]
מניפסט מגרסה V3
  "permissions": [
    "declarativeNetRequestWithHostAccess"
  ],
  "host_permissions": [
    "https://developer.chrome.com/*"
  ]

חסימת קובצי cookie

במניפסט מגרסה V2, חסימה של קובצי cookie מחייבת יירוט של הכותרות של בקשות האינטרנט לפני שהן נשלחות, והסרה של כותרות ספציפיות מתבצעת.

סקריפט רקע של מניפסט מגרסה V2
chrome.webRequest.onBeforeSendHeaders.addListener(
  function(details) {
    removeHeader(details.requestHeaders, 'cookie');
    return {requestHeaders: details.requestHeaders};
  },
  // filters
  {urls: ['https://*/*', 'http://*/*']},
  // extraInfoSpec
  ['blocking', 'requestHeaders', 'extraHeaders']);

גם קובץ המניפסט V3 מבצע את הפעולה הזו באמצעות כלל בקובץ כללים. הפעם סוג הפעולה הוא "modifyHeaders". הקובץ לוקח מערך של "requestHeaders" אובייקטים, שמציין את הכותרות שיש לשנות ואת אופן השינוי שלהן. חשוב לשים לב שהאובייקט "condition" מכיל רק מערך "resourceTypes". הוא תומך באותם ערכים כמו בדוגמאות הקודמות.

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

קובץ Manifest V3 Manifest.json
[
  {
    "id": 1,
    "priority": 1,
    "action": {
      "type": "modifyHeaders",
      "requestHeaders": [
        { "header": "cookie", "operation": "remove" }
      ]
    },
    "condition": {
      "urlFilter": "|*?no-cookies=1",
      "resourceTypes": ["main_frame"]
    }
  }
]

תרחיש זה מחייב שינויים גם בהרשאות של התוסף. כמו קודם, צריך להחליף את ההרשאה "webRequestBlocking" בהרשאה "declarativeNetRequest".

מניפסט מגרסה 2
  "permissions": [
    "webRequest",
    "webRequestBlocking",
    "https://*/*",
    "http://*/*"
  ],
מניפסט מגרסה V3
  "permissions": [
    "declarativeNetRequest",
  ],
  "host_permissions": [
    ""
  ]