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