Inną metodą jest udostępnienie zasobu dostępnego w sieci , chociaż pozwoli to dowolnej witrynie na sprawdzenie, czy rozszerzenie jest zainstalowane.
Załóżmy, że identyfikator rozszerzenia to aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
i dodajesz plik (powiedzmy przezroczysty obraz pikselowy) jakotest.png
w plikach rozszerzenia.
Następnie udostępniasz ten plik na stronach internetowych za pomocą web_accessible_resources
klucza manifestu:
"web_accessible_resources": [
"test.png"
],
Na swojej stronie internetowej możesz spróbować załadować ten plik <img>
, używając pełnego adresu URL (w tagu, przez XHR lub w inny sposób):
chrome-extension:
Jeśli plik zostanie załadowany, rozszerzenie zostanie zainstalowane. Jeśli podczas ładowania tego pliku wystąpi błąd, rozszerzenie nie jest zainstalowane.
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);
};
}
Uwaga: jeśli wystąpi błąd podczas ładowania tego pliku, wspomniany stos sieciowy błąd pojawi się w konsoli bez możliwości jego wyciszenia. Kiedy Chromecast używał tej metody, wywołało to sporo kontrowersji z tego powodu; z ostatecznym bardzo brzydkim rozwiązaniem polegającym na umieszczeniu na czarnej liście bardzo konkretnych błędów z Narzędzi dla programistów przez zespół Chrome.
Ważna uwaga: ta metoda nie będzie działać w Firefox WebExtensions. Zasoby dostępne w sieci z natury narażają rozszerzenie na odciski palców, ponieważ adres URL jest przewidywalny dzięki znajomości identyfikatora. Firefox postanowił zamknąć tę lukę, przypisując losowy adres URL specyficzny dla instancji do zasobów dostępnych w sieci:
Pliki będą wtedy dostępne pod adresem URL takim jak:
moz-extension://<random-UUID>/<path/to/resource>
Ten UUID jest generowany losowo dla każdej instancji przeglądarki i nie jest identyfikatorem Twojego rozszerzenia. Zapobiega to pobieraniu przez strony internetowe odcisków palców zainstalowanych przez użytkownika rozszerzeń.
Jednak chociaż rozszerzenie może użyć runtime.getURL()
do uzyskania tego adresu, nie można go na stałe zakodować w swojej witrynie.