Skip to content

Commit 92b59ab

Browse files
ghostery-adblocker-bot[bot]Ghostery Adblocker Bot
andauthored
Update scriptlets (#27)
Co-authored-by: Ghostery Adblocker Bot <ghostery-adblocker-bot@users.noreply.github.com>
1 parent fd7ed7c commit 92b59ab

2 files changed

Lines changed: 90 additions & 79 deletions

File tree

‎package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"main": "index.js",
66
"type": "module",
77
"scripts": {
8-
"build": "deno build.ts --tagName 1.66.4 > ubo.js",
8+
"build": "deno build.ts --tagName 1.66.5b0 > ubo.js",
99
"test": "node --test"
1010
},
1111
"author": {

‎ubo.js‎

Lines changed: 89 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -31806,92 +31806,103 @@ function trustedClickElement(
3180631806
return shadowRoot && querySelectorEx(inside, shadowRoot);
3180731807
};
3180831808

31809-
const selectorList = safe.String_split.call(selectors, /\s*,\s*/)
31810-
.filter(s => {
31811-
try {
31812-
void querySelectorEx(s);
31813-
} catch {
31814-
return false;
31815-
}
31816-
return true;
31817-
});
31818-
if ( selectorList.length === 0 ) { return; }
31819-
31809+
const steps = safe.String_split.call(selectors, /\s*,\s*/).map(a => {
31810+
if ( /^\d+$/.test(a) ) { return parseInt(a, 10); }
31811+
return a;
31812+
});
31813+
if ( steps.length === 0 ) { return; }
3182031814
const clickDelay = parseInt(delay, 10) || 1;
31821-
const t0 = Date.now();
31822-
const tbye = t0 + 10000;
31823-
let tnext = selectorList.length !== 1 ? t0 : t0 + clickDelay;
31815+
for ( let i = steps.length-1; i > 0; i-- ) {
31816+
if ( typeof steps[i] !== 'string' ) { continue; }
31817+
if ( typeof steps[i-1] !== 'string' ) { continue; }
31818+
steps.splice(i, 0, clickDelay);
31819+
}
31820+
if ( typeof steps.at(-1) !== 'number' ) {
31821+
steps.push(10000);
31822+
}
3182431823

31825-
const terminate = ( ) => {
31826-
selectorList.length = 0;
31827-
next.stop();
31828-
observe.stop();
31829-
};
31830-
31831-
const next = notFound => {
31832-
if ( selectorList.length === 0 ) {
31833-
safe.uboLog(logPrefix, 'Completed');
31834-
return terminate();
31835-
}
31836-
const tnow = Date.now();
31837-
if ( tnow >= tbye ) {
31838-
safe.uboLog(logPrefix, 'Timed out');
31839-
return terminate();
31840-
}
31841-
if ( notFound ) { observe(); }
31842-
const delay = Math.max(notFound ? tbye - tnow : tnext - tnow, 1);
31843-
next.timer = setTimeout(( ) => {
31844-
next.timer = undefined;
31845-
process();
31846-
}, delay);
31847-
safe.uboLog(logPrefix, `Waiting for ${selectorList[0]}...`);
31848-
};
31849-
next.stop = ( ) => {
31850-
if ( next.timer === undefined ) { return; }
31851-
clearTimeout(next.timer);
31852-
next.timer = undefined;
31853-
};
31854-
31855-
const observe = ( ) => {
31856-
if ( observe.observer !== undefined ) { return; }
31857-
observe.observer = new MutationObserver(( ) => {
31858-
if ( observe.timer !== undefined ) { return; }
31859-
observe.timer = setTimeout(( ) => {
31860-
observe.timer = undefined;
31861-
process();
31862-
}, 20);
31824+
const waitForTime = ms => {
31825+
return new Promise(resolve => {
31826+
safe.uboLog(logPrefix, `Waiting for ${ms} ms`);
31827+
waitForTime.timer = setTimeout(( ) => {
31828+
waitForTime.timer = undefined;
31829+
resolve();
31830+
}, ms);
3186331831
});
31864-
observe.observer.observe(document, {
31865-
attributes: true,
31866-
childList: true,
31867-
subtree: true,
31832+
};
31833+
waitForTime.cancel = ( ) => {
31834+
const { timer } = waitForTime;
31835+
if ( timer === undefined ) { return; }
31836+
clearTimeout(timer);
31837+
waitForTime.timer = undefined;
31838+
};
31839+
31840+
const waitForElement = selector => {
31841+
return new Promise(resolve => {
31842+
const elem = querySelectorEx(selector);
31843+
if ( elem !== null ) {
31844+
elem.click();
31845+
resolve();
31846+
return;
31847+
}
31848+
safe.uboLog(logPrefix, `Waiting for ${selector}`);
31849+
const observer = new MutationObserver(( ) => {
31850+
const elem = querySelectorEx(selector);
31851+
if ( elem === null ) { return; }
31852+
waitForElement.cancel();
31853+
elem.click();
31854+
resolve();
31855+
});
31856+
observer.observe(document, {
31857+
attributes: true,
31858+
childList: true,
31859+
subtree: true,
31860+
});
31861+
waitForElement.observer = observer;
3186831862
});
3186931863
};
31870-
observe.stop = ( ) => {
31871-
if ( observe.timer !== undefined ) {
31872-
clearTimeout(observe.timer);
31873-
observe.timer = undefined;
31874-
}
31875-
if ( observe.observer ) {
31876-
observe.observer.disconnect();
31877-
observe.observer = undefined;
31878-
}
31864+
waitForElement.cancel = ( ) => {
31865+
const { observer } = waitForElement;
31866+
if ( observer === undefined ) { return; }
31867+
waitForElement.observer = undefined;
31868+
observer.disconnect();
31869+
};
31870+
31871+
const waitForTimeout = ms => {
31872+
waitForTimeout.cancel();
31873+
waitForTimeout.timer = setTimeout(( ) => {
31874+
waitForTimeout.timer = undefined;
31875+
terminate();
31876+
safe.uboLog(logPrefix, `Timed out after ${ms} ms`);
31877+
}, ms);
31878+
};
31879+
waitForTimeout.cancel = ( ) => {
31880+
if ( waitForTimeout.timer === undefined ) { return; }
31881+
clearTimeout(waitForTimeout.timer);
31882+
waitForTimeout.timer = undefined;
3187931883
};
3188031884

31881-
const process = ( ) => {
31882-
next.stop();
31883-
if ( Date.now() < tnext ) { return next(); }
31884-
const selector = selectorList.shift();
31885-
if ( selector === undefined ) { return terminate(); }
31886-
const elem = querySelectorEx(selector);
31887-
if ( elem === null ) {
31888-
selectorList.unshift(selector);
31889-
return next(true);
31885+
const terminate = ( ) => {
31886+
waitForTime.cancel();
31887+
waitForElement.cancel();
31888+
waitForTimeout.cancel();
31889+
};
31890+
31891+
const process = async ( ) => {
31892+
waitForTimeout(steps.pop());
31893+
while ( steps.length !== 0 ) {
31894+
const step = steps.shift();
31895+
if ( step === undefined ) { break; }
31896+
if ( typeof step === 'number' ) {
31897+
await waitForTime(step);
31898+
if ( step === 1 ) { continue; }
31899+
continue;
31900+
}
31901+
if ( step.startsWith('!') ) { continue; }
31902+
await waitForElement(step);
31903+
safe.uboLog(logPrefix, `Clicked ${step}`);
3189031904
}
31891-
safe.uboLog(logPrefix, `Clicked ${selector}`);
31892-
elem.click();
31893-
tnext += clickDelay;
31894-
next();
31905+
terminate();
3189531906
};
3189631907

3189731908
runAtHtmlElementFn(process);

0 commit comments

Comments
 (0)