Для моего расширения FF я использовал content_scripts
для ввода manifest.json
с matches: ['<all_urls>']
, но теперь я переключаюсь на программные инъекции, используя browser.tabs.executeScript
.
Как я могу убедиться, что скрипт загружен в каждый кадр на каждой вкладке? Нужно ли прослушивать изменения URL вкладки с помощью browser.tabs.onUpdated
или, в качестве альтернативы, для события DOMContentLoaded
с использованием browser.webNavigation.onDOMContentLoaded
?
Или есть более элегантный способ сделать это?
Проблема с browser.tabs.onUpdated
заключается в том, что он не будет запускать изменения URL-адресов iFrames с id! == 0.
Поэтому я экспериментировал с browser.webNavigation.onDOMContentLoaded
, чтобы преодолеть эту проблему (пример упрощенного кода):
browser.webNavigation.onDOMContentLoaded.addListener(infos => {
const { tabId, frameId } = infos;
browser.tabs.executeScript(tabId, {
file: '../path/to/content-script.js',
frameId
});
});
Причина всего этого заключается в том, что я хочу позволить пользователю разрешить отказаться от автоматической загрузки скриптов контента и вместо этого делать это вручную через pageAction
, а также отказаться от инъекций в iFrames. Поэтому на DOMContentLoaded
эти 2 параметра будут проверены до того, как произойдут какие-либо инъекции.
В комментарии к другому вопросу дружественный пользователь предложил мне даже не нужен другой API (например, webRequests
), и что tabs.executeScript
будет достаточно - интересно, как? Есть ли другой способ условного внедрения скриптов содержимого?