@@ -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