แทนที่ Listener การบล็อกคำขอเว็บ

การแก้ไขคำขอเครือข่ายใน 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 ในสคริปต์เบื้องหลัง

สคริปต์เบื้องหลังของ Manifest V2
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 หลัก แต่คุณอาจบล็อกเฉพาะแบบอักษรก็ได้

ไฟล์กฎ Manifest V3
[
  {
    "id" : 1,
    "priority": 1,
    "action" : { "type" : "block" },
    "condition" : {
      "urlFilter" : "||example.com",
      "resourceTypes" : ["main_frame"]
    }
  }
]

หากต้องการให้การดำเนินการนี้ทำงาน คุณจะต้องอัปเดตสิทธิ์ของส่วนขยาย ใน manifest.json ให้แทนที่สิทธิ์ "webRequestBlocking" ด้วยสิทธิ์ "declarativeNetRequest" โปรดทราบว่าระบบจะนำ URL ออกจากช่อง "permissions" เนื่องจากการบล็อกเนื้อหาไม่จําเป็นต้องใช้สิทธิ์ของโฮสต์ ดังที่แสดงด้านบน ไฟล์กฎจะระบุโฮสต์ที่คำขอสุทธิแบบประกาศมีผล

หากต้องการลองใช้ โค้ดด้านล่างนี้มีอยู่ในพื้นที่เก็บข้อมูลตัวอย่าง

Manifest V2
  "permissions": [
    "webRequestBlocking",
    "https://*.example.com/*"
  ]
Manifest V3
  "permissions": [
    "declarativeNetRequest",
  ]

เปลี่ยนเส้นทาง URL หลายรายการ

กรณีการใช้งานทั่วไปอีกอย่างหนึ่งใน Manifest V2 คือการใช้เหตุการณ์ BeforeRequest เพื่อเปลี่ยนเส้นทางคำขอเว็บ

สคริปต์เบื้องหลังของ Manifest 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"]
);

สำหรับไฟล์ Manifest V3 ให้ใช้ประเภทการดําเนินการ "redirect" เช่นเดียวกับก่อนหน้านี้ "urlFilter" จะแทนที่ตัวเลือก url ที่ส่งไปยังโปรแกรมฟัง webRequest โปรดทราบว่าในตัวอย่างนี้ ออบเจ็กต์ "action" ของไฟล์กฎมีช่อง "redirect" ที่มี URL ที่จะแสดงแทน URL ที่ถูกกรอง

ไฟล์กฎ Manifest 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" นอกเหนือจากสิทธิ์ของโฮสต์ด้วย

หากต้องการลองใช้ โค้ดด้านล่างนี้มีอยู่ในพื้นที่เก็บข้อมูลตัวอย่าง

Manifest V2
  "permissions": [
    "webRequestBlocking",
    "https://developer.chrome.com/docs/extensions/*",
    "https://developer.chrome.com/docs/extensions/reference"
  ]
Manifest V3
  "permissions": [
    "declarativeNetRequestWithHostAccess"
  ],
  "host_permissions": [
    "https://developer.chrome.com/*"
  ]

บล็อกคุกกี้

ใน Manifest V2 การบล็อกคุกกี้ต้องสกัดกั้นส่วนหัวคำขอเว็บก่อนที่จะส่งและนำคุกกี้ที่เฉพาะเจาะจงออก

สคริปต์เบื้องหลังของ 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" เท่านั้น ซึ่งรองรับค่าเดียวกับตัวอย่างก่อนหน้านี้

หากต้องการลองใช้ โค้ดด้านล่างนี้มีอยู่ในพื้นที่เก็บข้อมูลตัวอย่าง

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

สถานการณ์นี้ยังกำหนดให้ต้องเปลี่ยนแปลงสิทธิ์ของส่วนขยายด้วย เช่นเดียวกับก่อนหน้านี้ ให้แทนที่สิทธิ์ "webRequestBlocking" ด้วยสิทธิ์ "declarativeNetRequest"

Manifest V2
  "permissions": [
    "webRequest",
    "webRequestBlocking",
    "https://*/*",
    "http://*/*"
  ],
Manifest V3
  "permissions": [
    "declarativeNetRequest",
  ],
  "host_permissions": [
    ""
  ]