From 57e6c4513a946023747d5cfb9f8191481b7d9bbd Mon Sep 17 00:00:00 2001 From: Ghostery Adblocker Bot Date: Mon, 8 Dec 2025 20:09:15 +0000 Subject: [PATCH] Update scriptlets --- package.json | 2 +- ubo.js | 328 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 197 insertions(+), 133 deletions(-) diff --git a/package.json b/package.json index 0a2d530..5e93f8a 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "type": "module", "scripts": { - "build": "deno build.ts --tagName 1.68.1b0 > ubo.js", + "build": "deno build.ts --tagName 1.68.1b2 > ubo.js", "test": "node --test" }, "author": { diff --git a/ubo.js b/ubo.js index 8e63b7d..6250471 100644 --- a/ubo.js +++ b/ubo.js @@ -24824,6 +24824,109 @@ aliases: [], world: 'ISOLATED', requiresTrust: false, func: function (scriptletGlobals = {}, ...args) { +function getSafeCookieValuesFn() { + return [ + 'accept', 'reject', + 'accepted', 'rejected', 'notaccepted', + 'allow', 'disallow', 'deny', + 'allowed', 'denied', + 'approved', 'disapproved', + 'checked', 'unchecked', + 'dismiss', 'dismissed', + 'enable', 'disable', + 'enabled', 'disabled', + 'essential', 'nonessential', + 'forbidden', 'forever', + 'hide', 'hidden', + 'necessary', 'required', + 'ok', + 'on', 'off', + 'true', 't', 'false', 'f', + 'yes', 'y', 'no', 'n', + 'all', 'none', 'functional', + 'granted', 'done', + 'decline', 'declined', + 'closed', 'next', 'mandatory', + 'disagree', 'agree', + ]; +} +function setLocalStorageItemFn( + which = 'local', + trusted = false, + key = '', + value = '', + options = {} +) { + if ( key === '' ) { return; } + + // For increased compatibility with AdGuard + if ( value === 'emptyArr' ) { + value = '[]'; + } else if ( value === 'emptyObj' ) { + value = '{}'; + } + + const trustedValues = [ + '', + 'undefined', 'null', + '{}', '[]', '""', + '$remove$', + ...getSafeCookieValuesFn(), + ]; + + if ( trusted ) { + if ( value.includes('$now$') ) { + value = value.replaceAll('$now$', Date.now()); + } + if ( value.includes('$currentDate$') ) { + value = value.replaceAll('$currentDate$', `${Date()}`); + } + if ( value.includes('$currentISODate$') ) { + value = value.replaceAll('$currentISODate$', (new Date()).toISOString()); + } + } else { + const normalized = value.toLowerCase(); + const match = /^("?)(.+)\1$/.exec(normalized); + const unquoted = match && match[2] || normalized; + if ( trustedValues.includes(unquoted) === false ) { + if ( /^-?\d+$/.test(unquoted) === false ) { return; } + const n = parseInt(unquoted, 10) || 0; + if ( n < -32767 || n > 32767 ) { return; } + } + } + + let modified = false; + + try { + const storage = self[`${which}Storage`]; + if ( value === '$remove$' ) { + const safe = safeSelf(); + const pattern = safe.patternToRegex(key, undefined, true ); + const toRemove = []; + for ( let i = 0, n = storage.length; i < n; i++ ) { + const key = storage.key(i); + if ( pattern.test(key) ) { toRemove.push(key); } + } + modified = toRemove.length !== 0; + for ( const key of toRemove ) { + storage.removeItem(key); + } + } else { + + const before = storage.getItem(key); + const after = `${value}`; + modified = after !== before; + if ( modified ) { + storage.setItem(key, after); + } + } + } catch { + } + + if ( modified && typeof options.reload === 'number' ) { + setTimeout(( ) => { window.location.reload(); }, options.reload); + } +} function safeSelf() { if ( scriptletGlobals.safeSelf ) { return scriptletGlobals.safeSelf; @@ -25013,6 +25116,21 @@ function safeSelf() { } return safe; } +function setLocalStorageItem(key = '', value = '') { + const safe = safeSelf(); + const options = safe.getExtraArgs(Array.from(arguments), 2) + setLocalStorageItemFn('local', false, key, value, options); +}; +setLocalStorageItem(...args); +}, +}; + + +scriptlets['set-session-storage-item.js'] = { +aliases: [], +world: 'ISOLATED', +requiresTrust: false, +func: function (scriptletGlobals = {}, ...args) { function getSafeCookieValuesFn() { return [ 'accept', 'reject', @@ -25044,6 +25162,7 @@ function setLocalStorageItemFn( trusted = false, key = '', value = '', + options = {} ) { if ( key === '' ) { return; } @@ -25083,6 +25202,8 @@ function setLocalStorageItemFn( } } + let modified = false; + try { const storage = self[`${which}Storage`]; if ( value === '$remove$' ) { @@ -25093,28 +25214,26 @@ function setLocalStorageItemFn( const key = storage.key(i); if ( pattern.test(key) ) { toRemove.push(key); } } + modified = toRemove.length !== 0; for ( const key of toRemove ) { storage.removeItem(key); } } else { - storage.setItem(key, `${value}`); + + const before = storage.getItem(key); + const after = `${value}`; + modified = after !== before; + if ( modified ) { + storage.setItem(key, after); + } } } catch { } -} -function setLocalStorageItem(key = '', value = '') { - setLocalStorageItemFn('local', false, key, value); -}; -setLocalStorageItem(...args); -}, -}; - -scriptlets['set-session-storage-item.js'] = { -aliases: [], -world: 'ISOLATED', -requiresTrust: false, -func: function (scriptletGlobals = {}, ...args) { + if ( modified && typeof options.reload === 'number' ) { + setTimeout(( ) => { window.location.reload(); }, options.reload); + } +} function safeSelf() { if ( scriptletGlobals.safeSelf ) { return scriptletGlobals.safeSelf; @@ -25304,6 +25423,21 @@ function safeSelf() { } return safe; } +function setSessionStorageItem(key = '', value = '') { + const safe = safeSelf(); + const options = safe.getExtraArgs(Array.from(arguments), 2) + setLocalStorageItemFn('session', false, key, value, options); +}; +setSessionStorageItem(...args); +}, +}; + + +scriptlets['trusted-set-local-storage-item.js'] = { +aliases: [], +world: 'ISOLATED', +requiresTrust: true, +func: function (scriptletGlobals = {}, ...args) { function getSafeCookieValuesFn() { return [ 'accept', 'reject', @@ -25335,6 +25469,7 @@ function setLocalStorageItemFn( trusted = false, key = '', value = '', + options = {} ) { if ( key === '' ) { return; } @@ -25374,6 +25509,8 @@ function setLocalStorageItemFn( } } + let modified = false; + try { const storage = self[`${which}Storage`]; if ( value === '$remove$' ) { @@ -25384,28 +25521,26 @@ function setLocalStorageItemFn( const key = storage.key(i); if ( pattern.test(key) ) { toRemove.push(key); } } + modified = toRemove.length !== 0; for ( const key of toRemove ) { storage.removeItem(key); } } else { - storage.setItem(key, `${value}`); + + const before = storage.getItem(key); + const after = `${value}`; + modified = after !== before; + if ( modified ) { + storage.setItem(key, after); + } } } catch { } -} -function setSessionStorageItem(key = '', value = '') { - setLocalStorageItemFn('session', false, key, value); -}; -setSessionStorageItem(...args); -}, -}; - -scriptlets['trusted-set-local-storage-item.js'] = { -aliases: [], -world: 'ISOLATED', -requiresTrust: true, -func: function (scriptletGlobals = {}, ...args) { + if ( modified && typeof options.reload === 'number' ) { + setTimeout(( ) => { window.location.reload(); }, options.reload); + } +} function safeSelf() { if ( scriptletGlobals.safeSelf ) { return scriptletGlobals.safeSelf; @@ -25595,6 +25730,21 @@ function safeSelf() { } return safe; } +function trustedSetLocalStorageItem(key = '', value = '') { + const safe = safeSelf(); + const options = safe.getExtraArgs(Array.from(arguments), 2) + setLocalStorageItemFn('local', true, key, value, options); +}; +trustedSetLocalStorageItem(...args); +}, +}; + + +scriptlets['trusted-set-session-storage-item.js'] = { +aliases: [], +world: 'ISOLATED', +requiresTrust: true, +func: function (scriptletGlobals = {}, ...args) { function getSafeCookieValuesFn() { return [ 'accept', 'reject', @@ -25626,6 +25776,7 @@ function setLocalStorageItemFn( trusted = false, key = '', value = '', + options = {} ) { if ( key === '' ) { return; } @@ -25665,6 +25816,8 @@ function setLocalStorageItemFn( } } + let modified = false; + try { const storage = self[`${which}Storage`]; if ( value === '$remove$' ) { @@ -25675,28 +25828,26 @@ function setLocalStorageItemFn( const key = storage.key(i); if ( pattern.test(key) ) { toRemove.push(key); } } + modified = toRemove.length !== 0; for ( const key of toRemove ) { storage.removeItem(key); } } else { - storage.setItem(key, `${value}`); + + const before = storage.getItem(key); + const after = `${value}`; + modified = after !== before; + if ( modified ) { + storage.setItem(key, after); + } } } catch { } -} -function trustedSetLocalStorageItem(key = '', value = '') { - setLocalStorageItemFn('local', true, key, value); -}; -trustedSetLocalStorageItem(...args); -}, -}; - -scriptlets['trusted-set-session-storage-item.js'] = { -aliases: [], -world: 'ISOLATED', -requiresTrust: true, -func: function (scriptletGlobals = {}, ...args) { + if ( modified && typeof options.reload === 'number' ) { + setTimeout(( ) => { window.location.reload(); }, options.reload); + } +} function safeSelf() { if ( scriptletGlobals.safeSelf ) { return scriptletGlobals.safeSelf; @@ -25886,97 +26037,10 @@ function safeSelf() { } return safe; } -function getSafeCookieValuesFn() { - return [ - 'accept', 'reject', - 'accepted', 'rejected', 'notaccepted', - 'allow', 'disallow', 'deny', - 'allowed', 'denied', - 'approved', 'disapproved', - 'checked', 'unchecked', - 'dismiss', 'dismissed', - 'enable', 'disable', - 'enabled', 'disabled', - 'essential', 'nonessential', - 'forbidden', 'forever', - 'hide', 'hidden', - 'necessary', 'required', - 'ok', - 'on', 'off', - 'true', 't', 'false', 'f', - 'yes', 'y', 'no', 'n', - 'all', 'none', 'functional', - 'granted', 'done', - 'decline', 'declined', - 'closed', 'next', 'mandatory', - 'disagree', 'agree', - ]; -} -function setLocalStorageItemFn( - which = 'local', - trusted = false, - key = '', - value = '', -) { - if ( key === '' ) { return; } - - // For increased compatibility with AdGuard - if ( value === 'emptyArr' ) { - value = '[]'; - } else if ( value === 'emptyObj' ) { - value = '{}'; - } - - const trustedValues = [ - '', - 'undefined', 'null', - '{}', '[]', '""', - '$remove$', - ...getSafeCookieValuesFn(), - ]; - - if ( trusted ) { - if ( value.includes('$now$') ) { - value = value.replaceAll('$now$', Date.now()); - } - if ( value.includes('$currentDate$') ) { - value = value.replaceAll('$currentDate$', `${Date()}`); - } - if ( value.includes('$currentISODate$') ) { - value = value.replaceAll('$currentISODate$', (new Date()).toISOString()); - } - } else { - const normalized = value.toLowerCase(); - const match = /^("?)(.+)\1$/.exec(normalized); - const unquoted = match && match[2] || normalized; - if ( trustedValues.includes(unquoted) === false ) { - if ( /^-?\d+$/.test(unquoted) === false ) { return; } - const n = parseInt(unquoted, 10) || 0; - if ( n < -32767 || n > 32767 ) { return; } - } - } - - try { - const storage = self[`${which}Storage`]; - if ( value === '$remove$' ) { - const safe = safeSelf(); - const pattern = safe.patternToRegex(key, undefined, true ); - const toRemove = []; - for ( let i = 0, n = storage.length; i < n; i++ ) { - const key = storage.key(i); - if ( pattern.test(key) ) { toRemove.push(key); } - } - for ( const key of toRemove ) { - storage.removeItem(key); - } - } else { - storage.setItem(key, `${value}`); - } - } catch { - } -} function trustedSetSessionStorageItem(key = '', value = '') { - setLocalStorageItemFn('session', true, key, value); + const safe = safeSelf(); + const options = safe.getExtraArgs(Array.from(arguments), 2) + setLocalStorageItemFn('session', true, key, value, options); }; trustedSetSessionStorageItem(...args); },