Một phương pháp khác là hiển thị tài nguyên có thể truy cập web , mặc dù điều này sẽ cho phép bất kỳ trang web nào kiểm tra xem tiện ích mở rộng của bạn đã được cài đặt chưa.
Giả sử ID của tiện ích mở rộng của bạn là aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
và bạn thêm một tệp (giả sử, một hình ảnh pixel trong suốt) như test.png
trong các tệp của tiện ích mở rộng của bạn.
Sau đó, bạn hiển thị tệp này trên các trang web có web_accessible_resources
khóa kê khai:
"web_accessible_resources": [
"test.png"
],
Trong trang web của mình, bạn có thể cố gắng tải tệp này bằng URL đầy đủ của nó (trong <img>
thẻ, qua XHR hoặc theo bất kỳ cách nào khác):
chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/test.png
Nếu tệp tải, thì tiện ích mở rộng đã được cài đặt. Nếu có lỗi khi tải tệp này, thì tiện ích mở rộng chưa được cài đặt.
// 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);
};
}
Lưu ý: nếu có lỗi xảy ra khi tải tệp này, lỗi ngăn xếp mạng đã nói sẽ xuất hiện trong bảng điều khiển và không có khả năng tắt tiếng nó. Khi Chromecast sử dụng phương pháp này, nó đã gây ra khá nhiều tranh cãi vì điều này; với giải pháp cuối cùng rất tệ hại là chỉ đưa vào danh sách đen các lỗi rất cụ thể từ Công cụ dành cho nhà phát triển bởi nhóm Chrome.
Lưu ý quan trọng: phương pháp này sẽ không hoạt động trong Firefox WebExtensions. Các tài nguyên có thể truy cập web vốn đã để tiện ích mở rộng lấy dấu vân tay, vì URL có thể dự đoán được bằng cách biết ID. Firefox đã quyết định đóng lỗ hổng đó bằng cách gán một URL ngẫu nhiên cho từng trường hợp cụ thể cho các tài nguyên có thể truy cập web:
Các tệp sau đó sẽ có sẵn bằng cách sử dụng URL như:
moz-extension://<random-UUID>/<path/to/resource>
UUID này được tạo ngẫu nhiên cho mọi phiên bản trình duyệt và không phải là ID của tiện ích mở rộng của bạn. Điều này ngăn các trang web lưu dấu lại các tiện ích mở rộng mà người dùng đã cài đặt.
Tuy nhiên, trong khi tiện ích mở rộng có thể sử dụng runtime.getURL()
để lấy địa chỉ này, bạn không thể mã hóa nó trong trang web của mình.