OnBeforeSendHeaders обновляет список фильтров на лету или лучший способ последовательного использования событий onBeforeRequest и onBeforeSendHeaders - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь заблокировать запросы с веб-сайта в расширении chrome, которое я создаю.

В настоящее время я использую onBeforeRequest, чтобы просматривать входящий трафик c и решать, какой те, которые я заблокирую, затем я намерен использовать этот массив в качестве списка фильтров для блокировки на более позднем этапе, например onBeforeSendHeaders.

Теперь у меня сейчас две проблемы, во-первых, если я реализую его так, как у меня ниже это очень неэффективно, так как на некоторых веб-сайтах есть сотни вещей, что означает, что событие слишком часто присоединяется и отключается.

Во-вторых, если я просто объявляю слушателя в начале, список фильтров не использует обновленная версия - я предполагаю, что когда он регистрируется, он берет копию списка фильтров, а не ссылку на память, я попробовал вместо этого использовать функцию et c.

Любая помощь в оптимизации этого / лучшего был бы признателен за то, чтобы этот список работал.

var urlstoblock = [];

//Listen to all incoming requests and filter them
chrome.webRequest.onBeforeRequest.addListener
(
    FilterRequests,
    {urls: ["<all_urls>"]},
    ["requestBody"]
);


function FilterRequests(info)
{
    urlstoblock.push("*://*.lol123.com/*");
    chrome.webRequest.onBeforeSendHeaders.removeListener(DomainBlock);
    chrome.webRequest.onBeforeSendHeaders.addListener(
        DomainFilter,
        {urls: urlstoblock},
        ["blocking"]
    );
}

function DomainFilter(){
    return {cancel : true};
}

1 Ответ

1 голос
/ 07 мая 2020

Фильтры для существующего слушателя не могут быть изменены динамически, поэтому на самом деле единственный способ - удалить слушателя и добавить его с новым фильтром.

В вашем случае может быть лучше перехватить все запросы. Окончательное решение должно основываться на измерениях производительности, потому что сотня запросов по своей сути не впечатляет. Вы можете использовать профилировщик devtools или chrome: // трассировку для углубленного анализа.

Возможный обходной путь - каждый раз создавать новую ссылку на функцию:

const blockedUrls = new Map();
const blocker = () => ({cancel: true});

const registerBlocker = url => {
  const fn = blocker.bind(null);
  blockedUrls.set(url, fn);
  chrome.webRequest.onBeforeSendHeaders.addListener(fn, {urls: [url]}, ['blocking']);
};

chrome.webRequest.onBeforeRequest.addListener(
  info => registerBlocker('*://*.lol123.com/*'),
  {urls: ['<all_urls>']},
  ['requestBody'],
);

Новый слушатель функция сохраняется в blockedUrls только для того, чтобы вы могли впоследствии отменить ее регистрацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...