Расширение Chrome, установленное на `run_at`` document_start` работает слишком быстро?

РЕДАКТИРОВАТЬ: Что-то не так с моим браузером Chrome, и возник конфликт с моим скриптом, полная переустановка устранила источник проблемы. Если мне удастся выяснить, что вызвало это, я включу это сюда.

РЕДАКТИРОВАТЬ 2: Просто, чтобы любой, кто читает это в 2017 году, знал, что я не забыл это, и у меня никогда не было этой проблемы со времени моего предыдущего редактирования.

EDIT3: это 2019 и до сих пор у меня никогда не было этой проблемы снова.

Я изучал, как создать простое расширение Chrome, которое является портом usercript. Скрипт отлично работает с Tampermonkey с настройкойrun at вdocument-startвсе необходимые события, которые должны быть перехвачены с самого начала, фиксируются.

Однако, когда я установил те же настройки в расширении Chrome, я обнаружил, что тот же самый рабочий параметр работает быстрее, чем Tampermonkey, что приводит к сбою первой функции :(Uncaught TypeError: Cannot call method 'appendChild' of null.) поскольку он пытается добавить элемент скрипта вhead раздел, который не существует до 0,010 с позже.

Мое грязное решение до сих пор состояло в том, чтобы использоватьsetInterval функция с таймером, установленным на 10, чтобы проверить,document.head существует, а затем перейдите к коду, если условие истинно.

Есть ли способ, которым я могу сделать это правильно, не прибегая кsetInterval или, может быть, копия Tampermonkey'sgrant none вариант, который появляется для запуска usercript в контексте веб-страницы?

Ниже приведен мой файл manifest.json:

{
    "manifest_version": 2,
    "content_scripts": [ {
        "js":        [ "simpleuserscript.user.js" ],
        "matches":   [ "https://www.google.com/*"],
        "run_at":    "document_start"
    } ],
    "converted_from_user_script": true,
    "description":  "Chrome extension",
    "name":         "Testing",
    "version":      "1"
}

Всего этого можно избежать, если Chrome приметafterscriptexecute событие, но пока это не произошло, я застрял сload событие. Я заранее благодарю за любую помощь.

РЕДАКТИРОВАТЬ: я уже попробовал предложения в ответах: используя другойrun at точка, используяDOMContentLoaded и добавить кdocument.documentElement, Все они оказались неудачными, потому что: 1 и 2 заставляют скрипт пропустить ранние события, а 3 возвращает ту же ошибку TypeError, что и при попытке добавить кdocument.head.

Скрипт должен быть вставлен / запущен, когдаdocument.readyState = loading или же он пропустит ранние необходимые события, но не настолько рано, что не сможет добавить детей кdocumentElementили жеhead

Пример кода внутриsimpleuserscript.user.js:

var script = document.createElement("script");
script.textContent = "console.log('success')";
if(document.head) {
    document.head.appendChild(script);
} else if(document.documentElement) {
    document.documentElement.appendChild(script);
}

Консоль покажетTypeError: Cannot call method 'appendChild' of null

Ответы на вопрос(2)

Ваш ответ на вопрос