Greasemonkey: Admite el tiempo de ejecución del script de inicio de documento

Creado en 25 jul. 2017  ·  17Comentarios  ·  Fuente: greasemonkey/greasemonkey

Soporte document-start por @run-at .

Ver #2483 para más detalles. Esto puede ser "imposible".

Todos 17 comentarios

Se puede utilizar el run_at propiedad del content_scripts clave de manifiesto.

Compartí la lástima de Chrome contigo hace 4 años. Ahora de nuevo para Firefox. 😭

Me gustaría reformular mi sugerencia en https://bugs.chromium.org/p/chromium/issues/detail?id=257956

tabs.insertCSS/executeScript debe insertar CSS/JS hasta que la URL de la pestaña se configure como no vacía (no nula, no indefinida, no cadena vacía ""), y se cancelará si la pestaña se elimina/cambia

Las API de WebExtension deben mejorarse.

@iology ¿ rechazaste mi sugerencia? Es perfectamente válido. Además, se puede usar el script de contenido para insertar etiquetas de script en el documento que contiene los scripts de usuario.

Lo siguiente debería explicar cómo hacerlo usando mi método: (debería funcionar de manera confiable)

/**
 * <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 Para cuando recupere los scripts del almacenamiento de extensiones, parte de la página ya estará cargada.

Soy consciente de eso, pero realmente no veo otra forma de hacerlo debido al hecho de que las WebExtensions son inherentemente asincrónicas.

@ExE-Boss, hay un bugzilla, https://bugzilla.mozilla.org/show_bug.cgi?id=1332273 , que parece que está progresando muy bien y debería ayudar a resolver el problema de @document-start. Si aterrizará para FF57, no estoy seguro.

Soy consciente de eso, pero realmente no veo otra forma de hacerlo debido al hecho de que las WebExtensions son inherentemente asincrónicas.

@ExE-Boss Ese es literalmente el problema que estamos tratando de resolver.

También estoy tratando de resolverlo, pero mi solución realmente solo funciona lo suficientemente bien para el # 2525, porque en ese momento toda la página se ha cargado por completo.

Violentmonkey también tiene este problema, no estoy seguro de qué magia negra usa Tampermonkey, pero es capaz de inyectar secuencias de comandos de manera confiable en el document-start real.

Tampermonkey 2.9 y versiones anteriores tenían GPL-3.0 y se publicaron en GitHub . Intenté investigarlo, y al principio pensé que estaba usando sync XHR , pero después de investigarlo un poco, no tengo idea de cómo lo logra, pero lo hace de alguna manera porque se agregó soporte para eso

Vea aquí por qué Tampermonekey se cerró como fuente:

No estoy interesado en piratear cosas, no será demasiado difícil revertir la lógica de Tampermonkey, pero no es legal hacerlo.

@Sxderp Eso es solo para Firefox 57, ese error aún podría resolverse en 58+.

FYI, Tampermonkey tampoco es confiable al inicio del documento. Hay una opción de inyección "instantánea" (que es extremadamente hacky) que acelera las cosas, pero en páginas simples como xkcd.com, todavía obtengo un flash antes de que se cargue mi CSS (que siempre se inyecta al inicio del documento). De vez en cuando también obtengo un flash en otros sitios.

Invertir el código de Tampermonkey no es una forma de resolver esto. Además, bueno, los métodos reales que utilizan se pueden encontrar en sus foros, sugeridos por otros usuarios. Copiar un método no es copiar-vio, solo copiar el código en sí.

Pero sabemos que es una solución imperfecta y queremos una solución perfecta.

Si se encuentra un método para hacer que esto funcione, ¿podría haber una manera de que un script lea al menos un subconjunto de sus opciones de configuración de forma sincrónica? Como ejemplo del tipo de problemas que esto resolvería, consulte https://github.com/ccd0/4chan-x/issues/1627. Aquí necesito deshabilitar algún código en la página, pero también quiero tener una opción para no deshabilitar el código. Y muchos usuarios borran localStorage al final de cada sesión del navegador.

Si se encuentra un método para hacer que esto funcione, ¿podría haber una manera de que un script lea al menos un subconjunto de sus opciones de configuración de forma sincrónica?

No a corto plazo. No hay forma de comunicarse con el almacenamiento de valores (get|set) de forma síncrona. Tal vez algún tipo de inyección por parte de GM en el que las variables con valores de configuración se inyectan en el alcance global del script. Eso es lo mejor que se me ocurre, y eso no es muy agradable.

Tal vez algún tipo de inyección por parte de GM en el que las variables con valores de configuración se inyectan en el alcance global del script. Eso es lo mejor que se me ocurre, y eso no es muy agradable.

Presumiblemente sería parte del objeto GM . Algo así como GM.initValues.yourVariable .

¿Fue útil esta página
0 / 5 - 0 calificaciones