Skip to content
Permalink
Browse files
Add ability to linger for remove-class scriptlet
Similar to related change for the `remove-attr` scriptlet:
- gorhill/uBlock@0f330c7

Related feedback:
- https://www.reddit.com/r/uBlockOrigin/comments/nsroaw/some_elements_isare_not_removed_after_the_cookie/

Related commits:
- gorhill/uBlock@2de24a1

Co-authored-by: Raymond Hill <rhill@raymondhill.net>
  • Loading branch information
JustOff and gorhill committed Jun 11, 2021
1 parent 5545be3 commit d1ad2d176ec2af24bbe19fabc89700b2fb0e4e1c
Showing with 41 additions and 11 deletions.
  1. +41 −11 assets/resources/resources.txt
@@ -2276,28 +2276,58 @@ remove-attr.js application/javascript

remove-class.js application/javascript
(function() {
var token = '{{1}}';
const token = '{{1}}';
if ( token === '' || token === '{{1}}' ) { return; }
var tokens = token.split(/\s*\|\s*/);
var selector = '{{2}}';
const tokens = token.split(/\s*\|\s*/);
let selector = '{{2}}';
if ( selector === '' || selector === '{{2}}' ) {
selector = '.' + tokens.map(a => CSS.escape(a)).join(',.');
}
var rmclass = function(ev) {
if ( ev ) { window.removeEventListener(ev.type, rmclass, true); }
let behavior = '{{3}}';
let timer;
const rmclass = function() {
timer = undefined;
try {
var nodes = document.querySelectorAll(selector), i = nodes.length;
while ( i-- ) {
var node = nodes[i];
const nodes = document.querySelectorAll(selector);
for ( let node of nodes ) {
node.classList.remove(...tokens);
}
} catch(ex) {
}
};
if ( document.readyState === 'loading' ) {
window.addEventListener('DOMContentLoaded', rmclass, true);
} else {
const mutationHandler = mutations => {
if ( timer !== undefined ) { return; }
let skip = true;
for ( let i = 0; i < mutations.length && skip; i++ ) {
const { type, addedNodes, removedNodes } = mutations[i];
if ( type === 'attributes' ) { skip = false; }
for ( let j = 0; j < addedNodes.length && skip; j++ ) {
if ( addedNodes[j].nodeType === 1 ) { skip = false; break; }
}
for ( let j = 0; j < removedNodes.length && skip; j++ ) {
if ( removedNodes[j].nodeType === 1 ) { skip = false; break; }
}
}
if ( skip ) { return; }
timer = self.requestIdleCallback(rmclass, { timeout: 67 });
};
const start = ( ) => {
rmclass();
if ( /\bstay\b/.test(behavior) === false ) { return; }
const observer = new MutationObserver(mutationHandler);
observer.observe(document.documentElement, {
attributes: true,
attributeFilter: [ 'class' ],
childList: true,
subtree: true,
});
};
if ( document.readyState !== 'complete' && /\bcomplete\b/.test(behavior) ) {
self.addEventListener('load', start, { once: true });
} else if ( document.readyState === 'loading' ) {
self.addEventListener('DOMContentLoaded', start, { once: true });
} else {
start();
}
})();

0 comments on commit d1ad2d1

Please sign in to comment.