delay DOM node walking via requestIdleCallback

This commit is contained in:
Paul Irish
2018-03-19 10:09:53 -07:00
committed by Ilya Grigorik
parent e85dad3280
commit 8e199cd975

View File

@@ -285,18 +285,29 @@ chrome.runtime.sendMessage({}, function(response) {
} }
} }
} }
// Process the DOM nodes lazily
function enqueueCheckNodes(node, parent, added) {
const checkNodes = _ => checkForVideo(node, parent, added);
if ('requestIdleCallback' in window) {
requestIdleCallback(checkNodes, {timeout: 1000});
} else {
checkNodes();
}
}
var observer = new MutationObserver(function(mutations) { var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) { mutations.forEach(function(mutation) {
forEach.call(mutation.addedNodes, function(node) { forEach.call(mutation.addedNodes, function(node) {
if (typeof node === "function") if (typeof node === "function")
return; return;
checkForVideo(node, node.parentNode || mutation.target, true); enqueueCheckNodes(node, node.parentNode || mutation.target, true);
}) });
forEach.call(mutation.removedNodes, function(node) { forEach.call(mutation.removedNodes, function(node) {
if (typeof node === "function") if (typeof node === "function")
return; return;
checkForVideo(node, node.parentNode || mutation.target, false); enqueueCheckNodes(node, node.parentNode || mutation.target, false);
}) });
}); });
}); });
observer.observe(document, { childList: true, subtree: true }); observer.observe(document, { childList: true, subtree: true });