Inicio > internet > Stop AutoRefresh: evitar la recarga automática típica de los periódicos digitales en Chrome/Chromium

Stop AutoRefresh: evitar la recarga automática típica de los periódicos digitales en Chrome/Chromium

julio 12, 2012

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&#8221;)  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 ;)

  1. julio 12, 2012 en 3:35 am

    Excelente, ya mismo lo estoy probando! Una idea tan genial como simple! Mis felicitaciones!!!

  2. julio 12, 2012 en 4:54 am

    Qué bien ¿será posible implementarlo en Firefox?

  3. Alvaro
    julio 12, 2012 en 5:12 am

    otra no. Sólo recordar que programas como Proxomitron tienen muchos años y con ellos no hace falta instalar interminables extensiones que hacen pesado al navagedor. Se ponen los regex del código a borrar y se elimina basura a voluntad. En Linux está Proximodo. Además es realmente gozoso dejar a Google en pelota picada quitando sus grabaciones del teclado, cookies y toda la basura javascript. Es algo que nunca se podrá hacer hacer con Chrome.

  4. julio 12, 2012 en 8:08 am

    Mil gracias, Ricardo, no había nada tan irritante como el autorefresh! El Internet es un poco mejor desde hoy y gracias a ti :-)

  5. ase69s
    julio 12, 2012 en 9:12 am

    Si el refresco automatico de algunas paginas es lo que causa que en ocasiones aparezcan en blanco (forzandonos a recargar la pagina para poder visualizarla) al cambiar a su pestaña nos has hecho un gran favor ^.^

  6. julio 12, 2012 en 11:49 am

    Muchisimas gracias Ricardo por tu trabajo, era horrible cuando la página se recargaba en mitad de una lectura, o peor aún cuando la noticia incluía un vídeo cuya duración era superior al tiempo de refresco.

    Desde mi ignorancia en la programación de extensiones en Chrome me atrevo a preguntar si es necesario que la cabecera sea servida por un servidor web y sino sería posible que en incluirla en un fichero que sea abierto por el navegador.

    Saludos y gracias de nuevo.

  7. julio 12, 2012 en 12:02 pm

    @pontiflex No, no se puede con un fiechero. O no encontré la forma de simular con él cabeceras HTTP.

  8. julio 12, 2012 en 12:33 pm

    ffuentes :
    Qué bien ¿será posible implementarlo en Firefox?

    En firefox no hace falta tener una extensión, se puede hacer por configuración:
    Configuracion->Avanzado -> Advertir cuándo una página web intente redireccionar o recargar la página.

  9. javier
    julio 13, 2012 en 2:01 am

    Instalada. No te lo creerás pero estuve buscando, sin éxito, una extensión que hiciera eso mismo hace 3 o 4 días. Me parecía absurdo ese derroche de transferencia y otros recursos. (Hay un determinado grupo informativo que refresca frecuentemente y pierdes tu comentario a medio hacer… si llevas varios minutos redactando la gracia es morrocotuda).

    Otra extensión… en el mismo sentido que he sido incapaz de encontrar, creo que tendría mucho éxito y haría que Chromium volara… una que conserve en caché (evitando recargar) las páginas anteriores/posteriores… si no fuera por esta pesadez no necesitaría tantas pestañas simultáneas… sería más cómodo navegar con el back-forward.

  1. julio 22, 2012 en 2:05 am
Los comentarios están cerrados.
Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 460 seguidores

%d personas les gusta esto: