Thay thế việc chặn trình nghe yêu cầu web

Sửa đổi yêu cầu mạng trong Manifest V3

Tệp kê khai Manifest V3 thay đổi cách các tiện ích xử lý việc sửa đổi các yêu cầu mạng. Thay vì chặn các yêu cầu mạng và thay đổi các yêu cầu đó trong thời gian chạy bằng chrome.webRequest, tiện ích của bạn sẽ chỉ định các quy tắc mô tả các hành động cần thực hiện khi đáp ứng một nhóm điều kiện nhất định. Hãy thực hiện việc này bằng cách sử dụng API Yêu cầu mạng khai báo.

API Yêu cầu web và API Yêu cầu mạng khai báo có sự khác biệt đáng kể. Thay vì thay thế một lệnh gọi hàm bằng một lệnh gọi hàm khác, bạn cần viết lại mã theo các trường hợp sử dụng. Phần này sẽ hướng dẫn bạn thực hiện quy trình đó.

Trong Manifest V2, việc chặn các yêu cầu web có thể làm giảm đáng kể cả hiệu suất của tiện ích và hiệu suất của các trang mà tiện ích đó hoạt động. Không gian tên webRequest hỗ trợ 9 sự kiện có thể chặn, mỗi sự kiện có số lượng trình xử lý sự kiện không giới hạn. Tệ hơn nữa, mỗi trang web có thể bị nhiều tiện ích chặn và các quyền cần thiết cho việc này là xâm phạm. Tệp kê khai V3 ngăn chặn vấn đề này bằng cách thay thế lệnh gọi lại bằng các quy tắc khai báo.

Đây là phần thứ hai trong số ba phần mô tả những thay đổi cần thiết đối với mã không thuộc trình chạy dịch vụ tiện ích. Tài liệu này mô tả cách chuyển đổi các yêu cầu chặn web mà Manifest V2 sử dụng thành các yêu cầu mạng khai báo mà Manifest V3 sử dụng. Hai phần còn lại trình bày về việc cập nhật mã cần thiết để di chuyển sang Tệp kê khai V3 và cải thiện tính bảo mật.

Cập nhật quyền

Thực hiện các thay đổi sau đối với trường "permissions" trong manifest.json.

  • Xoá quyền "webRequest" nếu bạn không cần quan sát các yêu cầu mạng nữa.
  • Di chuyển Mẫu khớp từ "permissions" sang "host_permissions".

Bạn sẽ cần thêm các quyền khác, tuỳ thuộc vào trường hợp sử dụng. Các quyền đó được mô tả cùng với trường hợp sử dụng mà chúng hỗ trợ.

Tạo quy tắc yêu cầu mạng khai báo

Để tạo các quy tắc yêu cầu mạng khai báo, bạn phải thêm đối tượng "declarative_net_request" vào manifest.json. Khối "declarative_net_request" chứa một mảng các đối tượng "rule_resource" trỏ đến tệp quy tắc. Tệp quy tắc chứa một mảng đối tượng chỉ định một hành động và các điều kiện trong đó các hành động đó được gọi.

Các trường hợp sử dụng phổ biến

Các phần sau đây mô tả các trường hợp sử dụng phổ biến cho các yêu cầu mạng khai báo. Phần hướng dẫn bên dưới chỉ cung cấp thông tin tóm tắt. Bạn có thể xem thêm thông tin về tất cả thông tin tại đây trong tài liệu tham khảo API trong phần chrome.declarativeNetRequest

Chặn một URL

Một trường hợp sử dụng phổ biến trong Tệp kê khai V2 là chặn các yêu cầu web bằng sự kiện onBeforeRequest trong tập lệnh ở chế độ nền.

Tập lệnh trong nền của Manifest V2
chrome.webRequest.onBeforeRequest.addListener((e) => {
    return { cancel: true };
}, { urls: ["https://www.example.com/*"] }, ["blocking"]);

Đối với Tệp kê khai V3, hãy tạo một quy tắc declarativeNetRequest mới bằng loại thao tác "block". Lưu ý đối tượng "condition" trong quy tắc mẫu. "urlFilter" của nó sẽ thay thế tuỳ chọn urls được truyền đến trình nghe webRequest. Mảng "resourceTypes" chỉ định danh mục tài nguyên cần chặn. Ví dụ này chỉ chặn trang HTML chính, nhưng bạn có thể chỉ chặn phông chữ.

Tệp quy tắc tệp kê khai V3
[
  {
    "id" : 1,
    "priority": 1,
    "action" : { "type" : "block" },
    "condition" : {
      "urlFilter" : "||example.com",
      "resourceTypes" : ["main_frame"]
    }
  }
]

Để làm việc này, bạn cần cập nhật quyền của tiện ích. Trong manifest.json, hãy thay thế quyền "webRequestBlocking" bằng quyền "declarativeNetRequest". Lưu ý rằng URL sẽ bị xoá khỏi trường "permissions" vì việc chặn nội dung không yêu cầu quyền lưu trữ. Như đã trình bày ở trên, tệp quy tắc chỉ định máy chủ hoặc máy chủ mà yêu cầu mạng khai báo áp dụng.

Nếu bạn muốn thử cách này, mã dưới đây có trong kho lưu trữ mẫu của chúng tôi.

Tệp kê khai V2
  "permissions": [
    "webRequestBlocking",
    "https://*.example.com/*"
  ]
Manifest V3 (Tệp kê khai phiên bản 3)
  "permissions": [
    "declarativeNetRequest",
  ]

Chuyển hướng nhiều URL

Một trường hợp sử dụng phổ biến khác trong Manifest V2 là dùng sự kiện BeforeRequest để chuyển hướng các yêu cầu web.

Tập lệnh trong nền của 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"]
);

Đối với Manifest V3, hãy sử dụng loại hành động "redirect". Giống như trước, "urlFilter" sẽ thay thế tuỳ chọn url được truyền đến trình nghe webRequest. Lưu ý rằng đối với ví dụ này, đối tượng "action" của tệp quy tắc chứa trường "redirect" chứa URL cần trả về thay vì URL đang được lọc.

Tệp quy tắc 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"]
    }
  }

Tình huống này cũng yêu cầu thay đổi các quyền của tiện ích. Giống như trước, hãy thay thế quyền "webRequestBlocking" bằng quyền "declarativeNetRequest". Các URL lại được di chuyển từ manifest.json sang tệp quy tắc. Xin lưu ý rằng việc chuyển hướng cũng yêu cầu quyền "declarativeNetRequestWithHostAccess" ngoài quyền lưu trữ.

Nếu bạn muốn thử cách này, mã dưới đây có trong kho lưu trữ mẫu của chúng tôi.

Tệp kê khai V2
  "permissions": [
    "webRequestBlocking",
    "https://developer.chrome.com/docs/extensions/*",
    "https://developer.chrome.com/docs/extensions/reference"
  ]
Tệp kê khai V3
  "permissions": [
    "declarativeNetRequestWithHostAccess"
  ],
  "host_permissions": [
    "https://developer.chrome.com/*"
  ]

Chặn cookie

Trong Tệp kê khai V2, việc chặn cookie yêu cầu chặn các tiêu đề yêu cầu web trước khi chúng được gửi và xoá một tiêu đề cụ thể.

Tập lệnh trong nền của Manifest V2
chrome.webRequest.onBeforeSendHeaders.addListener(
  function(details) {
    removeHeader(details.requestHeaders, 'cookie');
    return {requestHeaders: details.requestHeaders};
  },
  // filters
  {urls: ['https://*/*', 'http://*/*']},
  // extraInfoSpec
  ['blocking', 'requestHeaders', 'extraHeaders']);

Tệp kê khai V3 cũng thực hiện việc này bằng một quy tắc trong tệp quy tắc. Lần này, loại hành động là "modifyHeaders". Tệp này sẽ lấy một mảng các đối tượng "requestHeaders", chỉ định tiêu đề cần sửa đổi và cách sửa đổi các đối tượng đó. Lưu ý rằng đối tượng "condition" chỉ chứa một mảng "resourceTypes". Tham số này hỗ trợ các giá trị giống như trong các ví dụ trước.

Nếu bạn muốn thử cách này, mã dưới đây có trong kho lưu trữ mẫu của chúng tôi.

Tệp kê khai Manifest V3 manifest.json
[
  {
    "id": 1,
    "priority": 1,
    "action": {
      "type": "modifyHeaders",
      "requestHeaders": [
        { "header": "cookie", "operation": "remove" }
      ]
    },
    "condition": {
      "urlFilter": "|*?no-cookies=1",
      "resourceTypes": ["main_frame"]
    }
  }
]

Tình huống này cũng yêu cầu thay đổi các quyền của tiện ích. Giống như trước, hãy thay thế quyền "webRequestBlocking" bằng quyền "declarativeNetRequest".

Tệp kê khai V2
  "permissions": [
    "webRequest",
    "webRequestBlocking",
    "https://*/*",
    "http://*/*"
  ],
Tệp kê khai V3
  "permissions": [
    "declarativeNetRequest",
  ],
  "host_permissions": [
    ""
  ]