"Después del juego es antes del juego"
Sepp Herberger

Mostrando entradas con la etiqueta chrome. Mostrar todas las entradas
Mostrando entradas con la etiqueta chrome. Mostrar todas las entradas

viernes, 24 de enero de 2025

Evitar el aviso "Google Chrome no está actualizado"

El Google Chrome siempre quiere estar actualizado. Tan pronto como la versión es un poco antigua te presenta en la parte superior derecha el mensaje de que no está actualizado y necesita una actualizacion ya mismo. Si estamos en un entorno donde las actualizaciones están controladas y escalonadas eso provoca que muchas veces ese mensaje esté presente en el navegador.

Por algún motivo eso parece provocar una profunda zozobra en algunos usuarios, hasta el punto de que intentan insistentemente tener el navegador actualizado al último byte. Si además no tienen los permisos para actualizarlo eso genera una cierta frustración que acaban intentando contagiar al sysadmin.

Una buena opción para evitar esto consiste en hacer que Chrome no muestre tal mensaje y deje de dar la vara con que debería estar actualizado. Lo ideal seria que hubiese un fichero de configuración para regular esto, pero parece ser que no se le ha ocurrido a nadie en Google. Afortunadamente se puede anular el mensaje usando un parámetro en el comando que invoca a Chrome:
# google-chrome-stable --simulate-outdated-no-au='Tue, 31 Dec 2099 23:59:59 GMT' 
Con esto decimos que hasta el 2099 no se preocupe por las actualizaciones. Como los usuarios no lanzan Chrome desde la linea de comandos lo adecuado sería editar /usr/share/applications/google-chrome.desktop (y en general todos los google-chrome.desktop que tengamos en los escritorios y en cualquier otro lado) y cambiar dentro esta línea:
Exec=/usr/bin/google-chrome-stable --simulate-outdated-no-au='Tue, 31 Dec 2099 23:59:59 GMT' %U
Tras eso habria que ejecutar un "update-desktop-database".

En resumen: ojos que no ven, corazón que no siente.

miércoles, 24 de abril de 2024

Chequear mediante javascript si está instalada una extensión de Google Chrome

Que complicadas son a veces las cosas. Necesitaba asegurarme en la parte javascript de una página web de que Google Chrome tenía instalada una extensión determinada y me encuentro que no hay ninguna función en el API de Chrome que permita averiguarlo. La única manera es mediante métodos indirectos y cutres: intentar hacer algo con la extensión y capturar el error que salta si no está presente.

Hay varías maneras de hacerlo, esta es simplemente una de ellas. Necesitamos saber:
  1. La ID de la extensión, que es como su DNI que la identifica de forma universal. La instalamos desde https://chromewebstore.google.com/ y luego vamos a Gestionar Extensiones de nuestro Chrome.
  2. Elegimos la extensión en cuestión en "Gestionar Extensiones" y le damos a "Detalles". En la barra de la URL aparece el ID, por ejemplo: chrome://extensions/?id=pmlcjncilaaaemknfefmegedhcgelmee.
  3. Visualizamos al manifiesto de la extensión para ver la parte pública de la misma, esto se hace accediendo con la URL: chrome-extension://pmlcjncilaaaemknfefmegedhcgelmee/manifest.json (cambiar la parte en negrita por el ID de tu extensión).
  4. En el manifiesto, que es una estructura .json localizamos el atributo "web_accessible_resources.resources". Alli se enumeran los recursos de la extensión que son públicos.
  5. Elegimos uno de esos recursos públicos. Por ejemplo, dado el manifiesto:
     {
       "action": {
          "chrome_url_overrides": {
             "newtab": "popup.html"
          },
          "default_title": "__MSG_extName__"
       },
       "background": {
          "service_worker": "js/background.js"
       },
       "content_scripts": [ {
          "all_frames": false,
          "js": [ "js/content.js" ],
          "match_about_blank": false,
          "matches": [ "\u003Call_urls>" ],
          "run_at": "document_start"
       } ],
       "default_locale": "en",
       "description": "__MSG_extShortDesc__",
       "host_permissions": [ "\u003Call_urls>" ],
       "icons": {
          "128": "icons/icon-128.png",
          "16": "icons/icon-16.png",
          "300": "icons/icon-300.png",
          "48": "icons/icon-48.png"
       },
       "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxAT6Z9x4SMUH91sYicM+8qwroIqnrZoMYW4zd+0IX3DGnEtzUX6bNusmBjiwKydV9LvASRM5o12bmc+XuWsYr/G/YwzoKuVfmLHgr8JVfJDwS67XlYKHc1YeSLDI1r7mVrP2nr6W6MBfxRuxWz4QoAZxnaQkw9Dw+SNQksGQq2BIDt12uqSFavzEILGcURMM1+YdILVAEHLSiGVwiLveZfcZzPhS91tJNgawW/nagxxe7iuRE0ea0h+m4I9b3cHCW1oc22nUR9FIliXsslM1F6BZNQDxJoHBJM01+Jq5VDpInXTykeHvL2+v9JRhRrizeLsdRcPBKyIFZDROXQnR+wIDAQAB",
       "manifest_version": 3,
       "minimum_chrome_version": "88.0",
       "name": "__MSG_extName__",
       "offline_enabled": true,
       "permissions": [ "storage", "scripting", "alarms" ],
       "update_url": "https://clients2.google.com/service/update2/crx",
       "version": "1.0.5",
       "web_accessible_resources": [ {
          "matches": [ "\u003Call_urls>" ],
          "resources": [ "icons/*" ],
          "use_dynamic_url": false
       } ]
    }
    
    Podríamos escoger el recurso icons/icon-16.png. La URL para acceder a él sería: chrome-extension://pmlcjncilaaaemknfefmegedhcgelmee/icons/icon-16.png. Si abrimos esa URL en el navegador debería cargarse dicho icono. Ojo: igual que hemos elegido un .png podríamos haber elegido un .html o un .txt, no importa el tipo de recurso.
  6. La URL elegida anteriormente será la que usemos para chequear si existe la extensión desde JavaScript. Intentaremos acceder a dicha URL y si obtenemos HTTP 200 OK es que la extensión está instalada y activa, en caso contrario la extensión no está disponible. Es feo, pero funciona.


La función quedaría:
function extensionInstalada() {

	 var url = 'chrome-extension://pmlcjncilaaaemknfefmegedhcgelmee/icons/icon-16.png';
	 var hasExtension=null;

	 var xhr = new XMLHttpRequest();
	 xhr.onreadystatechange = function() {
		 if (xhr.readyState != 4) return;
		 if (xhr.status === 200) {
			   hasExtension=true;
		 }
	 };
	 xhr.open("GET", url, false);
	 try {
		  xhr.send();
	 } catch (error) {
		 hasExtension=false;
	 }
	 return hasExtension;

}  
El código JavasCript que comprobaría la extensión sería:
var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
if (is_chrome == false) {
	 alert("Esto solo funciona con Google Chrome");
	 return;
}
resultado=extensionInstalada();
if (!resultado) {
	 alert("No tienes instalada la extensión XXX.");
	 return;
}
Y ya está. No me digan que Google no podría currarselo un poquito para hacerlo más sencillo.

miércoles, 21 de octubre de 2020

Cuelgues en el arranque de Google Chrome

Por algún motivo desconocido nos sucede que el Google Chrome se queda a veces colgado en el arranque sin abrirse y aunque matemos todos los procesos "chrome" y empecemos de nuevo, vuelve a suceder una y otra vez.

Las sospechas se dirigen a un cierre abrupto de la sesión con Chrome abierto que ha dejado algo corrupto en su configuración o archivos temporales. También podría tener que ver que nuestros usuarios muchas veces inician sesión en distintas máquinas con un mismo home (ya que este reside en el servidor NFS) y eso provoca que compartan la configuración varias versiones de Chrome. Esta sospecha está sostenida en este problema se da más en unos usuarios que en otros.

Sabemos que hay algo mal en el perfil del usuario, pero no hemos encontrado que es. No nos queda otra que tirar de brocha gorda y borrar toda la configuración, haciendo antes backup de los marcadores pero eliminando todo lo demás. El script base es cortesía de mi compañero Julio, que es el que se ha currado el trabajo:
# cat cleanChrome.sh
#!/bin/bash
killall -9 chrome
cp  $HOME/.config/google-chrome/Default/Bookmarks /tmp/Bookmarks
rm -Rf $HOME/.cache/google-chrome
rm -Rf $HOME/.config/google-chrome
mkdir -p $HOME/.config/google-chrome/Default
cp -f /tmp/Bookmarks $HOME/.config/google-chrome/Default/Bookmarks
zenity --width 350 --info --text "Finalizado. Borrada configuración del google-chrome. Ahora puedes abrirlo."
exit 0
Con poner este script en todas las máquinas y un fichero .desktop que lo lance en el escritorio de los usuarios, tendremos una vía de salida para cuando el problema se presente, al menos mientras no encontremos una solución mas quirúrgica para eliminar aquello que provoca el cuelgue.


Hace unas horas la mision OSIRIS-REx le ha dado un piquito al asteroide Bennu y pronto estará de vuelta con las muestras: No es la primera vez que pasa esto, pero cualquier aterrizaje en un cuerpo alienígina es una proeza a tener en cuenta. Esperemos que entre las muestras no venga protomolécula.