Un altro metodo consiste nell'esposizione di una risorsa accessibile dal Web , sebbene ciò consentirà a qualsiasi sito Web di verificare se l'estensione è installata.
Supponi che l'ID della tua estensione sia aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
e aggiungi un file (ad esempio, un'immagine pixel trasparente) come test.png
nei file della tua estensione.
Quindi, esponi questo file alle pagine web con la web_accessible_resources
chiave manifest:
"web_accessible_resources": [
"test.png"
],
Nella tua pagina web, puoi provare a caricare questo file dal suo URL completo (in un <img>
tag, tramite XHR o in qualsiasi altro modo):
chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/test.png
Se il file viene caricato, l'estensione viene installata. Se si verifica un errore durante il caricamento di questo file, l'estensione non è installata.
// 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 si verifica un errore durante il caricamento di questo file, tale errore di stack di rete apparirà nella console senza possibilità di silenziarlo. Quando Chromecast ha utilizzato questo metodo, ha causato un bel po 'di polemiche per questo motivo; con l'eventuale soluzione molto brutta di semplicemente inserire nella lista nera errori molto specifici da Dev Tools del tutto da parte del team di Chrome.
Nota importante: questo metodo non funzionerà in Firefox WebExtensions. Le risorse accessibili dal Web espongono intrinsecamente l'estensione all'impronta digitale, poiché l'URL è prevedibile conoscendo l'ID. Firefox ha deciso di chiudere quel buco assegnando un URL casuale specifico dell'istanza alle risorse accessibili dal Web:
I file saranno quindi disponibili utilizzando un URL come:
moz-extension://<random-UUID>/<path/to/resource>
Questo UUID viene generato in modo casuale per ogni istanza del browser e non è l'ID dell'estensione. Ciò impedisce ai siti Web di rilevare le impronte delle estensioni installate da un utente.
Tuttavia, sebbene l'estensione possa essere utilizzata runtime.getURL()
per ottenere questo indirizzo, non è possibile codificarlo come hardcoded nel tuo sito web.