שינוי בקשות רשת במניפסט 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
בסקריפט הרקע.
chrome.webRequest.onBeforeRequest.addListener((e) => { return { cancel: true }; }, { urls: ["https://www.example.com/*"] }, ["blocking"]);
במניפסט מגרסה V3, צריך ליצור כלל declarativeNetRequest
חדש עם סוג הפעולה "block"
. שימו לב לאובייקט "condition"
בכלל לדוגמה. ה-"urlFilter"
שלו מחליף את האפשרות urls
שהועברה אל ה-listener webRequest
. מערך "resourceTypes"
מציין את הקטגוריה של המשאבים לחסימה. דוגמה זו חוסמת רק את דף ה-HTML הראשי, אך ניתן, למשל, לחסום רק גופנים.
[ { "id" : 1, "priority": 1, "action" : { "type" : "block" }, "condition" : { "urlFilter" : "||example.com", "resourceTypes" : ["main_frame"] } } ]
כדי שהתהליך הזה יפעל, עליך לעדכן את ההרשאות של התוסף. בשדה manifest.json
צריך להחליף את ההרשאה "webRequestBlocking"
בהרשאה "declarativeNetRequest"
. שימו לב שכתובת ה-URL תוסר מהשדה "permissions"
כי חסימת תוכן לא מחייבת הרשאות מארח. כפי שמתואר למעלה, קובץ הכללים מציין את המארח או המארחים שעליהם חלה בקשת נטו מוצהרת.
אם ברצונך לנסות את זה, הקוד הבא זמין במאגר הדוגמאות שלנו.
"permissions": [ "webRequestBlocking", "https://*.example.com/*" ]
"permissions": [ "declarativeNetRequest", ]
הפניה אוטומטית למספר כתובות URL
עוד תרחיש נפוץ במניפסט מגרסה V2 היה שימוש באירוע BeforeRequest
כדי להפנות בקשות אינטרנט לכתובות אחרות.
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 שעוברת סינון.
[ { "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"
בנוסף להרשאות המארח.
אם ברצונך לנסות את זה, הקוד הבא זמין במאגר הדוגמאות שלנו.
"permissions": [ "webRequestBlocking", "https://developer.chrome.com/docs/extensions/*", "https://developer.chrome.com/docs/extensions/reference" ]
"permissions": [ "declarativeNetRequestWithHostAccess" ], "host_permissions": [ "https://developer.chrome.com/*" ]
חסימת קובצי cookie
במניפסט מגרסה V2, חסימה של קובצי cookie מחייבת יירוט של הכותרות של בקשות האינטרנט לפני שהן נשלחות, והסרה של כותרות ספציפיות מתבצעת.
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"
. הוא תומך באותם ערכים כמו בדוגמאות הקודמות.
אם ברצונך לנסות את זה, הקוד הבא זמין במאגר הדוגמאות שלנו.
[ { "id": 1, "priority": 1, "action": { "type": "modifyHeaders", "requestHeaders": [ { "header": "cookie", "operation": "remove" } ] }, "condition": { "urlFilter": "|*?no-cookies=1", "resourceTypes": ["main_frame"] } } ]
תרחיש זה מחייב שינויים גם בהרשאות של התוסף. כמו קודם, צריך להחליף את ההרשאה "webRequestBlocking"
בהרשאה "declarativeNetRequest"
.
"permissions": [ "webRequest", "webRequestBlocking", "https://*/*", "http://*/*" ],
"permissions": [ "declarativeNetRequest", ], "host_permissions": [ "" ]