У меня есть расширение браузера, которое выполняет следующие действия:
- Выполняет скрипт содержимого в
document_start
. - Этот скрипт контента вставляет элемент
<script>
с src
атрибут файла JavaScript в моем расширении. - Этот JavaScript файл перехватывает некоторые функции браузера.
Все три из этих вещей должны произойти до запуска любого сценария загруженная страница. С этой целью я создал следующее в своем manifest.json
:
"content_scripts": [
{
"matches": [
"https://example.com/*",
],
"run_at": "document_start",
"js": ["js/inject.js"]
}
]
Затем для inject.js
:
console.log('Inject');
const scriptEl = document.createElement('script');
scriptEl.src = chrome.runtime.getURL('js/hooks.js');
(document.head || document.documentElement).appendChild(scriptEl);
В hooks.js
, на данный момент, только некоторые отладка:
console.log('Hooks');
Наконец, на моей тестовой странице HTML у меня также есть некоторый скрипт:
<!DOCTYPE html>
<html>
<head>
<script>
document.addEventListener('DOMContentLoaded', async (e) => {
console.log('DOMContentLoaded');
});
</script>
</head>
<body>
<h1>Test Page</h1>
</body>
</html>
Я ожидаю увидеть следующее на консоли, в этот порядок:
Inject
Hooks
DOMContentLoaded
Вместо того, что я вижу:
Inject
DOMContentLoaded
Hooks
Если я проверяю DOM с помощью инструментов разработчика моего браузера, я вижу, что <script src=".../js/hooks.js"></script>
вставляется непосредственно перед <head>
. Это ожидается методом внедрения.
Есть ли способ заставить этот сценарий выполняться раньше всех других сценариев?