Modyfikowanie żądań sieciowych w platformie Manifest V3
Platforma Manifest V3 zmienia sposób, w jaki rozszerzenia obsługują modyfikowanie żądań sieciowych. Zamiast przechwytywać żądania sieciowe i zmieniać je w czasie działania za pomocą zasady chrome.webRequest
, rozszerzenie określa reguły opisujące działania, które należy wykonać, gdy zostanie spełniony określony zestaw warunków. Możesz to zrobić za pomocą deklaratywnego interfejsu Net Request API.
Interfejsy Web Request API i Deklaracja Net Request API znacznie się różnią. Zamiast zastępowania jednego wywołania funkcji innym, musisz przeredagować kod pod kątem przypadków użycia. Z tej sekcji dowiesz się, jak to zrobić.
W platformie Manifest V2 blokowanie żądań internetowych może znacznie obniżyć wydajność rozszerzeń i stron, z którymi współpracują. Przestrzeń nazw webRequest
obsługuje 9 potencjalnie blokujących zdarzeń, a każde z nich wymaga nieograniczonej liczby modułów obsługi zdarzeń. Co gorsza, każda strona internetowa jest potencjalnie blokowana przez wiele rozszerzeń, a wymagane do tego uprawnienia są inwazyjne. Manifest V3 chroni przed tym problemem, zastępując wywołania zwrotne regułami deklaratywnymi.
Jest to druga z trzech sekcji opisujących zmiany niezbędne w kodzie, który nie jest częścią skryptu service worker rozszerzeń. Opisuje on konwertowanie blokujących żądań internetowych, z których korzysta platforma Manifest V2, w deklaratywne żądania netto używane przez platformę Manifest V3. Dwie pozostałe sekcje dotyczą aktualizacji kodu niezbędnego do migracji do platformy Manifest V3 i poprawy bezpieczeństwa.
Aktualizuj uprawnienia
Wprowadź poniższe zmiany w polu "permissions"
w manifest.json
.
- Jeśli nie musisz już obserwować żądań sieciowych, usuń uprawnienie
"webRequest"
. - Przenieś wzorce dopasowania z:
"permissions"
do:"host_permissions"
.
W zależności od zastosowania musisz dodać inne uprawnienia. Te uprawnienia są opisane w odpowiednim przypadku użycia.
Utwórz deklaratywne reguły żądania netto
Tworzenie deklaratywnej reguły żądań netto wymaga dodania obiektu "declarative_net_request"
do manifest.json
. Blok "declarative_net_request"
zawiera tablicę obiektów "rule_resource"
, które wskazują plik reguły. Plik reguły zawiera tablicę obiektów określającą działanie i warunki ich wywoływania.
Typowe przypadki użycia
W sekcjach poniżej opisano typowe przypadki użycia deklaratywnych żądań netto. Poniższe instrukcje to tylko krótki opis. Więcej informacji na ten temat znajdziesz w dokumentacji interfejsu API w sekcji chrome.declarativeNetRequest
.
Blokowanie pojedynczego adresu URL
Typowym przypadkiem użycia platformy Manifest V2 było blokowanie żądań internetowych za pomocą zdarzenia onBeforeRequest
w skrypcie działającym w tle.
chrome.webRequest.onBeforeRequest.addListener((e) => { return { cancel: true }; }, { urls: ["https://www.example.com/*"] }, ["blocking"]);
W przypadku platformy Manifest V3 utwórz nową regułę declarativeNetRequest
za pomocą typu działania "block"
. Zwróć uwagę na obiekt "condition"
w przykładowej regule. "urlFilter"
zastępuje opcję urls
przekazaną do odbiornika webRequest
. Tablica "resourceTypes"
określa kategorię zasobów do zablokowania. W tym przykładzie blokuje się tylko główna strona HTML, ale można na przykład zablokować tylko czcionki.
[ { "id" : 1, "priority": 1, "action" : { "type" : "block" }, "condition" : { "urlFilter" : "||example.com", "resourceTypes" : ["main_frame"] } } ]
Aby korzystać z tej funkcji, musisz zaktualizować uprawnienia rozszerzenia. W manifest.json
zastąp uprawnienie "webRequestBlocking"
uprawnieniem "declarativeNetRequest"
. Zwróć uwagę, że adres URL jest usuwany z pola "permissions"
, ponieważ blokowanie treści nie wymaga uprawnień hosta. Jak pokazano powyżej, plik reguły określa hosta lub hosty, których dotyczy deklaratywne żądanie netto.
Jeśli chcesz spróbować, poniższy kod jest dostępny w naszym przykładowym repozytorium.
"permissions": [ "webRequestBlocking", "https://*.example.com/*" ]
"permissions": [ "declarativeNetRequest", ]
Przekierowanie wielu adresów URL
Innym typowym przypadkiem użycia platformy Manifest V2 było użycie zdarzenia BeforeRequest
do przekierowywania żądań internetowych.
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"] );
W przypadku platformy Manifest V3 użyj typu działania "redirect"
. Tak jak wcześniej, "urlFilter"
zastępuje opcję url
przekazaną do odbiornika webRequest
. Zwróć uwagę, że w tym przykładzie obiekt "action"
pliku reguły zawiera pole "redirect"
z adresem URL, który ma zostać zwrócony zamiast adresu URL filtrowanego.
[ { "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"] } }
Ten scenariusz wymaga też wprowadzenia zmian w uprawnieniach rozszerzenia. Tak jak wcześniej, zastąp uprawnienie "webRequestBlocking"
uprawnieniem "declarativeNetRequest"
. Adresy URL są ponownie przenoszone z pliku manifest.json
do pliku reguły. Zwróć uwagę, że przekierowanie wymaga też uprawnienia "declarativeNetRequestWithHostAccess"
oprócz uprawnienia do hosta.
Jeśli chcesz spróbować, poniższy kod jest dostępny w naszym przykładowym repozytorium.
"permissions": [ "webRequestBlocking", "https://developer.chrome.com/docs/extensions/*", "https://developer.chrome.com/docs/extensions/reference" ]
"permissions": [ "declarativeNetRequestWithHostAccess" ], "host_permissions": [ "https://developer.chrome.com/*" ]
Blokuj pliki cookie
W platformie Manifest V2 blokowanie plików cookie wymaga przechwycenia nagłówków żądań internetowych przed ich wysłaniem i usunięcia konkretnego.
chrome.webRequest.onBeforeSendHeaders.addListener( function(details) { removeHeader(details.requestHeaders, 'cookie'); return {requestHeaders: details.requestHeaders}; }, // filters {urls: ['https://*/*', 'http://*/*']}, // extraInfoSpec ['blocking', 'requestHeaders', 'extraHeaders']);
Manifest V3 robi to również za pomocą reguły w pliku reguł. Tym razem typ działania to "modifyHeaders"
. Plik przyjmuje tablicę obiektów "requestHeaders"
, które określają nagłówki do zmiany i sposób ich modyfikacji. Zwróć uwagę, że obiekt "condition"
zawiera tylko tablicę "resourceTypes"
. To ustawienie obsługuje te same wartości co w poprzednich przykładach.
Jeśli chcesz spróbować, poniższy kod jest dostępny w naszym przykładowym repozytorium.
[ { "id": 1, "priority": 1, "action": { "type": "modifyHeaders", "requestHeaders": [ { "header": "cookie", "operation": "remove" } ] }, "condition": { "urlFilter": "|*?no-cookies=1", "resourceTypes": ["main_frame"] } } ]
Ten scenariusz wymaga też wprowadzenia zmian w uprawnieniach rozszerzenia. Tak jak wcześniej, zastąp uprawnienie "webRequestBlocking"
uprawnieniem "declarativeNetRequest"
.
"permissions": [ "webRequest", "webRequestBlocking", "https://*/*", "http://*/*" ],
"permissions": [ "declarativeNetRequest", ], "host_permissions": [ "" ]