Otro método es exponer un recurso accesible desde la web , aunque esto permitirá que cualquier sitio web pruebe si su extensión está instalada.
Suponga que el ID de su extensión es aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
, y agrega un archivo (digamos, una imagen de píxel transparente) como test.png
en los archivos de su extensión.
Luego, expone este archivo a las páginas web con la web_accessible_resources
clave de manifiesto:
"web_accessible_resources": [
"test.png"
],
En su página web, puede intentar cargar este archivo por su URL completa (en una <img>
etiqueta, a través de XHR o de cualquier otra forma):
chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/test.png
Si el archivo se carga, entonces se instala la extensión. Si hay un error al cargar este archivo, la extensión no está instalada.
// Code from https://groups.google.com/a/chromium.org/d/msg/chromium-extensions/8ArcsWMBaM4/2GKwVOZm1qMJ
function detectExtension(extensionId, callback) {
var img;
img = new Image();
img.src = "chrome-extension://" + extensionId + "/test.png";
img.onload = function() {
callback(true);
};
img.onerror = function() {
callback(false);
};
}
Nota: si hay un error al cargar este archivo, dicho error de pila de red aparecerá en la consola sin posibilidad de silenciarlo. Cuando Chromecast usó este método, causó bastante controversia debido a esto; con la eventual solución muy fea de simplemente incluir en la lista negra errores muy específicos de Dev Tools por el equipo de Chrome.
Nota importante: este método no funcionará en Firefox WebExtensions. Los recursos accesibles a través de la web exponen de forma inherente la extensión a la toma de huellas digitales, ya que la URL es predecible al conocer la ID. Firefox decidió cerrar ese agujero asignando una URL aleatoria específica de la instancia a los recursos accesibles en la web:
Los archivos estarán disponibles usando una URL como:
moz-extension://<random-UUID>/<path/to/resource>
Este UUID se genera aleatoriamente para cada instancia del navegador y no es el ID de su extensión. Esto evita que los sitios web tomen las huellas digitales de las extensiones que un usuario ha instalado.
Sin embargo, si bien la extensión puede usarse runtime.getURL()
para obtener esta dirección, no puede codificarla en su sitio web.