Описание
Пространство имен chrome.events содержит распространенные типы, используемые API, которые отправляют события, чтобы уведомлять вас о том, что происходит что-то интересное.
Основные понятия и использование
Event – это объект, который позволяет получать уведомления о важных событиях. Вот пример использования события browser.alarms.onAlarm для получения уведомлений о срабатывании будильника:
browser.alarms.onAlarm.addListener((alarm) => {
appendToLog(`alarms.onAlarm -- name: ${alarm.name}, scheduledTime: ${alarm.scheduledTime}`);
});
Как показано в примере, для регистрации уведомлений используется метод addListener(). Аргументом addListener() всегда является функция, которую вы определяете для обработки события, но параметры функции зависят от того, какое событие вы обрабатываете. В документации по alarms.onAlarm указано, что у функции есть один параметр – объект alarms.Alarm, содержащий сведения о сработавшем будильнике.
Примеры API, использующих события: alarms, i18n, identity, runtime. Большинство API chrome поддерживают асинхронные методы.
Декларативные обработчики событий
Декларативные обработчики событий позволяют задавать правила, состоящие из декларативных условий и действий. Условия оцениваются в браузере, а не в движке JavaScript, что сокращает задержки и повышает эффективность.
Декларативные обработчики событий используются, например, в Declarative Content API. На этой странице описаны основные концепции всех декларативных обработчиков событий.
Правила
Простейшее правило состоит из одного или нескольких условий и одного или нескольких действий:
const rule = {
conditions: [ /* my conditions */ ],
actions: [ /* my actions */ ]
};
Если выполняется хотя бы одно из условий, выполняются все действия.
Помимо условий и действий, каждому правилу можно присвоить идентификатор, который упрощает отмену регистрации ранее зарегистрированных правил, и приоритет, определяющий приоритет между правилами. Приоритеты учитываются, только если правила конфликтуют друг с другом или должны выполняться в определенном порядке. Действия выполняются в порядке убывания приоритета правил.
const rule = {
id: "my rule", // optional, will be generated if not set.
priority: 100, // optional, defaults to 100.
conditions: [ /* my conditions */ ],
actions: [ /* my actions */ ]
};
Объекты событий
Объекты событий могут поддерживать правила. Эти объекты событий не вызывают функцию обратного вызова при возникновении событий, а проверяют, выполнено ли хотя бы одно условие зарегистрированного правила, и выполняют действия, связанные с этим правилом. Объекты событий, поддерживающие декларативный API, имеют три соответствующих метода: events.Event.addRules(), events.Event.removeRules() и events.Event.getRules().
Добавить правила
Чтобы добавить правила, вызовите функцию addRules() объекта события. В качестве первого параметра он принимает массив экземпляров правил, а также функцию обратного вызова, которая выполняется по завершении.
const rule_list = [rule1, rule2, ...];
addRules(rule_list, (details) => {...});
Если правила были успешно вставлены, параметр details содержит массив вставленных правил, которые появляются в том же порядке, что и в переданном rule_list, где необязательные параметры id и priority были заполнены сгенерированными значениями. Если какое-либо правило недействительно, например из-за недопустимого условия или действия, то ни одно из правил не добавляется, а при вызове функции обратного вызова задается переменная runtime.lastError. Каждое правило в rule_list должно содержать уникальный идентификатор, который не используется другим правилом, или пустой идентификатор.
Удалить правила
Чтобы удалить правила, вызовите функцию removeRules(). В качестве первого параметра он принимает необязательный массив идентификаторов правил, а в качестве второго – функцию обратного вызова.
const rule_ids = ["id1", "id2", ...];
removeRules(rule_ids, () => {...});
Если rule_ids – это массив идентификаторов, то удаляются все правила, идентификаторы которых перечислены в массиве. Если в rule_ids указан неизвестный идентификатор, он игнорируется. Если для параметра rule_ids задано значение undefined, все зарегистрированные правила этого расширения удаляются. Функция callback() вызывается после удаления правил.
Получение правил
Чтобы получить список зарегистрированных правил, вызовите функцию getRules(). Он принимает необязательный массив идентификаторов правил с той же семантикой, что и removeRules(), и функцию обратного вызова.
const rule_ids = ["id1", "id2", ...];
getRules(rule_ids, (details) => {...});
Параметр details, передаваемый функции callback(), относится к массиву правил, включая заполненные необязательные параметры.
Эффективность
Чтобы добиться максимальной эффективности, следуйте приведенным ниже рекомендациям.
Регистрировать и отменять регистрацию правил в массовом порядке. После каждой регистрации или отмены регистрации Chrome необходимо обновить внутренние структуры данных. Это ресурсоемкая операция.
const rule1 = {...}; const rule2 = {...}; browser.declarativeWebRequest.onRequest.addRules([rule1]); browser.declarativeWebRequest.onRequest.addRules([rule2]);
const rule1 = {...}; const rule2 = {...}; browser.declarativeWebRequest.onRequest.addRules([rule1, rule2]);
В events.UrlFilter лучше использовать сопоставление подстрок, а не регулярные выражения. Сопоставление на основе подстрок выполняется очень быстро.
const match = new browser.declarativeWebRequest.RequestMatcher({ url: {urlMatches: "example.com/[^?]*foo" } });
const match = new browser.declarativeWebRequest.RequestMatcher({ url: {hostSuffix: "example.com", pathContains: "foo"} });
Если у вас есть несколько правил с одинаковыми действиями, объедините их в одно. Правило срабатывает, как только выполняется хотя бы одно условие. Это ускоряет сопоставление и снижает потребление памяти для повторяющихся наборов действий.
const condition1 = new browser.declarativeWebRequest.RequestMatcher({ url: { hostSuffix: 'example.com' } }); const condition2 = new browser.declarativeWebRequest.RequestMatcher({ url: { hostSuffix: 'foobar.com' } }); const rule1 = { conditions: [condition1], actions: [new browser.declarativeWebRequest.CancelRequest()] }; const rule2 = { conditions: [condition2], actions: [new browser.declarativeWebRequest.CancelRequest()] }; browser.declarativeWebRequest.onRequest.addRules([rule1, rule2]);
const condition1 = new browser.declarativeWebRequest.RequestMatcher({ url: { hostSuffix: 'example.com' } }); const condition2 = new browser.declarativeWebRequest.RequestMatcher({ url: { hostSuffix: 'foobar.com' } }); const rule = { conditions: [condition1, condition2], actions: [new browser.declarativeWebRequest.CancelRequest()] }; browser.declarativeWebRequest.onRequest.addRules([rule]);
Отфильтрованные события
Отфильтрованные события – это механизм, который позволяет слушателям указать подмножество событий, которые их интересуют. Прослушиватель, использующий фильтр, не будет вызываться для событий, которые не проходят фильтр, что делает код прослушивания более декларативным и эффективным. Сервисному скрипту не нужно активироваться для обработки событий, которые его не касаются.
Отфильтрованные события предназначены для перехода от кода фильтрации, заданного вручную.
browser.webNavigation.onCommitted.addListener((event) => { if (hasHostSuffix(event.url, 'google.com') || hasHostSuffix(event.url, 'google.com.au')) { // ... } });
browser.webNavigation.onCommitted.addListener((event) => { // ... }, {url: [{hostSuffix: 'google.com'}, {hostSuffix: 'google.com.au'}]});
Для событий поддерживаются определенные фильтры, которые имеют значение для этого события. Список фильтров, которые поддерживает событие, будет приведен в документации по этому событию в разделе filters.
При сопоставлении URL (как в примере выше) фильтры событий поддерживают те же возможности сопоставления URL, что и events.UrlFilter, за исключением сопоставления схемы и порта.
Типы
Event
Объект, который позволяет добавлять и удалять прослушиватели для события Chrome.
Свойства
-
addListener
void
Регистрирует обратный вызов прослушивателя событий для события.
Функция
addListenerвыглядит следующим образом:(callback: H) => {...}
-
обратный вызов
H
Вызывается при возникновении события. Параметры этой функции зависят от типа события.
-
-
addRules
void
Регистрирует правила для обработки событий.
Функция
addRulesвыглядит следующим образом:(rules: Rule<anyany>[], callback?: function) => {...}
-
правила
Rule<anyany>[]
Правила, которые нужно зарегистрировать. Они не заменяют ранее зарегистрированные правила.
-
обратный вызов
function необязательно
Параметр
callbackвыглядит следующим образом:(rules: Rule<anyany>[]) => void
-
правила
Rule<anyany>[]
Правила, которые были зарегистрированы, необязательные параметры заполнены значениями.
-
-
-
getRules
void
Возвращает зарегистрированные правила.
Функция
getRulesвыглядит следующим образом:(ruleIdentifiers?: string[], callback: function) => {...}
-
ruleIdentifiers
string[] необязательно
Если передается массив, возвращаются только правила с идентификаторами, содержащимися в этом массиве.
-
обратный вызов
function
Параметр
callbackвыглядит следующим образом:(rules: Rule<anyany>[]) => void
-
правила
Rule<anyany>[]
Правила, которые были зарегистрированы, необязательные параметры заполнены значениями.
-
-
-
hasListener
void
Функция
hasListenerвыглядит следующим образом:(callback: H) => {...}
-
обратный вызов
H
Прослушиватель, статус регистрации которого нужно проверить.
-
Возвращает
Логическое значение
True, если callback зарегистрирован для события.
-
-
hasListeners
void
Функция
hasListenersвыглядит следующим образом:() => {...}-
Возвращает
Логическое значение
Значение True, если для события зарегистрированы прослушиватели событий.
-
-
removeListener
void
Отменяет регистрацию обратного вызова прослушивателя событий.
Функция
removeListenerвыглядит следующим образом:(callback: H) => {...}
-
обратный вызов
H
Прослушиватель, регистрацию которого нужно отменить.
-
-
removeRules
void
Отменяет регистрацию текущих правил.
Функция
removeRulesвыглядит следующим образом:(ruleIdentifiers?: string[], callback?: function) => {...}
-
ruleIdentifiers
string[] необязательно
Если передается массив, отменяется регистрация только правил с идентификаторами, содержащимися в этом массиве.
-
обратный вызов
function необязательно
Параметр
callbackвыглядит следующим образом:() => void
-
Rule
Описание декларативного правила для обработки событий.
Свойства
-
действия
any[]
Список действий, которые запускаются при выполнении одного из условий.
-
условия
any[]
Список условий, которые могут активировать действия.
-
id
Строка (необязательно)
Необязательный идентификатор, позволяющий ссылаться на это правило.
-
приоритет
number (необязательно)
Необязательный приоритет этого правила. Значение по умолчанию – 100.
-
теги
string[] необязательно
Теги можно использовать для аннотирования правил и выполнения операций с наборами правил.
UrlFilter
Фильтрует URL по различным критериям. Подробнее о фильтрации событий… Все критерии чувствительны к регистру.
Свойства
-
cidrBlocks
string[] необязательно
Chrome 123 и более поздние версии browser.* начиная с Chrome 148Совпадение обнаруживается, если часть URL, относящаяся к хосту, является IP-адресом и содержится в любом из блоков CIDR, указанных в массиве.
-
hostContains
Строка (необязательно)
Соответствие устанавливается, если имя хоста в URL содержит указанную строку. Чтобы проверить, есть ли у компонента имени хоста префикс foo, используйте hostContains: '.foo'. Это соответствует www.foobar.com и foo.com, поскольку в начале имени хоста неявно добавляется точка. Аналогично, hostContains можно использовать для сопоставления с суффиксом компонента ('foo.') и для точного сопоставления с компонентами ('.foo.'). Точное соответствие и соответствие по суффиксу для последних компонентов нужно настраивать отдельно с помощью hostSuffix, поскольку в конце имени хоста не добавляется точка.
-
hostEquals
Строка (необязательно)
Совпадение регистрируется, если имя хоста в URL равно указанной строке.
-
hostPrefix
Строка (необязательно)
Соответствие устанавливается, если имя хоста в URL начинается с указанной строки.
-
hostSuffix
Строка (необязательно)
Совпадение регистрируется, если имя хоста в URL заканчивается указанной строкой.
-
originAndPathMatches
Строка (необязательно)
Соответствие устанавливается, если URL без сегмента запроса и идентификатора фрагмента соответствует заданному регулярному выражению. Если номер порта совпадает с номером порта по умолчанию, он удаляется из URL. Регулярные выражения используют синтаксис RE2.
-
pathContains
Строка (необязательно)
Соответствие устанавливается, если сегмент пути URL содержит указанную строку.
-
pathEquals
Строка (необязательно)
Совпадение регистрируется, если сегмент пути URL равен указанной строке.
-
pathPrefix
Строка (необязательно)
Соответствие устанавливается, если сегмент пути URL начинается с указанной строки.
-
pathSuffix
Строка (необязательно)
Соответствие устанавливается, если сегмент пути URL заканчивается указанной строкой.
-
ports
(number | number[])[] optional
Совпадение, если порт URL содержится в любом из указанных списков портов. Например,
[80, 443, [1000, 1200]]соответствует всем запросам на портах 80, 443 и в диапазоне 1000–1200. -
queryContains
Строка (необязательно)
Соответствие устанавливается, если сегмент запроса в URL содержит указанную строку.
-
queryEquals
Строка (необязательно)
Соответствие устанавливается, если сегмент запроса в URL совпадает с указанной строкой.
-
queryPrefix
Строка (необязательно)
Соответствие устанавливается, если сегмент запроса в URL начинается с указанной строки.
-
querySuffix
Строка (необязательно)
Соответствие устанавливается, если сегмент запроса в URL заканчивается указанной строкой.
-
схемы
string[] необязательно
Совпадение, если схема URL соответствует любой из схем, указанных в массиве.
-
urlContains
Строка (необязательно)
Соответствие устанавливается, если URL (без идентификатора фрагмента) содержит указанную строку. Если номер порта совпадает с номером порта по умолчанию, он удаляется из URL.
-
urlEquals
Строка (необязательно)
Соответствие устанавливается, если URL (без идентификатора фрагмента) совпадает с заданной строкой. Если номер порта совпадает с номером порта по умолчанию, он удаляется из URL.
-
urlMatches
Строка (необязательно)
Соответствует, если URL (без идентификатора фрагмента) соответствует указанному регулярному выражению. Если номер порта совпадает с номером порта по умолчанию, он удаляется из URL. Регулярные выражения используют синтаксис RE2.
-
urlPrefix
Строка (необязательно)
Соответствие устанавливается, если URL (без идентификатора фрагмента) начинается с указанной строки. Если номер порта совпадает с номером порта по умолчанию, он удаляется из URL.
-
urlSuffix
Строка (необязательно)
Соответствие устанавливается, если URL (без идентификатора фрагмента) заканчивается указанной строкой. Если номер порта совпадает с номером порта по умолчанию, он удаляется из URL.