Поддерживает ли отрицательный URL-фильтр API веб-навигации Google Chrome расширение? - PullRequest
0 голосов
/ 12 января 2020

Похоже, что он не поддерживает отрицание изначально, например, он имеет hostContains или urlContains, но не имеет hostNotConatins et c. Поэтому я прибег к использованию регулярных выражений, и теперь, к моему удивлению, когда я использую ?! Regex отрицание, Chrome не может добавить прослушиватель и возвращает ошибку:

chrome.webNavigation.onHistoryStateUpdated.addListener(function(){
    chrome.tabs.executeScript({
        file: 'js/contentScript.js'
    });
},{url: [{urlMatches: "/(?!(downloads))"}]});

Почему это так? Почему они ограничивают то, что мы можем сделать с фильтрами URL? JS изначально поддерживает Regex ?! отрицание.

Или я делаю это неправильно? Есть ли обходной путь?

1 Ответ

0 голосов
/ 29 января 2020

Пользователь wOxxOm ответил на мой вопрос в комментариях, и я надеялся, что он напишет ответ в конце, чтобы я мог пометить этот вопрос как ответивший, но он этого не сделал, поэтому мне пришлось скопировать его ответ:

Если встроенного URL-фильтра недостаточно, у прослушивателя webNavigation есть параметр объекта для функции обратного вызова, которая содержит URL-адрес страницы, вы можете настроить фильтры на него следующим образом:

chrome.webNavigation.onHistoryStateUpdated.addListener(function(obj){
    if (obj["url"].search(/twitch.tv[\/](?!(directory|downloads|friends|inventory|jobs|p|payments|settings|subscriptions|turbo))/) > 0){
        chrome.tabs.executeScript({
            file: 'js/twitchContentScript2.js'
        });
    }
},{url: [{hostSuffix: "twitch.tv", urlMatches: "((.+://)?(www\.)?twitch.tv/.+$)"}]});

Вот комментарии к документации, если кто-то сочтет это ненужным, сообщите мне об этом, отредактировав их:

Нет способа использовать исключения в фильтрах. Как сказано в документации, API использует синтаксис RE2, который не имеет негативных перспектив из соображений производительности. - wOxxOm 12 января в 17: 07

Я думал использовать location.href.search(/[\/](?!(downloads))/) из фонового скрипта, но у меня нет доступа к location.href, поэтому я подумал, что, возможно, я смогу использовать chrome.runtime.sendMessage из contentScript в фоновый скрипт, но он не работает. Так что я не знаю, какие у меня есть варианты, знаете ли вы? Спасибо - Шаян 12 января в 18:45

См. Документацию: слушатель получает параметр details с URL внутри. - wOxxOm 12 января в 18: 54

Вы имеете в виду chrome.tabs.onUpdated? Но я использую скрипты контента, объявленные в манифесте, и использую webNavigation для их повторного внедрения, использование onUpdated ломает весь смысл. Или ты имеешь в виду что-то еще? - Шаян 12 января в 19:00

Почему обновлено? Я имею в виду слушателя в вашем коде, конечно. - 10 января в 19: 02

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