Manifest V3 меняет подход расширений к обработке изменений сетевых запросов. Вместо перехвата сетевых запросов и их изменения во время выполнения с помощью browser.webRequest , ваше расширение задаёт правила, описывающие действия, которые необходимо выполнить при выполнении определённого набора условий. Это можно сделать с помощью декларативного API сетевых запросов .
API веб-запросов и декларативный API сетевых запросов существенно отличаются. Вместо замены одного вызова функции другим, вам необходимо переписать свой код с учетом вариантов использования. В этом разделе описан этот процесс.
Если ваше расширение установлено с помощью политики, вносить эти изменения не требуется. Для расширений, установленных с помощью политики, разрешение webRequestBlocking по-прежнему доступно в Manifest V3.
Это второй из трех разделов, описывающих изменения, необходимые для кода, не являющегося частью сервисного обработчика расширений. В нем описывается преобразование блокирующих веб-запросов, используемых Manifest V2, в декларативные сетевые запросы, используемые Manifest V3. Два других раздела посвящены обновлению кода, необходимого для миграции на Manifest V3, и повышению безопасности .
Введение
В Manifest V2 блокировка веб-запросов могла значительно ухудшить как производительность расширений, так и производительность страниц, с которыми они работают. Пространство имен webRequest поддерживает девять потенциально блокирующих событий, каждое из которых принимает неограниченное количество обработчиков событий. Что еще хуже, каждая веб-страница потенциально может быть заблокирована несколькими расширениями, а необходимые для этого разрешения являются инвазивными. Manifest V3 защищает от этой проблемы, заменяя коллбэки декларативными правилами.
Обновить права доступа
Внесите следующие изменения в поле "permissions" в вашем manifest.json .
- Удалите разрешение
"webRequest", если вам больше не нужно отслеживать сетевые запросы. - Переместите параметры Match Patterns из раздела
"permissions"в раздел"host_permissions".
В зависимости от конкретного сценария использования вам потребуется добавить и другие разрешения. Эти разрешения описаны в соответствии с поддерживаемым ими сценарием использования.
Создайте декларативные правила сетевых запросов.
Для создания декларативных правил сетевых запросов необходимо добавить объект "declarative_net_request" в файл manifest.json . Блок "declarative_net_request" содержит массив объектов "rule_resource" , указывающих на файл правил. Файл правил содержит массив объектов, определяющих действие и условия, при которых эти действия выполняются.
Типичные сценарии использования
В следующих разделах описаны типичные сценарии использования запросов DeclarativeNetRequest. Приведенные ниже инструкции представляют собой лишь краткое описание. Более подробная информация обо всем вышеизложенном описана в справочнике API по адресу browser.declarativeNetRequest
Заблокировать один URL-адрес
В Manifest V2 часто использовался сценарий блокировки веб-запросов с помощью события onBeforeRequest в фоновом скрипте.
browser.webRequest.onBeforeRequest.addListener((e) => { return { cancel: true }; }, { urls: ["https://www.example.com/*"] }, ["blocking"]);
Для Manifest V3 создайте новое правило declarativeNetRequest , используя тип действия "block" . Обратите внимание на объект "condition" в примере правила. Его "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 для перенаправления веб-запросов.
browser.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/*" ]
Блокировка файлов cookie
В Manifest V2 блокировка файлов cookie требует перехвата заголовков веб-запроса до их отправки и удаления определенного из них.
browser.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": [ "" ]