การแก้ไขคำขอเครือข่ายใน Manifest V3
Manifest V3 เปลี่ยนวิธีที่ส่วนขยายจัดการกับการแก้ไขคําขอเครือข่าย แทนที่จะขัดขวางคําขอเครือข่ายและแก้ไขคําขอเหล่านั้นที่รันไทม์ด้วย chrome.webRequest
ส่วนขยายจะระบุกฎที่อธิบายการดําเนินการที่จะทําเมื่อตรงตามชุดเงื่อนไขหนึ่งๆ โดยทําโดยใช้ Declarative Net Request API
Web Request API และ Declarative Net Request API มีความแตกต่างกันอย่างมาก คุณต้องเขียนโค้ดใหม่ตาม Use Case แทนการแทนที่การเรียกฟังก์ชันหนึ่งด้วยอีกฟังก์ชันหนึ่ง ส่วนนี้จะอธิบายขั้นตอนดังกล่าว
ใน Manifest V2 การบล็อกคําขอเว็บอาจทําให้ประสิทธิภาพของส่วนขยายและประสิทธิภาพของหน้าเว็บที่ทำงานร่วมกันลดลงอย่างมาก เนมสเปซ webRequest
รองรับเหตุการณ์ที่อาจบล็อกได้ 9 รายการ โดยแต่ละรายการจะใช้ตัวแฮนเดิลเหตุการณ์ได้ไม่จํากัด ปัญหายิ่งแย่ลงเมื่อหน้าเว็บแต่ละหน้าอาจถูกบล็อกโดยส่วนขยายหลายรายการ และสิทธิ์ที่จําเป็นสําหรับการดำเนินการนี้เป็นการละเมิดความเป็นส่วนตัว Manifest V3 ป้องกันปัญหานี้ด้วยการเปลี่ยนคอลแบ็กเป็นกฎแบบประกาศ
นี่เป็นส่วนที่ 2 จาก 3 ส่วนที่อธิบายการเปลี่ยนแปลงที่จำเป็นสำหรับโค้ดที่ไม่ได้เป็นส่วนหนึ่งของ Service Worker ของส่วนขยาย ซึ่งอธิบายการแปลงคําขอเว็บที่บล็อกซึ่ง Manifest V2 ใช้ไปเป็นคําขอสุทธิแบบประกาศซึ่ง Manifest V3 ใช้ ส่วนอื่นๆ อีก 2 ส่วนจะครอบคลุมการอัปเดตโค้ดที่จําเป็นสําหรับการย้ายข้อมูลไปยัง Manifest V3 และการปรับปรุงความปลอดภัย
อัปเดตสิทธิ์
ทำการเปลี่ยนแปลงต่อไปนี้ในช่อง "permissions"
ใน manifest.json
- นำสิทธิ์
"webRequest"
ออกหากไม่จําเป็นต้องตรวจสอบคําขอเครือข่ายอีกต่อไป - ย้ายรูปแบบการทำงานของคีย์เวิร์ดจาก
"permissions"
ไป"host_permissions"
คุณจะต้องเพิ่มสิทธิ์อื่นๆ โดยขึ้นอยู่กับกรณีการใช้งาน สิทธิ์เหล่านั้นจะอธิบายพร้อมกับกรณีการใช้งานที่รองรับ
สร้างกฎคำขอเครือข่ายแบบประกาศ
การสร้างกฎคําขอสุทธิแบบประกาศจําเป็นต้องเพิ่มออบเจ็กต์ "declarative_net_request"
ลงใน manifest.json
บล็อก "declarative_net_request"
มีอาร์เรย์ของออบเจ็กต์ "rule_resource"
ที่ชี้ไปยังไฟล์กฎ ไฟล์กฎประกอบด้วยอาร์เรย์ของออบเจ็กต์ที่ระบุการดำเนินการและเงื่อนไขที่เรียกใช้การดำเนินการเหล่านั้น
กรณีการใช้งานทั่วไป
ส่วนต่อไปนี้จะอธิบายกรณีการใช้งานทั่วไปของคําขอสุทธิแบบประกาศ วิธีการด้านล่างเป็นเพียงภาพรวมคร่าวๆ ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อมูลทั้งหมดนี้ได้ในเอกสารอ้างอิง API ในส่วน chrome.declarativeNetRequest
บล็อก URL เดียว
กรณีการใช้งานทั่วไปใน Manifest V2 คือการบล็อกคำขอเว็บโดยใช้เหตุการณ์ onBeforeRequest
ในสคริปต์เบื้องหลัง
chrome.webRequest.onBeforeRequest.addListener((e) => { return { cancel: true }; }, { urls: ["https://www.example.com/*"] }, ["blocking"]);
สำหรับ Manifest V3 ให้สร้างกฎ declarativeNetRequest
ใหม่โดยใช้ประเภทการดำเนินการ "block"
สังเกตออบเจ็กต์ "condition"
ในกฎตัวอย่าง "urlFilter"
ของ "urlFilter"
จะมาแทนที่ตัวเลือก urls
ที่ส่งไปยังฟังก์ชันการฟัง 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 หลายรายการ
กรณีการใช้งานทั่วไปอีกอย่างหนึ่งใน Manifest 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"] );
สำหรับไฟล์ Manifest V3 ให้ใช้ประเภทการดําเนินการ "redirect"
เช่นเดียวกับก่อนหน้านี้ "urlFilter"
จะแทนที่ตัวเลือก url
ที่ส่งไปยังโปรแกรมฟัง 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/*" ]
บล็อกคุกกี้
ใน Manifest V2 การบล็อกคุกกี้ต้องสกัดกั้นส่วนหัวคำขอเว็บก่อนที่จะส่งและนำคุกกี้ที่เฉพาะเจาะจงออก
chrome.webRequest.onBeforeSendHeaders.addListener( function(details) { removeHeader(details.requestHeaders, 'cookie'); return {requestHeaders: details.requestHeaders}; }, // filters {urls: ['https://*/*', 'http://*/*']}, // extraInfoSpec ['blocking', 'requestHeaders', 'extraHeaders']);
Manifest 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": [ "" ]