Corregir páginas web con greasemonkey

2018/05/29

Corregir páginas web con greasemonkey

Problema

Debo escribir un email utilizando un cliente webmail desde Firefox.

Como una imagen dice más que mil palabras:

Problema con webmail

Como puede verse el area del mensaje se superpone a la linea del asunto del email.

El cliente webmail es roundcube (en el fuente de la página aparece el javascript var rcmail = new rcube_webmail();), desconozco la versión y no pude obtenerla de las páginas del roundcube.

La instalación de Firefox que estoy usando es la 60.0.1, 64-bit linux, pero el problema lo he tenido antes con versiones anteriores.

Solución manual

Presionando F12 para abrir las Web development tools en la ventana del email, se utiliza el node picker para seleccionar el area del mensaje, encontrandose que tiene el id compose-body. Editando el css y agregando margin-top: 5em; encontramos que se evita el solapamiento.

Corrección con web development tools

Ahora interesa no tener que estar realizando la misma acción cada vez que se va a escribir un email.

Solución automática con Greasemonkey

Para solucionar el problema se utilizará greasemonkey, que permite administrar userscripts: scripts (usualmente en javascript) que permiten modificar las páginas web al ser cargadas.

La documentación (escasa), se puede encontrar en la wiki de greasemonkey.

Una mejor fuente es el libro Greasemonkey Hacks, que puede verse en archive.org. Conviene tener en cuenta el post relativo a las incompatibilidades introducidas en la versión 4.

Se pasa a crear el script.

Como nombre de archivo se utiliza fix-roundcube-compose-overlap.user.js. Notar que la extensión .user.js es necesaria para que el script sea instalado por greasemonkey.

A continuación se debe escribir la metadata del script:

// ==UserScript==
// @name        fix-roundcube-compose-overlap
// @namespace   jumapico.uy/greasemonkey
// @version     1
// @grant       none
// @match       *://*/webmail/?*_task=mail*_action=compose*
// @description Fix overlapping issue when compose email in roundcube webmail
// ==/UserScript==

Para más detalles sobre el elemento @match ver la documentación de Match Patterns de google.

El cuerpo del script es simple: una función javascript para insertar un nodo de tipo style cuyo contenido es el encontrado previamente al hacer el arreglo manual:

function insert_style(css) {
    var head = document.getElementsByTagName('head')[0],
        style = document.createElement('style');
    style.type = 'text/css';
    style.appendChild(document.createTextNode(css));
    head.appendChild(style);
}

insert_style('#compose-body { margin-top: 3em; }');

La referencia utilizada para javascript es MDN web docs.

El archivo completo se encuentra en fix-roundcube-compose-overlap.user.js (recordar desactivar greasemonkey para descargar el archivo).

Para instalarlo (y también hacer pruebas durante el desarrollo), se utiliza el servidor web standalone de python3 ejecutando python3 -m http.server 8000 en el mismo directorio en que se encuentra el script y abriendo en el navegador web la url http://127.0.0.1:8000/fix-roundcube-compose-overlap.user.js.