Greasemonkey: document.head имеет значение null, когда @run-at document-start

Созданный на 15 июн. 2017  ·  9Комментарии  ·  Источник: greasemonkey/greasemonkey

Окружающая обстановка

Ключ | Ценность
-- | --
системная платформа | AMD64, Windows-10-10.0.14393
Браузер | Firefox Developer Edition (55.0 Beta 1, 64-разрядная версия)
Пользовательский агент | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0
Конфигурация сборки | https://hg.mozilla.org/releases/mozilla-beta/rev/6872377277a618b2b9e0d2b4c2b9e51765ac199e
Смазать обезьяну | 3.11

Тестовый пользовательский скрипт:

// ==UserScript==
// <strong i="15">@name</strong>        HeadTest
// <strong i="16">@namespace</strong>   HeadTest
// <strong i="17">@include</strong>     *
// @run-at      document-start
// <strong i="18">@version</strong>     1
// <strong i="19">@grant</strong>       none
// ==/UserScript==
AddGlobalStyle('body{background-color:red;}');

function AddGlobalStyle(css) {
    var head, style;
    head = document.getElementsByTagName("head")[0];
    console.log("[Test]: Head: %o", head); //DEBUG
    console.log("[Test]: document.head: %o", document.head); //DEBUG
}

Ожидаемый результат:

[Test]: Head:  <head> 
[Test]: document.head:  <head>

Фактический результат:

[Test]: Head:  undefined
[Test]: document.head:  null

Эта проблема также относится к GM_addStyle

Самый полезный комментарий

@the8472 the8472 Если поведение текущего document-start правильное и преднамеренное, то нам нужно использовать наблюдателя каждый раз, когда вам нужно добавить стиль
Что-то типа

function addGlobalStyle(css){
  let headHunter = new MutationObserver(
    records => {
    ; check mutation records
    ; is added node's tag name 'head'?
    ; create a style node then throw it in
    ; then disconnect us
   }
  );
  headhunter.observer(document, {childlist : true});
}

необходим для каждого сценария, который добавляет стиль перед document-end . Это скучно.

Я надеюсь, что GM_addstyle может сделать это для меня или написать какое-нибудь полезное предупреждение в вики ("GM_addstyle недоступен для скриптов с @run-at document-start, не используйте его, найдите решение самостоятельно ", и т.д)

Все 9 Комментарий

Последняя хорошая версия: Firefox 55.0a1 (17 марта 2017 г.)
Сборка с https://hg.mozilla.org/mozilla-central/rev/39607304b774591fa6e32c4b06158d869483c312

Первое плохое: Firefox 55.0a1 (2017-03-17)
Сборка с https://hg.mozilla.org/mozilla-central/rev/23a4b7430dd7e83a2809bf3dc41471f154301eda

Пушлог:
https://hg.mozilla.org/mozilla-central/pushloghtml?fromchange=39607304b774591fa6e32c4b06158d869483c312&tochange=23a4b7430dd7e83a2809bf3dc41471f154301eda

Ошибка 1333990 является подозреваемой.

Смотрите также #1849

@janekptacijarabaci Нашел обходной путь:

setTimeout(()=>{
    AddGlobalStyle('body{background-color:red;}');
});

Это выглядит нестабильным и ненадежным, но это самый простой способ, который я могу найти в настоящее время, чтобы заставить все работать.

Я не думаю, что это ошибка. document-start происходит очень рано. Это позволяет пользовательским скриптам манипулировать страницей до того, как какой-либо контент javascript будет выполнен.

Если вы хотите выполнить позже, просто используйте document-end или используйте наблюдателей мутаций, чтобы дождаться вставки определенного элемента.

@the8472
Может быть, вы правы.
Согласно МДН:

вставленный элемент документа
Отправляется сразу после создания корневого элемента документа, но до выполнения на нем любого скрипта.

document-start (на основе document-element-inserted ) запускается сразу после создания <html></html> , в настоящее время <head> равно нулю.

Но это ломает многие скрипты, которые пытаются добавить стиль до отображения страницы (если вы используете GM_addstyle с document-end , вы заметите, что страница мигает), как это работало раньше

Я не уверен, что это сделано намеренно

GM_addStyle в любом случае глупый, он просто вставляет тег <style> в <head> , вы можете сделать это самостоятельно, при необходимости с наблюдателем мутаций.

Но если это действительно проблема, ее можно исправить, чтобы проверить наличие <head> , используйте наблюдателей, если это не так.

@the8472 the8472 Если поведение текущего document-start правильное и преднамеренное, то нам нужно использовать наблюдателя каждый раз, когда вам нужно добавить стиль
Что-то типа

function addGlobalStyle(css){
  let headHunter = new MutationObserver(
    records => {
    ; check mutation records
    ; is added node's tag name 'head'?
    ; create a style node then throw it in
    ; then disconnect us
   }
  );
  headhunter.observer(document, {childlist : true});
}

необходим для каждого сценария, который добавляет стиль перед document-end . Это скучно.

Я надеюсь, что GM_addstyle может сделать это для меня или написать какое-нибудь полезное предупреждение в вики ("GM_addstyle недоступен для скриптов с @run-at document-start, не используйте его, найдите решение самостоятельно ", и т.д)

Да, gm_addstyle должен быть исправлен.

Но все остальное, что может делать скрипт, также должно проходить через те же обручи при запуске документа, добавляя стили, не являющиеся особенными в этом отношении. Ничто из DOM недоступно, поэтому вам придется ждать того, что вам нужно. Т.е. вам все равно нужно использовать наблюдателей, если вы запускаете что-то при старте документа.

Спасибо за подробный отчет, но это WAI, а ветка 3.x все равно мертва. (Я, например, приветствую наших новых повелителей веб-расширений.) Такие вещи, как GM_addStyle , будут исправлены тем, что никогда не существовали в 4.x.

Существуют такие сценарии, как https://arantius.com/misc/greasemonkey/amazon-url-cleaner.user.js , которые вообще не нуждаются в DOM и должны запускаться как можно скорее.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги