Etiquetas

, , , , ,

Acaba de salir publicada en el Chrome Web Store la extensión Stop AutoRefresh. Soy gran consumidor de noticias, por lo que abro muchos «periódicos digitales». La mayoría de ellos tienen la maldita costumbre de poner la etiqueta <meta http-equiv=»refresh» content=»600″ /> para que la página se recargue automáticamentes. A ellos les vendrá bien para las estadísticas y los rankings, pero para los usuarios es muy molesto, sobre todo si estás con un portátil y muchas pestañas abiertas. Con esta extensión os olvidarés de ese problema, no sólo de la página principal, sino de cualquier frame o iframe que use el mismo truco para recargarse (es decir, también lo evita en casos como éste).

En caso que haya detenido la recarga de la página principal (y sólo de ella), os aparecerá el icono de la extensión en la barra de direcciones.

Por cierto, los iconos me los hizo @nuvols en un momento, al enterarse por Twitter que estaba intentando hacer esta extensión (y que mi mayor problemas son los iconos 😉 ).

This extension disables the annoying page auto refresh fired by the meta «http-equiv» + «refresh» that is used in several sites just to increase page views.

Rollo técnico

En Chrome no se puede evitar esa recarga automática (sí hay maneras de hacerlo en Firefox -de forma nativa y con extensiones- y hasta en Internet Explorer). Tampoco encontré ninguna extensión de Chrome que lo hiciese, por lo que me puse manos a la obra. Nunca había programado una extensión, pero al poco tiempo me di cuenta de por qué no había otras, una vez que el navegador «leyó» la etiqueta, no hay forma de eliminar el refresco, ni siquiera eliminando o cambiándola en el DOM del documento.

Después de darle vueltas, y estudiar más el API de Chrome, encontré un truco:

  1. Al cargar cada página y frame, analizar los meta, y enviar un mensaje al JS principal (temas de seguridad) para que almacene los URLs y la hora en que se produciría la recarga de cada frame, en cada pestaña.
  2. Interceptar todas las conexiones de la ventana principal y los frames, verificar el URL contra los almacenados para esa pestaña,  si la hora coincide, detener la conexión.

Al implementarlo, encontré que al solución era peor que la enfermedad, Chrome hacía desaparecer el contenido de la página, y mostraba un mensae de error que acojonaba:

No encontré la forma de evitar ese error, y me dí cuenta por qué no encontré ninguna extensión [todavía]. Cuando estuaba a punto de abandonarlo, se me ocurrió pensar que quizás haya una cabecera de estado HTTP (como los «404» de «no encontrado) que hiciese que el navegador no cambie el contenido de lo que ya tiene. Encontré que el 204 sonaba bastante a lo que quería. Intenté inyectar desde javascript esta cabecera, pero no había manera. La única forma era incluir un pequeño servidor web (en código nativo, para que no haya requerimientos adicionales de Python, o similar) y redireccionarlo hacia allí. Pero como no estaba por la labor de desarrollar eso para vairas plataformas.

La solución fue implementar un pequeño script en PHP en los servidores de Menéame («http://www.meneame.net/stoprefresh.php»)  Google App Engine (stopautorefresh.appspot.com/stop) que sólo devuelven las cabeceras mínimas necesarias:

header("HTTP/1.0 204 No content");
header("Content-Length: 0");
header("Connection: close");

La nueva versión en App Engine:

self.response.headers['Content-Length'] = 0
self.response.headers['Connection'] = "close"
self.error(204)

Et vóilà, funciona. Como la conexión es en segundo plano, y sólo se dispara al interceptar el auto refresco (y sólo la primera vez), el usuario no notará nada. De todas formas ya veré si lo paso a Google App Engine para que los fallos que podamos tener en Menéame no afecten a la extensiones.

Chrome and Chromium don’t allow to disable the refresh meta tag, nor they provide with an easy method for cancelling it. The extension uses a http trick. When the [unavoidable] refresh is fired, it intercepts it, checks if it’s the refresh event, if so, it redirects the connection to a small script (in meneame.net). This script just returns a 204 http status code, so the browser does not modify the content of the page, and doesn’t try to refresh it again.

Nota: vuelto a poner http://www.meneame.net como «backend», App Engine va muy lento (al menos con las cuotas gratuitas), a veces tarda más de 20 segundos en responder.

PS: Ahora me pondrán en un comentario un enlace a otra extensión que hace algo similar, seguro 😉