Outro método é expor um recurso acessível pela web , embora isso permita que qualquer site teste se sua extensão está instalada.
Suponha que o ID da sua extensão seja aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
, e você adicione um arquivo (digamos, uma imagem de pixel transparente) como test.png
nos arquivos da sua extensão.
Em seguida, você expõe esse arquivo às páginas da web com a web_accessible_resources
chave de manifesto:
"web_accessible_resources": [
"test.png"
],
Em sua página da web, você pode tentar carregar este arquivo pelo URL completo (em uma <img>
tag, via XHR ou de qualquer outra forma):
chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/test.png
Se o arquivo carregar, a extensão está instalada. Se houver um erro ao carregar este arquivo, a extensão não 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: se houver um erro ao carregar este arquivo, o referido erro de pilha de rede aparecerá no console sem possibilidade de silenciá-lo. Quando o Chromecast usou esse método, causou um pouco de controvérsia por causa disso; com a eventual solução muito desagradável de simplesmente colocar na lista negra erros muito específicos das Ferramentas de Desenvolvimento pela equipe do Chrome.
Observação importante: este método não funcionará no Firefox WebExtensions. Os recursos acessíveis pela Web expõem de maneira inerente a extensão à impressão digital, uma vez que o URL é previsível ao conhecer o ID. O Firefox decidiu fechar essa lacuna atribuindo um URL aleatório específico da instância para recursos acessíveis na web:
Os arquivos estarão disponíveis em um URL como:
moz-extension://<random-UUID>/<path/to/resource>
Este UUID é gerado aleatoriamente para cada instância do navegador e não é o ID da sua extensão. Isso evita que os sites registrem as impressões digitais das extensões que um usuário instalou.
No entanto, embora a extensão possa ser usada runtime.getURL()
para obter esse endereço, você não pode codificá-lo no seu site.