Greasemonkey: Поддержка времени выполнения сценария запуска документа

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

Поддержка document-start за @run-at .

См. # 2483 для более подробной информации. Это может быть «невозможно».

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

Вы можете использовать run_at свойство content_scripts манифеста ключ.

Я поделился с вами сожалением о Chrome 4 года назад. Теперь снова для Firefox. 😭

Я хотел бы перефразировать свое предложение в https://bugs.chromium.org/p/chromium/issues/detail?id=257956.

tabs.insertCSS/executeScript должен вставлять CSS/JS до тех пор, пока URL-адрес вкладки не будет установлен непустым (не нулевым, не неопределенным, не пустой строкой ""), и будет отменен, если вкладка удалена/изменена

API-интерфейсы WebExtension должны быть улучшены.

@iology, почему вы отклонили мое предложение? Это совершенно справедливо. Кроме того, можно просто использовать сценарий содержимого для вставки тегов сценария в документ, содержащий пользовательские сценарии.

Следующее должно объяснить, как это сделать с помощью моего метода: (должно работать надежно)

/**
 * <strong i="8">@typedef</strong> UserScript
 * <strong i="9">@property</strong> {Object} header The parsed header of a script
 * <strong i="10">@property</strong> {String} script The raw script data
 * <strong i="11">@property</strong> {String} type The script media type (in case a script is WebAssembly
 *                         or something other than JavaScript)
 */

/** The load state of this script. Used by the `matches()` function */
const READY_STATE = document.readyState;

(async () => {
    (await (browser.storage.local.get({scripts: []}) // Excuse this horrible code style
        .then(ret => ret.scripts)))                  // of combining `await` and `.then()`
        .forEach(/* <strong i="12">@param</strong> {UserScript} script */ script => {
            if (matches(script.header)) {
                let scriptTag = document.createElement("script");
                scriptTag.setAttribute("type", script.type)
                scriptTag.textContent = script.script;
                document.appendChild(scriptTag);
            }
        });
})();

/**
 * Checks if this script matches this page and @run-at property.
 * 
 * <strong i="13">@param</strong> {Object} scriptHeader The parsed header of a script
 * <strong i="14">@return</strong> {boolean} `true` if this page matches, `false` otherwise
 */
function matches(scriptHeader) {
    // Uses window.location and READY_STATE.
    // TODO: Implement
}

@ExE-Boss К тому времени, когда вы извлечете скрипты из хранилища расширений, часть страницы уже будет загружена.

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

@ExE-Boss, есть багзилла, https://bugzilla.mozilla.org/show_bug.cgi?id=1332273 , похоже, что она успешно развивается и должна помочь решить проблему @document-start. Приземлится ли он на FF57, я не уверен.

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

@ExE-Boss Это буквально проблема, которую мы пытаемся решить.

Я тоже пытаюсь решить эту проблему, но мое решение действительно работает достаточно хорошо только для # 2525, потому что к этому моменту вся страница полностью загружена.

У Violentmonkey тоже есть эта проблема, не знаю, какую черную магию использует Tampermonkey, но он может надежно внедрить скрипт в настоящий document-start .

Tampermonkey 2.9 и более ранние версии были GPL-3.0 и опубликованы на GitHub . Я пытался разобраться в этом, и сначала я подумал, что он использует sync XHR , но немного добавлена ​​​​в версии 2.6. .2767 .

Посмотрите здесь, почему Tampermonekey закрыл исходный код:

Я не заинтересован в пиратстве, будет несложно изменить логику Tampermonkey, но это не законно.

@Sxderp Это только для Firefox 57, эта ошибка может быть решена в 58+.

К вашему сведению, Tampermonkey также ненадежен при запуске документа. Существует опция «мгновенной» инъекции (которая чрезвычайно хакерская), которая ускоряет работу, но на простых страницах, таких как xkcd.com, я все еще получаю вспышку до загрузки моего CSS (который всегда вводится в начале документа). Я также иногда получаю вспышку на других сайтах.

Обратный код Tampermonkey — не способ понять это. Кроме того, фактические методы, которые они используют, можно найти на их форумах, предложенных другими пользователями. Копирование метода не является копированием, это просто копирование самого кода.

Но мы знаем, что это несовершенное решение, и нам нужно идеальное.

Если будет найден способ заставить это работать, может ли сценарий синхронно прочитать хотя бы часть своих параметров конфигурации? В качестве примера проблем, которые это решит, см. https://github.com/ccd0/4chan-x/issues/1627. Здесь мне нужно отключить некоторый код на странице, но я также хочу иметь возможность не отключать код. И многие пользователи очищают localStorage в конце каждого сеанса браузера.

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

Ни в какой краткосрочной перспективе. Невозможно синхронно взаимодействовать с хранилищем (get|set)Value. Возможно, какая-то инъекция со стороны GM, при которой переменные со значениями конфигурации вводятся в глобальную область скрипта. Это лучшее, что я могу придумать, и это не очень приятно.

Возможно, какая-то инъекция со стороны GM, при которой переменные со значениями конфигурации вводятся в глобальную область скрипта. Это лучшее, что я могу придумать, и это не очень приятно.

Предположительно, это будет часть объекта GM . Что-то вроде GM.initValues.yourVariable .

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