Другой метод - предоставить доступ к веб-ресурсу , хотя это позволит любому веб-сайту проверить, установлено ли ваше расширение.
Предположим, у вашего расширения есть ID aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
, и вы добавляете файл (скажем, прозрачное пиксельное изображение), как test.png
в файлах вашего расширения.
Затем вы предоставляете этот файл веб-страницам с помощью web_accessible_resources
ключа манифеста:
"web_accessible_resources": [
"test.png"
],
На своей веб-странице вы можете попробовать загрузить этот файл по его полному URL (в <img>
теге, через XHR или любым другим способом):
chrome-extension:
Если файл загружается, значит, расширение установлено. Если при загрузке этого файла произошла ошибка, значит, расширение не установлено.
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);
};
}
Обратите внимание: если при загрузке этого файла произошла ошибка, указанная ошибка сетевого стека появится в консоли без возможности ее отключения. Когда Chromecast использовал этот метод, это вызвало немало споров из-за этого; с возможным очень уродливым решением - просто занести в черный список очень конкретные ошибки из Dev Tools командой Chrome.
Важное примечание: этот метод не будет работать в Firefox WebExtensions. Ресурсы, доступные в Интернете, по своей сути подвергают расширение «отпечаткам пальцев», поскольку URL-адрес можно предсказать, зная идентификатор. Firefox решил закрыть эту дыру, назначив случайный URL-адрес для конкретного экземпляра доступным веб-ресурсам:
После этого файлы будут доступны по URL-адресу, например:
moz-extension://<random-UUID>/<path/to/resource>
Этот UUID генерируется случайным образом для каждого экземпляра браузера и не является идентификатором вашего расширения. Это не дает веб-сайтам снимать отпечатки пальцев с расширений, установленных пользователем.
Однако, хотя расширение можно использовать runtime.getURL()
для получения этого адреса, вы не можете жестко запрограммировать его на своем веб-сайте.