mirror of
https://github.com/gorhill/uBlock.git
synced 2024-10-06 09:37:12 +02:00
Imrpove sed scriptlet reliability
Related feedback: - https://github.com/uBlockOrigin/uAssets/discussions/18185
This commit is contained in:
parent
692b0b2334
commit
659f35837a
@ -2229,6 +2229,7 @@ function sed(
|
|||||||
pattern = '',
|
pattern = '',
|
||||||
replacement = ''
|
replacement = ''
|
||||||
) {
|
) {
|
||||||
|
if ( document.documentElement === null ) { return; }
|
||||||
const reNodeName = patternToRegex(nodeName, 'i');
|
const reNodeName = patternToRegex(nodeName, 'i');
|
||||||
const rePattern = patternToRegex(pattern, 'gms');
|
const rePattern = patternToRegex(pattern, 'gms');
|
||||||
const extraArgs = new Map(
|
const extraArgs = new Map(
|
||||||
@ -2243,7 +2244,7 @@ function sed(
|
|||||||
const safe = safeSelf();
|
const safe = safeSelf();
|
||||||
const stop = (takeRecord = true) => {
|
const stop = (takeRecord = true) => {
|
||||||
if ( takeRecord ) {
|
if ( takeRecord ) {
|
||||||
handler(observer.takeRecords());
|
handleMutations(observer.takeRecords());
|
||||||
}
|
}
|
||||||
observer.disconnect();
|
observer.disconnect();
|
||||||
if ( shouldLog !== 0 ) {
|
if ( shouldLog !== 0 ) {
|
||||||
@ -2251,28 +2252,51 @@ function sed(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
let sedCount = extraArgs.has('sedCount') ? parseInt(extraArgs.get('sedCount')) : 0;
|
let sedCount = extraArgs.has('sedCount') ? parseInt(extraArgs.get('sedCount')) : 0;
|
||||||
const handler = mutations => {
|
const handleNode = node => {
|
||||||
|
const before = node.textContent;
|
||||||
|
if ( safe.RegExp_test.call(rePattern, before) === false ) { return true; }
|
||||||
|
if ( safe.RegExp_test.call(reCondition, before) === false ) { return true; }
|
||||||
|
const after = before.replace(rePattern, replacement);
|
||||||
|
node.textContent = after;
|
||||||
|
if ( shouldLog !== 0 ) {
|
||||||
|
safe.uboLog('sed.js before:\n', before);
|
||||||
|
safe.uboLog('sed.js after:\n', after);
|
||||||
|
}
|
||||||
|
return sedCount === 0 || (sedCount -= 1) !== 0;
|
||||||
|
};
|
||||||
|
const handleMutations = mutations => {
|
||||||
for ( const mutation of mutations ) {
|
for ( const mutation of mutations ) {
|
||||||
for ( const node of mutation.addedNodes ) {
|
for ( const node of mutation.addedNodes ) {
|
||||||
if ( reNodeName.test(node.nodeName) === false ) { continue; }
|
if ( reNodeName.test(node.nodeName) === false ) { continue; }
|
||||||
const before = node.textContent;
|
if ( handleNode(node) ) { continue; }
|
||||||
if ( safe.RegExp_test.call(rePattern, before) === false ) { continue; }
|
stop(false); return;
|
||||||
if ( safe.RegExp_test.call(reCondition, before) === false ) { continue; }
|
|
||||||
if ( shouldLog !== 0 ) { safe.uboLog('sed.js before:\n', before); }
|
|
||||||
const after = before.replace(rePattern, replacement);
|
|
||||||
if ( shouldLog !== 0 ) { safe.uboLog('sed.js after:\n', after); }
|
|
||||||
node.textContent = after;
|
|
||||||
if ( sedCount !== 0 && (sedCount -= 1) === 0 ) {
|
|
||||||
return stop(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const observer = new MutationObserver(handler);
|
const observer = new MutationObserver(handleMutations);
|
||||||
observer.observe(document.documentElement, {
|
observer.observe(document.documentElement, { childList: true, subtree: true });
|
||||||
childList: true,
|
{
|
||||||
subtree: true,
|
const treeWalker = document.createTreeWalker(
|
||||||
});
|
document.documentElement,
|
||||||
|
NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT
|
||||||
|
);
|
||||||
|
const currentScriptNode = document.currentScript;
|
||||||
|
const currentTextNode = currentScriptNode.firstChild;
|
||||||
|
let count = 0;
|
||||||
|
for (;;) {
|
||||||
|
const node = treeWalker.nextNode();
|
||||||
|
count += 1;
|
||||||
|
if ( node === null ) { break; }
|
||||||
|
if ( reNodeName.test(node.nodeName) === false ) { continue; }
|
||||||
|
if ( node === currentScriptNode ) { continue; }
|
||||||
|
if ( node === currentTextNode ) { continue; }
|
||||||
|
if ( handleNode(node) ) { continue; }
|
||||||
|
stop(); break;
|
||||||
|
}
|
||||||
|
if ( shouldLog !== 0 ) {
|
||||||
|
safe.uboLog(`sed.js ${count} nodes present before installing mutation observer`);
|
||||||
|
}
|
||||||
|
}
|
||||||
if ( shouldStay ) { return; }
|
if ( shouldStay ) { return; }
|
||||||
runAt(( ) => {
|
runAt(( ) => {
|
||||||
const quitAfter = parseInt(extraArgs.get('quitAfter')) || 0;
|
const quitAfter = parseInt(extraArgs.get('quitAfter')) || 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user