Я создаю расширение Chrome, которое использует обозреватель для наблюдения за изменениями в DOM.Если в DOM добавлен некоторый указатель ресурса, выполняется функция processLink()
:
document.addEventListener("DOMContentLoaded", function(event) {
chrome.storage.sync.get(["value", "enabled_value", "mode"], function(result) {
// there's no HEAD yet at document-start, let's wait until we have it
new MutationObserver((mutations, observer) => {
if (document.head) {
observer.disconnect();
monitorLinks();
}
}).observe(document.documentElement, {childList: true});
function monitorLinks() {
const onMutation = mutations => {
for (const {addedNodes} of mutations) {
for (const n of addedNodes) {
if (n.nodeName === 'LINK' && (n.rel === 'preconnect' || n.rel === 'prefetch' || n.rel ==='dns-prefetch' || n.rel === 'prerender')) {
processLink(n);
}
}
}
};
// the HEAD may have some children already
onMutation([{
addedNodes: document.getElementsByTagName('link'),
}]);
// watch for the newly added children of HEAD
new MutationObserver(onMutation).observe(document.head, {childList: true});
}
});
});
Функция processLink()
только передает сообщение в фоновый скрипт следующим образом:
function processLink(link) {
prerenderFound = true;
chrome.runtime.sendMessage({ "newIconPath" : "images/48.png" });
}
Результатом этого должно стать изменение иконки на панели расширений.Это все в contentScript()
, которое выполняется на document_start
.На моем компьютере, который имеет мало памяти и его процессор также работает медленно, расширение работает отлично.Однако на лучшем устройстве значок не изменится.Я думаю, что может быть проблема с загрузкой DOM слишком рано.Что может вызвать эту проблему?