diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index ea9945b0e..425e11be6 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -130,13 +130,18 @@ builtinScriptlets.push({ }); function runAt(fn, when) { const intFromReadyState = state => { - return ({ - loading: 1, - interactive: 2, - end: 2, - complete: 3, - idle: 3, - })[`${state}`] || 0; + const targets = { + 'loading': 1, + 'interactive': 2, 'end': 2, '2': 2, + 'complete': 3, 'idle': 3, '3': 3, + }; + const tokens = Array.isArray(state) ? state : [ state ]; + for ( const token of tokens ) { + const prop = `${token}`; + if ( targets.hasOwnProperty(prop) === false ) { continue; } + return targets[prop]; + } + return 0; }; const runAt = intFromReadyState(when); if ( intFromReadyState(document.readyState) >= runAt ) { @@ -1030,14 +1035,22 @@ builtinScriptlets.push({ function setConstant( arg1 = '', arg2 = '', - arg3 = 0 + arg3 = '' ) { const details = typeof arg1 !== 'object' - ? { prop: arg1, value: arg2, runAt: parseInt(arg3, 10) || 0 } + ? { prop: arg1, value: arg2 } : arg1; + if ( arg3 !== '' ) { + if ( /^\d$/.test(arg3) ) { + details.options = [ arg3 ]; + } else { + details.options = Array.from(arguments).slice(2); + } + } const { prop: chain = '', value: cValue = '' } = details; if ( typeof chain !== 'string' ) { return; } if ( chain === '' ) { return; } + const options = details.options || []; function setConstant(chain, cValue) { const trappedProp = (( ) => { const pos = chain.lastIndexOf('.'); @@ -1093,13 +1106,20 @@ function setConstant( cValue = cloakFunc(function(){ return true; }); } else if ( cValue === 'falseFunc' ) { cValue = cloakFunc(function(){ return false; }); - } else if ( /^\d+$/.test(cValue) ) { - cValue = parseFloat(cValue); + } else if ( /^-?\d+$/.test(cValue) ) { + cValue = parseInt(cValue); if ( isNaN(cValue) ) { return; } if ( Math.abs(cValue) > 0x7FFF ) { return; } } else { return; } + if ( options.includes('asCallback') ) { + cValue = ( ) => cValue; + } else if ( options.includes('asResolve') ) { + cValue = Promise.resolve(cValue); + } else if ( options.includes('asReject') ) { + cValue = Promise.reject(cValue); + } let aborted = false; const mustAbort = function(v) { if ( aborted ) { return true; } @@ -1193,7 +1213,7 @@ function setConstant( } runAt(( ) => { setConstant(chain, cValue); - }, details.runAt); + }, options); } /******************************************************************************/ diff --git a/src/js/3p-filters.js b/src/js/3p-filters.js index b1430a52b..b6a2c9945 100644 --- a/src/js/3p-filters.js +++ b/src/js/3p-filters.js @@ -182,6 +182,12 @@ const renderFilterLists = ( ) => { } for ( const [ listkey, listDetails ] of treeEntries ) { const listEntry = createListEntry(listDetails, depth); + if ( dom.cl.has(dom.root, 'mobile') ) { + const leafStats = qs$(listEntry, '.leafstats'); + if ( leafStats ) { + listEntry.append(leafStats); + } + } listEntry.dataset.key = listkey; listEntry.dataset.parent = parentkey; dom.text(qs$(listEntry, '.listname'), listDetails.title);