Я хочу найти способ внедрить элемент скрипта, как только DOM будет использоваться на веб-странице и до загрузки любого другого скрипта, в моем веб-расширении.
Я пытался добиться этого с помощью события webNavigation.onCommited , которое должно быть запущено when a navigation is committed. At least part of the new document has been received from the server and the browser has decided to switch to the new document.
(цитирование ранее связанной страницы).
Дело в том,что к моменту внедрения сценария документ уже был проанализирован и обработан браузером, поэтому объекты, на которые я хочу ссылаться с точки зрения веб-страницы, еще не определены.
I 'Я тестировал только на Firefox, но мне сейчас не нужна поддержка других браузеров.
Я создал минимальный воспроизводимый пример.Весь источник может быть извлечен здесь .
По сути, в фоновом скрипте я регистрирую свой обработчик событий, который внедряет скрипт содержимого во вкладку «Commit»:
browser.webNavigation.onCommitted.addListener(details => {
browser.tabs.executeScript(
details.tabId,
{
'file': 'inject.js',
'runAt': 'document_start'
})
console.log(details)
})
В inject.js я создаю элемент script и присоединяю его к корню документа:
const script = document.createElement('script')
script.src = browser.runtime.getURL('script.js')
script.onload = () => {
console.log('injected')
}
console.log('injecting')
document.documentElement.appendChild(script)
0
script.js очень прост:
TEST=1
Чтобы проверить расширениеЯ создал еще одну простую веб-страницу:
<!doctype html>
<html>
<head>
<meta charset=utf-8>
<title>Test</title>
<script>
console.log('too late?', window.TEST ? 'no' : 'yes :\\')
</script>
</head>
</html>
Я ожидаю увидеть в консоли строку журнала 'слишком поздно?нет».Всегда бывает слишком поздно?да: \ ', за исключением нескольких случаев, таких как открытие веб-страницы в первый раз, закрытие вкладки, содержащей страницу, и ее восстановление (CTRL + SHIFT + T).Обновление страницы (F5, CTRL + F5, что угодно) всегда приводит к «слишком поздно»?да: \ '