Skip to content

Commit 951b88b

Browse files
authored
Add remove-dom-element.js scriptlet
1 parent ad07d43 commit 951b88b

1 file changed

Lines changed: 62 additions & 0 deletions

File tree

scriptlets.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,67 @@
11
'use strict';
22

3+
/// remove-dom-element.js
4+
/// alias rde.js
5+
/// world ISOLATED
6+
/// dependency run-at.fn
7+
/// dependency safe-self.fn
8+
// example.com##+js(rde, .ads)
9+
function removeElement(
10+
selector = ''
11+
) {
12+
const safe = safeSelf();
13+
const logPrefix = safe.makeLogPrefix('removeDOMElement', ...Array.from(arguments));
14+
const stop = (takeRecord = true) => {
15+
if ( takeRecord ) {
16+
handleMutations(observer.takeRecords());
17+
}
18+
observer.disconnect();
19+
if ( safe.logLevel > 1 ) {
20+
safe.uboLog(logPrefix, 'Quitting');
21+
}
22+
};
23+
let sedCount = 0;
24+
const handleNode = node => {
25+
const nodes = document.querySelectorAll(selector);
26+
nodes.forEach(elem => elem.remove())
27+
safe.uboLog(logPrefix, `${selector} node removed from the DOM`);
28+
return sedCount === 0 || (sedCount -= 1) !== 0;
29+
};
30+
const handleMutations = mutations => {
31+
for ( const mutation of mutations ) {
32+
for ( const node of mutation.addedNodes ) {
33+
if ( handleNode(node) ) { continue; }
34+
stop(false); return;
35+
}
36+
}
37+
};
38+
const observer = new MutationObserver(handleMutations);
39+
observer.observe(document, { childList: true, subtree: true });
40+
if ( document.documentElement ) {
41+
const treeWalker = document.createTreeWalker(
42+
document.documentElement,
43+
NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT
44+
);
45+
let count = 0;
46+
for (;;) {
47+
const node = treeWalker.nextNode();
48+
count += 1;
49+
if ( node === null ) { break; }
50+
if ( handleNode(node) ) { continue; }
51+
stop(); break;
52+
}
53+
safe.uboLog(logPrefix, `${count} nodes present before installing mutation observer`);
54+
}
55+
runAt(( ) => {
56+
const quitAfter = 0;
57+
if ( quitAfter !== 0 ) {
58+
setTimeout(( ) => { stop(); }, quitAfter);
59+
} else {
60+
stop();
61+
}
62+
}, 'interactive');
63+
}
64+
365
/// rename-attr.js
466
/// alias rna.js
567
/// world ISOLATED

0 commit comments

Comments
 (0)