Введенный расширением <script>порядок выполнения тега - PullRequest
1 голос
/ 20 марта 2020

У меня есть расширение браузера, которое выполняет следующие действия:

  1. Выполняет скрипт содержимого в document_start.
  2. Этот скрипт контента вставляет элемент <script> с src атрибут файла JavaScript в моем расширении.
  3. Этот 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>. Это ожидается методом внедрения.

Есть ли способ заставить этот сценарий выполняться раньше всех других сценариев?

1 Ответ

1 голос
/ 20 марта 2020

Основываясь на идее @CertainPerformance, вот решение для взлома:

console.log('Inject');

const req = new XMLHttpRequest();
req.open('GET', chrome.runtime.getURL('js/hooks.js'), false);
req.send(null);
if (req.status === 200) {
  const scriptEl = document.createElement('script');
  scriptEl.textContent = req.responseText;
  (document.head || document.documentElement).appendChild(scriptEl);
}

Гадость, но работа сделана на сегодня. Если у кого-то есть более подходящее решение, дайте мне знать!

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