|
1 | 1 | 'use strict'; |
2 | 2 |
|
| 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 | + |
3 | 65 | /// rename-attr.js |
4 | 66 | /// alias rna.js |
5 | 67 | /// world ISOLATED |
|
0 commit comments