Правила декларативного запроса на обновление

#google-chrome #google-chrome-extension

#google-chrome #google-chrome-extension

Вопрос:

Как описано в документации, я пытаюсь обновить declarativeNetRequest правила расширения Chrome. Из документов:

Обновленные динамические правила

chrome.declarativeNetRequest.updateDynamicRules(массив целых значений ruleIdsToRemove, массив правил rulesToAdd, обратный вызов функции)

Измените текущий набор динамических правил для расширения. Правила с идентификаторами, указанными в ruleIdsToRemove, сначала удаляются, а затем добавляются правила, указанные в rulesToAdd. Это обновление происходит как одна атомарная операция: либо добавляются и удаляются все указанные правила, либо возвращается ошибка. Эти правила сохраняются во всех сеансах браузера и при обновлении расширений. Любые идентификаторы в ruleIdsToRemove, которые отсутствуют, будут проигнорированы. Обратите внимание, что статические правила, указанные как часть пакета расширения, не могут быть удалены с помощью этой функции. Примечание: MAX_NUMBER_OF_DYNAMIC_RULES — это максимальное количество динамических правил, которые может добавить расширение.

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

Мой вопрос в том, как я действительно могу обновить правила после получения новых правил из онлайн-API? API declarativeNetRequest не предоставляет никаких методов для этого, все предоставленные методы не будут полезны для этой области.

Комментарии:

1. Вы поняли, как правильно использовать chrome.declarativeNetRequest.updateDynamicRules() api?

Ответ №1:

После того, как я потратил некоторое время, чтобы выяснить, как работает API chrome.declarativeNetRequest.updateDynamicRules(), я закончил это решение, и оно работает нормально.

blockUrls — это переменная массива, которая содержит все веб-сайты / URL-адреса блоков.

 blockUrls.forEach((domain, index) => {
    let id = index   1;

    chrome.declarativeNetRequest.updateDynamicRules(
       {addRules:[{
          "id": id,
          "priority": 1,
          "action": { "type": "block" },
          "condition": {"urlFilter": domain, "resourceTypes": ["main_frame"] }}
         ],
         removeRuleIds: [id]
       },
    )
})  

Комментарии:

1. Почему вы добавляете и удаляете один и тот же идентификатор правила одновременно?

2. @RaedCHAMMAM, чтобы избежать дублирования идентификаторов.

3. Разве это не удалит только что добавленное вами правило, поскольку оно имеет тот же идентификатор?

4. @RaedCHAMMAM В документах говорится, что «Правила с идентификаторами, указанными в ruleIdsToRemove, сначала удаляются, а затем добавляются правила, указанные в rulesToAdd», поэтому он просто проверяет, не возникнет ли конфликт с идентификатором, который уже используется.

5. @LetsGoBrandon blockUrls является объявленной переменной, и она перебирает все URL-адреса с помощью foreach для добавления или обновления правил.

Ответ №2:

Создайте массив со всеми вашими новыми правилами. Получите старые правила и замените их все новыми правилами.

 const newRules = [];
blockUrls.forEach((domain, index) => {
    newRules.push({
        "id": index   1,
        "priority": 1,
        "action": { "type": "block" },
        "condition": { "urlFilter": domain, "resourceTypes": ["main_frame"] }
    });
});
chrome.declarativeNetRequest.getDynamicRules(previousRules => {
    const previousRuleIds = previousRules.map(rule => rule.id);
    chrome.declarativeNetRequest.updateDynamicRules({removeRuleIds: previousRuleIds, addRules: newRules});
});