From 505fbc7a75a8c4c30deb1d12161e30616556affa Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 6 Aug 2026 13:13:27 -0400 Subject: [PATCH 001/145] Revisit scriptlets' `getExtraArgs` implementation --- src/js/resources/attribute.js | 10 ++++--- src/js/resources/cookie.js | 15 ++++++---- src/js/resources/create-html.js | 5 ++-- src/js/resources/json-edit.js | 24 ++++++++-------- src/js/resources/json-prune.js | 15 ++++++---- src/js/resources/localstorage.js | 16 +++++------ src/js/resources/object-prune.js | 10 ++++--- src/js/resources/prevent-addeventlistener.js | 5 ++-- src/js/resources/prevent-clipboard-write.js | 4 +-- src/js/resources/prevent-fetch.js | 5 ++-- src/js/resources/replace-argument.js | 5 ++-- src/js/resources/safe-self.js | 17 ++++++------ src/js/resources/scriptlets.js | 29 ++++++++++++-------- src/js/resources/set-constant.js | 5 ++-- src/js/resources/stack-trace.js | 5 ++-- 15 files changed, 95 insertions(+), 75 deletions(-) diff --git a/src/js/resources/attribute.js b/src/js/resources/attribute.js index a2197ac76b96a..47f65c08d3efe 100644 --- a/src/js/resources/attribute.js +++ b/src/js/resources/attribute.js @@ -132,7 +132,8 @@ registerScriptlet(setAttrFn, { export function setAttr( selector = '', attr = '', - value = '' + value = '', + ...varargs ) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('set-attr', selector, attr, value); @@ -146,7 +147,7 @@ export function setAttr( return; } } - const options = safe.getExtraArgs(Array.from(arguments), 3); + const options = safe.parseVarargs(varargs); setAttrFn(false, logPrefix, selector, attr, value, options); } registerScriptlet(setAttr, { @@ -182,11 +183,12 @@ registerScriptlet(setAttr, { export function trustedSetAttr( selector = '', attr = '', - value = '' + value = '', + ...varargs ) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('trusted-set-attr', selector, attr, value); - const options = safe.getExtraArgs(Array.from(arguments), 3); + const options = safe.parseVarargs(varargs); setAttrFn(true, logPrefix, selector, attr, value, options); } registerScriptlet(trustedSetAttr, { diff --git a/src/js/resources/cookie.js b/src/js/resources/cookie.js index 21300bc650041..69169071056ec 100644 --- a/src/js/resources/cookie.js +++ b/src/js/resources/cookie.js @@ -193,7 +193,8 @@ registerScriptlet(setCookieFn, { export function setCookie( name = '', value = '', - path = '' + path = '', + ...varargs ) { if ( name === '' ) { return; } const safe = safeSelf(); @@ -214,7 +215,7 @@ export function setCookie( value, '', path, - safe.getExtraArgs(Array.from(arguments), 3) + safe.parseVarargs(varargs) ); if ( done ) { @@ -271,7 +272,8 @@ export function trustedSetCookie( name = '', value = '', offsetExpiresSec = '', - path = '' + path = '', + ...varargs ) { if ( name === '' ) { return; } @@ -308,7 +310,7 @@ export function trustedSetCookie( value, expires, path, - safeSelf().getExtraArgs(Array.from(arguments), 4) + safe.parseVarargs(varargs) ); if ( done ) { @@ -357,12 +359,13 @@ registerScriptlet(trustedSetCookieReload, { * */ export function removeCookie( - needle = '' + needle = '', + ...varargs ) { if ( typeof needle !== 'string' ) { return; } const safe = safeSelf(); const reName = safe.patternToRegex(needle); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 1); + const extraArgs = safe.parseVarargs(varargs); const throttle = (fn, ms = 500) => { if ( throttle.timer !== undefined ) { return; } throttle.timer = setTimeout(( ) => { diff --git a/src/js/resources/create-html.js b/src/js/resources/create-html.js index 33b5a99f37541..468083d36034e 100644 --- a/src/js/resources/create-html.js +++ b/src/js/resources/create-html.js @@ -50,13 +50,14 @@ import { safeSelf } from './safe-self.js'; function trustedCreateHTML( parentSelector, htmlStr = '', - durationStr = '' + durationStr = '', + ...varargs ) { if ( parentSelector === '' ) { return; } if ( htmlStr === '' ) { return; } const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('trusted-create-html', parentSelector, htmlStr, durationStr); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); + const extraArgs = safe.parseVarargs(varargs); // We do not want to recursively create elements self.trustedCreateHTML = true; let ancestor = self.frameElement; diff --git a/src/js/resources/json-edit.js b/src/js/resources/json-edit.js index f45be349cfed1..9a67b40809afb 100644 --- a/src/js/resources/json-edit.js +++ b/src/js/resources/json-edit.js @@ -732,7 +732,7 @@ registerScriptlet(trustedEditElementObject, { /******************************************************************************/ /******************************************************************************/ -function jsonEditXhrResponseFn(trusted, jsonq = '') { +function jsonEditXhrResponseFn(trusted, jsonq = '', ...varargs) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix( `${trusted ? 'trusted-' : ''}json-edit-xhr-response`, @@ -743,7 +743,7 @@ function jsonEditXhrResponseFn(trusted, jsonq = '') { if ( jsonp.valid === false || jsonp.value !== undefined && trusted !== true ) { return safe.uboLog(logPrefix, 'Bad JSONPath query'); } - const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); + const extraArgs = safe.parseVarargs(varargs); const propNeedles = parsePropertiesToMatchFn(extraArgs.propsToMatch, 'url'); self.XMLHttpRequest = class extends self.XMLHttpRequest { open(method, url, ...args) { @@ -867,7 +867,7 @@ registerScriptlet(trustedJsonEditXhrResponse, { /******************************************************************************/ /******************************************************************************/ -function jsonEditXhrRequestFn(trusted, jsonq = '') { +function jsonEditXhrRequestFn(trusted, jsonq = '', ...varargs) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix( `${trusted ? 'trusted-' : ''}json-edit-xhr-request`, @@ -878,7 +878,7 @@ function jsonEditXhrRequestFn(trusted, jsonq = '') { if ( jsonp.valid === false || jsonp.value !== undefined && trusted !== true ) { return safe.uboLog(logPrefix, 'Bad JSONPath query'); } - const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); + const extraArgs = safe.parseVarargs(varargs); const propNeedles = parsePropertiesToMatchFn(extraArgs.propsToMatch, 'url'); self.XMLHttpRequest = class extends self.XMLHttpRequest { open(method, url, ...args) { @@ -985,7 +985,7 @@ registerScriptlet(trustedJsonEditXhrRequest, { /******************************************************************************/ /******************************************************************************/ -function jsonEditFetchResponseFn(trusted, jsonq = '') { +function jsonEditFetchResponseFn(trusted, jsonq = '', ...varargs) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix( `${trusted ? 'trusted-' : ''}json-edit-fetch-response`, @@ -995,7 +995,7 @@ function jsonEditFetchResponseFn(trusted, jsonq = '') { if ( jsonp.valid === false || jsonp.value !== undefined && trusted !== true ) { return safe.uboLog(logPrefix, 'Bad JSONPath query'); } - const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); + const extraArgs = safe.parseVarargs(varargs); const propNeedles = parsePropertiesToMatchFn(extraArgs.propsToMatch, 'url'); proxyApplyFn('fetch', function(context) { const args = context.callArgs; @@ -1107,7 +1107,7 @@ registerScriptlet(trustedJsonEditFetchResponse, { /******************************************************************************/ /******************************************************************************/ -function jsonEditFetchRequestFn(trusted, jsonq = '') { +function jsonEditFetchRequestFn(trusted, jsonq = '', ...varargs) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix( `${trusted ? 'trusted-' : ''}json-edit-fetch-request`, @@ -1117,7 +1117,7 @@ function jsonEditFetchRequestFn(trusted, jsonq = '') { if ( jsonp.valid === false || jsonp.value !== undefined && trusted !== true ) { return safe.uboLog(logPrefix, 'Bad JSONPath query'); } - const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); + const extraArgs = safe.parseVarargs(varargs); const propNeedles = parsePropertiesToMatchFn(extraArgs.propsToMatch, 'url'); const filterBody = body => { if ( typeof body !== 'string' ) { return; } @@ -1256,7 +1256,7 @@ registerScriptlet(jsonlEditFn, { /******************************************************************************/ -function jsonlEditXhrResponseFn(trusted, jsonq = '') { +function jsonlEditXhrResponseFn(trusted, jsonq = '', ...varargs) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix( `${trusted ? 'trusted-' : ''}jsonl-edit-xhr-response`, @@ -1267,7 +1267,7 @@ function jsonlEditXhrResponseFn(trusted, jsonq = '') { if ( jsonp.valid === false || jsonp.value !== undefined && trusted !== true ) { return safe.uboLog(logPrefix, 'Bad JSONPath query'); } - const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); + const extraArgs = safe.parseVarargs(varargs); const propNeedles = parsePropertiesToMatchFn(extraArgs.propsToMatch, 'url'); self.XMLHttpRequest = class extends self.XMLHttpRequest { open(method, url, ...args) { @@ -1384,7 +1384,7 @@ registerScriptlet(trustedJsonlEditXhrResponse, { /******************************************************************************/ /******************************************************************************/ -function jsonlEditFetchResponseFn(trusted, jsonq = '') { +function jsonlEditFetchResponseFn(trusted, jsonq = '', ...varargs) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix( `${trusted ? 'trusted-' : ''}jsonl-edit-fetch-response`, @@ -1394,7 +1394,7 @@ function jsonlEditFetchResponseFn(trusted, jsonq = '') { if ( jsonp.valid === false || jsonp.value !== undefined && trusted !== true ) { return safe.uboLog(logPrefix, 'Bad JSONPath query'); } - const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); + const extraArgs = safe.parseVarargs(varargs); const propNeedles = parsePropertiesToMatchFn(extraArgs.propsToMatch, 'url'); const logall = jsonq === ''; proxyApplyFn('fetch', function(context) { diff --git a/src/js/resources/json-prune.js b/src/js/resources/json-prune.js index aa787841835ff..22c5dc46f7bf3 100644 --- a/src/js/resources/json-prune.js +++ b/src/js/resources/json-prune.js @@ -36,12 +36,13 @@ import { safeSelf } from './safe-self.js'; function jsonPrune( rawPrunePaths = '', rawNeedlePaths = '', - stackNeedle = '' + stackNeedle = '', + ...varargs ) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('json-prune', rawPrunePaths, rawNeedlePaths, stackNeedle); const stackNeedleDetails = safe.initPattern(stackNeedle, { canNegate: true }); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); + const extraArgs = safe.parseVarargs(varargs); proxyApplyFn('JSON.parse', function(context) { const objBefore = context.reflect(); if ( rawPrunePaths === '' ) { @@ -75,11 +76,12 @@ registerScriptlet(jsonPrune, { function jsonPruneFetchResponse( rawPrunePaths = '', - rawNeedlePaths = '' + rawNeedlePaths = '', + ...varargs ) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('json-prune-fetch-response', rawPrunePaths, rawNeedlePaths); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); + const extraArgs = safe.parseVarargs(varargs); const propNeedles = parsePropertiesToMatchFn(extraArgs.propsToMatch, 'url'); const stackNeedle = safe.initPattern(extraArgs.stackToMatch || '', { canNegate: true }); const logall = rawPrunePaths === ''; @@ -150,12 +152,13 @@ registerScriptlet(jsonPruneFetchResponse, { function jsonPruneXhrResponse( rawPrunePaths = '', - rawNeedlePaths = '' + rawNeedlePaths = '', + ...varargs ) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('json-prune-xhr-response', rawPrunePaths, rawNeedlePaths); const xhrInstances = new WeakMap(); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); + const extraArgs = safe.parseVarargs(varargs); const propNeedles = parsePropertiesToMatchFn(extraArgs.propsToMatch, 'url'); const stackNeedle = safe.initPattern(extraArgs.stackToMatch || '', { canNegate: true }); self.XMLHttpRequest = class extends self.XMLHttpRequest { diff --git a/src/js/resources/localstorage.js b/src/js/resources/localstorage.js index 3e33ca2397a56..601ea08b49e15 100644 --- a/src/js/resources/localstorage.js +++ b/src/js/resources/localstorage.js @@ -191,9 +191,9 @@ registerScriptlet(removeCacheStorageItem, { * **/ -export function setLocalStorageItem(key = '', value = '') { +export function setLocalStorageItem(key = '', value = '', ...varargs) { const safe = safeSelf(); - const options = safe.getExtraArgs(Array.from(arguments), 2) + const options = safe.parseVarargs(varargs) setLocalStorageItemFn('local', false, key, value, options); } registerScriptlet(setLocalStorageItem, { @@ -205,9 +205,9 @@ registerScriptlet(setLocalStorageItem, { ], }); -export function setSessionStorageItem(key = '', value = '') { +export function setSessionStorageItem(key = '', value = '', ...varargs) { const safe = safeSelf(); - const options = safe.getExtraArgs(Array.from(arguments), 2) + const options = safe.parseVarargs(varargs) setLocalStorageItemFn('session', false, key, value, options); } registerScriptlet(setSessionStorageItem, { @@ -230,9 +230,9 @@ registerScriptlet(setSessionStorageItem, { * **/ -export function trustedSetLocalStorageItem(key = '', value = '') { +export function trustedSetLocalStorageItem(key = '', value = '', ...varargs) { const safe = safeSelf(); - const options = safe.getExtraArgs(Array.from(arguments), 2) + const options = safe.parseVarargs(varargs) setLocalStorageItemFn('local', true, key, value, options); } registerScriptlet(trustedSetLocalStorageItem, { @@ -245,9 +245,9 @@ registerScriptlet(trustedSetLocalStorageItem, { ], }); -export function trustedSetSessionStorageItem(key = '', value = '') { +export function trustedSetSessionStorageItem(key = '', value = '', ...varargs) { const safe = safeSelf(); - const options = safe.getExtraArgs(Array.from(arguments), 2) + const options = safe.parseVarargs(varargs) setLocalStorageItemFn('session', true, key, value, options); } registerScriptlet(trustedSetSessionStorageItem, { diff --git a/src/js/resources/object-prune.js b/src/js/resources/object-prune.js index 50256fe52828b..537e2b2078ae1 100644 --- a/src/js/resources/object-prune.js +++ b/src/js/resources/object-prune.js @@ -163,7 +163,8 @@ function trustedPruneInboundObject( entryPoint = '', argPos = '', rawPrunePaths = '', - rawNeedlePaths = '' + rawNeedlePaths = '', + ...varargs ) { if ( entryPoint === '' ) { return; } let context = globalThis; @@ -180,7 +181,7 @@ function trustedPruneInboundObject( if ( isNaN(argIndex) ) { return; } if ( argIndex < 1 ) { return; } const safe = safeSelf(); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 4); + const extraArgs = safe.parseVarargs(varargs); const needlePaths = []; if ( rawPrunePaths !== '' ) { needlePaths.push(...safe.String_split.call(rawPrunePaths, / +/)); @@ -241,11 +242,12 @@ registerScriptlet(trustedPruneInboundObject, { function trustedPruneOutboundObject( propChain = '', rawPrunePaths = '', - rawNeedlePaths = '' + rawNeedlePaths = '', + ...varargs ) { if ( propChain === '' ) { return; } const safe = safeSelf(); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); + const extraArgs = safe.parseVarargs(varargs); proxyApplyFn(propChain, function(context) { const objBefore = context.reflect(); if ( objBefore instanceof Object === false ) { return objBefore; } diff --git a/src/js/resources/prevent-addeventlistener.js b/src/js/resources/prevent-addeventlistener.js index 2e40b5f10d310..7a9666ab71de1 100644 --- a/src/js/resources/prevent-addeventlistener.js +++ b/src/js/resources/prevent-addeventlistener.js @@ -55,10 +55,11 @@ import { safeSelf } from './safe-self.js'; function preventAddEventListener( type = '', - pattern = '' + pattern = '', + ...varargs ) { const safe = safeSelf(); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); + const extraArgs = safe.parseVarargs(varargs); const logPrefix = safe.makeLogPrefix('prevent-addEventListener', type, pattern); const reType = safe.patternToRegex(type, undefined, true); const rePattern = safe.patternToRegex(pattern); diff --git a/src/js/resources/prevent-clipboard-write.js b/src/js/resources/prevent-clipboard-write.js index 4151ecf4d93be..ca0de56e0bdf8 100644 --- a/src/js/resources/prevent-clipboard-write.js +++ b/src/js/resources/prevent-clipboard-write.js @@ -47,11 +47,11 @@ import { safeSelf } from './safe-self.js'; * * */ -function preventClipboardWrite(matches = '') { +function preventClipboardWrite(matches = '', ...varargs) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('prevent-clipboard-write'); const pattern = safe.initPattern(matches); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 1); + const extraArgs = safe.parseVarargs(varargs); const excludePattern = extraArgs.excludeMatches && safe.initPattern(extraArgs.excludeMatches); const domAlert = clipboardText => { diff --git a/src/js/resources/prevent-fetch.js b/src/js/resources/prevent-fetch.js index dbe096a5dbc7c..d636859b63d31 100644 --- a/src/js/resources/prevent-fetch.js +++ b/src/js/resources/prevent-fetch.js @@ -36,7 +36,8 @@ function preventFetchFn( trusted = false, propsToMatch = '', responseBody = '', - responseType = '' + responseType = '', + ...varargs ) { const safe = safeSelf(); const setTimeout = self.setTimeout; @@ -47,7 +48,7 @@ function preventFetchFn( responseBody, responseType ); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 4); + const extraArgs = safe.parseVarargs(varargs); const propNeedles = parsePropertiesToMatchFn(propsToMatch, 'url'); const validResponseProps = { ok: [ false, true ], diff --git a/src/js/resources/replace-argument.js b/src/js/resources/replace-argument.js index 53162f09c304e..783fac37abd1d 100644 --- a/src/js/resources/replace-argument.js +++ b/src/js/resources/replace-argument.js @@ -60,13 +60,14 @@ import { validateConstantFn } from './set-constant.js'; export function trustedReplaceArgument( propChain = '', argposRaw = '', - argraw = '' + argraw = '', + ...varargs ) { if ( propChain === '' ) { return; } const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('trusted-replace-argument', propChain, argposRaw, argraw); const argoffset = parseInt(argposRaw, 10) || 0; - const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); + const extraArgs = safe.parseVarargs(varargs); let replacer; if ( argraw.startsWith('repl:/') ) { const parsed = parseReplaceFn(argraw.slice(5)); diff --git a/src/js/resources/safe-self.js b/src/js/resources/safe-self.js index 1e983639d969d..4a48fd8a119e9 100644 --- a/src/js/resources/safe-self.js +++ b/src/js/resources/safe-self.js @@ -134,15 +134,14 @@ export function safeSelf() { } return /^/; }, - getExtraArgs(args, offset = 0) { - const entries = args.slice(offset).reduce((out, v, i, a) => { - if ( (i & 1) === 0 ) { - const rawValue = a[i+1]; - const value = /^\d+$/.test(rawValue) - ? parseInt(rawValue, 10) - : rawValue; - out.push([ a[i], value ]); - } + parseVarargs(varargs) { + const entries = varargs.reduce((out, v, i, a) => { + if ( i & 1 ) { return out; } + const rawValue = a[i+1]; + const value = /^\d+$/.test(rawValue) + ? parseInt(rawValue, 10) + : rawValue; + out.push([ a[i], value ]); return out; }, []); return this.Object_fromEntries(entries); diff --git a/src/js/resources/scriptlets.js b/src/js/resources/scriptlets.js index 7c97f4893bf34..d867959f936e1 100755 --- a/src/js/resources/scriptlets.js +++ b/src/js/resources/scriptlets.js @@ -83,13 +83,14 @@ builtinScriptlets.push({ function replaceNodeTextFn( nodeName = '', pattern = '', - replacement = '' + replacement = '', + ...varargs ) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('replace-node-text.fn', ...Array.from(arguments)); const reNodeName = safe.patternToRegex(nodeName, 'i', true); const rePattern = safe.patternToRegex(pattern, 'gms'); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); + const extraArgs = safe.parseVarargs(varargs); const reIncludes = extraArgs.includes || extraArgs.condition ? safe.patternToRegex(extraArgs.includes || extraArgs.condition, 'ms') : null; @@ -198,7 +199,8 @@ function replaceFetchResponseFn( trusted = false, pattern = '', replacement = '', - propsToMatch = '' + propsToMatch = '', + ...varargs ) { if ( trusted !== true ) { return; } const safe = safeSelf(); @@ -206,7 +208,7 @@ function replaceFetchResponseFn( if ( pattern === '*' ) { pattern = '.*'; } const rePattern = safe.patternToRegex(pattern); const propNeedles = parsePropertiesToMatchFn(propsToMatch, 'url'); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 4); + const extraArgs = safe.parseVarargs(varargs); const reIncludes = extraArgs.includes ? safe.patternToRegex(extraArgs.includes) : null; self.fetch = new Proxy(self.fetch, { apply: function(target, thisArg, args) { @@ -988,14 +990,15 @@ builtinScriptlets.push({ function xmlPrune( selector = '', selectorCheck = '', - urlPattern = '' + urlPattern = '', + ...varargs ) { if ( typeof selector !== 'string' ) { return; } if ( selector === '' ) { return; } const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('xml-prune', selector, selectorCheck, urlPattern); const reUrl = safe.patternToRegex(urlPattern); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); + const extraArgs = safe.parseVarargs(varargs); const queryAll = (xmlDoc, selector) => { const isXpath = /^xpath\(.+\)$/.test(selector); if ( isXpath === false ) { @@ -1583,7 +1586,8 @@ builtinScriptlets.push({ function trustedReplaceXhrResponse( pattern = '', replacement = '', - propsToMatch = '' + propsToMatch = '', + ...varargs ) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('trusted-replace-xhr-response', pattern, replacement, propsToMatch); @@ -1591,7 +1595,7 @@ function trustedReplaceXhrResponse( if ( pattern === '*' ) { pattern = '.*'; } const rePattern = safe.patternToRegex(pattern); const propNeedles = parsePropertiesToMatchFn(propsToMatch, 'url'); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); + const extraArgs = safe.parseVarargs(varargs); const reIncludes = extraArgs.includes ? safe.patternToRegex(extraArgs.includes) : null; self.XMLHttpRequest = class extends self.XMLHttpRequest { open(method, url, ...args) { @@ -1822,7 +1826,7 @@ function trustedReplaceOutboundText( propChain = '', rawPattern = '', rawReplacement = '', - ...args + ...varargs ) { if ( propChain === '' ) { return; } const safe = safeSelf(); @@ -1831,7 +1835,7 @@ function trustedReplaceOutboundText( const replacement = rawReplacement.startsWith('json:') ? safe.JSON_parse(rawReplacement.slice(5)) : rawReplacement; - const extraArgs = safe.getExtraArgs(args); + const extraArgs = safe.parseVarargs(varargs); const reCondition = safe.patternToRegex(extraArgs.condition || ''); proxyApplyFn(propChain, function(context) { const encodedTextBefore = context.reflect(); @@ -2073,12 +2077,13 @@ builtinScriptlets.push({ function trustedOverrideElementMethod( methodPath = '', selector = '', - disposition = '' + disposition = '', + ...varargs ) { if ( methodPath === '' ) { return; } const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('trusted-override-element-method', methodPath, selector, disposition); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); + const extraArgs = safe.parseVarargs(varargs); proxyApplyFn(methodPath, function(context) { let override = selector === ''; if ( override === false ) { diff --git a/src/js/resources/set-constant.js b/src/js/resources/set-constant.js index 9ee985914d5f7..ced3adf0507d1 100644 --- a/src/js/resources/set-constant.js +++ b/src/js/resources/set-constant.js @@ -89,12 +89,13 @@ registerScriptlet(validateConstantFn, { export function setConstantFn( trusted = false, chain = '', - rawValue = '' + rawValue = '', + ...varargs ) { if ( chain === '' ) { return; } const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('set-constant', chain, rawValue); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); + const extraArgs = safe.parseVarargs(varargs); function setConstant(chain, rawValue) { const trappedProp = (( ) => { const pos = chain.lastIndexOf('.'); diff --git a/src/js/resources/stack-trace.js b/src/js/resources/stack-trace.js index c2e535847ee32..7d742135c01a0 100644 --- a/src/js/resources/stack-trace.js +++ b/src/js/resources/stack-trace.js @@ -82,12 +82,13 @@ registerScriptlet(matchesStackTraceFn, { function abortOnStackTrace( chain = '', - needle = '' + needle = '', + ...varargs ) { if ( typeof chain !== 'string' ) { return; } const safe = safeSelf(); const needleDetails = safe.initPattern(needle, { canNegate: true }); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); + const extraArgs = safe.parseVarargs(varargs); if ( needle === '' ) { extraArgs.log = 'all'; } const makeProxy = function(owner, chain) { const pos = chain.indexOf('.'); From 31020add79af9d3bbdac7a6be5ae68b0ca902fc7 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 6 Aug 2026 13:22:06 -0400 Subject: [PATCH 002/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 837f16a799cef..e135c90632109 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.73.0 \ No newline at end of file +1.73.1.0 \ No newline at end of file From 0fdbfdb2b5e76fabb7610c8c1b9d1f999d08ffff Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 7 Aug 2026 09:53:31 -0400 Subject: [PATCH 003/145] Improve `json-edit` scriptlet --- src/js/resources/json-edit.js | 60 +++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/src/js/resources/json-edit.js b/src/js/resources/json-edit.js index 9a67b40809afb..d50d4a2820647 100644 --- a/src/js/resources/json-edit.js +++ b/src/js/resources/json-edit.js @@ -40,7 +40,7 @@ import { safeSelf } from './safe-self.js'; function editOutboundObjectFn( trusted = false, propChain = '', - jsonq = '', + jsonq = '' ) { if ( propChain === '' ) { return; } const safe = safeSelf(); @@ -127,6 +127,42 @@ registerScriptlet(trustedEditOutboundObject, { }); /******************************************************************************/ + +function jsonEditFn(trusted = false, jsonq = '', ...varargs) { + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix( + `${trusted ? 'trusted-' : ''}json-edit`, + jsonq, + ...varargs + ); + const jsonp = JSONPath.create(jsonq); + if ( jsonp.valid === false || jsonp.value !== undefined && trusted !== true ) { + return safe.uboLog(logPrefix, 'Bad JSONPath query'); + } + const extraArgs = safe.parseVarargs(varargs); + const pattern = extraArgs.matches && safe.initPattern(extraArgs.matches); + proxyApplyFn('JSON.parse', function(context) { + const json = context.callArgs[0]; + const obj = context.reflect(); + if ( pattern && safe.testPattern(pattern, json) === false ) { return obj; } + const objAfter = jsonp.apply(obj); + if ( objAfter === undefined ) { return obj; } + safe.uboLog(logPrefix, 'Edited'); + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, `After edit:\n${safe.JSON_stringify(objAfter, null, 2)}`); + } + return objAfter; + }); +} +registerScriptlet(jsonEditFn, { + name: 'json-edit.fn', + dependencies: [ + JSONPath, + proxyApplyFn, + safeSelf, + ], +}); + /******************************************************************************/ /** * @scriptlet json-edit.js @@ -138,15 +174,20 @@ registerScriptlet(trustedEditOutboundObject, { * @param jsonq * A uBO-flavored JSONPath query. * + * @param 'matches', pattern + * Vararg, optional: The JSONPath will be applied if and only if the pattern + * matches the inbound JSON string. The pattern can be a plain string or a + * regex. + * * */ -function jsonEdit(jsonq = '') { - editOutboundObjectFn(false, 'JSON.parse', jsonq); +function jsonEdit(jsonq = '', ...varargs) { + jsonEditFn(false, jsonq, ...varargs); } registerScriptlet(jsonEdit, { name: 'json-edit.js', dependencies: [ - editOutboundObjectFn, + jsonEditFn, ], }); @@ -161,16 +202,21 @@ registerScriptlet(jsonEdit, { * @param jsonq * A uBO-flavored JSONPath query. * + * @param 'matches', pattern + * Vararg, optional: The JSONPath will be applied if and only if the pattern + * matches the inbound JSON string. The pattern can be a plain string or a + * regex. + * * */ -function trustedJsonEdit(jsonq = '') { - editOutboundObjectFn(true, 'JSON.parse', jsonq); +function trustedJsonEdit(jsonq = '', ...varargs) { + jsonEditFn(true, jsonq, ...varargs); } registerScriptlet(trustedJsonEdit, { name: 'trusted-json-edit.js', requiresTrust: true, dependencies: [ - editOutboundObjectFn, + jsonEditFn, ], }); From ed8f4024d2adc916e9a83e753d3b3a528ac2b60a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 7 Aug 2026 10:00:16 -0400 Subject: [PATCH 004/145] Update changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 514662d6514b5..038269139662a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +- [Improve `json-edit` scriptlet](https://github.com/gorhill/uBlock/commit/0fdbfdb2b5) +- [Revisit scriptlets' `getExtraArgs` implementation](https://github.com/gorhill/uBlock/commit/505fbc7a75) + +---------- + +# 1.73.0 + - [[logger] Preserve whitespace characters](https://github.com/gorhill/uBlock/commit/ef981d09b5) - [Improve `proxy-apply` utility scriptlet](https://github.com/gorhill/uBlock/commit/be3bb05fce) - [Improve `abort-current-script` scriptlet](https://github.com/gorhill/uBlock/commit/84e4bd7659) From d945c04cbe9847bcd1dd47b3f4607c3a3f008ccd Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 7 Aug 2026 10:14:15 -0400 Subject: [PATCH 005/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 629b941f3467f..76667275deb5d 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.72.3.104", + "version": "1.73.1.0", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.72.3rc4/uBlock0_1.72.3rc4.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b0/uBlock0_1.73.1b0.firefox.signed.xpi" } ] } From 5e176aec5d7ce8a9a6c0c4f55be37fe20d3b76dc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 7 Aug 2026 13:44:41 -0400 Subject: [PATCH 006/145] Publish self-hosted CRX package Related issues: - https://github.com/uBlockOrigin/uBlock-issues/discussions/4075 - https://github.com/uBlockOrigin/uBlock-issues/discussions/3514 --- Makefile | 4 +++- dist/chromium/update-dev.xml | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 dist/chromium/update-dev.xml diff --git a/Makefile b/Makefile index 932ecf5613fa8..50b0b2c029048 100644 --- a/Makefile +++ b/Makefile @@ -137,7 +137,9 @@ publish-dev-chromium: ghrepo=uBlock \ ghtag=$(version) \ ghasset=chromium \ - storeid=cgbcahbpdhpcegmbfconppldiemgcoii + storeid=cgbcahbpdhpcegmbfconppldiemgcoii \ + crxupdatepath=dist/chromium/update-dev.xml \ + crxkeytoken=ubo_dev_key_path # Usage: make publish-dev-firefox version=? publish-dev-firefox: diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml new file mode 100644 index 0000000000000..a7068182787f5 --- /dev/null +++ b/dist/chromium/update-dev.xml @@ -0,0 +1,6 @@ + + + + + + From 20ebdda8df698cc3f81ca7927f0eef3aded25fcd Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 7 Aug 2026 13:53:08 -0400 Subject: [PATCH 007/145] Fix URL of crx package --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index a7068182787f5..5a98d37416927 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From 83863b2a1f2b56cfbc3af3d563169a1ff2044122 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 7 Aug 2026 18:35:34 -0400 Subject: [PATCH 008/145] Update submodules --- publish-extension | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/publish-extension b/publish-extension index b245171eac43e..990eb214e94ab 160000 --- a/publish-extension +++ b/publish-extension @@ -1 +1 @@ -Subproject commit b245171eac43ed1faeecff4b5d277044cdbcdbea +Subproject commit 990eb214e94abdd97e7ef138d6d4c88fb1e5fa27 From 88de36c5e497c8a375ffbbe890c960b7c7ec4808 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 8 Aug 2026 11:18:22 -0400 Subject: [PATCH 009/145] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/extension/_locales/bn/messages.json | 2 +- platform/mv3/extension/_locales/br_FR/messages.json | 2 +- platform/mv3/extension/_locales/cy/messages.json | 2 +- platform/mv3/extension/_locales/el/messages.json | 2 +- platform/mv3/extension/_locales/fil/messages.json | 2 +- platform/mv3/extension/_locales/hu/messages.json | 2 +- platform/mv3/extension/_locales/ka/messages.json | 2 +- platform/mv3/extension/_locales/lv/messages.json | 4 ++-- platform/mv3/extension/_locales/nb/messages.json | 2 +- platform/mv3/extension/_locales/pl/messages.json | 2 +- platform/mv3/extension/_locales/si/messages.json | 2 +- platform/mv3/extension/_locales/uk/messages.json | 2 +- 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/platform/mv3/extension/_locales/bn/messages.json b/platform/mv3/extension/_locales/bn/messages.json index 6bb20e444b583..8ba63b6fb8667 100644 --- a/platform/mv3/extension/_locales/bn/messages.json +++ b/platform/mv3/extension/_locales/bn/messages.json @@ -348,7 +348,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "এলিমেন্ট জ্যাপার মোডে প্রবেশ করুন", + "message": "একটি উপাদান সরান", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index dc2d666deccb7..4cbe95971f947 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -348,7 +348,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "Mont er mod \"dilemel elfennoù\"", + "message": "Dilemel un elfenn", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { diff --git a/platform/mv3/extension/_locales/cy/messages.json b/platform/mv3/extension/_locales/cy/messages.json index 305b6d7d83255..b38ef41c54076 100644 --- a/platform/mv3/extension/_locales/cy/messages.json +++ b/platform/mv3/extension/_locales/cy/messages.json @@ -348,7 +348,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "Galluogi'r modd saethu elfen", + "message": "Tynnu elfen", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index 6a4eafe99955b..b0b4c7f0cda4c 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -348,7 +348,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "Είσοδος σε λειτουργία αφαίρεσης στοιχείων", + "message": "Αφαίρεση ενός στοιχείου", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { diff --git a/platform/mv3/extension/_locales/fil/messages.json b/platform/mv3/extension/_locales/fil/messages.json index d03312e34b6f2..c325300472a3f 100644 --- a/platform/mv3/extension/_locales/fil/messages.json +++ b/platform/mv3/extension/_locales/fil/messages.json @@ -348,7 +348,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "Paganahin ang element zapper mode", + "message": "Mag-alis ng elemento", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index a91bd9d7a81b6..4ecb4b7f11872 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -348,7 +348,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "Belépés az elemeltávolító módba", + "message": "Elem eltávolítása", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { diff --git a/platform/mv3/extension/_locales/ka/messages.json b/platform/mv3/extension/_locales/ka/messages.json index 6b66a663a03a4..b50dad0e61165 100644 --- a/platform/mv3/extension/_locales/ka/messages.json +++ b/platform/mv3/extension/_locales/ka/messages.json @@ -348,7 +348,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "ნაწილების ამოჭრის რეჟიმში გადასვლა", + "message": "ელემენტის წაშლა", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { diff --git a/platform/mv3/extension/_locales/lv/messages.json b/platform/mv3/extension/_locales/lv/messages.json index 63bf88a97b6b6..36b364d41cef8 100644 --- a/platform/mv3/extension/_locales/lv/messages.json +++ b/platform/mv3/extension/_locales/lv/messages.json @@ -36,7 +36,7 @@ "description": "Link to privacy policy on GitHub (English)" }, "aboutDocumentation": { - "message": "Documentation", + "message": "Dokumentācija", "description": "Link to documentation in About pane" }, "popupFilteringModeLabel": { @@ -348,7 +348,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "Pārslēgties uz elementu iznīcināšanu", + "message": "Noņemt elementu", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { diff --git a/platform/mv3/extension/_locales/nb/messages.json b/platform/mv3/extension/_locales/nb/messages.json index 2ea34d86cac78..28651c883442d 100644 --- a/platform/mv3/extension/_locales/nb/messages.json +++ b/platform/mv3/extension/_locales/nb/messages.json @@ -348,7 +348,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "Gå til element­fjernings­modus", + "message": "Fjern et element", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { diff --git a/platform/mv3/extension/_locales/pl/messages.json b/platform/mv3/extension/_locales/pl/messages.json index 278bde31a42db..b908c4e88dab7 100644 --- a/platform/mv3/extension/_locales/pl/messages.json +++ b/platform/mv3/extension/_locales/pl/messages.json @@ -348,7 +348,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "Przejdź do trybu usuwania elementów", + "message": "Usuń element", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { diff --git a/platform/mv3/extension/_locales/si/messages.json b/platform/mv3/extension/_locales/si/messages.json index d879e20cc15a1..aadc6f8c404d9 100644 --- a/platform/mv3/extension/_locales/si/messages.json +++ b/platform/mv3/extension/_locales/si/messages.json @@ -348,7 +348,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "මූලද්‍රව්‍ය zapper ප්‍රකාරයට ඇතුළු වන්න", + "message": "මූලද්‍රව්‍යයක් ඉවත් කරන්න", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index f0c018705b18a..a17cb6b0a45b8 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -348,7 +348,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "Перейти в режим тимчасового приховування елементів", + "message": "Видалити елемент", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { From 5c34167eb4970d46f4dee2a82d6bffc2de1d0537 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 8 Aug 2026 11:32:44 -0400 Subject: [PATCH 010/145] [mv3] Add "user scripts" permission warning for sandbox filters Related discussion: https://old.reddit.com/r/uBlockOrigin/comments/1vikbk0/ --- platform/mv3/extension/_locales/en/messages.json | 12 ++++++++++-- platform/mv3/extension/css/settings.css | 6 +++--- platform/mv3/extension/dashboard.html | 3 ++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/platform/mv3/extension/_locales/en/messages.json b/platform/mv3/extension/_locales/en/messages.json index 0805a337b5ec8..df73d7ab8cf66 100644 --- a/platform/mv3/extension/_locales/en/messages.json +++ b/platform/mv3/extension/_locales/en/messages.json @@ -103,6 +103,10 @@ "message": "URL of the filter list to add", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Import / Export", "description": "Text label heading the import/export area of custom filters" @@ -112,8 +116,8 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts. Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "message": "Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Changelog", @@ -287,6 +291,10 @@ "message": "Filter-creation sandbox", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Developer mode", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/css/settings.css b/platform/mv3/extension/css/settings.css index 15eae15c015b7..d07645d4b1bd4 100644 --- a/platform/mv3/extension/css/settings.css +++ b/platform/mv3/extension/css/settings.css @@ -271,11 +271,11 @@ body:not([data-supports~="compiled-filters"]) section[data-pane="rulesets"] #lis section[data-pane="rulesets"] #lists:has([data-nodeid="imported"].hideUnused) + aside { display: none; } -body section[data-pane="rulesets"] p[data-i18n="userScriptsInfo"] { +body .userScriptsInfo { color: var(--ink-2); font-size: small; } -body[data-supports~="user-scripts"] section[data-pane="rulesets"] p[data-i18n="userScriptsInfo"] { +body[data-supports~="user-scripts"] .userScriptsInfo { display: none; } body section[data-pane="rulesets"] .importRulesetURL > p { @@ -394,7 +394,7 @@ section[data-pane="filters"] aside .importFromText:not(:has(textarea:placeholder section[data-pane="filters"] aside .importFromText:not(:has(textarea:placeholder-shown)) button:has([data-i18n="exportButton"]) { display: none; } -section[data-pane="filters"] aside p { +section[data-pane="filters"] aside .importFromText p { display: flex; flex-wrap: wrap; gap: 1em; diff --git a/platform/mv3/extension/dashboard.html b/platform/mv3/extension/dashboard.html index 1d59bb0e8bc15..c8d8b0b9c6c90 100644 --- a/platform/mv3/extension/dashboard.html +++ b/platform/mv3/extension/dashboard.html @@ -116,7 +116,7 @@

_

From 53789245cb858542e8e7ec2646c8b9d685c247d4 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 8 Aug 2026 11:34:14 -0400 Subject: [PATCH 011/145] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/extension/_locales/ar/messages.json | 10 +++++++++- platform/mv3/extension/_locales/az/messages.json | 10 +++++++++- platform/mv3/extension/_locales/be/messages.json | 10 +++++++++- platform/mv3/extension/_locales/bg/messages.json | 10 +++++++++- platform/mv3/extension/_locales/bn/messages.json | 10 +++++++++- platform/mv3/extension/_locales/br_FR/messages.json | 12 ++++++++++-- platform/mv3/extension/_locales/bs/messages.json | 12 ++++++++++-- platform/mv3/extension/_locales/ca/messages.json | 10 +++++++++- platform/mv3/extension/_locales/cs/messages.json | 10 +++++++++- platform/mv3/extension/_locales/cv/messages.json | 12 ++++++++++-- platform/mv3/extension/_locales/cy/messages.json | 10 +++++++++- platform/mv3/extension/_locales/da/messages.json | 10 +++++++++- platform/mv3/extension/_locales/de/messages.json | 10 +++++++++- platform/mv3/extension/_locales/el/messages.json | 10 +++++++++- platform/mv3/extension/_locales/en_GB/messages.json | 10 +++++++++- platform/mv3/extension/_locales/eo/messages.json | 12 ++++++++++-- platform/mv3/extension/_locales/es/messages.json | 10 +++++++++- platform/mv3/extension/_locales/et/messages.json | 10 +++++++++- platform/mv3/extension/_locales/eu/messages.json | 10 +++++++++- platform/mv3/extension/_locales/fa/messages.json | 10 +++++++++- platform/mv3/extension/_locales/fi/messages.json | 10 +++++++++- platform/mv3/extension/_locales/fil/messages.json | 12 ++++++++++-- platform/mv3/extension/_locales/fr/messages.json | 10 +++++++++- platform/mv3/extension/_locales/fy/messages.json | 10 +++++++++- platform/mv3/extension/_locales/gl/messages.json | 12 ++++++++++-- platform/mv3/extension/_locales/gu/messages.json | 10 +++++++++- platform/mv3/extension/_locales/he/messages.json | 10 +++++++++- platform/mv3/extension/_locales/hi/messages.json | 10 +++++++++- platform/mv3/extension/_locales/hr/messages.json | 10 +++++++++- platform/mv3/extension/_locales/hu/messages.json | 10 +++++++++- platform/mv3/extension/_locales/hy/messages.json | 10 +++++++++- platform/mv3/extension/_locales/id/messages.json | 12 ++++++++++-- platform/mv3/extension/_locales/it/messages.json | 10 +++++++++- platform/mv3/extension/_locales/ja/messages.json | 10 +++++++++- platform/mv3/extension/_locales/ka/messages.json | 10 +++++++++- platform/mv3/extension/_locales/kk/messages.json | 10 +++++++++- platform/mv3/extension/_locales/kn/messages.json | 10 +++++++++- platform/mv3/extension/_locales/ko/messages.json | 10 +++++++++- platform/mv3/extension/_locales/lt/messages.json | 10 +++++++++- platform/mv3/extension/_locales/lv/messages.json | 12 ++++++++++-- platform/mv3/extension/_locales/mk/messages.json | 10 +++++++++- platform/mv3/extension/_locales/ml/messages.json | 10 +++++++++- platform/mv3/extension/_locales/mr/messages.json | 10 +++++++++- platform/mv3/extension/_locales/ms/messages.json | 10 +++++++++- platform/mv3/extension/_locales/nb/messages.json | 12 ++++++++++-- platform/mv3/extension/_locales/nl/messages.json | 10 +++++++++- platform/mv3/extension/_locales/oc/messages.json | 10 +++++++++- platform/mv3/extension/_locales/pa/messages.json | 10 +++++++++- platform/mv3/extension/_locales/pl/messages.json | 10 +++++++++- platform/mv3/extension/_locales/pt_BR/messages.json | 10 +++++++++- platform/mv3/extension/_locales/pt_PT/messages.json | 10 +++++++++- platform/mv3/extension/_locales/ro/messages.json | 10 +++++++++- platform/mv3/extension/_locales/ru/messages.json | 10 +++++++++- platform/mv3/extension/_locales/si/messages.json | 10 +++++++++- platform/mv3/extension/_locales/sk/messages.json | 10 +++++++++- platform/mv3/extension/_locales/sl/messages.json | 10 +++++++++- platform/mv3/extension/_locales/so/messages.json | 10 +++++++++- platform/mv3/extension/_locales/sq/messages.json | 10 +++++++++- platform/mv3/extension/_locales/sr/messages.json | 10 +++++++++- platform/mv3/extension/_locales/sv/messages.json | 10 +++++++++- platform/mv3/extension/_locales/sw/messages.json | 10 +++++++++- platform/mv3/extension/_locales/ta/messages.json | 10 +++++++++- platform/mv3/extension/_locales/te/messages.json | 10 +++++++++- platform/mv3/extension/_locales/th/messages.json | 12 ++++++++++-- platform/mv3/extension/_locales/tr/messages.json | 10 +++++++++- platform/mv3/extension/_locales/uk/messages.json | 10 +++++++++- platform/mv3/extension/_locales/ur/messages.json | 10 +++++++++- platform/mv3/extension/_locales/vi/messages.json | 10 +++++++++- platform/mv3/extension/_locales/zh_CN/messages.json | 10 +++++++++- platform/mv3/extension/_locales/zh_TW/messages.json | 10 +++++++++- 70 files changed, 640 insertions(+), 80 deletions(-) diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index ca9946d98c013..56944a2165bc1 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -103,6 +103,10 @@ "message": "رابط قائمة التصفية المراد إضافتها", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "استيراد / تصدير", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "لتطبيق مرشحات التجميل أو السكريبت من القوائم المستوردة، يجب منح uBO Lite إذنا لتشغيل نصوص المستخدم. افتح صفحة الإضافات في متصفحك (chrome://extensions في Chrome أو about:addons في Firefox)، ثم افتح تفاصيل uBO Lite، وفعل خيار السماح بنصوص المستخدم (المعروف أيضا بـ \"نصوص الطرف الثالث غير الموثقة\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "سجل التغييرات", @@ -287,6 +291,10 @@ "message": "بيئة معزولة لإنشاء خيارات التصفية", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "وضع المطور", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/az/messages.json b/platform/mv3/extension/_locales/az/messages.json index f89b0324117bd..6008907d4ff78 100644 --- a/platform/mv3/extension/_locales/az/messages.json +++ b/platform/mv3/extension/_locales/az/messages.json @@ -103,6 +103,10 @@ "message": "Əlavə ediləcək filtr siyahısının URL-i", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "İdxal / İxrac et", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "İdxal edilmiş siyahılardan kosmetik və ya skriptlet filtrlərini tətbiq etmək üçün uBO Lite-a istifadəçi skriptlərini işlətmək icazəsi verməlisiniz. Brauzerinizin genişləndirmələr səhifəsini açın (Chrome-da chrome://extensions və ya Firefox-da about:addons), uBO Lite bölməsinin təfərrüatlarını açın və İstifadəçi skriptlərinə icazə ver seçimini aktivləşdirin (bu seçim “təsdiqlənməmiş üçüncü tərəf skriptləri” kimi də adlandırılır).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Dəyişikliklər siyahısı", @@ -287,6 +291,10 @@ "message": "Filtr yaratma sınaq mühiti", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Tərtibatçı rejimi", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/be/messages.json b/platform/mv3/extension/_locales/be/messages.json index 31e11c42a4f98..b1ed647821567 100644 --- a/platform/mv3/extension/_locales/be/messages.json +++ b/platform/mv3/extension/_locales/be/messages.json @@ -103,6 +103,10 @@ "message": "Устаўце сюды URL-адрас спіса фільтраў, які трэба дадаць", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Імпартаваць/экспартаваць", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Каб прымяніць касметычныя фільтры або фільтры скрыптлетаў да імпартаваных спісаў, вы павінны даць uBO Lite дазвол на запуск карыстальніцкіх скрыптоў. Адкрыйце старонку пашырэнняў вашага браўзера (chrome://extensions у Chrome або about:addons у Firefox), адкрыйце падрабязнасці uBO Lite і ўключыце Дазволіць карыстальніцкія скрыпты (таксама вядомыя як «неправераныя староннія скрыпты»).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Журнал змяненняў", @@ -287,6 +291,10 @@ "message": "Пясочніца стварэння фільтраў", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Рэжым распрацоўшчыка", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index a91069ef2154c..57e0d5994546e 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -103,6 +103,10 @@ "message": "Поставете тук URL адреса на списъка с филтри, който искате да добавите", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Импортиране / експортиране", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "За да приложите козметични филтри или филтри за скриптове от импортирани списъци, трябва да предоставите на uBO Lite разрешение да изпълнява потребителски скриптове. Отворете страницата с разширенията на браузъра си (chrome://extensions в Chrome или about:addons във Firefox), отворете подробностите за uBO Lite и активирайте опцията Разрешаване на потребителски скриптове (наричани още „непроверени скриптове от трети страни“).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Списък с промени", @@ -287,6 +291,10 @@ "message": "Тестова среда за създаване на филтри", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Режим за програмисти", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/bn/messages.json b/platform/mv3/extension/_locales/bn/messages.json index 8ba63b6fb8667..7b9566f85bc89 100644 --- a/platform/mv3/extension/_locales/bn/messages.json +++ b/platform/mv3/extension/_locales/bn/messages.json @@ -103,6 +103,10 @@ "message": "যোগ করার জন্য ফিল্টার তালিকার URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "আমদানি / রপ্তানি", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "আমদানিকৃত তালিকা থেকে কসমেটিক বা স্ক্রিপ্টলেট ফিল্টার প্রয়োগ করতে, আপনাকে uBO Lite-কে ব্যবহারকারী স্ক্রিপ্ট চালানোর অনুমতি দিতে হবে। আপনার ব্রাউজারের এক্সটেনশন পৃষ্ঠা খুলুন (Chrome-এ chrome://extensions অথবা Firefox-এ about:addons), uBO Lite-এর বিস্তারিত খুলুন, এবং Allow user scripts (যা \"অযাচাইকৃত তৃতীয়-পক্ষ স্ক্রিপ্ট\" নামেও পরিচিত) চালু করুন।", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "পরিবর্তনসূচি", @@ -287,6 +291,10 @@ "message": "ফিল্টার তৈরির স্যান্ডবক্স", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "ডেভেলপার মোড", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index 4cbe95971f947..bcc2770fd0c0d 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -103,6 +103,10 @@ "message": "Pegit amañ URL al listenn siloù a fell deoc'h ouzhpennañ", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Enporzhiañ / Ezporzhiañ", "description": "Text label heading the import/export area of custom filters" @@ -112,8 +116,8 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts. Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "message": "Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Deizlevr ar cheñchamantoù", @@ -287,6 +291,10 @@ "message": "Tachenn krouiñ siloù", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Mod diorroer", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/bs/messages.json b/platform/mv3/extension/_locales/bs/messages.json index 91a0df461457f..18d30d264559c 100644 --- a/platform/mv3/extension/_locales/bs/messages.json +++ b/platform/mv3/extension/_locales/bs/messages.json @@ -103,6 +103,10 @@ "message": "URL of the filter list to add", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Uvezi / Izvezi", "description": "Text label heading the import/export area of custom filters" @@ -112,8 +116,8 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts. Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "message": "Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Dnevnik izmjena", @@ -287,6 +291,10 @@ "message": "Filter-creation sandbox", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Režim za razvojne programere", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/ca/messages.json b/platform/mv3/extension/_locales/ca/messages.json index 8333c5c460f1f..1bd0d79bb06c9 100644 --- a/platform/mv3/extension/_locales/ca/messages.json +++ b/platform/mv3/extension/_locales/ca/messages.json @@ -103,6 +103,10 @@ "message": "Enganxeu aquí l'URL de la llista de filtres per a afegir-la", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importa/Exporta", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Per a aplicar filtres cosmètics o de scripts mitjançant llistes importades, doneu permís a l'uBO Lite d'execució de scripts d'usuari. Obriu la pàgina d'extensions del navegador (chrome://extensions al Chrome o about:addons al Firefox), obriu els detalls d'uBO Lite i activeu Permet scripts d'usuari (també anomenats «scripts de tercers no verificats»).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Registre de canvis", @@ -287,6 +291,10 @@ "message": "Entorn de proves per a la creació de filtres", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Mode de desenvolupador", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/cs/messages.json b/platform/mv3/extension/_locales/cs/messages.json index 4a2aaf93bb4d7..00e612f74a190 100644 --- a/platform/mv3/extension/_locales/cs/messages.json +++ b/platform/mv3/extension/_locales/cs/messages.json @@ -103,6 +103,10 @@ "message": "Sem vložte adresu URL seznamu filtrů, které chcete přidat", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Import / Export", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Chcete-li použít filtry vzhledu nebo skriptů z importovaných seznamů, musíte aplikaci uBO Lite udělit oprávnění ke spouštění uživatelských skriptů. Otevřete stránku rozšíření ve svém prohlížeči (chrome://extensions v prohlížeči Chrome nebo about:addons v prohlížeči Firefox), otevřete podrobnosti uBO Lite a zapněte volbu Povolit uživatelské skripty (také označované jako \"neověřené skripty třetích stran\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Přehled změn", @@ -287,6 +291,10 @@ "message": "Testovací prostředí pro vytváření filtrů", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Vývojářský režim", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/cv/messages.json b/platform/mv3/extension/_locales/cv/messages.json index 78e9fda1a6d3c..61c922e16d28c 100644 --- a/platform/mv3/extension/_locales/cv/messages.json +++ b/platform/mv3/extension/_locales/cv/messages.json @@ -103,6 +103,10 @@ "message": "URL of the filter list to add", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Import / Export", "description": "Text label heading the import/export area of custom filters" @@ -112,8 +116,8 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts. Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "message": "Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Changelog", @@ -287,6 +291,10 @@ "message": "Filter-creation sandbox", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Developer mode", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/cy/messages.json b/platform/mv3/extension/_locales/cy/messages.json index b38ef41c54076..dc68906692a9d 100644 --- a/platform/mv3/extension/_locales/cy/messages.json +++ b/platform/mv3/extension/_locales/cy/messages.json @@ -103,6 +103,10 @@ "message": "URL y rhestr hidl i'w hychwanegu", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Mewnforio / Allforio", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "I orfodi hidlau cosmetig neu sgriptlet o restrau wedi'u mewnforio, rhaid i chi roi caniatâd i uBO Lite redeg sgriptiau defnyddiwr. Agorwch dudalen estyniadau eich porwr (chrome://extensions yn Chrome neu about:addons yn Firefox), agorwch fanylion uBO Lite, a throwch Caniatáu sgriptiau defnyddiwr ymlaen (a elwir hefyd yn “sgriptiau trydydd parti heb eu gwirio”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Cofnod newidiadau", @@ -287,6 +291,10 @@ "message": "Blwch tywod creu hidl", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Modd datblygwr", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/da/messages.json b/platform/mv3/extension/_locales/da/messages.json index 0d2ae39486481..de142fa7119d6 100644 --- a/platform/mv3/extension/_locales/da/messages.json +++ b/platform/mv3/extension/_locales/da/messages.json @@ -103,6 +103,10 @@ "message": "URL'en til filterlisten, der skal tilføjes", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Import/ Eksport", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "For at håndhæve kosmetiske eller scriptlet-filtre fra importerede lister, giv uBO Lite tilladelse til at eksekvere brugerscripts. Åbn webbrowserens udvidelsesside (chrome://extensions i Chrome eller about:addons i Firefox), åbn uBO Lite-detaljerne og slå Tillad brugerscripts til (også kaldet \"ubekræftede tredjepartsscripts\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Ændringslog", @@ -287,6 +291,10 @@ "message": "Sandkasse til filteroprettelse", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Udviklertilstand", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index 3adbc21940168..1c0a1cfc9f17e 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -103,6 +103,10 @@ "message": "URL der Filterliste hier einfügen", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importieren und exportieren", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "uBO Lite benötigt die Berechtigung zum Ausführen von Nutzerscripts, um kosmetische Filter oder Scriptlet-Filter aus importierten Listen anzuwenden. Die Option befindet sich in den Browser-Einstellungen für Erweiterungen (chrome://extensions in Chrome oder about:addons in Firefox). Anschließend die Details von uBO Lite öffnen und Nutzerscripts zulassen aktivieren (in Firefox „Nicht verifizierten Skripten von Drittanbietern den Zugriff auf Ihre Daten erlauben“).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Änderungsprotokoll", @@ -287,6 +291,10 @@ "message": "Testumgebung zum Erstellen von Filtern", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Entwicklermodus", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index b0b4c7f0cda4c..f801094f24b31 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -103,6 +103,10 @@ "message": "Επικολλήστε το URL της λίστας φίλτρων εδώ", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Εισαγωγή / Εξαγωγή", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Για να επιβάλετε φίλτρα εμφάνισης ή scriptlet από εισαγόμενες λίστες, πρέπει να παραχωρήσετε στο uBO Lite το δικαίωμα εκτέλεσης user scripts. Ανοίξτε τη σελίδα επεκτάσεων του προγράμματος περιήγησής σας (chrome://extensions στο Chrome ή about:addons στον Firefox), ανοίξτε τις λεπτομέρειες του uBO Lite και ενεργοποιήστε την επιλογή Να επιτρέπονται τα user scripts (γνωστά και ως «μη επαληθευμένα σενάρια τρίτων»).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Αρχείο αλλαγών", @@ -287,6 +291,10 @@ "message": "Αμμοδοχείο δημιουργίας φίλτρων", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Λειτουργία προγραμματιστή", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/en_GB/messages.json b/platform/mv3/extension/_locales/en_GB/messages.json index 9e4dcb176b8ad..e9916f84ebee3 100644 --- a/platform/mv3/extension/_locales/en_GB/messages.json +++ b/platform/mv3/extension/_locales/en_GB/messages.json @@ -103,6 +103,10 @@ "message": "URL of the filter list to add", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Import / Export", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts. Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open the uBO Lite details and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Change-log", @@ -287,6 +291,10 @@ "message": "Filter-creation sandbox", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Developer mode", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/eo/messages.json b/platform/mv3/extension/_locales/eo/messages.json index 6b974e06809af..cd50d410bf79b 100644 --- a/platform/mv3/extension/_locales/eo/messages.json +++ b/platform/mv3/extension/_locales/eo/messages.json @@ -103,6 +103,10 @@ "message": "URL of the filter list to add", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importi / Eksporti", "description": "Text label heading the import/export area of custom filters" @@ -112,8 +116,8 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts. Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "message": "Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Ŝanĝprotokolo", @@ -287,6 +291,10 @@ "message": "Provejo por kreado de filtriloj", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Reĝimo por programistoj", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 13a6a7eeac599..3fc5ebdbed016 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -103,6 +103,10 @@ "message": "Pega aquí la URL del filtro de lista a agregar", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importar / Exportar", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Para aplicar filtros cosméticos o de scripts desde listas importadas, debes otorgar a uBO Lite permiso para correr scripts de usuario. Abre la página de extensiones de tu navegador. (chrome://extensions en Chrome o about:addons en Firefox), abre los uBO Lite detalles, y enciende Permitir scripts de usuario (tambien referido como \"scripts de terceros no verificados\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Registro de cambios", @@ -287,6 +291,10 @@ "message": "Caja de arena de creación de filtro", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Modo desarrollador", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/et/messages.json b/platform/mv3/extension/_locales/et/messages.json index cf107951430e7..a22823faf5a0d 100644 --- a/platform/mv3/extension/_locales/et/messages.json +++ b/platform/mv3/extension/_locales/et/messages.json @@ -103,6 +103,10 @@ "message": "Lisata filtri nimekirja URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Impordi/ekspordi", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Ilufiltrite või scriplet filtrite kasutamiseks imporditud nimekirjast pead lubama uBO Lite'il käivitada kasutajaskripte. Ava veebilehitseja laiendite lehekülg (chrome://extensions Chrome'is või about:addons Firefoxis), ava uBO Lite'i andmed ja luba Luba kasutajaskriptid (tuntud ka kui „kinnitamata muu osapoole skriptid“).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Muudatuste logi", @@ -287,6 +291,10 @@ "message": "Filtri loomise katsetus", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Arendaja režiim", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/eu/messages.json b/platform/mv3/extension/_locales/eu/messages.json index bf7e585a23ca8..1f66143c82731 100644 --- a/platform/mv3/extension/_locales/eu/messages.json +++ b/platform/mv3/extension/_locales/eu/messages.json @@ -103,6 +103,10 @@ "message": "Gehitzeko iragazki-zerrendaren URLa", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Inportatu / Esportatu", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Inportatutako zerrendetako iragazki kosmetiko edo scriptlet-ak betearazteko, baimena eman behar diozu uBO Lite-ri erabiltzaile-scriptak exekutatzeko. Ireki zure nabigatzailearen luzapenen orria (chrome://extensions Chrome-n edo about:addons Firefox-en), ireki uBO Lite-ren xehetasunak, eta aktibatu Onartu erabiltzaile-scriptak (“egiaztatu gabeko hirugarrenen scriptak” ere deitua).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Aldaketen erregistroa", @@ -287,6 +291,10 @@ "message": "Iragazkiak sortzeko proba-gunea", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Garatzaile modua", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/fa/messages.json b/platform/mv3/extension/_locales/fa/messages.json index 67839f6d27778..b17aa4f579f46 100644 --- a/platform/mv3/extension/_locales/fa/messages.json +++ b/platform/mv3/extension/_locales/fa/messages.json @@ -103,6 +103,10 @@ "message": "آدرس اینترنتی لیست فیلتر برای افزودن", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "وارد کردن / خارج کردن", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "برای اعمال فیلترهای ظاهری یا اسکریپتلت از لیست‌های وارد شده، باید به uBO Lite اجازه اجرای اسکریپت‌های کاربر را بدهید. صفحه افزونه‌های مرورگر خود را باز کنید (chrome://extensions در کروم یا about:addons در فایرفاکس)، جزئیات uBO Lite را باز کنید و گزینه اجازه به اسکریپت‌های کاربر (که به عنوان \"اسکریپت‌های شخص ثالث تایید نشده\" نیز شناخته می‌شود) را فعال کنید.", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "گزارش دگرگونی", @@ -287,6 +291,10 @@ "message": "محیط آزمایشی ایجاد فیلتر", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "حالت توسعه‌دهنده", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/fi/messages.json b/platform/mv3/extension/_locales/fi/messages.json index b902fc2583ffd..59af84332cb8c 100644 --- a/platform/mv3/extension/_locales/fi/messages.json +++ b/platform/mv3/extension/_locales/fi/messages.json @@ -103,6 +103,10 @@ "message": "Lisättävän listan URL-osoite", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Tuonti / Vienti", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Tuotujen listojen kosmeetisten ja scriplet‑suodattimien käyttämiseksi, on uBO Litelle myönnettävä oikeus suorittaa käyttäjäskriptejä. Avaa selaimesi laajennussivu (chrome://extensions Chromessa, about:addons Firefoxissa), valitse uBO Lite ‑laajennuksen tiedot ja aktivoi käyttöoikeus Salli käyttäjäskriptit (Chrome) tai Salli vahvistamattomien kolmannen osapuolen komentosarjojen pääsy tietoihisi (Firefox).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Muutoshistoria", @@ -287,6 +291,10 @@ "message": "Vapaa suodatinluonti", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Kehittäjätila", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/fil/messages.json b/platform/mv3/extension/_locales/fil/messages.json index c325300472a3f..cb80fb29d5f0c 100644 --- a/platform/mv3/extension/_locales/fil/messages.json +++ b/platform/mv3/extension/_locales/fil/messages.json @@ -103,6 +103,10 @@ "message": "URL of the filter list to add", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Import / Export", "description": "Text label heading the import/export area of custom filters" @@ -112,8 +116,8 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts. Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "message": "Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Talaan ng mga pagbabago", @@ -287,6 +291,10 @@ "message": "Filter-creation sandbox", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Developer mode", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/fr/messages.json b/platform/mv3/extension/_locales/fr/messages.json index c9f63be978f03..d5a7ef3b7cb24 100644 --- a/platform/mv3/extension/_locales/fr/messages.json +++ b/platform/mv3/extension/_locales/fr/messages.json @@ -103,6 +103,10 @@ "message": "Lien de la liste de filtres à ajouter", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importer / Exporter", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Pour forcer les filtres cosmétiques ou de type scriptlet présents dans les listes importées, vous devez accorder à uBO Lite la permission d'exécuter des scripts utilisateurs. Ouvrez la page des extensions de votre navigateur (chrome://extensions dans Chrome, ou about:addons dans Firefox), ouvrez la page des détails d'uBO Lite, et activez l'option Autoriser les scripts utilisateurs (aussi appelés \"scripts tiers non-vérifiés\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Journal des changements", @@ -287,6 +291,10 @@ "message": "Bac à sable de création de filtres", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Mode développeur", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/fy/messages.json b/platform/mv3/extension/_locales/fy/messages.json index fd365b2a53f7a..9cb9c85472d2b 100644 --- a/platform/mv3/extension/_locales/fy/messages.json +++ b/platform/mv3/extension/_locales/fy/messages.json @@ -103,6 +103,10 @@ "message": "URL fan de ta te foegjen filterlist", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Ymportearje / Eksportearje", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Om kosmetyske of scriptletfilters fan ymportearre listen út ta te passen, moatte jo uBO Lite tastimming jaan foar it útfieren fan brûkersscripts. Iepenje de útwreidingsside fan jo browser (chrome://extensions yn Chrome of about:addons yn Firefox), iepenje de details fan uBO Lite, en skeakelje Brûkersscripts tastean (ek wol oanjûn as ‘Net-ferifiearte scripts fan tredden’) yn.", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Wizigingslochboek", @@ -287,6 +291,10 @@ "message": "Sandbox foar it oanmeitsjen fan filters", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Untwikkelersmodus", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/gl/messages.json b/platform/mv3/extension/_locales/gl/messages.json index 64741156ed972..ab74ce0fe139f 100644 --- a/platform/mv3/extension/_locales/gl/messages.json +++ b/platform/mv3/extension/_locales/gl/messages.json @@ -103,6 +103,10 @@ "message": "URL of the filter list to add", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importar/Exportar", "description": "Text label heading the import/export area of custom filters" @@ -112,8 +116,8 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts. Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "message": "Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Rexistro de cambios", @@ -287,6 +291,10 @@ "message": "Filter-creation sandbox", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Modo desenvolvemento", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/gu/messages.json b/platform/mv3/extension/_locales/gu/messages.json index a5a60c5963d42..ea08b7d2395bf 100644 --- a/platform/mv3/extension/_locales/gu/messages.json +++ b/platform/mv3/extension/_locales/gu/messages.json @@ -103,6 +103,10 @@ "message": "ઉમેરવા માટે ફિલ્ટર યાદીનો URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "આયાત / નિકાસ", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "આયાત કરેલ યાદીઓમાંથી કોસ્મેટિક અથવા સ્ક્રિપ્ટલેટ ફિલ્ટરો લાગુ કરવા માટે, તમારે uBO Lite ને વપરાશકર્તા સ્ક્રિપ્ટો ચલાવવાની પરવાનગી આપવી આવશ્યક છે. તમારા બ્રાઉઝરનું એક્સ્ટેંશન પેજ ખોલો (Chrome માં chrome://extensions અથવા Firefox માં about:addons), uBO Lite વિગતો ખોલો, અને વપરાશકર્તા સ્ક્રિપ્ટોને મંજૂરી આપો (જેને “અવેરિફાઇડ તૃતીય-પક્ષ સ્ક્રિપ્ટો” તરીકે પણ ઓળખવામાં આવે છે) ચાલુ કરો.", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "ફેરફાર યાદી", @@ -287,6 +291,10 @@ "message": "ફિલ્ટર-નિર્માણ સેન્ડબોક્સ", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "ડેવલપર મોડ", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/he/messages.json b/platform/mv3/extension/_locales/he/messages.json index f05b4d60be5dd..4c7f10c4dfdfd 100644 --- a/platform/mv3/extension/_locales/he/messages.json +++ b/platform/mv3/extension/_locales/he/messages.json @@ -103,6 +103,10 @@ "message": "העתיקו לכאן את ה URL של רשימת המסננים", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "יבוא / יצוא", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "בכדי לאפשר מסננים קוסמטיים או scriptlet מרשימות מיובאות, יש לאפשר ל uBO Lite להריץ סקריפטים של המשתמש. פתחו את התוספים או ההרחבות בדפדפן שלכם (chrome://extensions בכרום או chrome://extensions בפיירפוקס), פתחו את הפרטים של uBO Lite, ותנו אישור לסקריפטים של משתמשים (או \"לאפשר לתסריטי צד שלישי לא מאומתים לגשת לנתונים שלך\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "יומן שינויים", @@ -287,6 +291,10 @@ "message": "ארגז חול ליצירת מסננים", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "מצב מפתחים", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/hi/messages.json b/platform/mv3/extension/_locales/hi/messages.json index bfabe032301e4..2530bdabde985 100644 --- a/platform/mv3/extension/_locales/hi/messages.json +++ b/platform/mv3/extension/_locales/hi/messages.json @@ -103,6 +103,10 @@ "message": "जोड़ने के लिए फ़िल्टर सूची का URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "आयात / निर्यात", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "आयातित सूचियों से कॉस्मेटिक या स्क्रिप्टलेट फ़िल्टर लागू करने के लिए, आपको uBO Lite को उपयोगकर्ता स्क्रिप्ट चलाने की अनुमति देनी होगी। अपने ब्राउज़र का एक्सटेंशन पेज खोलें (Chrome में chrome://extensions या Firefox में about:addons), uBO Lite विवरण खोलें, और उपयोगकर्ता स्क्रिप्ट की अनुमति दें (जिसे \"असत्यापित तृतीय-पक्ष स्क्रिप्ट\" भी कहा जाता है) को चालू करें।", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "परिवर्तन पत्र", @@ -287,6 +291,10 @@ "message": "फ़िल्टर-निर्माण सैंडबॉक्स", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "डेवलपर मोड", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/hr/messages.json b/platform/mv3/extension/_locales/hr/messages.json index 637ecb76ee467..e553fed83dcdf 100644 --- a/platform/mv3/extension/_locales/hr/messages.json +++ b/platform/mv3/extension/_locales/hr/messages.json @@ -103,6 +103,10 @@ "message": "URL popisa filtera za dodavanje", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Uvoz / Izvoz", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Da biste primijenili kozmetičke ili skriptlet filtere iz uvezenih popisa, morate dati uBO Liteu dopuštenje za pokretanje korisničkih skripti. Otvorite stranicu s proširenjima preglednika (chrome://extensions u Chromeu ili about:addons u Firefoxu), otvorite detalje o uBO Liteu i uključite Dopusti korisničke skripte (također se nazivaju \"nepotvrđene skripte trećih strana\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Popis promjena", @@ -287,6 +291,10 @@ "message": "Igraonica za stvaranje filtera", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Način rada za programere", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index 4ecb4b7f11872..84eb31db8ccd5 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -103,6 +103,10 @@ "message": "Illessze be ide a hozzáadandó szűrőlista webcímét", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importálás/exportálás", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Az importált listákból származó kozmetikai szűrők alkalmazásához engedélyezni kell az uBO Lite számára, hogy felhasználói parancsfájlokat futtatsson. Nyissa meg a böngészőkiegészítők vagy bővítmények oldalát (chrome://extensions a Chrome-ban vagy about:addons a Firefoxban), nyissa meg a uBO Lite részleteit, és kapcsolja be a Felhasználói parancsfájlok engedélyezése lehetőséget (más néven „nem ellenőrzött külső parancsfájlok”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Változások listája", @@ -287,6 +291,10 @@ "message": "Szűrőlétrehozási homokozó", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Fejlesztői mód", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/hy/messages.json b/platform/mv3/extension/_locales/hy/messages.json index 344d336ae1f6d..106fc7da5cb31 100644 --- a/platform/mv3/extension/_locales/hy/messages.json +++ b/platform/mv3/extension/_locales/hy/messages.json @@ -103,6 +103,10 @@ "message": "Ավելացման ենթակա զտիչների ցանկի URL-ը", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Ներմուծում / Արտահանում", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Ներմուծված ցանկերից կոսմետիկ կամ սկրիպտլետ զտիչները կիրառելու համար դուք պետք է uBO Lite-ին թույլատրեք գործարկել օգտատիրոջ սկրիպտները։ Բացեք ձեր դիտարկչի ընդլայնումների էջը (chrome://extensions Chrome-ում կամ about:addons Firefox-ում), բացեք uBO Lite-ի մանրամասները և միացրեք Թույլատրել օգտատիրոջ սկրիպտները (նաև կոչվում է “չստուգված երրորդ կողմի սկրիպտներ”)։", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Փոփոխությունների մատյան", @@ -287,6 +291,10 @@ "message": "Զտիչների ստեղծման ավազարկղ", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Մշակողի ռեժիմ", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/id/messages.json b/platform/mv3/extension/_locales/id/messages.json index 79a96d6ea037e..dc25b8c934674 100644 --- a/platform/mv3/extension/_locales/id/messages.json +++ b/platform/mv3/extension/_locales/id/messages.json @@ -103,6 +103,10 @@ "message": "URL filter untuk ditambahkan", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Impor / Ekspor", "description": "Text label heading the import/export area of custom filters" @@ -112,8 +116,8 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts. Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "message": "Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Catatan perubahan", @@ -287,6 +291,10 @@ "message": "Lingkungan uji coba pembuatan filter", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Mode pengembang", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index 303c981d94511..41bfbc8cdabb2 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -103,6 +103,10 @@ "message": "Incolla qui l'URL dell'elenco di filtri da aggiungere", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importa / Esporta", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Per applicare i filtri cosmetici o gli scriptlet provenienti da elenchi importati, è necessario concedere a uBO Lite l'autorizzazione a eseguire gli script utente. Apri la pagina delle estensioni del tuo browser (chrome://extensions su Chrome o about:addons su Firefox), apri i dettagli di uBO Lite e attiva l'opzione Consenti script utente (nota anche come \"script di terze parti non verificati\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Reg. modifiche", @@ -287,6 +291,10 @@ "message": "Sandbox per la creazione di filtri", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Modalità sviluppatore", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/ja/messages.json b/platform/mv3/extension/_locales/ja/messages.json index 024b4211fc73e..9b55f26ec0863 100644 --- a/platform/mv3/extension/_locales/ja/messages.json +++ b/platform/mv3/extension/_locales/ja/messages.json @@ -103,6 +103,10 @@ "message": "追加したいフィルターリストの URL を貼り付けてください", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "インポート又はエクスポート", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "インポートしたリストから外観フィルターやスクリプトレットフィルターを適用するには、uBO Lite にユーザー スクリプトを実行する権限を付与する必要があります。ブラウザの拡張機能ページ(Chrome の場合は chrome://extensions、Firefox の場合は about:addons)を開き、uBO Lite の詳細を開いて、ユーザー スクリプトを許可する(「未検証のサードパーティ スクリプト」とも呼ばれます)をオンに切り替えてください。", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "更新履歴", @@ -287,6 +291,10 @@ "message": "フィルター作成サンドボックス", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "開発者モード", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/ka/messages.json b/platform/mv3/extension/_locales/ka/messages.json index b50dad0e61165..ffb285fcf831a 100644 --- a/platform/mv3/extension/_locales/ka/messages.json +++ b/platform/mv3/extension/_locales/ka/messages.json @@ -103,6 +103,10 @@ "message": "ჩასვით სიის ბმული დასამატებლად", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "შემოტანა / გატანა", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "გარეგნული ან მცირე სკრიპტის ფილტრების იძულებით ასამოქმედებლად შემოტანილი სიებიდან, uBO Lite უნდა იყოს სკრიპტების გაშვების ნებართვის მქონე. გახსენით ბრაუზერის გაფართოებების გვერდი (chrome://extensions Chrome-ში ან about:addons Firefox-ში), იხილეთ uBO Lite ვრცლად და გადართეთ მომხმარებლის სკრიპტების ნებართვა (აგრეთვე შეიძლება ეწეროს „დაუმოწმებელი გარეშე სკრიპტები“).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "ცვლილებები", @@ -287,6 +291,10 @@ "message": "ფილტრის შესაქმნელი ცალკე გარემო", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "შემმუშვებლის რეჟიმი", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/kk/messages.json b/platform/mv3/extension/_locales/kk/messages.json index 01dc0fde19c78..fe6256604b07f 100644 --- a/platform/mv3/extension/_locales/kk/messages.json +++ b/platform/mv3/extension/_locales/kk/messages.json @@ -103,6 +103,10 @@ "message": "Қосылатын сүзгі тізімінің URL-мекенжайы", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Импорттау / Экспорттау", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Импортталған тізімдерден алынған көрнекілік немесе скрипт сүзгілерін қолдану үшін сіз uBO Lite-ке пайдаланушы скрипттерін іске қосу рұқсатын беруіңіз керек. Браузеріңіздің кеңейтулер бетін ашыңыз (chrome://extensions Chrome-да немесе about:addons Firefox-та), uBO Lite мәліметтерін ашып, Пайдаланушы скрипттеріне рұқсат ету (сонымен қатар “расталмаған үшінші тарап скрипттері” деп аталады) қосқышын қосыңыз.", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Өзгерістер журналы", @@ -287,6 +291,10 @@ "message": "Сүзгі құру құмсалғышы", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Әзірлеуші режимі", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/kn/messages.json b/platform/mv3/extension/_locales/kn/messages.json index a97102a42bfb6..fb6a282b500d7 100644 --- a/platform/mv3/extension/_locales/kn/messages.json +++ b/platform/mv3/extension/_locales/kn/messages.json @@ -103,6 +103,10 @@ "message": "ಸೇರಿಸಬೇಕಾದ ಶೋಧಕ ಪಟ್ಟಿಯ URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "ಆಮದು / ರಫ್ತು", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "ಆಮದು ಮಾಡಿದ ಪಟ್ಟಿಗಳಿಂದ ಸೌಂದರ್ಯ ಅಥವಾ ಸ್ಕ್ರಿಪ್ಟ್ಲೆಟ್ ಶೋಧಕಗಳನ್ನು ಜಾರಿಗೊಳಿಸಲು, ನೀವು uBO Lite ಗೆ ಬಳಕೆದಾರ ಸ್ಕ್ರಿಪ್ಟ್ಗಳನ್ನು ಚಲಾಯಿಸಲು ಅನುಮತಿ ನೀಡಬೇಕು. ನಿಮ್ಮ ಬ್ರೌಸರ್ನ ವಿಸ್ತರಣೆಗಳ ಪುಟವನ್ನು ತೆರೆಯಿರಿ (Chrome ನಲ್ಲಿ chrome://extensions ಅಥವಾ Firefox ನಲ್ಲಿ about:addons), uBO Lite ವಿವರಗಳನ್ನು ತೆರೆಯಿರಿ, ಮತ್ತು ಬಳಕೆದಾರ ಸ್ಕ್ರಿಪ್ಟ್ಗಳನ್ನು ಅನುಮತಿಸು ಅನ್ನು ಟಾಗಲ್ ಆನ್ ಮಾಡಿ (ಇದನ್ನು “ಪರಿಶೀಲಿಸದ ಮೂರನೇ-ಪಕ್ಷ ಸ್ಕ್ರಿಪ್ಟ್ಗಳು” ಎಂದೂ ಕರೆಯಲಾಗುತ್ತದೆ).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "ಬದಲಾವಣೆಗಳು", @@ -287,6 +291,10 @@ "message": "ಶೋಧಕ-ರಚನೆ ಸ್ಯಾಂಡ್ಬಾಕ್ಸ್", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "ಡೆವಲಪರ್ ಮೋಡ್", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/ko/messages.json b/platform/mv3/extension/_locales/ko/messages.json index e9ddede99fa1f..6c2c0640b0cbf 100644 --- a/platform/mv3/extension/_locales/ko/messages.json +++ b/platform/mv3/extension/_locales/ko/messages.json @@ -103,6 +103,10 @@ "message": "추가하려는 필터 목록의 URL 입력", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "가져오기 / 내보내기", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "가져온 목록에서 요소 숨김 또는 스크립트 주입 필터를 적용하려면, uBO Lite에 사용자 스크립트 실행 권한을 허용해야 합니다. 브라우저의 확장 프로그램 페이지(Chrome chrome://extensions, Firefox는 about:addons)를 열고, uBO Lite 세부 정보를 연 뒤, 사용자 스크립트 허용(혹은 \"검증되지 않은 타사 스크립트 허용\")을 활성화하세요.", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "변경 로그", @@ -287,6 +291,10 @@ "message": "필터 제작용 샌드박스", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "개발자 모드", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/lt/messages.json b/platform/mv3/extension/_locales/lt/messages.json index f969ac42ba79f..f62681d2bd819 100644 --- a/platform/mv3/extension/_locales/lt/messages.json +++ b/platform/mv3/extension/_locales/lt/messages.json @@ -103,6 +103,10 @@ "message": "Pridedamo filtrų sąrašo URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importuoti / Eksportuoti", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Kad galėtumėte taikyti kosmetinius ar scenarijų filtrus iš importuotų sąrašų, turite suteikti uBO Lite leidimą vykdyti vartotojo scenarijus. Atidarykite naršyklės plėtinių puslapį (chrome://extensions sistemoje Chrome arba about:addons sistemoje Firefox), atidarykite uBO Lite išsamią informaciją ir įjunkite Leisti vartotojo scenarijus (taip pat vadinama „nepatikrintais trečiųjų šalių scenarijais“).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Pakeitimų žurnalas", @@ -287,6 +291,10 @@ "message": "Filtrų kūrimo smėlio dėžė", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Kūrėjo režimas", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/lv/messages.json b/platform/mv3/extension/_locales/lv/messages.json index 36b364d41cef8..66b96d7d27f35 100644 --- a/platform/mv3/extension/_locales/lv/messages.json +++ b/platform/mv3/extension/_locales/lv/messages.json @@ -103,6 +103,10 @@ "message": "URL of the filter list to add", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Ievietot/izgūt", "description": "Text label heading the import/export area of custom filters" @@ -112,8 +116,8 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts. Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "message": "Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Izmaiņu žurnāls", @@ -287,6 +291,10 @@ "message": "Aizturētāju izveidošanas smilškaste", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Izstrādātāja režīms", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/mk/messages.json b/platform/mv3/extension/_locales/mk/messages.json index 45088241f8c09..09a38512e1e50 100644 --- a/platform/mv3/extension/_locales/mk/messages.json +++ b/platform/mv3/extension/_locales/mk/messages.json @@ -103,6 +103,10 @@ "message": "URL на листата на филтри за додавање", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Увоз / Извоз", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "За да ги примените козметичките или скриплет филтрите од увезените листи, мора да му доделите на uBO Lite дозвола за извршување на кориснички скрипти. Отворете ја страницата за проширувања на вашиот прелистувач (chrome://extensions во Chrome или about:addons во Firefox), отворете ги деталите за uBO Lite и вклучете ја опцијата Дозволи кориснички скрипти (исто така наречени „непроверени скрипти од трети страни“).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Промени", @@ -287,6 +291,10 @@ "message": "Песочник за креирање филтри", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Мод за девелопери", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/ml/messages.json b/platform/mv3/extension/_locales/ml/messages.json index e093c2dbf0070..a8ee09625a870 100644 --- a/platform/mv3/extension/_locales/ml/messages.json +++ b/platform/mv3/extension/_locales/ml/messages.json @@ -103,6 +103,10 @@ "message": "ചേർക്കേണ്ട ഫിൽറ്റർ ലിസ്റ്റിന്റെ URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "ഇറക്കുമതി / കയറ്റുമതി", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "ഇറക്കുമതി ചെയ്ത ലിസ്റ്റുകളിൽ നിന്നുള്ള കോസ്മെറ്റിക് അല്ലെങ്കിൽ സ്ക്രിപ്റ്റ്ലെറ്റ് ഫിൽറ്ററുകൾ നടപ്പിലാക്കാൻ, യൂസർ സ്ക്രിപ്റ്റുകൾ പ്രവർത്തിപ്പിക്കാനുള്ള അനുമതി uBO Lite-ന് നിങ്ങൾ നൽകണം. നിങ്ങളുടെ ബ്രൗസറിന്റെ എക്സ്റ്റൻഷനുകൾ പേജ് തുറക്കുക (Chrome-ൽ chrome://extensions അല്ലെങ്കിൽ Firefox-ൽ about:addons), uBO Lite വിശദാംശങ്ങൾ തുറക്കുക, യൂസർ സ്ക്രിപ്റ്റുകൾ അനുവദിക്കുക (മറ്റൊരു വിധത്തിൽ “പരിശോധിക്കാത്ത മൂന്നാം കക്ഷി സ്ക്രിപ്റ്റുകൾ” എന്നും അറിയപ്പെടുന്നു) ടോഗിൾ ഓണാക്കുക.", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "ചേഞ്ച് ലോഗ്", @@ -287,6 +291,10 @@ "message": "ഫിൽറ്റർ-നിർമ്മാണ സാൻഡ്ബോക്സ്", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "ഡെവലപ്പർ മോഡ്", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/mr/messages.json b/platform/mv3/extension/_locales/mr/messages.json index 7965783c66430..ad62e720b3cec 100644 --- a/platform/mv3/extension/_locales/mr/messages.json +++ b/platform/mv3/extension/_locales/mr/messages.json @@ -103,6 +103,10 @@ "message": "जोडायच्या फिल्टर यादीचा URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "आयात / निर्यात", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "आयात केलेल्या याद्यांमधील कॉस्मेटिक किंवा स्क्रिप्टलेट फिल्टर लागू करण्यासाठी, तुम्ही uBO Lite ला वापरकर्ता स्क्रिप्ट चालवण्याची परवानगी दिली पाहिजे. तुमच्या ब्राउझरचे विस्तारण पृष्ठ उघडा (Chrome मध्ये chrome://extensions किंवा Firefox मध्ये about:addons), uBO Lite तपशील उघडा, आणि Allow user scripts (ज्याला “unverified third-party scripts” असेही म्हणतात) टॉगल चालू करा.", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "बदल नोंदवही", @@ -287,6 +291,10 @@ "message": "फिल्टर-निर्मिती सँडबॉक्स", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "विकासक मोड", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/ms/messages.json b/platform/mv3/extension/_locales/ms/messages.json index cdfa345542b26..d7f7b71eded14 100644 --- a/platform/mv3/extension/_locales/ms/messages.json +++ b/platform/mv3/extension/_locales/ms/messages.json @@ -103,6 +103,10 @@ "message": "URL senarai penapis untuk ditambah", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Import / Eksport", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Untuk menguatkuasakan penapis kosmetik atau scriptlet daripada senarai yang diimport, anda mesti memberikan kebenaran kepada uBO Lite untuk menjalankan skrip pengguna. Buka halaman sambungan pelayar anda (chrome://extensions dalam Chrome atau about:addons dalam Firefox), buka butiran uBO Lite, dan aktifkan Benarkan skrip pengguna (juga dirujuk sebagai \"skrip pihak ketiga yang tidak disahkan\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Log perubahan", @@ -287,6 +291,10 @@ "message": "Kotak pasir penciptaan penapis", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Mod pembangun", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/nb/messages.json b/platform/mv3/extension/_locales/nb/messages.json index 28651c883442d..7cfb709a0fb00 100644 --- a/platform/mv3/extension/_locales/nb/messages.json +++ b/platform/mv3/extension/_locales/nb/messages.json @@ -103,6 +103,10 @@ "message": "URL of the filter list to add", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importér/Eksportér", "description": "Text label heading the import/export area of custom filters" @@ -112,8 +116,8 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts. Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "message": "Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Endringslogg", @@ -287,6 +291,10 @@ "message": "Filter-creation sandbox", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Utviklermodus", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/nl/messages.json b/platform/mv3/extension/_locales/nl/messages.json index d479b41a55aa3..e3ca1f0be547d 100644 --- a/platform/mv3/extension/_locales/nl/messages.json +++ b/platform/mv3/extension/_locales/nl/messages.json @@ -103,6 +103,10 @@ "message": "URL van de toe te voegen filterlijst", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importeren / Exporteren", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Om cosmetische of scriptletfilters vanuit geïmporteerde lijsten toe te passen, moet u uBO Lite toestemming geven voor het uitvoeren van gebruikersscripts. Open de extensiespagina van uw browser (chrome://extensions in Chrome of about:addons in Firefox), open de details van uBO Lite, en schakel Gebruikersscripts toestaan (ook wel aangeduid als ‘Niet-geverifieerde scripts van derden’) in.", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Wijzigingenlogboek", @@ -287,6 +291,10 @@ "message": "Sandbox voor het aanmaken van filters", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Ontwikkelaarsmodus", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/oc/messages.json b/platform/mv3/extension/_locales/oc/messages.json index 9f2b18c950681..020106137c192 100644 --- a/platform/mv3/extension/_locales/oc/messages.json +++ b/platform/mv3/extension/_locales/oc/messages.json @@ -103,6 +103,10 @@ "message": "URL de la lista de filtres d'apondre", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importar / Exportar", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Per aplicar los filtres cosmetics o scriptlets de las listas importadas, deuatz acordar la permission a uBO Lite d'executar d'scripts utilizaire. Dobrissètz la pagina de las extensions de vòstre navigador (chrome://extensions dins Chrome o about:addons dins Firefox), dobrissètz los detalhs de uBO Lite, e activatz Permetre los scripts utilizaire (tanben nomenats “scripts tèrces pas verificats”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Jornal dels cambiaments", @@ -287,6 +291,10 @@ "message": "Bac de sable de creacion de filtres", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Mòde desvolopaire", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/pa/messages.json b/platform/mv3/extension/_locales/pa/messages.json index f3afec517cd20..4d402ddcd36dc 100644 --- a/platform/mv3/extension/_locales/pa/messages.json +++ b/platform/mv3/extension/_locales/pa/messages.json @@ -103,6 +103,10 @@ "message": "ਜੋੜਨ ਲਈ ਫਿਲਟਰ ਸੂਚੀ ਦਾ URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "ਇੰਪੋਰਟ / ਐਕਸਪੋਰਟ", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "ਆਯਾਤ ਕੀਤੀਆਂ ਸੂਚੀਆਂ ਤੋਂ ਕਾਸਮੈਟਿਕ ਜਾਂ ਸਕ੍ਰਿਪਟਲੈੱਟ ਫਿਲਟਰਾਂ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ uBO Lite ਨੂੰ ਉਪਭੋਗਤਾ ਸਕ੍ਰਿਪਟਾਂ ਚਲਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣੀ ਚਾਹੀਦੀ ਹੈ। ਆਪਣੇ ਬ੍ਰਾਊਜ਼ਰ ਦਾ ਐਕਸਟੈਂਸ਼ਨ ਪੰਨਾ ਖੋਲ੍ਹੋ (chrome://extensions Chrome ਵਿੱਚ ਜਾਂ about:addons Firefox ਵਿੱਚ), uBO Lite ਵੇਰਵੇ ਖੋਲ੍ਹੋ, ਅਤੇ Allow user scripts (ਜਿਸਨੂੰ “ਅਣਪ੍ਰਮਾਣਿਤ ਤੀਜੀ-ਧਿਰ ਸਕ੍ਰਿਪਟਾਂ” ਵੀ ਕਿਹਾ ਜਾਂਦਾ ਹੈ) ਨੂੰ ਚਾਲੂ ਕਰੋ।", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "ਤਬਦੀਲੀ-ਸੂਚੀ", @@ -287,6 +291,10 @@ "message": "ਫਿਲਟਰ-ਨਿਰਮਾਣ ਸੈਂਡਬਾਕਸ", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "ਡਿਵੈਲਪਰ ਮੋਡ", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/pl/messages.json b/platform/mv3/extension/_locales/pl/messages.json index b908c4e88dab7..2de92edc139df 100644 --- a/platform/mv3/extension/_locales/pl/messages.json +++ b/platform/mv3/extension/_locales/pl/messages.json @@ -103,6 +103,10 @@ "message": "Wklej tutaj adres URL listy filtrów, którą chcesz dodać", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Import i eksport", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Aby wymusić filtry kosmetyczne lub skryptletów z importowanych list, musisz przyznać uBO Lite uprawnienia do uruchamiania skryptów użytkownika. Otwórz stronę rozszerzeń przeglądarki (chrome://extensions w Chrome lub about:addons w Firefoksie), otwórz szczegóły uBO Lite i włącz opcję Zezwalaj na skrypty użytkownika (nazywane również „niezweryfikowanymi skryptami zewnętrzymi”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Informacje o wydaniu", @@ -287,6 +291,10 @@ "message": "Piaskownica tworzenia filtrów", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Tryb programisty", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index be9645a88e778..9109b35c559b6 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -103,6 +103,10 @@ "message": "Cole aqui o URL da lista de filtros que quer adicionar", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importação e exportação", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Para aplicar filtros de scriptlet ou cosméticos de listas importadas, você deve conceder ao uBO Lite a permissão para executar scripts de usuário. Abra a página de extensões do seu navegador (chrome://extensions no Chrome ou about:addons no Firefox), abra os detalhes do uBO Lite, e ative Permitir scripts de usuário (também referidos como \"scripts de terceiros não verificados\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Notas de lançamento", @@ -287,6 +291,10 @@ "message": "Ambiente isolado para criação de filtros", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Modo de desenvolvedor", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index ba50475befd8c..08c5f001eb19b 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -103,6 +103,10 @@ "message": "URL da lista de filtros a adicionar", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importar/Exportar", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Para aplicar filtros cosméticos ou scriptlets provenientes de listas importadas, é necessário conceder ao uBO Lite permissão para executar scripts do utilizador. Abra a página de extensões do navegador (chrome://extensions no Chrome ou about:addons no Firefox), abra os detalhes do uBO Lite e ative a opção Permitir scripts do utilizador (também designada por \"scripts de terceiros não verificados\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Registo de alterações", @@ -287,6 +291,10 @@ "message": "Sandbox para criação de filtros", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Modo de programador", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/ro/messages.json b/platform/mv3/extension/_locales/ro/messages.json index 64ad0f008d06e..8443da5b7b00d 100644 --- a/platform/mv3/extension/_locales/ro/messages.json +++ b/platform/mv3/extension/_locales/ro/messages.json @@ -103,6 +103,10 @@ "message": "URL-ul listei de filtre de adăugat", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importă / Exportă", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Pentru a aplica filtrele cosmetice sau de tip scriptlet din listele importate, trebuie să îi acorzi uBO Lite permisiunea de a rula scripturi de utilizator. Deschide pagina de extensii a browserului tău (chrome://extensions în Chrome sau about:addons în Firefox), deschide detaliile uBO Lite și activează opțiunea Permite scripturile de utilizator (numite și „scripturi de la terți neverificate”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Jurnal de modificări", @@ -287,6 +291,10 @@ "message": "Spațiu de testare pentru filtre", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Mod dezvoltator", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/ru/messages.json b/platform/mv3/extension/_locales/ru/messages.json index 47944a9aa664e..7abc9cbc0d3b9 100644 --- a/platform/mv3/extension/_locales/ru/messages.json +++ b/platform/mv3/extension/_locales/ru/messages.json @@ -103,6 +103,10 @@ "message": "URL-адрес списка фильтров для добавления", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Импорт / Экспорт", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Чтобы применять косметические фильтры или скриптлеты из импортированных списков, вы должны предоставить uBO Lite разрешение на запуск пользовательских скриптов. Откройте страницу расширений вашего браузера (chrome://extensions в Chrome или about:addons в Firefox), откройте uBO Lite и включите Разрешить пользовательские скрипты (так называемые «непроверенные сторонние скрипты»).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Список изменений", @@ -287,6 +291,10 @@ "message": "Песочница для создания фильтров", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Режим разработчика", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/si/messages.json b/platform/mv3/extension/_locales/si/messages.json index aadc6f8c404d9..4bda33dd47728 100644 --- a/platform/mv3/extension/_locales/si/messages.json +++ b/platform/mv3/extension/_locales/si/messages.json @@ -103,6 +103,10 @@ "message": "එක් කළ යුතු පෙරහන් ලැයිස්තුවේ URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "ආයාත කරන්න / නිර්යාත කරන්න", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "ආයාත කළ ලැයිස්තු වලින් ආලේපන හෝ ස්ක්‍රිප්ට්ලට් පෙරහන් බලාත්මක කිරීම සඳහා, ඔබ uBO Lite වෙත පරිශීලක ස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීමට අවසර දිය යුතුය. ඔබගේ බ්‍රවුසරයේ දිගු පිටුව විවෘත කරන්න (Chrome හි chrome://extensions හෝ Firefox හි about:addons), uBO Lite විස්තර විවෘත කරන්න, සහ පරිශීලක ස්ක්‍රිප්ට් වලට ඉඩ දෙන්න (එය “සත්‍යාපනය නොකළ තෙවන පාර්ශවීය ස්ක්‍රිප්ට්” ලෙසද හැඳින්වේ) සක්‍රිය කරන්න.", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "වෙනස්කම් සටහන", @@ -287,6 +291,10 @@ "message": "පෙරහන්-නිර්මාණ වැලිපිල්ල", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "සංවර්ධක ප්‍රකාරය", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/sk/messages.json b/platform/mv3/extension/_locales/sk/messages.json index 655147710ace0..110cab9c11ef3 100644 --- a/platform/mv3/extension/_locales/sk/messages.json +++ b/platform/mv3/extension/_locales/sk/messages.json @@ -103,6 +103,10 @@ "message": "Sem vložte URL zoznamu filtrov, ktorý chcete pridať", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Import/export", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Ak chcete vynútiť kozmetické filtre alebo skriptletov z importovaných zoznamov, musíte udeliť rozšíreniu uBO Lite oprávnenie na spúšťanie používateľských skriptov. Otvorte stránku s rozšíreniami v prehliadači (chrome://extensions v prehliadači Chrome alebo about:addons vo Firefoxe), otvorte podrobnosti o uBO Lite a zapnite možnosť Povoliť používateľské skripty (tiež označované ako \"neoverené skripty tretích strán\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Zoznam zmien", @@ -287,6 +291,10 @@ "message": "Sandbox na vytváranie filtrov", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Vývojársky režim", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/sl/messages.json b/platform/mv3/extension/_locales/sl/messages.json index 5c167d011886e..f6b39ba843664 100644 --- a/platform/mv3/extension/_locales/sl/messages.json +++ b/platform/mv3/extension/_locales/sl/messages.json @@ -103,6 +103,10 @@ "message": "URL seznama filtrov za dodajanje", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Uvozi / Izvozi", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Če želite uveljaviti kozmetične ali skriptletne filtre iz uvoženih seznamov, morate podeliti dovoljenje za izvajanje uporabniških skriptov. Odprite stran z razširitvami v brskalniku (chrome://extensions v Chromu ali about:addons v Firefoxu), odprite podrobnosti za uBO Lite in omogočite Dovoli uporabniške skripte (imenovane tudi “nepreverjene skripte tretjih oseb”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Dnevnik sprememb", @@ -287,6 +291,10 @@ "message": "Peskovnik za ustvarjanje filtrov", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Razvojni način", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/so/messages.json b/platform/mv3/extension/_locales/so/messages.json index 0429d89a365f7..c9d4961197d85 100644 --- a/platform/mv3/extension/_locales/so/messages.json +++ b/platform/mv3/extension/_locales/so/messages.json @@ -103,6 +103,10 @@ "message": "URL-ka liiska shaandhada ee la rabo in la daro", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Soo dejinta / Dhoofinta", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Si loo dhaqan geliyo shaandhooyinka qurxinta ama qoraal-yar ee liisaska la soo dejiyay, waa inaad siisaa uBO Lite ogolaansho si ay u waddo qoraallada isticmaalaha. Fur bogga kordhinta biraawsarkaaga (chrome://extensions Chrome ama about:addons Firefox), fur faahfaahinta uBO Lite, oo daawo Oggolow qoraallada isticmaalaha (oo sidoo kale loo yaqaan “qoraallada dhinac-saddexaad ee aan la xaqiijin”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Diiwaanka isbeddelka", @@ -287,6 +291,10 @@ "message": "Sanduuqa ciyaarta ee abuurista shaandhada", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Habka horumariyaha", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index 29ee6a62bae90..34207fe513195 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -103,6 +103,10 @@ "message": "URL e listave të filtrave për të shtuar", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importoj / Eksportoj", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Për të zbatuar filtrat kozmetikë ose skriptesh nga listat e importuara, duhet t'i jepni uBO Lite leje për të ekzekutuar skriptet e përdoruesit. Hapni faqen e zgjerimeve të shfletuesit tuaj (chrome://extensions në Chrome ose about:addons në Firefox), hapni detajet e uBO Lite dhe aktivizoni Lejo skriptet e përdoruesit (të referuara edhe si \"skripte të palëve të treta të paverifikuara\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Ditari i ndryshimeve", @@ -287,6 +291,10 @@ "message": "Ambienti i izoluar për krijimin e filtrave", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Këndi i zhvilluesit", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/sr/messages.json b/platform/mv3/extension/_locales/sr/messages.json index c8782640f6ee8..d13675b265548 100644 --- a/platform/mv3/extension/_locales/sr/messages.json +++ b/platform/mv3/extension/_locales/sr/messages.json @@ -103,6 +103,10 @@ "message": "URL листе филтера коју желите додати", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Увоз / извоз", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Да бисте применили козметичке или скриптлет филтере из увезених листа, морате дати дозволу програму uBO Lite за покретање корисничких скрипти. Отворите страницу са проширењима прегледача (chrome://extensions у Chrome или about:addons у Firefox прегледачу), отворите детаље о uBO Lite и укључите Дозволи корисничке скрипте (такође познате као „неверификоване скрипте трећих страна”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Списак измена", @@ -287,6 +291,10 @@ "message": "Изоловано окружење за креирање филтера", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Режим програмерa", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/sv/messages.json b/platform/mv3/extension/_locales/sv/messages.json index 74cbf54e73c56..3f16565074e84 100644 --- a/platform/mv3/extension/_locales/sv/messages.json +++ b/platform/mv3/extension/_locales/sv/messages.json @@ -103,6 +103,10 @@ "message": "Filterlistans webbadress som ska läggas till", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Importera / Exportera", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "För att tillämpa kosmetiska filter eller scriptlet-filter från importerade listor måste du ge uBO Lite behörighet att köra användarskript. Öppna webbläsarens tilläggssida (chrome://extensions i Chrome eller about:addons i Firefox), öppna uBO Lite detaljer och aktivera Tillåt användarskript (även kallat \"obekräftade tredjepartsskript\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Ändringslogg", @@ -287,6 +291,10 @@ "message": "Sandlåda för filterskapande", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Utvecklarläge", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/sw/messages.json b/platform/mv3/extension/_locales/sw/messages.json index e7ff5912fd3d2..c13f98f71d130 100644 --- a/platform/mv3/extension/_locales/sw/messages.json +++ b/platform/mv3/extension/_locales/sw/messages.json @@ -103,6 +103,10 @@ "message": "URL ya orodha ya vichujio ya kuongeza", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Ingiza / Hamisha", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Ili kutekeleza vichujio vya urembo au scriptlet kutoka kwenye orodha zilizoingizwa, lazima uipe uBO Lite ruhusa ya kuendesha hati za mtumiaji. Fungua ukurasa wa viendelezi vya kivinjari chako (chrome://extensions kwenye Chrome au about:addons kwenye Firefox), fungua maelezo ya uBO Lite, na washa Ruhusu hati za mtumiaji (pia hujulikana kama \"hati zisizoidhinishwa za watu wengine\").", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Rekodi ya mabadiliko", @@ -287,6 +291,10 @@ "message": "Sanduku la mchanga la kuunda vichujio", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Hali ya msanidi programu", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/ta/messages.json b/platform/mv3/extension/_locales/ta/messages.json index 746c14088f0e0..21f51c357f1bd 100644 --- a/platform/mv3/extension/_locales/ta/messages.json +++ b/platform/mv3/extension/_locales/ta/messages.json @@ -103,6 +103,10 @@ "message": "சேர்க்க வேண்டிய வடிப்பான் பட்டியலின் URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "இறக்குமதி / ஏற்றுமதி", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "இறக்குமதி செய்யப்பட்ட பட்டியல்களில் இருந்து அழகியல் அல்லது ஸ்கிரிப்ட்லெட் வடிப்பான்களை செயல்படுத்த, நீங்கள் uBO Lite க்கு பயனர் ஸ்கிரிப்ட்களை இயக்க அனுமதி வழங்க வேண்டும். உங்கள் உலாவியின் நீட்டிப்புகள் பக்கத்தைத் திறக்கவும் (Chrome இல் chrome://extensions அல்லது Firefox இல் about:addons), uBO Lite விவரங்களைத் திறக்கவும், மேலும் பயனர் ஸ்கிரிப்ட்களை அனுமதி (இது “சரிபார்க்கப்படாத மூன்றாம் தரப்பு ஸ்கிரிப்ட்கள்” என்றும் குறிப்பிடப்படுகிறது) என்பதை இயக்கவும்.", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "மாற்றப்பதிவேடு", @@ -287,6 +291,10 @@ "message": "வடிப்பான் உருவாக்கும் மணல் பெட்டி (sandbox)", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "டெவலப்பர் முறை", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/te/messages.json b/platform/mv3/extension/_locales/te/messages.json index e147042ad8b65..e25460e43b7d9 100644 --- a/platform/mv3/extension/_locales/te/messages.json +++ b/platform/mv3/extension/_locales/te/messages.json @@ -103,6 +103,10 @@ "message": "జోడించవలసిన ఫిల్టర్ జాబితా యొక్క URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "దిగుమతి / ఎగుమతి", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "దిగుమతి చేసిన జాబితాల నుండి కాస్మెటిక్ లేదా స్క్రిప్ట్‌లెట్ ఫిల్టర్లను అమలు చేయడానికి, మీరు uBO Liteకి యూజర్ స్క్రిప్ట్‌లను అమలు చేసే అనుమతిని ఇవ్వాలి. మీ బ్రౌజర్ యొక్క ఎక్స్‌టెన్షన్ పేజీని తెరవండి (chrome://extensions Chromeలో లేదా about:addons Firefoxలో), uBO Lite వివరాలను తెరవండి, మరియు Allow user scripts (లేదా “unverified third-party scripts” అని కూడా పిలుస్తారు) టోగుల్ చేయండి.", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "మార్పుల చరిత్ర", @@ -287,6 +291,10 @@ "message": "ఫిల్టర్-సృష్టి శాండ్‌బాక్స్", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "డెవలపర్ మోడ్", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/th/messages.json b/platform/mv3/extension/_locales/th/messages.json index 9764514048469..f1e107bf9d26c 100644 --- a/platform/mv3/extension/_locales/th/messages.json +++ b/platform/mv3/extension/_locales/th/messages.json @@ -103,6 +103,10 @@ "message": "URL of the filter list to add", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "นำเข้า / ส่งออก", "description": "Text label heading the import/export area of custom filters" @@ -112,8 +116,8 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts. Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "message": "Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "บันทึการเปลี่ยนแปลง", @@ -287,6 +291,10 @@ "message": "Filter-creation sandbox", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "โหมดนักพัฒนา", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/tr/messages.json b/platform/mv3/extension/_locales/tr/messages.json index f4b213fa32915..ce062e1265eb9 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -103,6 +103,10 @@ "message": "Eklenecek filtre listesinin URL'sini buraya yapıştırın", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "İçeri/Dışarı aktar", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "İçeri aktarılmış listelerdeki kozmetik veya kod filtrelerini uygulamak için uBO Lite'a kullanıcı komut dosyalarını çalıştırma izni vermeniz gerekir. İzni vermek için tarayıcınızın uzantılar sayfasını açın (Chrome için:chrome://extensions Firefox için:about:addons), uBO Lite'ın ayrıntılar sayfasına tıklayın ve Kullanıcı komut dosyalarına izin ver seçeneğine tıklayın (\"doğrulanmamış 3. parti komutlar\" olarak da adlandırılabilir).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Değişiklik günlüğü", @@ -287,6 +291,10 @@ "message": "Filtre oluşturma alanı", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Geliştirici modu", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index a17cb6b0a45b8..cbea1be7343fa 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -103,6 +103,10 @@ "message": "Вставте сюди URL-адресу списку фільтрів, який потрібно додати", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Імпорт / Експорт", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Щоб застосувати косметичні фільтри або фільтри на основі скриптів із імпортованих списків, необхідно надати uBO Lite дозвіл на виконання користувацьких скриптів. Відкрийте сторінку розширень у браузері (chrome://extensions у Chrome або about:addons у Firefox), перейдіть до детальної інформації про uBO Lite та увімкніть опцію «Дозволити користувацькі скрипти» (також відомі як «неперевірені сторонні скрипти»).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Журнал змін", @@ -287,6 +291,10 @@ "message": "Пісочниця створення фільтру", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Режим розробника", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/ur/messages.json b/platform/mv3/extension/_locales/ur/messages.json index 7525c0c00c7b5..24f0abfed2136 100644 --- a/platform/mv3/extension/_locales/ur/messages.json +++ b/platform/mv3/extension/_locales/ur/messages.json @@ -103,6 +103,10 @@ "message": "شامل کرنے کے لیے فلٹر لسٹ کا URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "درآمد / برآمد", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "درآمد شدہ فہرستوں سے کاسمیٹک یا اسکرپٹلیٹ فلٹرز کو نافذ کرنے کے لیے، آپ کو uBO Lite کو صارف اسکرپٹس چلانے کی اجازت دینی ہوگی۔ اپنے براؤزر کے ایکسٹینشنز پیج (chrome://extensions Chrome میں یا about:addons Firefox میں) کو کھولیں، uBO Lite کی تفصیلات کھولیں، اور Allow user scripts کو آن کریں (جسے “unverified third-party scripts” بھی کہا جاتا ہے)۔", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "چینج لاگ", @@ -287,6 +291,10 @@ "message": "فلٹر تخلیق سینڈ باکس", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "ڈویلپر موڈ", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/vi/messages.json b/platform/mv3/extension/_locales/vi/messages.json index 5bfe537e8595a..fc2ecee6aa666 100644 --- a/platform/mv3/extension/_locales/vi/messages.json +++ b/platform/mv3/extension/_locales/vi/messages.json @@ -103,6 +103,10 @@ "message": "URL của danh sách bộ lọc cần thêm", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "Nhập / Xuất", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "Để áp dụng các bộ lọc giao diện hoặc tập lệnh từ danh sách đã nhập, bạn phải cấp quyền cho uBO Lite chạy các tập lệnh người dùng. Mở trang tiện ích mở rộng của trình duyệt (chrome://extensions trong Chrome hoặc about:addons trong Firefox), mở chi tiết uBO Lite và bật Cho phép tập lệnh người dùng (còn được gọi là “tập lệnh của bên thứ ba chưa được xác minh”).", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "Nhật ký thay đổi", @@ -287,6 +291,10 @@ "message": "Hộp thử nghiệm tạo bộ lọc", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "Chế độ nhà phát triển", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/zh_CN/messages.json b/platform/mv3/extension/_locales/zh_CN/messages.json index 431365f7eafad..309342e090505 100644 --- a/platform/mv3/extension/_locales/zh_CN/messages.json +++ b/platform/mv3/extension/_locales/zh_CN/messages.json @@ -103,6 +103,10 @@ "message": "在此处粘贴要添加的过滤列表的 URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "导入/导出", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "要强制执行来自导入列表的元素或脚本过滤规则,您必须授予 uBO Lite 运行用户脚本的权限。打开浏览器的扩展页面(Chrome 中为 chrome://extensions,Firefox 中为 about:addons),打开 uBO Lite 详情,然后开启 允许用户脚本(也称为“未经验证的第三方脚本”)。", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "更新日志", @@ -287,6 +291,10 @@ "message": "过滤器创建沙盒", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "开发者模式", "description": "Label for a checkbox in the options page" diff --git a/platform/mv3/extension/_locales/zh_TW/messages.json b/platform/mv3/extension/_locales/zh_TW/messages.json index a871020370b3e..dcf3aaf468ebd 100644 --- a/platform/mv3/extension/_locales/zh_TW/messages.json +++ b/platform/mv3/extension/_locales/zh_TW/messages.json @@ -103,6 +103,10 @@ "message": "要添加的過濾清單url", "description": "Placeholder text which describes the purpose of the textarea widget" }, + "customListImportUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "customFiltersImportExportLabel": { "message": "匯入 / 匯出", "description": "Text label heading the import/export area of custom filters" @@ -113,7 +117,7 @@ }, "userScriptsInfo": { "message": "若要在已匯入清單套用外觀或 Scriptlet 過濾規則,您必須授予 uBO Lite 執行使用者腳本的權限。請開啟瀏覽器的擴充功能頁面(Chrome 中輸入 chrome://extensions,Firefox 中輸入 about:addons),開啟 uBO Lite 的詳細資料,並啟用允許使用者腳本(亦稱為『未經驗證的第三方腳本』)。", - "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { "message": "變更日誌", @@ -287,6 +291,10 @@ "message": "篩選規則建立沙盒", "description": "Header for filter-creation section in the dashboard" }, + "sandboxEditorUserScriptsInfo": { + "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" + }, "developerModeLabel": { "message": "開發人員模式", "description": "Label for a checkbox in the options page" From a873fd2b290461cb6efffe6e67ac7dc1fbde21e2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 8 Aug 2026 14:15:08 -0400 Subject: [PATCH 012/145] [mv3] Patch `removeParams` rules with `main_frame` & `initiatorDomains` properties Related discussion: https://github.com/uBlockOrigin/uBOL-home/discussions/736 --- .../extension/js/offscreen/compile-filters.js | 7 +-- platform/mv3/extension/js/ubo-parser.js | 51 +++++++++++++++++-- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/platform/mv3/extension/js/offscreen/compile-filters.js b/platform/mv3/extension/js/offscreen/compile-filters.js index 96b825f9eac0a..af2bb5a92f0dc 100644 --- a/platform/mv3/extension/js/offscreen/compile-filters.js +++ b/platform/mv3/extension/js/offscreen/compile-filters.js @@ -197,11 +197,8 @@ export function compileFilters(listid, text, context = {}) { } if ( parser.isNetworkFilter() ) { filterStats.total += 1; - const rule = parseNetworkFilter(parser, { - resourceTypes, - }); - if ( rule ) { - unminimizedRules.push(rule); + const result = parseNetworkFilter(parser, { resourceTypes }, unminimizedRules); + if ( result ) { filterStats.accepted += 1; } else { filterStats.rejected += 1; diff --git a/platform/mv3/extension/js/ubo-parser.js b/platform/mv3/extension/js/ubo-parser.js index a85566424c3c2..f1500b0b87f8d 100644 --- a/platform/mv3/extension/js/ubo-parser.js +++ b/platform/mv3/extension/js/ubo-parser.js @@ -306,6 +306,45 @@ function dropEntities(rule, prop) { /******************************************************************************/ +function convertInitiatorDomainsToRequestDomains(rule) { + if ( rule.condition.initiatorDomains ) { + rule.condition.requestDomains ??= []; + rule.condition.requestDomains = [ + ...rule.condition.requestDomains, + ...rule.condition.initiatorDomains, + ]; + delete rule.condition.initiatorDomains; + } + if ( rule.condition.excludedInitiatorDomains ) { + rule.condition.excludedRequestDomains ??= []; + rule.condition.excludedRequestDomains = [ + ...rule.condition.excludedRequestDomains, + ...rule.condition.excludedInitiatorDomains, + ]; + delete rule.condition.excludedInitiatorDomains; + } +} + +/******************************************************************************/ + +// https://github.com/uBlockOrigin/uBOL-home/discussions/736 + +function expandRemoveparamsRule(rule0, out) { + if ( Boolean(rule0.condition.resourceTypes?.includes('main_frame')) === false ) { return; } + if ( rule0.condition.initiatorDomains === undefined ) { return; } + if ( rule0.condition.resourceTypes.length === 1 ) { + convertInitiatorDomainsToRequestDomains(rule0); + return; + } + const rule1 = structuredClone(rule0); + rule0.condition.resourceTypes = rule0.condition.resourceTypes.filter(a => a !== 'main_frame'); + rule1.condition.resourceTypes = [ 'main_frame' ]; + convertInitiatorDomainsToRequestDomains(rule1); + out.push(rule1); +} + +/******************************************************************************/ + export function validateRules(rules) { const out = []; for ( const rule of rules ) { @@ -343,7 +382,7 @@ export function validateRules(rules) { // Block important: 40 // Redirect important: 41-49 -export function parseNetworkFilter(parser, details = {}) { +export function parseNetworkFilter(parser, details = {}, out = []) { if ( parser.isNetworkFilter() === false ) { return; } if ( parser.hasError() ) { return; } @@ -714,7 +753,11 @@ export function parseNetworkFilter(parser, details = {}) { if ( priority !== 1 ) { rule.priority = priority; } - return rule; + out.push(rule); + if ( rule.action.redirect?.transform?.queryTransform?.removeParams ) { + expandRemoveparamsRule(rule, out); + } + return out; } /******************************************************************************/ @@ -729,9 +772,7 @@ export function parseFilters(text, details) { for ( const line of lines ) { parser.parse(line); if ( parser.isNetworkFilter() === false ) { continue; } - const rule = parseNetworkFilter(parser, details); - if ( rule === undefined ) { continue; } - rules.push(rule); + parseNetworkFilter(parser, details, rules); } rules = minimizeRuleset(rules); rules = minimizeRules(rules); From 6bc5ee892d7b135d1d230d658520c46ab2cbb2e8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 8 Aug 2026 17:28:29 -0400 Subject: [PATCH 013/145] [mv3] Patch removeParams rules with main_frame & initiatorDomains properties For stock rulesets. Related discussion: https://github.com/uBlockOrigin/uBOL-home/discussions/736 --- platform/mv3/extension/js/ubo-parser.js | 2 +- platform/mv3/make-rulesets.js | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/platform/mv3/extension/js/ubo-parser.js b/platform/mv3/extension/js/ubo-parser.js index f1500b0b87f8d..27314c2f4c8ab 100644 --- a/platform/mv3/extension/js/ubo-parser.js +++ b/platform/mv3/extension/js/ubo-parser.js @@ -329,7 +329,7 @@ function convertInitiatorDomainsToRequestDomains(rule) { // https://github.com/uBlockOrigin/uBOL-home/discussions/736 -function expandRemoveparamsRule(rule0, out) { +export function expandRemoveparamsRule(rule0, out) { if ( Boolean(rule0.condition.resourceTypes?.includes('main_frame')) === false ) { return; } if ( rule0.condition.initiatorDomains === undefined ) { return; } if ( rule0.condition.resourceTypes.length === 1 ) { diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index 7463a744c1925..c6a4037849b47 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -31,6 +31,10 @@ import { dnrRulesetFromRawLists, mergeRules, } from './js/static-dnr-filtering.js'; +import { + expandRemoveparamsRule, + minimizeRuleset, +} from './js/ubo-parser.js'; import { execSync } from 'node:child_process'; import { fetchList } from './js/offscreen/fetch-list.js'; @@ -38,7 +42,6 @@ import fs from 'fs/promises'; import { hostnameCompare } from './js/offscreen/make-utils.js'; import { literalStrFromRegex } from './js/offscreen/regex-analyzer.js'; import { makeCosmeticScripts } from './js/offscreen/make-cosmetic-filters.js'; -import { minimizeRuleset } from './js/ubo-parser.js'; import path from 'path'; import process from 'process'; import redirectResourcesMap from './js/redirect-resources.js'; @@ -590,6 +593,13 @@ async function processDnrRules(assetDetails, network, dnrRules) { ); }); + // Patch removeParams rules as needed + for ( const rule of staticRules ) { + if ( rule.action.redirect?.transform?.queryTransform?.removeParams ) { + expandRemoveparamsRule(rule, staticRules); + } + } + // Minimize rulesets const minimizedStaticRuleset = minimizeRuleset(staticRules); log(`\tStatic rules (raw/minimized): ${staticRules.length}/${minimizedStaticRuleset.length}`); From 9f4f7ab058bda3d1cb19d13a4b123bf28962cd2d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 9 Aug 2026 10:13:29 -0400 Subject: [PATCH 014/145] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/bg/messages.json | 4 +-- .../mv3/extension/_locales/ca/messages.json | 4 +-- .../mv3/extension/_locales/da/messages.json | 6 ++-- .../mv3/extension/_locales/de/messages.json | 4 +-- .../mv3/extension/_locales/el/messages.json | 6 ++-- .../mv3/extension/_locales/es/messages.json | 4 +-- .../mv3/extension/_locales/fi/messages.json | 6 ++-- .../mv3/extension/_locales/fr/messages.json | 6 ++-- .../mv3/extension/_locales/hr/messages.json | 4 +-- .../mv3/extension/_locales/it/messages.json | 4 +-- .../mv3/extension/_locales/ja/messages.json | 6 ++-- .../mv3/extension/_locales/ko/messages.json | 10 +++---- .../mv3/extension/_locales/nl/messages.json | 6 ++-- .../mv3/extension/_locales/pl/messages.json | 4 +-- .../extension/_locales/pt_BR/messages.json | 4 +-- .../extension/_locales/pt_PT/messages.json | 10 +++---- .../mv3/extension/_locales/ru/messages.json | 4 +-- .../mv3/extension/_locales/sk/messages.json | 4 +-- .../mv3/extension/_locales/sr/messages.json | 6 ++-- .../mv3/extension/_locales/sv/messages.json | 6 ++-- .../mv3/extension/_locales/vi/messages.json | 4 +-- src/_locales/ko/messages.json | 30 +++++++++---------- src/_locales/sr/messages.json | 2 +- 23 files changed, 72 insertions(+), 72 deletions(-) diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index 57e0d5994546e..4c43d7a5424e8 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "За да приложите козметични филтри или скриптови филтри от импортирани списъци, трябва да предоставите на uBO Lite разрешение за изпълнение на потребителски скриптове.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "За да активирате козметични филтри или скриптлет филтри от пясъчника, трябва да предоставите на uBO Lite разрешение за изпълнение на потребителски скриптове.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/ca/messages.json b/platform/mv3/extension/_locales/ca/messages.json index 1bd0d79bb06c9..5c2b7af69d4c2 100644 --- a/platform/mv3/extension/_locales/ca/messages.json +++ b/platform/mv3/extension/_locales/ca/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Per aplicar filtres cosmètics o d'scriptlets a les llistes importades, heu de concedir permís a l'uBO Lite per executar scripts d'usuari.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Per aplicar filtres cosmètics o d'scriptlets des de l'entorn de proves, heu de concedir permís a l'uBO Lite per executar scripts d'usuari.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/da/messages.json b/platform/mv3/extension/_locales/da/messages.json index de142fa7119d6..3d48be14e2aa0 100644 --- a/platform/mv3/extension/_locales/da/messages.json +++ b/platform/mv3/extension/_locales/da/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "For at håndhæve kosmetiske eller scriptlets-filtre fra importerede lister skal uBlock gives tilladelse til at afvikle bruger-scripts.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "For at håndhæve kosmetiske eller scriptlet-filtre fra importerede lister, giv uBO Lite tilladelse til at eksekvere brugerscripts. Åbn webbrowserens udvidelsesside (chrome://extensions i Chrome eller about:addons i Firefox), åbn uBO Lite-detaljerne og slå Tillad brugerscripts til (også kaldet \"ubekræftede tredjepartsscripts\").", + "message": "Åbn webbrowserens udvidelsesside (chrome://extensions i Chrome eller Om:tilføjelser i Firefox), åbn uBO Lite-detaljerne, og slå Tillad bruger-scripts til (også kaldet “ubekræftede tredjeparts-scripts”).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "For at håndhæve kosmetiske eller scriptlets-filtre fra sandkasse skal uBlock gives tilladelse til at afvikle bruger-scripts.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index 1c0a1cfc9f17e..5add2e2f300d7 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Um kosmetische Filter oder Scriptlet-Filter aus importierten Listen anzuwenden, benötigt uBO Lite die Berechtigung zum Ausführen von Nutzerscripts.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Um kosmetische Filter oder Scriptlet-Filter aus der Sandbox anzuwenden, benötigt uBO Lite die Berechtigung zum Ausführen von Nutzerscripts.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index f801094f24b31..1fce55230f9ff 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Για να επιβάλετε φίλτρα μορφοποίησης ή σεναρίων από εισαγόμενες λίστες, πρέπει να δώσετε άδεια εκτέλεσης σεναρίων χρήστη στο uBO Lite.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -288,11 +288,11 @@ "description": "Short description for a checkbox in the options page" }, "sandboxEditorLabel": { - "message": "Αμμοδοχείο δημιουργίας φίλτρων", + "message": "Περιβάλλον προστατευμένης εκτέλεσης για δημιουργία φίλτρων", "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Για να επιβάλετε φίλτρα μορφοποίησης ή σεναρίων από το περιβάλλον προστατευμένης εκτέλεσης, πρέπει να δώσετε άδεια εκτέλεσης σεναρίων χρήστη στο uBO Lite.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 3fc5ebdbed016..2421a03f8ec9c 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Para hacer respetar los filtros cosméticos o de scripts a partir de listas importadas, debes otorgar a uBO Lite permiso para ejecutar scripts de usuario.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Para hacer respetar los filtros cosméticos o de scripts desde el entorno aislado, debes otorgar a uBO Lite permiso para ejecutar scripts de usuario.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/fi/messages.json b/platform/mv3/extension/_locales/fi/messages.json index 59af84332cb8c..b0822be4598b6 100644 --- a/platform/mv3/extension/_locales/fi/messages.json +++ b/platform/mv3/extension/_locales/fi/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Tuotujen listojen kosmeetisten ja scriplet‑suodattimien käyttämiseksi, on uBO Litelle myönnettävä oikeus suorittaa käyttäjäskriptejä.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Tuotujen listojen kosmeetisten ja scriplet‑suodattimien käyttämiseksi, on uBO Litelle myönnettävä oikeus suorittaa käyttäjäskriptejä. Avaa selaimesi laajennussivu (chrome://extensions Chromessa, about:addons Firefoxissa), valitse uBO Lite ‑laajennuksen tiedot ja aktivoi käyttöoikeus Salli käyttäjäskriptit (Chrome) tai Salli vahvistamattomien kolmannen osapuolen komentosarjojen pääsy tietoihisi (Firefox).", + "message": "Avaa selaimesi laajennussivu (chrome://extensions Chromessa, about:addons Firefoxissa), valitse uBO Liten tiedot ja aktivoi käyttöoikeus Salli käyttäjäskriptit tai Salli vahvistamattomien kolmannen osapuolen komentosarjojen pääsy tietoihisi.", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Vapaan suodatinluonnin kosmeetisten ja scriplet‑suodattimien käyttämiseksi, on uBO Litelle myönnettävä oikeus suorittaa käyttäjäskriptejä.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/fr/messages.json b/platform/mv3/extension/_locales/fr/messages.json index d5a7ef3b7cb24..ae9e77634c3a6 100644 --- a/platform/mv3/extension/_locales/fr/messages.json +++ b/platform/mv3/extension/_locales/fr/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Pour appliquer les filtres cosmétiques / scriptlets depuis les listes importées, vous devez accorder à uBO Lite la permission d'exécuter des scripts utilisateurs.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Pour forcer les filtres cosmétiques ou de type scriptlet présents dans les listes importées, vous devez accorder à uBO Lite la permission d'exécuter des scripts utilisateurs. Ouvrez la page des extensions de votre navigateur (chrome://extensions dans Chrome, ou about:addons dans Firefox), ouvrez la page des détails d'uBO Lite, et activez l'option Autoriser les scripts utilisateurs (aussi appelés \"scripts tiers non-vérifiés\").", + "message": "Ouvrez la page des extensions de votre navigateur (chrome://extensions dans Chrome, ou about:addons dans Firefox), ouvrez la page des détails d'uBO Lite, et activez l'option Autoriser les scripts utilisateurs (aussi appelés \"scripts tiers non-vérifiés\").", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Pour appliquer les filtres cosmétiques / scriptlets depuis le bac à sable, vous devez accorder à uBO Lite la permission d'exécuter des scripts utilisateurs.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/hr/messages.json b/platform/mv3/extension/_locales/hr/messages.json index e553fed83dcdf..d4f8d68fd761e 100644 --- a/platform/mv3/extension/_locales/hr/messages.json +++ b/platform/mv3/extension/_locales/hr/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Za primjenu kozmetičkih ili skriptlet filtera iz uvezenih popisa, morate dati uBO Lite dopuštenje za pokretanje korisničkih skripti.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Za primjenu kozmetičkih ili skriptlet filtera iz sandboxa, morate dati uBO Lite dopuštenje za pokretanje korisničkih skripti.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index 41bfbc8cdabb2..a81d6c5772b47 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Per applicare i filtri cosmetici o gli scriptlet provenienti da elenchi importati, è necessario concedere a uBO Lite l'autorizzazione a eseguire gli script utente.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Per applicare i filtri cosmetici o gli scriptlet dalla sandbox, è necessario concedere a uBO Lite l'autorizzazione a eseguire gli script utente.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/ja/messages.json b/platform/mv3/extension/_locales/ja/messages.json index 9b55f26ec0863..46027f2590cf4 100644 --- a/platform/mv3/extension/_locales/ja/messages.json +++ b/platform/mv3/extension/_locales/ja/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "インポートしたリストの整形・スクリプトレットフィルターを適用するには、uBO Lite にユーザースクリプトの実行を許可する必要があります。", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -112,7 +112,7 @@ "description": "Text label heading the import/export area of custom filters" }, "customFiltersImportTextareaPlaceholder": { - "message": "ここに追加したいコスメティックフィルターをペースト", + "message": "ここに追加したい整形・スクリプトレットフィルターを貼り付け", "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "サンドボックスから整形・スクリプトレットフィルターを適用するには、uBO Lite にユーザースクリプトの実行を許可する必要があります。", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/ko/messages.json b/platform/mv3/extension/_locales/ko/messages.json index 6c2c0640b0cbf..c615d201348bf 100644 --- a/platform/mv3/extension/_locales/ko/messages.json +++ b/platform/mv3/extension/_locales/ko/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "가져온 목록의 요소 숨김 및 스크립트 주입 필터를 적용하려면 uBO Lite에 사용자 스크립트 실행 권한을 허용해야 합니다.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "샌드박스 요소 숨김 및 스크립트 주입 필터를 적용하려면 uBO Lite에 사용자 스크립트 실행 권한을 허용해야 합니다.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { @@ -356,11 +356,11 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "숨길 요소 선택하기", + "message": "요소 제거하기", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { - "message": "숨길 요소 선택 종료하기", + "message": "요소 제거 모드 종료", "description": "Tooltip for the button used to exit zapper mode" }, "pickerTipEnter": { @@ -432,7 +432,7 @@ "description": "Message asking user to confirm reset to default settings" }, "dnrRulesWarning": { - "message": "신뢰할 수 없는 출처의 콘텐츠를 추가하지 마십시오", + "message": "신뢰할 수 없는 출처의 콘텐츠는 추가하지 마세요", "description": "Short description of the DNR rules editor pane" }, "dnrRulesCountInfo": { diff --git a/platform/mv3/extension/_locales/nl/messages.json b/platform/mv3/extension/_locales/nl/messages.json index e3ca1f0be547d..37fc31c631a90 100644 --- a/platform/mv3/extension/_locales/nl/messages.json +++ b/platform/mv3/extension/_locales/nl/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Om cosmetische of scriptletfilters vanuit geïmporteerde lijsten toe te passen, moet u uBO Lite toestemming geven voor het uitvoeren van gebruikersscripts.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Om cosmetische of scriptletfilters vanuit geïmporteerde lijsten toe te passen, moet u uBO Lite toestemming geven voor het uitvoeren van gebruikersscripts. Open de extensiespagina van uw browser (chrome://extensions in Chrome of about:addons in Firefox), open de details van uBO Lite, en schakel Gebruikersscripts toestaan (ook wel aangeduid als ‘Niet-geverifieerde scripts van derden’) in.", + "message": "Open de extensiespagina van uw browser (chrome://extensions in Chrome of about:addons in Firefox), open de details van uBO Lite, en schakel Gebruikersscripts toestaan (ook wel aangeduid als ‘Niet-geverifieerde scripts van derden’) in.", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Om cosmetische of scriptletfilters vanuit de sandbox toe te passen, moet u uBO Lite toestemming geven voor het uitvoeren van gebruikersscripts.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/pl/messages.json b/platform/mv3/extension/_locales/pl/messages.json index 2de92edc139df..e38cfd3d8cb98 100644 --- a/platform/mv3/extension/_locales/pl/messages.json +++ b/platform/mv3/extension/_locales/pl/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Aby wymusić stosowanie filtrów kosmetycznych lub skryptletów z importowanych list, należy przyznać uBO Lite uprawnienie do uruchamiania skryptów użytkownika.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Aby wymusić stosowanie filtrów kosmetycznych lub skryptletów z piaskownicy, należy przyznać uBO Lite uprawnienie do uruchamiania skryptów użytkownika.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index 9109b35c559b6..665599c481644 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Para aplicar os filtros cosméticos e de scripts das listas importadas, você deve conceder ao uBO Lite a permissão de executar scripts do usuário.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Para aplicar os filtros cosméticos e de scripts dentro da sandbox, você deve conceder ao uBO Lite a permissão de executar scripts do usuário.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index 08c5f001eb19b..204d41a2ca132 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -36,7 +36,7 @@ "description": "Link to privacy policy on GitHub (English)" }, "aboutDocumentation": { - "message": "Documentation", + "message": "Documentação", "description": "Link to documentation in About pane" }, "popupFilteringModeLabel": { @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Para aplicar filtros cosméticos ou de scriptlet provenientes de listas importadas, tem de conceder ao uBO Lite permissão para executar scripts do utilizador.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -112,11 +112,11 @@ "description": "Text label heading the import/export area of custom filters" }, "customFiltersImportTextareaPlaceholder": { - "message": "Filtros cosméticos/scriptlets específicos a adicionar", + "message": "Filtros cosméticos/de scriptlet específicos a adicionar", "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Para aplicar filtros cosméticos ou scriptlets provenientes de listas importadas, é necessário conceder ao uBO Lite permissão para executar scripts do utilizador. Abra a página de extensões do navegador (chrome://extensions no Chrome ou about:addons no Firefox), abra os detalhes do uBO Lite e ative a opção Permitir scripts do utilizador (também designada por \"scripts de terceiros não verificados\").", + "message": "Abra a página de extensões do seu navegador (chrome://extensions no Chrome ou about:addons no Firefox), abra os detalhes do uBO Lite e ative a opção Permitir scripts do utilizador (também designada por \"scripts de terceiros não verificados\").", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Para aplicar filtros cosméticos ou de scriptlet provenientes da sandbox, tem de conceder ao uBO Lite permissão para executar scripts do utilizador.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/ru/messages.json b/platform/mv3/extension/_locales/ru/messages.json index 7abc9cbc0d3b9..3c39942c527bc 100644 --- a/platform/mv3/extension/_locales/ru/messages.json +++ b/platform/mv3/extension/_locales/ru/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Чтобы применять косметические фильтры или скриптлеты из импортированных списков, необходимо предоставить uBO Lite разрешение на выполнение пользовательских скриптов.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Чтобы применять косметические фильтры или скриптлеты из песочницы, необходимо предоставить uBO Lite разрешение на выполнение пользовательских скриптов.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/sk/messages.json b/platform/mv3/extension/_locales/sk/messages.json index 110cab9c11ef3..ebfb59ec96e84 100644 --- a/platform/mv3/extension/_locales/sk/messages.json +++ b/platform/mv3/extension/_locales/sk/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Ak chcete uplatniť kozmetické filtre alebo scriptlety z importovaných zoznamov, musíte udeliť uBO Lite oprávnenie na spúšťanie používateľských skriptov.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Ak chcete uplatniť kozmetické filtre alebo scriptlety zo sandboxu, musíte udeliť uBO Lite oprávnenie na spúšťanie používateľských skriptov.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/sr/messages.json b/platform/mv3/extension/_locales/sr/messages.json index d13675b265548..88c997e31061c 100644 --- a/platform/mv3/extension/_locales/sr/messages.json +++ b/platform/mv3/extension/_locales/sr/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "За примену козметичких или скриптлет филтера из увезених листа, морате дати дозволу програму uBO Lite за покретање корисничких скрипти.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Да бисте применили козметичке или скриптлет филтере из увезених листа, морате дати дозволу програму uBO Lite за покретање корисничких скрипти. Отворите страницу са проширењима прегледача (chrome://extensions у Chrome или about:addons у Firefox прегледачу), отворите детаље о uBO Lite и укључите Дозволи корисничке скрипте (такође познате као „неверификоване скрипте трећих страна”).", + "message": "Отворите страницу проширења (chrome://extensions у Chrome или about:addons у Firefox прегледачу), отворите детаље о uBO Lite и укључите Дозволи корисничке скрипте (такође познате као „неверификоване скрипте трећих страна”).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "За примену козметичких или скриптлет филтера из изолованог окружења, морате дати дозволу програм uBO Lite за покретање корисничких скрипти.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/sv/messages.json b/platform/mv3/extension/_locales/sv/messages.json index 3f16565074e84..e9bb43ec4f6b0 100644 --- a/platform/mv3/extension/_locales/sv/messages.json +++ b/platform/mv3/extension/_locales/sv/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "För att tillämpa kosmetiska filter eller skriptfilter från importerade listor måste du ge uBO Lite behörighet att köra användarskript.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "För att tillämpa kosmetiska filter eller scriptlet-filter från importerade listor måste du ge uBO Lite behörighet att köra användarskript. Öppna webbläsarens tilläggssida (chrome://extensions i Chrome eller about:addons i Firefox), öppna uBO Lite detaljer och aktivera Tillåt användarskript (även kallat \"obekräftade tredjepartsskript\").", + "message": "Öppna webbläsarens tilläggssida (chrome://extensions i Chrome eller about:addons i Firefox), öppna uBO Lite detaljer och aktivera Tillåt användarskript (även kallade \"obekräftade tredjepartsskript\").", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "För att tillämpa kosmetiska filter eller skriptfilter från sandlådan måste du ge uBO Lite behörighet att köra användarskript.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/vi/messages.json b/platform/mv3/extension/_locales/vi/messages.json index fc2ecee6aa666..eb111095d31e0 100644 --- a/platform/mv3/extension/_locales/vi/messages.json +++ b/platform/mv3/extension/_locales/vi/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Để áp dụng các bộ lọc trong danh sách đã nhập, bạn phải cấp cho uBO Lite quyền thực thi 'các tập lệnh người dùng'.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Để áp dụng các bộ lọc trong hộp thử nghiệm, bạn phải cấp cho uBO Lite quyền thực thi 'các tập lệnh người dùng'.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/src/_locales/ko/messages.json b/src/_locales/ko/messages.json index afb791f1f0536..7a41435e84bdd 100644 --- a/src/_locales/ko/messages.json +++ b/src/_locales/ko/messages.json @@ -76,7 +76,7 @@ "description": "Message to be read by screen readers" }, "popupPowerSwitchInfo2": { - "message": "클릭하여 이 사이트에서 uBlock₀ 을 켭니다.", + "message": "클릭하여 이 사이트에서 uBlock₀을 켭니다.", "description": "Message to be read by screen readers" }, "popupBlockedRequestPrompt": { @@ -116,11 +116,11 @@ "description": "English: Click to open the dashboard" }, "popupTipZapper": { - "message": "구성 요소 선택기 모드로 진입", + "message": "요소 제거기 모드 진입", "description": "Tooltip for the element-zapper icon in the popup panel" }, "popupTipPicker": { - "message": "구성 요소 선택기 모드로 진입", + "message": "요소 선택기 모드 진입", "description": "English: Enter element picker mode" }, "popupTipLog": { @@ -144,15 +144,15 @@ "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoLargeMedia": { - "message": "이 사이트에서만 적용되는 대용량 미디어 요소 차단 기능을 켜고 끕니다", + "message": "이 사이트에서 적용되는 대용량 미디어 요소 차단 기능 토글", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia1": { - "message": "클릭하여 이 사이트에서 대용량 미디어를 차단합니다", + "message": "클릭하여 이 사이트에서 대용량 미디어 요소를 차단합니다", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia2": { - "message": "클릭하여 이 사이트에서 대용량 미디어 차단을 해제합니다", + "message": "클릭하여 이 사이트에서 대용량 미디어 요소 차단을 해제합니다", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoCosmeticFiltering": { @@ -312,11 +312,11 @@ "description": "English: Click, Ctrl-click" }, "pickerContextMenuEntry": { - "message": "구성 요소 차단", + "message": "요소 차단…", "description": "An entry in the browser's contextual menu" }, "settingsCollapseBlockedPrompt": { - "message": "차단된 요소의 자리 감추기", + "message": "차단된 요소의 공간 숨기기", "description": "English: Hide placeholders of blocked elements" }, "settingsIconBadgePrompt": { @@ -380,7 +380,7 @@ "description": "" }, "settingsNoLargeMediaPrompt": { - "message": "{{input:number}} KB 보다 큰 미디어 구성요소 차단", + "message": "{{input}} KB보다 큰 미디어 요소 차단", "description": "" }, "settingsNoRemoteFontsPrompt": { @@ -508,7 +508,7 @@ "description": "Filter lists section name" }, "3pImport": { - "message": "불러오기..", + "message": "가져오기…", "description": "The label for the checkbox used to import external filter lists" }, "3pExternalListsHint": { @@ -536,7 +536,7 @@ "description": "used as a tooltip for error icon beside a list" }, "1pTrustWarning": { - "message": "신뢰할 수 없는 출처의 필터를 추가하지 마십시오.", + "message": "신뢰할 수 없는 출처의 필터는 추가하지 마세요.", "description": "Warning against copy-pasting filters from random sources" }, "1pEnableMyFiltersLabel": { @@ -592,7 +592,7 @@ "description": "Will discard manually-edited content and exit manual-edit mode" }, "rulesImport": { - "message": "파일로부터 불러오기...", + "message": "파일에서 가져오기…", "description": "" }, "rulesExport": { @@ -668,7 +668,7 @@ "description": "Appears in the logger's tab selector" }, "logBehindTheScene": { - "message": "숨겨진 구성 요소", + "message": "숨겨진 요소", "description": "Pretty name for behind-the-scene network requests" }, "loggerCurrentTab": { @@ -1204,7 +1204,7 @@ "description": "tooltip" }, "cloudPullAndMerge": { - "message": "클라우드 저장소의 설정 불러오기 및 현재 설정과 통합", + "message": "클라우드 저장소에서 가져와 현재 설정에 병합", "description": "tooltip" }, "cloudNoData": { @@ -1236,7 +1236,7 @@ "description": "" }, "contextMenuBlockElementInFrame": { - "message": "프레임 내 구성 요소 차단", + "message": "프레임 내 요소 차단…", "description": "An entry in the browser's contextual menu" }, "contextMenuSubscribeToList": { diff --git a/src/_locales/sr/messages.json b/src/_locales/sr/messages.json index 6de57c2c76cc0..d5dbd0a7accfa 100644 --- a/src/_locales/sr/messages.json +++ b/src/_locales/sr/messages.json @@ -16,7 +16,7 @@ "description": "A warning in the dashboard when navigating away from unsaved changes" }, "dashboardUnsavedWarningStay": { - "message": "Остани", + "message": "Остани овде", "description": "Label for button to prevent navigating away from unsaved changes" }, "dashboardUnsavedWarningIgnore": { From de5ea69e8fca38bf54d3746d84a3258ad4f679dd Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 9 Aug 2026 10:16:48 -0400 Subject: [PATCH 015/145] [mv3] Minor --- platform/mv3/extension/js/offscreen/scriptlet.template.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/platform/mv3/extension/js/offscreen/scriptlet.template.js b/platform/mv3/extension/js/offscreen/scriptlet.template.js index 8c1b42c594d9f..63df3183e1564 100644 --- a/platform/mv3/extension/js/offscreen/scriptlet.template.js +++ b/platform/mv3/extension/js/offscreen/scriptlet.template.js @@ -159,10 +159,9 @@ if ( $hasRegexes$ ) { } } } -if ( todo.size === 0 ) { return; } -// Execute scriplets -{ +// Execute scriptlets +if ( todo.size ) { const $scriptletFunctions$ = self.$scriptletFunctions$; const $scriptletArgs$ = self.$scriptletArgs$; const $scriptletArglists$ = self.$scriptletArglists$; From a9331645b1f0690edf87ab1720514a66631a6769 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 9 Aug 2026 10:45:52 -0400 Subject: [PATCH 016/145] [mv3] Minor --- .../js/offscreen/scriptlet.template.js | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/platform/mv3/extension/js/offscreen/scriptlet.template.js b/platform/mv3/extension/js/offscreen/scriptlet.template.js index 63df3183e1564..355b5e51d081a 100644 --- a/platform/mv3/extension/js/offscreen/scriptlet.template.js +++ b/platform/mv3/extension/js/offscreen/scriptlet.template.js @@ -84,7 +84,8 @@ const entries = (( ) => { })(); if ( entries.length === 0 ) { return; } -const todoIndices = new Set(); +const todo = new Set(); + if ( $hasHostnames$ ) { const $scriptletHostnames$ = self.$scriptletHostnames$; const collectArglistRefIndices = (out, hn, r) => { @@ -121,6 +122,7 @@ if ( $hasHostnames$ ) { } } }; + const todoIndices = new Set(); indicesFromHostname(todoIndices, entries[0]); if ( $hasAncestors$ ) { for ( const entry of entries ) { @@ -128,19 +130,18 @@ if ( $hasHostnames$ ) { indicesFromHostname(todoIndices, entry, '>>'); } } -} - -// Collect arglist references -const todo = new Set(); -if ( todoIndices.size !== 0 ) { - const $scriptletArglistRefs$ = self.$scriptletArglistRefs$; - const arglistRefs = $scriptletArglistRefs$.split(';'); - for ( const i of todoIndices ) { - for ( const ref of JSON.parse(`[${arglistRefs[i]}]`) ) { - todo.add(ref); + // Collect arglist references + if ( todoIndices.size ) { + const $scriptletArglistRefs$ = self.$scriptletArglistRefs$; + const arglistRefs = $scriptletArglistRefs$.split(';'); + for ( const i of todoIndices ) { + for ( const ref of JSON.parse(`[${arglistRefs[i]}]`) ) { + todo.add(ref); + } } } } + if ( $hasRegexes$ ) { const $scriptletFromRegexes$ = self.$scriptletFromRegexes$; const { hns } = entries[0]; From 2e13a766c5dc731754835d2b51e00a7f53a9a74b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 9 Aug 2026 11:53:34 -0400 Subject: [PATCH 017/145] [mv3] Fix "Imported lists" section not updating properly Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/737 --- platform/mv3/extension/js/filter-lists.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/mv3/extension/js/filter-lists.js b/platform/mv3/extension/js/filter-lists.js index a1dd8583c6fda..b66d768a3d211 100644 --- a/platform/mv3/extension/js/filter-lists.js +++ b/platform/mv3/extension/js/filter-lists.js @@ -188,7 +188,8 @@ export async function renderFilterLists() { const createListEntries = (parentkey, listTree, depth = 0) => { const treeEntries = Object.entries(listTree); - const listEntries = qs$(`#lists > .listEntries`) || + const listEntries = qs$(`#lists .listEntry[data-nodeid="${parentkey}"] > .listEntries`) || + qs$('#lists > .listEntries') || nodeFromTemplate('listEntries', '.listEntries'); if ( depth !== 0 ) { const reEmojis = /\p{Emoji}+/gu; From 36df0b96a37d7fd3c0cabf10c5ba39235fd7a5f1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 9 Aug 2026 12:24:53 -0400 Subject: [PATCH 018/145] [mv3] Minor CSS --- platform/mv3/extension/css/dashboard-common.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/platform/mv3/extension/css/dashboard-common.css b/platform/mv3/extension/css/dashboard-common.css index d88e12cd6a03a..9bdc5529158a4 100644 --- a/platform/mv3/extension/css/dashboard-common.css +++ b/platform/mv3/extension/css/dashboard-common.css @@ -21,6 +21,9 @@ h3 { a { text-decoration: none; } +details { + cursor: pointer; + } .fa-icon.info { color: var(--info0-ink); From c25d4dafea4fc8a39f78f3988db96d7ba5c51179 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 10 Aug 2026 08:42:00 -0400 Subject: [PATCH 019/145] Improve `prevent-clipboard-write` scriptlet Be stealthy when preventing clipboard write. --- src/js/resources/prevent-clipboard-write.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/resources/prevent-clipboard-write.js b/src/js/resources/prevent-clipboard-write.js index ca0de56e0bdf8..73b562dd64db2 100644 --- a/src/js/resources/prevent-clipboard-write.js +++ b/src/js/resources/prevent-clipboard-write.js @@ -113,7 +113,7 @@ function preventClipboardWrite(matches = '', ...varargs) { const { callArgs } = context; if ( callArgs[0] === 'copy' || callArgs[0] === 'cut' ) { const text = document.getSelection()?.toString(); - if ( text && prevent(text) ) { return false; } + if ( prevent(text) ) { return true; } } return context.reflect(); }, { skipToString: true }); From fd67cde545a438d5ac6080f68a5f42572979b461 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 10 Aug 2026 09:31:21 -0400 Subject: [PATCH 020/145] [mv3] Add support for broad scriptlet exception (`#@#js()`) --- .../extension/js/offscreen/make-scriptlets.js | 28 ++++++++++++++++++- .../js/offscreen/scriptlet.template.js | 2 +- src/js/static-dnr-filtering.js | 21 ++++++-------- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/platform/mv3/extension/js/offscreen/make-scriptlets.js b/platform/mv3/extension/js/offscreen/make-scriptlets.js index 10c7525486d99..dcd5d34334703 100644 --- a/platform/mv3/extension/js/offscreen/make-scriptlets.js +++ b/platform/mv3/extension/js/offscreen/make-scriptlets.js @@ -32,7 +32,7 @@ const worldTemplate = { scriptletFunctions: new Map(), allFunctions: new Map(), args: new Map(), - arglists: new Map(), + arglists: new Map([['',0]]), hostnames: new Map(), regexesOrPaths: new Map(), matches: new Set(), @@ -64,6 +64,29 @@ function createScriptletCoreCode(worldDetails, resourceEntry) { /******************************************************************************/ +function compileBroadExclusion(details) { + if ( Boolean(details.excludeMatches?.length) === false ) { return; } + for ( const worldDetails of Object.values(worlds) ) { + for ( const hn of details.excludeMatches ) { + if ( isHnRegexOrPath(hn) ) { + const refs = worldDetails.regexesOrPaths.get(hn) ?? new Set(); + if ( refs.size === 0 ) { + worldDetails.regexesOrPaths.set(hn, refs); + } + refs.add(0); + continue; + } + const refs = worldDetails.hostnames.get(hn) ?? new Set(); + if ( refs.size === 0 ) { + worldDetails.hostnames.set(hn, refs); + } + refs.add(0); + } + } +} + +/******************************************************************************/ + export function reset() { worlds.ISOLATED = structuredClone(worldTemplate); worlds.MAIN = structuredClone(worldTemplate); @@ -72,6 +95,9 @@ export function reset() { /******************************************************************************/ export function compile(rulesetId, details) { + if ( details.args.length === 0 ) { + return compileBroadExclusion(details); + } if ( details.args[0].endsWith('.js') === false ) { details.args[0] += '.js'; } diff --git a/platform/mv3/extension/js/offscreen/scriptlet.template.js b/platform/mv3/extension/js/offscreen/scriptlet.template.js index 355b5e51d081a..c912752ed2a5b 100644 --- a/platform/mv3/extension/js/offscreen/scriptlet.template.js +++ b/platform/mv3/extension/js/offscreen/scriptlet.template.js @@ -162,7 +162,7 @@ if ( $hasRegexes$ ) { } // Execute scriptlets -if ( todo.size ) { +if ( todo.size && todo.has(0) === false ) { const $scriptletFunctions$ = self.$scriptletFunctions$; const $scriptletArgs$ = self.$scriptletArgs$; const $scriptletArglists$ = self.$scriptletArglists$; diff --git a/src/js/static-dnr-filtering.js b/src/js/static-dnr-filtering.js index 0d5f8b6e2bc89..149f4bd9d49a3 100644 --- a/src/js/static-dnr-filtering.js +++ b/src/js/static-dnr-filtering.js @@ -107,28 +107,25 @@ function addExtendedToDNR(context, parser) { context.scriptletFilters = new Map(); } const exception = parser.isException(); - const args = parser.getScriptletArgs(); + const args = parser.getScriptletArgs() || []; const argsToken = JSON.stringify(args); for ( const { hn, not, bad } of parser.getExtFilterDomainIterator() ) { if ( bad ) { continue; } - if ( exception ) { continue; } - let details = context.scriptletFilters.get(argsToken); - if ( details === undefined ) { - context.scriptletFilters.set(argsToken, details = { args }); + if ( exception && not ) { continue; } + const details = context.scriptletFilters.get(argsToken) ?? {}; + if ( details.args === undefined ) { + context.scriptletFilters.set(argsToken, details); + details.args = args; if ( context.trustedSource ) { details.trustedSource = true; } } - if ( not ) { - if ( details.excludeMatches === undefined ) { - details.excludeMatches = []; - } + if ( exception || not ) { + details.excludeMatches ??= []; details.excludeMatches.push(hn); continue; } - if ( details.matches === undefined ) { - details.matches = []; - } + details.matches ??= []; if ( details.matches.includes('*') ) { continue; } if ( hn === '*' ) { details.matches = [ '*' ]; From e3c7ca7f18688d018305a769e4a94e56f7485ed1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 10 Aug 2026 09:53:55 -0400 Subject: [PATCH 021/145] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.ko.txt | 8 ++++---- platform/mv3/extension/_locales/bg/messages.json | 2 +- platform/mv3/extension/_locales/br_FR/messages.json | 2 +- platform/mv3/extension/_locales/ca/messages.json | 2 +- platform/mv3/extension/_locales/el/messages.json | 2 +- platform/mv3/extension/_locales/es/messages.json | 2 +- platform/mv3/extension/_locales/eu/messages.json | 2 +- platform/mv3/extension/_locales/fy/messages.json | 6 +++--- platform/mv3/extension/_locales/hr/messages.json | 2 +- platform/mv3/extension/_locales/it/messages.json | 2 +- platform/mv3/extension/_locales/ja/messages.json | 4 ++-- platform/mv3/extension/_locales/ko/messages.json | 2 +- platform/mv3/extension/_locales/pl/messages.json | 2 +- platform/mv3/extension/_locales/pt_BR/messages.json | 2 +- platform/mv3/extension/_locales/sk/messages.json | 2 +- platform/mv3/extension/_locales/zh_TW/messages.json | 6 +++--- 16 files changed, 24 insertions(+), 24 deletions(-) diff --git a/platform/mv3/description/webstore.ko.txt b/platform/mv3/description/webstore.ko.txt index cf38909f3f33c..8a836cd7e1fee 100644 --- a/platform/mv3/description/webstore.ko.txt +++ b/platform/mv3/description/webstore.ko.txt @@ -1,12 +1,12 @@ -uBO Lite (uBOL)는 MV3 기반 콘텐츠 차단기입니다. +uBO Lite(uBOL)는 MV3 기반 콘텐츠 차단기입니다. -기본 규칙 목록은 uBlock Origin의 기본 필터 목록과 대응됩니다. +기본 규칙 목록은 uBlock Origin의 기본 필터 목록과 동일합니다: - uBlock Origin 내장 필터 목록 - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -설정 페이지에서 규칙 목록을 더 활성화할 수 있습니다. 팝업 창의 _Cogs_ 아이콘을 누르세요. +팝업 패널에서 톱니바퀴 아이콘을 클릭하여 옵션 페이지로 이동하면 더 많은 규칙 목록을 활성화할 수 있습니다. -uBOL은 완전히 선언적이라 필터링 중 영구적으로 실행되는 uBOL 프로세스를 필요로 하지 않으며, CSS/JS 주입 기반 콘텐츠 필터링이 확장 프로그램이 아닌 브라우저 자체에서 더욱 안정적으로 동작합니다. 이는 콘텐츠 차단이 진행되는 동안 uBOL 자체는 CPU나 메모리 자원을 소모하지 않음을 의미합니다. uBOL의 서비스 워커 프로세스는 팝업 창이나 설정을 사용할 때만 실행됩니다. +uBOL은 완전한 선언형 방식으로 작동합니다. 즉, 필터링을 위해 uBOL 프로세스를 상시 실행할 필요가 없으며, CSS/JS 주입 기반 콘텐츠 필터링은 확장 프로그램이 아닌 브라우저 자체가 직접 안정적으로 수행합니다. 따라서 콘텐츠 차단이 진행되는 동안 uBOL 자체는 CPU/메모리 자원을 소비하지 않습니다. uBOL의 서비스 워커 프로세스는 팝업 패널이나 옵션 페이지를 조작할 때만 실행됩니다. diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index 4c43d7a5424e8..d6eb9a9a040d1 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "За да приложите козметични филтри или филтри за скриптове от импортирани списъци, трябва да предоставите на uBO Lite разрешение да изпълнява потребителски скриптове. Отворете страницата с разширенията на браузъра си (chrome://extensions в Chrome или about:addons във Firefox), отворете подробностите за uBO Lite и активирайте опцията Разрешаване на потребителски скриптове (наричани още „непроверени скриптове от трети страни“).", + "message": "Отворете страницата с разширенията на браузъра си (chrome://extensions в Chrome или about:addons във Firefox), отворете подробностите за uBO Lite и активирайте опцията Разрешаване на потребителски скриптове (наричани още „непроверени скриптове от трети страни“).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index bcc2770fd0c0d..a5653fffd9f1e 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -36,7 +36,7 @@ "description": "Link to privacy policy on GitHub (English)" }, "aboutDocumentation": { - "message": "Documentation", + "message": "Teuliadur", "description": "Link to documentation in About pane" }, "popupFilteringModeLabel": { diff --git a/platform/mv3/extension/_locales/ca/messages.json b/platform/mv3/extension/_locales/ca/messages.json index 5c2b7af69d4c2..faa9457a466ae 100644 --- a/platform/mv3/extension/_locales/ca/messages.json +++ b/platform/mv3/extension/_locales/ca/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Per a aplicar filtres cosmètics o de scripts mitjançant llistes importades, doneu permís a l'uBO Lite d'execució de scripts d'usuari. Obriu la pàgina d'extensions del navegador (chrome://extensions al Chrome o about:addons al Firefox), obriu els detalls d'uBO Lite i activeu Permet scripts d'usuari (també anomenats «scripts de tercers no verificats»).", + "message": "Obriu la pàgina d'extensions del navegador (chrome://extensions al Chrome o about:addons al Firefox), obriu els detalls d'uBO Lite i activeu Permet scripts d'usuari (també anomenats «scripts de tercers no verificats»).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index 1fce55230f9ff..2fe24a838281d 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Για να επιβάλετε φίλτρα εμφάνισης ή scriptlet από εισαγόμενες λίστες, πρέπει να παραχωρήσετε στο uBO Lite το δικαίωμα εκτέλεσης user scripts. Ανοίξτε τη σελίδα επεκτάσεων του προγράμματος περιήγησής σας (chrome://extensions στο Chrome ή about:addons στον Firefox), ανοίξτε τις λεπτομέρειες του uBO Lite και ενεργοποιήστε την επιλογή Να επιτρέπονται τα user scripts (γνωστά και ως «μη επαληθευμένα σενάρια τρίτων»).", + "message": "Ανοίξτε τη σελίδα επεκτάσεων του προγράμματος περιήγησής σας (chrome://extensions στο Chrome ή about:addons στον Firefox), ανοίξτε τις λεπτομέρειες του uBO Lite και ενεργοποιήστε την επιλογή Να επιτρέπονται τα user scripts (γνωστά και ως «μη επαληθευμένα σενάρια τρίτων»).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 2421a03f8ec9c..733bb1306fdc8 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Para aplicar filtros cosméticos o de scripts desde listas importadas, debes otorgar a uBO Lite permiso para correr scripts de usuario. Abre la página de extensiones de tu navegador. (chrome://extensions en Chrome o about:addons en Firefox), abre los uBO Lite detalles, y enciende Permitir scripts de usuario (tambien referido como \"scripts de terceros no verificados\").", + "message": "Abre la página de extensiones de tu navegador. (chrome://extensions en Chrome o about:addons en Firefox), abre los uBO Lite detalles, y enciende Permitir scripts de usuario (tambien referido como \"scripts de terceros no verificados\").", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/eu/messages.json b/platform/mv3/extension/_locales/eu/messages.json index 1f66143c82731..224b809a3055d 100644 --- a/platform/mv3/extension/_locales/eu/messages.json +++ b/platform/mv3/extension/_locales/eu/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Inportatutako zerrendetako iragazki kosmetiko edo scriptlet-ak betearazteko, baimena eman behar diozu uBO Lite-ri erabiltzaile-scriptak exekutatzeko. Ireki zure nabigatzailearen luzapenen orria (chrome://extensions Chrome-n edo about:addons Firefox-en), ireki uBO Lite-ren xehetasunak, eta aktibatu Onartu erabiltzaile-scriptak (“egiaztatu gabeko hirugarrenen scriptak” ere deitua).", + "message": "Ireki zure nabigatzailearen luzapenen orria (chrome://extensions Chrome-n edo about:addons Firefox-en), ireki uBO Lite-ren xehetasunak, eta aktibatu Onartu erabiltzaile-scriptak (“egiaztatu gabeko hirugarrenen scriptak” ere deitua).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/fy/messages.json b/platform/mv3/extension/_locales/fy/messages.json index 9cb9c85472d2b..9367bbe1e7d07 100644 --- a/platform/mv3/extension/_locales/fy/messages.json +++ b/platform/mv3/extension/_locales/fy/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Om kosmetyske of scriptletfilters fan ymportearre listen út ta te passen, moatte jo uBO Lite tastimming jaan foar it útfieren fan brûkersscripts.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Om kosmetyske of scriptletfilters fan ymportearre listen út ta te passen, moatte jo uBO Lite tastimming jaan foar it útfieren fan brûkersscripts. Iepenje de útwreidingsside fan jo browser (chrome://extensions yn Chrome of about:addons yn Firefox), iepenje de details fan uBO Lite, en skeakelje Brûkersscripts tastean (ek wol oanjûn as ‘Net-ferifiearte scripts fan tredden’) yn.", + "message": "Iepenje de útwreidingsside fan jo browser (chrome://extensions yn Chrome of about:addons yn Firefox), iepenje de details fan uBO Lite, en skeakelje Brûkersscripts tastean (ek wol oanjûn as ‘Net-ferifiearre scripts fan tredden’) yn.", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Om kosmetyske of scriptletfilters fan de sandbox út ta te passen, moatte jo uBO Lite tastimming jaan foar it útfieren fan brûkersscripts.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/hr/messages.json b/platform/mv3/extension/_locales/hr/messages.json index d4f8d68fd761e..2c5a768911e57 100644 --- a/platform/mv3/extension/_locales/hr/messages.json +++ b/platform/mv3/extension/_locales/hr/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Da biste primijenili kozmetičke ili skriptlet filtere iz uvezenih popisa, morate dati uBO Liteu dopuštenje za pokretanje korisničkih skripti. Otvorite stranicu s proširenjima preglednika (chrome://extensions u Chromeu ili about:addons u Firefoxu), otvorite detalje o uBO Liteu i uključite Dopusti korisničke skripte (također se nazivaju \"nepotvrđene skripte trećih strana\").", + "message": "Otvorite stranicu s proširenjima preglednika (chrome://extensions u Chromeu ili about:addons u Firefoxu), otvorite detalje o uBO Liteu i uključite Dopusti korisničke skripte (također se nazivaju \"nepotvrđene skripte trećih strana\").", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index a81d6c5772b47..eea5126fb9792 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Per applicare i filtri cosmetici o gli scriptlet provenienti da elenchi importati, è necessario concedere a uBO Lite l'autorizzazione a eseguire gli script utente. Apri la pagina delle estensioni del tuo browser (chrome://extensions su Chrome o about:addons su Firefox), apri i dettagli di uBO Lite e attiva l'opzione Consenti script utente (nota anche come \"script di terze parti non verificati\").", + "message": "Apri la pagina delle estensioni del tuo browser (chrome://extensions su Chrome o about:addons su Firefox), apri i dettagli di uBO Lite e attiva l'opzione Consenti script utente (nota anche come \"script di terze parti non verificati\").", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/ja/messages.json b/platform/mv3/extension/_locales/ja/messages.json index 46027f2590cf4..e918a92048220 100644 --- a/platform/mv3/extension/_locales/ja/messages.json +++ b/platform/mv3/extension/_locales/ja/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "インポートしたリストから外観フィルターやスクリプトレットフィルターを適用するには、uBO Lite にユーザー スクリプトを実行する権限を付与する必要があります。ブラウザの拡張機能ページ(Chrome の場合は chrome://extensions、Firefox の場合は about:addons)を開き、uBO Lite の詳細を開いて、ユーザー スクリプトを許可する(「未検証のサードパーティ スクリプト」とも呼ばれます)をオンに切り替えてください。", + "message": "ブラウザの拡張機能ページ(Chrome の場合は chrome://extensions、Firefox の場合は about:addons)を開き、uBO Lite の詳細を開いて、ユーザー スクリプトを許可する(「未検証のサードパーティ スクリプト」とも呼ばれます)をオンに切り替えてください。", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -356,7 +356,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "要素抹消モードを開始", + "message": "要素を削除する", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { diff --git a/platform/mv3/extension/_locales/ko/messages.json b/platform/mv3/extension/_locales/ko/messages.json index c615d201348bf..3f389cad19c5a 100644 --- a/platform/mv3/extension/_locales/ko/messages.json +++ b/platform/mv3/extension/_locales/ko/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "가져온 목록에서 요소 숨김 또는 스크립트 주입 필터를 적용하려면, uBO Lite에 사용자 스크립트 실행 권한을 허용해야 합니다. 브라우저의 확장 프로그램 페이지(Chrome chrome://extensions, Firefox는 about:addons)를 열고, uBO Lite 세부 정보를 연 뒤, 사용자 스크립트 허용(혹은 \"검증되지 않은 타사 스크립트 허용\")을 활성화하세요.", + "message": "브라우저의 확장 프로그램 페이지(Chrome chrome://extensions, Firefox는 about:addons)를 열고, uBO Lite 세부 정보를 연 뒤, 사용자 스크립트 허용(혹은 \"검증되지 않은 타사 스크립트 허용\")을 활성화하세요.", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/pl/messages.json b/platform/mv3/extension/_locales/pl/messages.json index e38cfd3d8cb98..9b015ab654927 100644 --- a/platform/mv3/extension/_locales/pl/messages.json +++ b/platform/mv3/extension/_locales/pl/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Aby wymusić filtry kosmetyczne lub skryptletów z importowanych list, musisz przyznać uBO Lite uprawnienia do uruchamiania skryptów użytkownika. Otwórz stronę rozszerzeń przeglądarki (chrome://extensions w Chrome lub about:addons w Firefoksie), otwórz szczegóły uBO Lite i włącz opcję Zezwalaj na skrypty użytkownika (nazywane również „niezweryfikowanymi skryptami zewnętrzymi”).", + "message": "Otwórz stronę rozszerzeń przeglądarki (chrome://extensions w Chrome lub about:addons w Firefoksie), otwórz szczegóły uBO Lite i włącz opcję Zezwalaj na skrypty użytkownika (nazywane również „niezweryfikowanymi skryptami zewnętrzymi”).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index 665599c481644..2ab7c73752549 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Para aplicar filtros de scriptlet ou cosméticos de listas importadas, você deve conceder ao uBO Lite a permissão para executar scripts de usuário. Abra a página de extensões do seu navegador (chrome://extensions no Chrome ou about:addons no Firefox), abra os detalhes do uBO Lite, e ative Permitir scripts de usuário (também referidos como \"scripts de terceiros não verificados\").", + "message": "Abra a página de extensões do seu navegador (chrome://extensions no Chrome ou about:addons no Firefox), abra os detalhes do uBO Lite, e ative Permitir scripts de usuário (também referidos como \"scripts de terceiros não verificados\").", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/sk/messages.json b/platform/mv3/extension/_locales/sk/messages.json index ebfb59ec96e84..18d594bbdaa04 100644 --- a/platform/mv3/extension/_locales/sk/messages.json +++ b/platform/mv3/extension/_locales/sk/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Ak chcete vynútiť kozmetické filtre alebo skriptletov z importovaných zoznamov, musíte udeliť rozšíreniu uBO Lite oprávnenie na spúšťanie používateľských skriptov. Otvorte stránku s rozšíreniami v prehliadači (chrome://extensions v prehliadači Chrome alebo about:addons vo Firefoxe), otvorte podrobnosti o uBO Lite a zapnite možnosť Povoliť používateľské skripty (tiež označované ako \"neoverené skripty tretích strán\").", + "message": "Otvorte stránku s rozšíreniami v prehliadači (chrome://extensions v prehliadači Chrome alebo about:addons vo Firefoxe), otvorte podrobnosti o uBO Lite a zapnite možnosť Povoliť používateľské skripty (tiež označované ako \"neoverené skripty tretích strán\").", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/zh_TW/messages.json b/platform/mv3/extension/_locales/zh_TW/messages.json index dcf3aaf468ebd..4806cc07f762a 100644 --- a/platform/mv3/extension/_locales/zh_TW/messages.json +++ b/platform/mv3/extension/_locales/zh_TW/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "若要套用從匯入清單中的樣式或小令稿過濾規則,您必須授予 uBO Lite 執行使用者命令稿的權限。", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "若要在已匯入清單套用外觀或 Scriptlet 過濾規則,您必須授予 uBO Lite 執行使用者腳本的權限。請開啟瀏覽器的擴充功能頁面(Chrome 中輸入 chrome://extensions,Firefox 中輸入 about:addons),開啟 uBO Lite 的詳細資料,並啟用允許使用者腳本(亦稱為『未經驗證的第三方腳本』)。", + "message": "請開啟瀏覽器的擴充功能頁面(Chrome 中輸入 chrome://extensions,Firefox 中輸入 about:addons),開啟 uBO Lite 的詳細資料,並啟用允許使用者腳本(亦稱為『未經驗證的第三方腳本』)。", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "若要在沙盒中套用外觀或小令稿過濾規則,您必須授予 uBO Lite 執行使用者命令稿的權限。", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { From 044d7569dcc502f2e7715c129323e28d316fa701 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 11 Aug 2026 08:50:07 -0400 Subject: [PATCH 022/145] [mv3] Minor CSS --- platform/mv3/extension/css/dashboard-common.css | 2 +- platform/mv3/extension/css/settings.css | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/platform/mv3/extension/css/dashboard-common.css b/platform/mv3/extension/css/dashboard-common.css index 9bdc5529158a4..f3af987bb967f 100644 --- a/platform/mv3/extension/css/dashboard-common.css +++ b/platform/mv3/extension/css/dashboard-common.css @@ -21,7 +21,7 @@ h3 { a { text-decoration: none; } -details { +summary { cursor: pointer; } diff --git a/platform/mv3/extension/css/settings.css b/platform/mv3/extension/css/settings.css index d07645d4b1bd4..d340324bb5398 100644 --- a/platform/mv3/extension/css/settings.css +++ b/platform/mv3/extension/css/settings.css @@ -370,7 +370,6 @@ section[data-pane="filters"] aside details { padding: 1em 0; } section[data-pane="filters"] aside summary { - cursor: default; line-height: 2; } section[data-pane="filters"] aside .importFromText { From 87fe86fdda8b7dfda18e0aeb6128f6617de25621 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 11 Aug 2026 09:57:49 -0400 Subject: [PATCH 023/145] Fix regression from 505fbc7a75 --- src/js/resources/scriptlets.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/resources/scriptlets.js b/src/js/resources/scriptlets.js index d867959f936e1..6950bed588110 100755 --- a/src/js/resources/scriptlets.js +++ b/src/js/resources/scriptlets.js @@ -1830,7 +1830,7 @@ function trustedReplaceOutboundText( ) { if ( propChain === '' ) { return; } const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('trusted-replace-outbound-text', propChain, rawPattern, rawReplacement, ...args); + const logPrefix = safe.makeLogPrefix('trusted-replace-outbound-text', propChain, rawPattern, rawReplacement, ...varargs); const rePattern = safe.patternToRegex(rawPattern); const replacement = rawReplacement.startsWith('json:') ? safe.JSON_parse(rawReplacement.slice(5)) From 6788ed72af9bf2670bcdc1c3da3925d8b4f36443 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 11 Aug 2026 09:58:23 -0400 Subject: [PATCH 024/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index e135c90632109..b7c3d06510d98 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.73.1.0 \ No newline at end of file +1.73.1.1 \ No newline at end of file From 65b22695291502224c310955cceea498856c6718 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 11 Aug 2026 10:05:01 -0400 Subject: [PATCH 025/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index 5a98d37416927..f4fe0a9958e8a 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From 199215880caa4de866a50418af68e9a4a52f0c66 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 11 Aug 2026 10:36:19 -0400 Subject: [PATCH 026/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 76667275deb5d..42bcef904fee2 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.73.1.0", + "version": "1.73.1.1", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b0/uBlock0_1.73.1b0.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b1/uBlock0_1.73.1b1.firefox.signed.xpi" } ] } From fb2775de2bca3f909e2fe816d5e6f491b4668cc4 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 11 Aug 2026 11:24:45 -0400 Subject: [PATCH 027/145] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/extension/_locales/bg/messages.json | 4 ++-- platform/mv3/extension/_locales/de/messages.json | 2 +- src/_locales/hu/messages.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index d6eb9a9a040d1..b31e44694cb6b 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -36,7 +36,7 @@ "description": "Link to privacy policy on GitHub (English)" }, "aboutDocumentation": { - "message": "Documentation", + "message": "Документация", "description": "Link to documentation in About pane" }, "popupFilteringModeLabel": { @@ -356,7 +356,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "Влизане в режима на временно скриване на елемента", + "message": "Премахване на елемент", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index 5add2e2f300d7..7021c6c619289 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "uBO Lite benötigt die Berechtigung zum Ausführen von Nutzerscripts, um kosmetische Filter oder Scriptlet-Filter aus importierten Listen anzuwenden. Die Option befindet sich in den Browser-Einstellungen für Erweiterungen (chrome://extensions in Chrome oder about:addons in Firefox). Anschließend die Details von uBO Lite öffnen und Nutzerscripts zulassen aktivieren (in Firefox „Nicht verifizierten Skripten von Drittanbietern den Zugriff auf Ihre Daten erlauben“).", + "message": "Die Option befindet sich in den Browser-Einstellungen für Erweiterungen (chrome://extensions in Chrome oder about:addons in Firefox). Anschließend die Details von uBO Lite öffnen und Nutzerscripts zulassen aktivieren (in Firefox „Nicht verifizierten Skripten von Drittanbietern den Zugriff auf Ihre Daten erlauben“).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/src/_locales/hu/messages.json b/src/_locales/hu/messages.json index 365cdd5bf37a5..6b71a86ce8cfc 100644 --- a/src/_locales/hu/messages.json +++ b/src/_locales/hu/messages.json @@ -1272,7 +1272,7 @@ "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, "toggleJavascript": { - "message": "Javascript be/ki", + "message": "JavaScript be/ki", "description": "Label for keyboard shortcut used to toggle no-scripting switch" }, "relaxBlockingMode": { From c68df492fd951bc3355fd0c6fec4afa8e2eae0aa Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 12 Aug 2026 13:11:11 -0400 Subject: [PATCH 028/145] [mv3] Mind `to=` option when converting `popup` filters Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/745 --- .../extension/js/scripting/prevent-popup.js | 25 +++++++++++-------- platform/mv3/make-rulesets.js | 24 ++++++++++++------ 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/platform/mv3/extension/js/scripting/prevent-popup.js b/platform/mv3/extension/js/scripting/prevent-popup.js index 7c8968410af34..c988c000e0d7b 100644 --- a/platform/mv3/extension/js/scripting/prevent-popup.js +++ b/platform/mv3/extension/js/scripting/prevent-popup.js @@ -35,7 +35,7 @@ a.slice(i).join('.') ); - const hostnameSearch = (hostnames, targets) => { + const hostnameSearch = hostnames => { let l = 0, i = 0, d = 0; let r = hostnames.length; let candidate; @@ -59,28 +59,33 @@ return -1; }; - const regexSearch = (regexes, target) => { + const regexSearch = regexes => { for ( let i = 0; i < regexes.length; i += 2 ) { - const key = regexes[i+0]; - if ( target.includes(key.slice(1)) === false ) { continue; } - const re = new RegExp(regexes[i+1], key.charAt(0).trimEnd()); - if ( re.test(target) ) { return i; } + if ( href.includes(regexes[i+0]) === false ) { continue; } + const entries = JSON.parse(regexes[i+1]); + for ( const entry of entries ) { + if ( entry.xto && hostnameSearch(entry.xto) ) { continue; } + if ( entry.to && hostnameSearch(entry.to) === -1 ) { continue; } + const re = new RegExp(entry.re, entry.f); + if ( re.test(href) === false ) { continue; } + return i; + } } return -1; } let shouldClose = false; for ( const { block } of preventPopupDetails ) { - if ( hostnameSearch(block.hostnames, targets) === -1 ) { - if ( regexSearch(block.regexes, href) === -1 ) { continue; } + if ( hostnameSearch(block.hostnames) === -1 ) { + if ( regexSearch(block.regexes) === -1 ) { continue; } } shouldClose = true; break; } if ( shouldClose === false ) { return; } for ( const { allow } of preventPopupDetails ) { - if ( hostnameSearch(allow.hostnames, targets) === -1 ) { - if ( regexSearch(allow.regexes, href) === -1 ) { continue; } + if ( hostnameSearch(allow.hostnames) === -1 ) { + if ( regexSearch(allow.regexes) === -1 ) { continue; } } shouldClose = false; break; diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index c6a4037849b47..5c57ea5ab101a 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -911,11 +911,17 @@ async function processPopupRules(assetDetails, popupRules) { } if ( re === undefined ) { return data; } const token = literalStrFromRegex(re).slice(0, 7); - const key = `${isUrlFilterCaseSensitive ? ' ' : 'i'}${token}`; - if ( realm.regexes.has(key) ) { - realm.regexes.set(key, `${realm.regexes.get(key)}|${re}`); - } else { - realm.regexes.set(key, re); + const details = realm.regexes.get(token) ?? { token, rules: [] }; + if ( details.rules.length === 0 ) { + realm.regexes.set(token, details) + } + const entry = { re, f: isUrlFilterCaseSensitive ? '' : 'i' }; + details.rules.push(entry); + if ( condition.requestDomains ) { + entry.to = condition.requestDomains.sort(hostnameCompare); + } + if ( condition.excludedRequestDomains ) { + entry.xto = condition.excludedRequestDomains.sort(hostnameCompare); } return data; } @@ -949,9 +955,13 @@ async function processPopupRules(assetDetails, popupRules) { const count = data.block.hostnames.length + data.block.regexes.size; if ( count === 0 ) { return; } data.block.hostnames = data.block.hostnames.toSorted(hostnameCompare); - data.block.regexes = Array.from(data.block.regexes).flat(); + data.block.regexes = Array.from(data.block.regexes.values()).map(a => + [ a.token, JSON.stringify(a.rules) ] + ).flat(); data.allow.hostnames = data.allow.hostnames.toSorted(hostnameCompare); - data.allow.regexes = Array.from(data.allow.regexes).flat(); + data.allow.regexes = Array.from(data.allow.regexes.values()).map(a => + [ a.token, JSON.stringify(a.rules) ] + ).flat(); const originalScriptletMap = await loadAllSourceScriptlets(); let patchedScriptlet = originalScriptletMap.get(`prevent-popup`); patchedScriptlet = safeReplace(patchedScriptlet, From 0ddca722b631cf53e462ad672fff9fdb1767213d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Aug 2026 09:36:40 -0400 Subject: [PATCH 029/145] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 08d2311634d72..94fd57edb4609 100644 --- a/README.md +++ b/README.md @@ -19,9 +19,9 @@ uBlock Origin (uBO) | Browser | Install from ... | Status | | :-------: | ---------------- | ------ | | Get uBlock Origin for Firefox | Firefox Add-ons | [uBO works best on Firefox](https://github.com/gorhill/uBlock/wiki/uBlock-Origin-works-best-on-Firefox) | -| Get uBlock Origin for Microsoft Edge | Edge Add-ons | +| Get uBlock Origin for Microsoft Edge | Edge Add-ons | "Moving the Microsoft Edge extensions ecosystem forward with Manifest Version 3": "Beginning in August 2026, Microsoft Edge will start the consumer transition away from Manifest Version 2 (MV2) extensions and toward MV3. Our goal is to complete the consumer transition by the end of 2026, with enterprise deprecation following in early 2027." | | Get uBlock Origin for Opera | Opera Add-ons | -| Get uBlock Origin for Chromium | Chrome Web Store | About Google Chrome's "This extension may soon no longer be supported"
Removal from the Store on August 31st, 2026. | +| Get uBlock Origin for Chromium | Chrome Web Store | "Manifest V2 support timeline": "Aug 31st 2026: All remaining Manifest V2 extensions removed from the Chrome Web Store"
About Google Chrome's "This extension may soon no longer be supported" | | Get uBlock Origin for Thunderbird | Thunderbird Add-ons | [No longer updated and stuck at 1.49.2.](https://github.com/uBlockOrigin/uBlock-issues/issues/2928) Later versions require "GitHub - Releases". | | Get uBlock Origin through GitHub | GitHub - Releases | Stable and development versions on Firefox, Chromium MV2, and Thunderbird. Must be placed manually into web browsers; the Chromium and Thunderbird versions usually won't auto-update. From 8a85e04907486cb4afcf0d2e0e80b5a726e279a7 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Aug 2026 11:13:26 -0400 Subject: [PATCH 030/145] Improve `prevent-clipboard-write` scriptlet As discussed internally with team. --- src/js/resources/prevent-clipboard-write.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/js/resources/prevent-clipboard-write.js b/src/js/resources/prevent-clipboard-write.js index 73b562dd64db2..df6fbd1dea904 100644 --- a/src/js/resources/prevent-clipboard-write.js +++ b/src/js/resources/prevent-clipboard-write.js @@ -59,11 +59,23 @@ function preventClipboardWrite(matches = '', ...varargs) { const div = doc.createElement('div'); const span = doc.createElement('span'); span.style = 'flex-grow:1;padding:0.5em 0 0.5em 0.5em;'; - const { domAlert } = extraArgs; + const domAlert = extraArgs.domAlert.replace(/\\n/g, '\n'); const placeholder = /\$\{text\}/.exec(domAlert); if ( placeholder ) { const code = doc.createElement('code'); - code.style = 'background-color:#ddc;font-family:monospace;padding:0.25em;user-select:none;word-break:break-all'; + const styles = [ + 'background-color: #ddc', + 'display: inline-block', + 'font-family: monospace', + 'max-height: 8em', + 'overflow: auto', + 'padding: 0.25em', + 'word-break: break-all' + ]; + if ( Boolean(extraArgs.selectable ?? true) === false ) { + styles.push('user-select: none'); + } + code.style = styles.join(';'); code.textContent = clipboardText; span.append( domAlert.slice(0, placeholder.index), @@ -74,7 +86,7 @@ function preventClipboardWrite(matches = '', ...varargs) { span.append(domAlert); } const button = doc.createElement('button'); - button.style = 'padding:1em'; + button.style = 'font-size:32px;padding:0.5em'; button.textContent = '×'; button.addEventListener('click', ( ) => { if ( currentAlert === null ) { return; } @@ -82,7 +94,7 @@ function preventClipboardWrite(matches = '', ...varargs) { currentAlert = null; }); div.append(span, button); - div.style = 'background-color:beige;color:black;border:1px solid black;display:flex;font-size:medium;position:fixed;text-align:center;top:0;width:100%;z-index:2147483647'; + div.style = 'background-color:beige;color:black;border:1px solid black;display:flex;font-family:sans-serif;font-size:medium;position:fixed;top:0;white-space:pre-wrap;width:100%;z-index:2147483647'; doc.documentElement.append(div); if ( currentAlert ) { currentAlert.remove(); From 901b68b1e64f0b1a8ba7233973bc5188b60d1ca9 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Aug 2026 11:16:37 -0400 Subject: [PATCH 031/145] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 038269139662a..067dda0b7b772 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ - [Improve `json-edit` scriptlet](https://github.com/gorhill/uBlock/commit/0fdbfdb2b5) +- [Improve `prevent-clipboard-write` scriptlet](https://github.com/gorhill/uBlock/commit/8a85e04907) - [Revisit scriptlets' `getExtraArgs` implementation](https://github.com/gorhill/uBlock/commit/505fbc7a75) ---------- From b68c9f2e5ad004bb999ce866eac82f8de8233876 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Aug 2026 11:16:54 -0400 Subject: [PATCH 032/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index b7c3d06510d98..803eb9daebec6 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.73.1.1 \ No newline at end of file +1.73.1.2 \ No newline at end of file From 7b94868bfb716d379b0fcd6ba5ed395352546696 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Aug 2026 11:26:56 -0400 Subject: [PATCH 033/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 42bcef904fee2..2cb0f7aa07e5e 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.73.1.1", + "version": "1.73.1.2", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b1/uBlock0_1.73.1b1.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b2/uBlock0_1.73.1b2.firefox.signed.xpi" } ] } From dc119d46c698c93920f86b21fb1ac9162ca78540 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Aug 2026 11:30:58 -0400 Subject: [PATCH 034/145] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 067dda0b7b772..36706ad8b5ea6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ -- [Improve `json-edit` scriptlet](https://github.com/gorhill/uBlock/commit/0fdbfdb2b5) - [Improve `prevent-clipboard-write` scriptlet](https://github.com/gorhill/uBlock/commit/8a85e04907) +- [Improve `json-edit` scriptlet](https://github.com/gorhill/uBlock/commit/0fdbfdb2b5) - [Revisit scriptlets' `getExtraArgs` implementation](https://github.com/gorhill/uBlock/commit/505fbc7a75) ---------- From 25d413803d71f5c5fcc364d2fda6ef820c3ea502 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Aug 2026 13:48:02 -0400 Subject: [PATCH 035/145] Add procedural operator `content(...)`, to lookup elements inside `template` tags As discussed internally with team. --- src/js/contentscript-extra.js | 15 +++++++++++++++ src/js/html-filtering.js | 16 +++++++++++++++- src/js/static-filtering-parser.js | 7 ++++++- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/js/contentscript-extra.js b/src/js/contentscript-extra.js index cb056c30f781d..9000542563a9e 100644 --- a/src/js/contentscript-extra.js +++ b/src/js/contentscript-extra.js @@ -63,6 +63,19 @@ class PSelectorVoidTask extends PSelectorTask { } } +class PSelectorContentTask extends PSelectorTask { + constructor(task) { + super(); + this.selector = task[1]; + } + transpose(node, output) { + const root = node.content; + if ( root?.querySelectorAll !== 'function' ) { return; } + const nodes = root.querySelectorAll(this.selector); + output.push(...nodes); + } +} + class PSelectorHasTextTask extends PSelectorTask { constructor(task) { super(); @@ -280,6 +293,7 @@ class PSelectorShadowTask extends PSelectorTask { if ( PSelectorShadowTask.openOrClosedShadowRoot !== undefined ) { return PSelectorShadowTask.openOrClosedShadowRoot; } + const { chrome } = self; if ( typeof chrome === 'object' && chrome !== null ) { if ( chrome.dom instanceof Object ) { if ( typeof chrome.dom.openOrClosedShadowRoot === 'function' ) { @@ -476,6 +490,7 @@ class PSelector { } } PSelector.prototype.operatorToTaskMap = new Map([ + [ 'content', PSelectorContentTask ], [ 'has', PSelectorIfTask ], [ 'has-text', PSelectorHasTextTask ], [ 'if', PSelectorIfTask ], diff --git a/src/js/html-filtering.js b/src/js/html-filtering.js index 9b5a50465ea35..4fdba576e5dff 100644 --- a/src/js/html-filtering.js +++ b/src/js/html-filtering.js @@ -65,6 +65,19 @@ class PSelectorVoidTask { transpose() { } } + +class PSelectorContentTask { + constructor(task) { + this.selector = task[1]; + } + transpose(node, output) { + const root = node.content; + if ( typeof root?.querySelectorAll !== 'function' ) { return; } + const nodes = root.querySelectorAll(this.selector); + output.push(...nodes); + } +} + class PSelectorHasTextTask { constructor(task) { this.needle = regexFromString(task[1]); @@ -238,6 +251,7 @@ class PSelector { } } PSelector.prototype.operatorToTaskMap = new Map([ + [ 'content', PSelectorContentTask ], [ 'has', PSelectorIfTask ], [ 'has-text', PSelectorHasTextTask ], [ 'if', PSelectorIfTask ], @@ -329,7 +343,7 @@ htmlFilteringEngine.compile = function(parser, writer) { // Only exception filters are allowed to be global. if ( parser.hasOptions() === false ) { if ( isException ) { - writer.push([ 64, '', 1, compiled ]); + writer.push([ 64, '', `-${compiled}` ]); } return; } diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index e415e092764e3..5429d423d5f8d 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -3312,6 +3312,7 @@ export class ExtSelectorCompiler { ':style', ]); this.proceduralOperatorNames = new Set([ + 'content', 'has-text', 'if', 'if-not', @@ -3959,6 +3960,8 @@ export class ExtSelectorCompiler { const arg = this.astSerialize(parts, false); if ( arg === undefined ) { return; } switch ( operator ) { + case 'content': + return this.compileSelector(arg); case 'has-text': return this.compileText(arg); case 'if': @@ -4194,6 +4197,7 @@ export const proceduralOperatorTokens = new Map([ [ '-abp-contains', 0b00 ], [ '-abp-has', 0b00, ], [ 'contains', 0b00, ], + [ 'content', 0b01, ], [ 'has', 0b01 ], [ 'has-text', 0b01 ], [ 'if', 0b00 ], @@ -4207,9 +4211,10 @@ export const proceduralOperatorTokens = new Map([ [ 'not', 0b01 ], [ 'nth-ancestor', 0b00 ], [ 'others', 0b11 ], - [ 'remove', 0b11 ], + [ 'remove', 0b01 ], [ 'remove-attr', 0b11 ], [ 'remove-class', 0b11 ], + [ 'shadow', 0b11, ], [ 'style', 0b11 ], [ 'upward', 0b01 ], [ 'watch-attr', 0b11 ], From 5ea3999904899e736fcad12f0db9e0c94d05ba98 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Aug 2026 13:50:39 -0400 Subject: [PATCH 036/145] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36706ad8b5ea6..f713303e2af00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add procedural operator `content(...)`, to lookup elements inside `template` tags](https://github.com/gorhill/uBlock/commit/25d413803d) - [Improve `prevent-clipboard-write` scriptlet](https://github.com/gorhill/uBlock/commit/8a85e04907) - [Improve `json-edit` scriptlet](https://github.com/gorhill/uBlock/commit/0fdbfdb2b5) - [Revisit scriptlets' `getExtraArgs` implementation](https://github.com/gorhill/uBlock/commit/505fbc7a75) From 3d5a048c0ff88b90ef8a4d442883e7e44ed661a4 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Aug 2026 13:51:00 -0400 Subject: [PATCH 037/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 803eb9daebec6..76a7e2313adbc 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.73.1.2 \ No newline at end of file +1.73.1.3 \ No newline at end of file From 8b20ca7ce2f7b647d3e540b7244059383640374f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Aug 2026 14:06:34 -0400 Subject: [PATCH 038/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 2cb0f7aa07e5e..4cdba1cdfe341 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.73.1.2", + "version": "1.73.1.3", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b2/uBlock0_1.73.1b2.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b3/uBlock0_1.73.1b3.firefox.signed.xpi" } ] } From 770513a3f78d85bb9ec946d1c5e13be8d92b3820 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Aug 2026 16:51:41 -0400 Subject: [PATCH 039/145] Fix test Related commit: https://github.com/gorhill/uBlock/commit/25d413803d71f5c5fcc364d2fda6ef820c3ea502 --- src/js/contentscript-extra.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/contentscript-extra.js b/src/js/contentscript-extra.js index 9000542563a9e..01b83e3d0af15 100644 --- a/src/js/contentscript-extra.js +++ b/src/js/contentscript-extra.js @@ -70,7 +70,7 @@ class PSelectorContentTask extends PSelectorTask { } transpose(node, output) { const root = node.content; - if ( root?.querySelectorAll !== 'function' ) { return; } + if ( typeof root?.querySelectorAll !== 'function' ) { return; } const nodes = root.querySelectorAll(this.selector); output.push(...nodes); } From 5a4d29d83deae08d152627962281ff1c42c9eee6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Aug 2026 16:52:40 -0400 Subject: [PATCH 040/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 76a7e2313adbc..a7d23bfe411b6 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.73.1.3 \ No newline at end of file +1.73.1.4 \ No newline at end of file From a796fd7daff3cb51a778b1acf6720a54bc31f4e4 Mon Sep 17 00:00:00 2001 From: Fanboynz Date: Fri, 14 Aug 2026 09:03:02 +1200 Subject: [PATCH 041/145] Add set/unset/given cookie values (#3936) * Add set/unset/closed/given cookie values * Closed already added --- src/js/resources/cookie.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/js/resources/cookie.js b/src/js/resources/cookie.js index 69169071056ec..79cda65b6d82f 100644 --- a/src/js/resources/cookie.js +++ b/src/js/resources/cookie.js @@ -49,6 +49,8 @@ export function getSafeCookieValuesFn() { 'decline', 'declined', 'closed', 'next', 'mandatory', 'disagree', 'agree', + 'set', 'unset', + 'given', ]; } registerScriptlet(getSafeCookieValuesFn, { From 8a476e57063bfe4997ce84a1d4738a6a894b95d6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Aug 2026 17:21:51 -0400 Subject: [PATCH 042/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 4cdba1cdfe341..134ec6cbb4142 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.73.1.3", + "version": "1.73.1.4", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b3/uBlock0_1.73.1b3.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b4/uBlock0_1.73.1b4.firefox.signed.xpi" } ] } From 79a59e135daaf7edeb9c5698a7de43b23882ea48 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 14 Aug 2026 11:36:37 -0400 Subject: [PATCH 043/145] remove use of softprops/action-gh-release --- .github/workflows/main.yml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index eeb9c77cf5861..2dbcddcc6084b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -36,15 +36,14 @@ jobs: sed -e 's/%version%/${{ env.VERSION }}/g' .github/workflows/RELEASE.HEAD.md >> release.body.txt - name: Create GitHub release id: create_release - uses: softprops/action-gh-release@v2 env: - GITHUB_TOKEN: ${{ github.token }} - with: - tag_name: ${{ env.VERSION }} - name: ${{ env.VERSION }} - draft: true - prerelease: true - body_path: release.body.txt - files: | + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release create ${{ env.VERSION }} \ + --title "${{ env.VERSION }}" \ + --prerelease \ + --draft \ + --notes-file release_body.txt + gh release upload ${{ env.VERSION }} \ dist/build/uBlock0_${{ env.VERSION }}.chromium.zip dist/build/uBlock0_${{ env.VERSION }}.firefox.xpi From ae655021864f31dbc0a92e2a82394e4bff268712 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 16 Aug 2026 11:19:40 -0400 Subject: [PATCH 044/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index f4fe0a9958e8a..8d3fd84d8ceef 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From 37a2ce19d376a4fa4d9529111b0d8e62bacf3404 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 16 Aug 2026 11:19:57 -0400 Subject: [PATCH 045/145] [mv3] Reject popup filters with excluded origins Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/753 --- platform/mv3/make-rulesets.js | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index 5c57ea5ab101a..bf8c42bba3705 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -894,6 +894,7 @@ async function processPopupRules(assetDetails, popupRules) { const { condition } = rule; if ( condition.domainType ) { return data; } if ( condition.initiatorDomains ) { return data; } + if ( condition.excludedInitiatorDomains ) { return data; } const { type } = rule.action; if ( type !== 'block' && type !== 'allow' ) { return data; } const realm = type === 'block' ? data.block : data.allow; From 30de8a59e6750a1c1f1587cffe22187443074a93 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 18 Aug 2026 09:42:42 -0400 Subject: [PATCH 046/145] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/ca/messages.json | 4 +-- .../mv3/extension/_locales/cs/messages.json | 6 ++-- .../extension/_locales/en_GB/messages.json | 2 +- .../mv3/extension/_locales/ka/messages.json | 4 +-- .../extension/_locales/pt_PT/messages.json | 6 ++-- .../mv3/extension/_locales/ru/messages.json | 2 +- .../mv3/extension/_locales/tr/messages.json | 4 +-- .../mv3/extension/_locales/uk/messages.json | 4 +-- src/_locales/pt_PT/messages.json | 34 +++++++++---------- 9 files changed, 33 insertions(+), 33 deletions(-) diff --git a/platform/mv3/extension/_locales/ca/messages.json b/platform/mv3/extension/_locales/ca/messages.json index faa9457a466ae..13f0ff744e045 100644 --- a/platform/mv3/extension/_locales/ca/messages.json +++ b/platform/mv3/extension/_locales/ca/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "Per aplicar filtres cosmètics o d'scriptlets a les llistes importades, heu de concedir permís a l'uBO Lite per executar scripts d'usuari.", + "message": "Per a aplicar filtres cosmètics o scripts a les llistes importades, doneu permís a l'uBO Lite d'execució de scripts d'usuari.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "Per aplicar filtres cosmètics o d'scriptlets des de l'entorn de proves, heu de concedir permís a l'uBO Lite per executar scripts d'usuari.", + "message": "Per a aplicar filtres cosmètics o scripts des de l'entorn de proves, doneu permís a l'uBO Lite d'execució de scripts d'usuari.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/cs/messages.json b/platform/mv3/extension/_locales/cs/messages.json index 00e612f74a190..e098d7bf97d34 100644 --- a/platform/mv3/extension/_locales/cs/messages.json +++ b/platform/mv3/extension/_locales/cs/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Chcete-li použít filtry vzhledu nebo skriptové filtry z importovaných seznamů, musíte uBO Lite udělit oprávnění ke spouštění uživatelských skriptů.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Chcete-li použít filtry vzhledu nebo skriptů z importovaných seznamů, musíte aplikaci uBO Lite udělit oprávnění ke spouštění uživatelských skriptů. Otevřete stránku rozšíření ve svém prohlížeči (chrome://extensions v prohlížeči Chrome nebo about:addons v prohlížeči Firefox), otevřete podrobnosti uBO Lite a zapněte volbu Povolit uživatelské skripty (také označované jako \"neověřené skripty třetích stran\").", + "message": "Otevřete stránku s rozšířeními ve svém prohlížeči (chrome://extensions v prohlížeči Chrome nebo about:addons v prohlížeči Firefox), otevřete podrobnosti o rozšíření uBO Lite a zapněte volbu Povolit uživatelské skripty (také označované jako \"neověřené skripty třetích stran\").", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Chcete-li v sandboxu aktivovat filtry vzhledu nebo skriptové filtry, musíte uBO Lite udělit oprávnění ke spouštění uživatelských skriptů.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/en_GB/messages.json b/platform/mv3/extension/_locales/en_GB/messages.json index e9916f84ebee3..ce0a26c2fa297 100644 --- a/platform/mv3/extension/_locales/en_GB/messages.json +++ b/platform/mv3/extension/_locales/en_GB/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts. Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open the uBO Lite details and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", + "message": "Open your browser's extensions page (chrome://extensions in Chrome or about:addons in Firefox), open the uBO Lite details, and toggle on Allow user scripts (also referred to as “unverified third-party scripts”).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/ka/messages.json b/platform/mv3/extension/_locales/ka/messages.json index ffb285fcf831a..91bd9b092c910 100644 --- a/platform/mv3/extension/_locales/ka/messages.json +++ b/platform/mv3/extension/_locales/ka/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "გარეგნული ან სკრიპტული ფილტრების იძულებით ამოქმედებისთვის შემოტანილი სიებიდან, uBO Lite საჭიროებს მომხმარებლის სკრიპტების გაშვების ნებართვებს.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "გარეგნული ან სკრიპტული ფილტრების იძულებით ამოქმედებისთვის განცაკლევებული გარემოდან, uBO Lite საჭიროებს მომხმარებლის სკრიპტების გაშვების ნებართვებს.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index 204d41a2ca132..a0c64456322dd 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -76,7 +76,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Proteção contra malware, segurança", + "message": "Proteção contra malware e segurança", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { @@ -124,7 +124,7 @@ "description": "" }, "aboutCode": { - "message": "Código fonte (GPLv3)", + "message": "Código-fonte (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { @@ -132,7 +132,7 @@ "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Código fonte", + "message": "Código-fonte", "description": "Link text to source code repo" }, "aboutTranslations": { diff --git a/platform/mv3/extension/_locales/ru/messages.json b/platform/mv3/extension/_locales/ru/messages.json index 3c39942c527bc..91a75e429ba84 100644 --- a/platform/mv3/extension/_locales/ru/messages.json +++ b/platform/mv3/extension/_locales/ru/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Чтобы применять косметические фильтры или скриптлеты из импортированных списков, вы должны предоставить uBO Lite разрешение на запуск пользовательских скриптов. Откройте страницу расширений вашего браузера (chrome://extensions в Chrome или about:addons в Firefox), откройте uBO Lite и включите Разрешить пользовательские скрипты (так называемые «непроверенные сторонние скрипты»).", + "message": "Откройте страницу расширений вашего браузера (chrome://extensions в Chrome или about:addons в Firefox), откройте uBO Lite и включите Разрешить пользовательские скрипты (так называемые «непроверенные сторонние скрипты»).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/tr/messages.json b/platform/mv3/extension/_locales/tr/messages.json index ce062e1265eb9..38309372954d9 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "İçe aktarılan listelerden kozmetik veya scriptlet filtrelerini uygulamak için, uBO Lite’a kullanıcı komut dosyalarını çalıştırma izni vermeniz gerekir.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Sandbox'tan kozmetik veya scriptlet filtrelerini uygulamak için, uBO Lite'a kullanıcı komut dosyalarını çalıştırma izni vermeniz gerekir.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index cbea1be7343fa..734343493c1e0 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "Щоб застосувати косметичні фільтри або фільтри на основі скриптів з імпортованих списків, необхідно надати uBO Lite дозвіл на виконання користувацьких скриптів.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Щоб застосувати косметичні фільтри або фільтри на основі скриптів із пісочниці, необхідно надати uBO Lite дозвіл на виконання користувацьких скриптів.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/src/_locales/pt_PT/messages.json b/src/_locales/pt_PT/messages.json index dc8c4931ec1b4..4f4ca7817d208 100644 --- a/src/_locales/pt_PT/messages.json +++ b/src/_locales/pt_PT/messages.json @@ -12,7 +12,7 @@ "description": "English: uBlock₀ — Dashboard" }, "dashboardUnsavedWarning": { - "message": "Atenção! Tem alterações não guardadas", + "message": "Atenção: tem alterações não guardadas!", "description": "A warning in the dashboard when navigating away from unsaved changes" }, "dashboardUnsavedWarningStay": { @@ -332,7 +332,7 @@ "description": "English: Make use of context menu where appropriate" }, "settingsColorBlindPrompt": { - "message": "Cores amigáveis para daltónicos", + "message": "Cores adequadas para daltónicos", "description": "English: Color-blind friendly" }, "settingsAppearance": { @@ -364,7 +364,7 @@ "description": "English: " }, "settingsWebRTCIPAddressHiddenPrompt": { - "message": "Impedir o WebRTC de vazar endereços IP locais", + "message": "Impedir fugas de endereços IP locais através do WebRTC", "description": "English: " }, "settingPerSiteSwitchGroup": { @@ -404,7 +404,7 @@ "description": "Section for controlling advanced-user settings" }, "settingsAdvancedSynopsis": { - "message": "Funcionalidades adequadas apenas para utilizadores avançados", + "message": "Funcionalidades adequadas apenas para utilizadores técnicos", "description": "Description of section controlling advanced-user settings" }, "settingsAdvancedUserSettings": { @@ -480,7 +480,7 @@ "description": "Filter lists section name" }, "3pGroupMalware": { - "message": "Proteção contra malware, segurança", + "message": "Proteção contra malware e segurança", "description": "Filter lists section name" }, "3pGroupSocial": { @@ -836,7 +836,7 @@ "description": "Below this sentence, the filter list(s) in which the filter was found" }, "loggerStaticFilteringFinderSentence2": { - "message": "O filtro estático não pôde ser encontrado em quaisquer das listas de filtros ativadas atualmente", + "message": "Não foi possível encontrar o filtro estático em nenhuma das listas de filtros atualmente ativadas", "description": "Message to show when a filter cannot be found in any filter lists" }, "loggerSettingDiscardPrompt": { @@ -848,7 +848,7 @@ "description": "A logger setting" }, "loggerSettingPerTabMaxLoads": { - "message": "Preservar no máximo {{input}} carregamentos de página por separador", + "message": "Preservar no máximo {{input}} recargas de página por separador", "description": "A logger setting" }, "loggerSettingPerTabMaxEntries": { @@ -952,7 +952,7 @@ "description": "Header of 'Troubleshooting Information' section in Support pane" }, "supportS5P1": { - "message": "Abaixo encontra-se informação técnica que pode ser útil quando voluntários estão a tentar ajudar-lhe a resolver um problema.", + "message": "Abaixo encontra-se informação técnica que pode ser útil quando voluntários estão a tentar ajudá-lo a resolver um problema.", "description": "First paragraph of 'Troubleshooting Information' section in Support pane" }, "supportS6H": { @@ -968,7 +968,7 @@ "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S2": { - "message": "Verifique se o problema ainda existe após o recarregamento da página web problemática.", + "message": "Verifique se o problema persiste após recarregar a página web problemática.", "description": "A paragraph in the filter issue reporter section" }, "supportS6URL": { @@ -1008,7 +1008,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leva a badware e phishing", + "message": "Leva a badware e/ou phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { @@ -1024,7 +1024,7 @@ "description": "" }, "aboutCode": { - "message": "Código fonte (GPLv3)", + "message": "Código-fonte (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { @@ -1032,7 +1032,7 @@ "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Código fonte", + "message": "Código-fonte", "description": "Link text to source code repo" }, "aboutTranslations": { @@ -1076,7 +1076,7 @@ "description": "Message asking user to confirm restore" }, "aboutRestoreDataError": { - "message": "Os dados não puderam ser lidos ou são inválidos", + "message": "Não foi possível ler os dados ou estes são inválidos", "description": "Message to display when an error occurred during restore" }, "aboutResetDataConfirm": { @@ -1144,7 +1144,7 @@ "description": "label to be used for the parameter-less URL: https://cloud.githubusercontent.com/assets/585534/9832014/bfb1b8f0-593b-11e5-8a27-fba472a5529a.png" }, "docblockedFoundIn": { - "message": "Encontrado em:", + "message": "O filtro foi encontrado em:", "description": "English: List of filter list names follows" }, "docblockedBack": { @@ -1248,7 +1248,7 @@ "description": "A context menu entry, present when large media elements have been blocked on the current site" }, "contextMenuViewSource": { - "message": "Ver código fonte…", + "message": "Ver código-fonte…", "description": "A context menu entry, to view the source code of the target resource" }, "shortcutCapturePlaceholder": { @@ -1256,7 +1256,7 @@ "description": "Placeholder string for input field used to capture a keyboard shortcut" }, "genericMergeViewScrollLock": { - "message": "Alternar deslocamento bloqueado", + "message": "Alternar bloqueio da deslocação", "description": "Tooltip for the button used to lock scrolling between the views in the 'My rules' pane" }, "genericCopyToClipboard": { @@ -1304,7 +1304,7 @@ "description": "Summary of number of errors as reported by the linter " }, "unprocessedRequestTooltip": { - "message": "Não foi possível filtrar adequadamente no arranque do navegador. Recarregue a página para assegurar uma filtragem adequada.", + "message": "Não foi possível filtrar corretamente no arranque do navegador. Recarregue a página para assegurar uma filtragem adequada.", "description": "A warning which will appear in the popup panel if needed" }, "dummy": { From 10ae629288424067952479ab3257244bb5981cae Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 18 Aug 2026 13:11:00 -0400 Subject: [PATCH 047/145] [mv3] Fix performance issue when importing large lists Related discussion: https://www.reddit.com/r/uBlockOrigin/comments/1vos8cd/ --- platform/mv3/extension/js/ubo-parser.js | 37 +++++++++++++------------ 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/platform/mv3/extension/js/ubo-parser.js b/platform/mv3/extension/js/ubo-parser.js index 27314c2f4c8ab..f88ff5c5f402f 100644 --- a/platform/mv3/extension/js/ubo-parser.js +++ b/platform/mv3/extension/js/ubo-parser.js @@ -142,9 +142,9 @@ function mergeDomains(rules, includeProp, excludeProp) { out.push(rule); continue; } - const includes = new Set(rule.condition[includeProp]); + const includes = rule.condition[includeProp] ?? []; rule.condition[includeProp] = undefined; - const excludes = new Set(rule.condition[excludeProp]); + const excludes = rule.condition[excludeProp] ?? []; rule.condition[excludeProp] = undefined; rule.id = undefined; const hash = JSON.stringify(rule, propertySorter); @@ -153,31 +153,34 @@ function mergeDomains(rules, includeProp, excludeProp) { details.initialized = true; distinctRules.set(hash, details); } - if ( includes.size === 0 ) { - details.includes = includes; + if ( includes.length === 0 ) { + details.includes = []; } else if ( details.includes === undefined ) { details.includes = includes; - } else if ( details.includes.size ) { - details.includes = details.includes.union(includes); + } else if ( details.includes.length ) { + for ( const hn of includes ) { + details.includes.push(hn); + } } - if ( excludes.size ) { - details.excludes ??= new Set(); - details.excludes = details.excludes.union(excludes); + if ( excludes.length ) { + if ( details.excludes === undefined ) { + details.excludes = excludes; + } else { + for ( const hn of excludes ) { + details.excludes.push(hn); + } + } } } for ( const [ hash, details ] of distinctRules ) { const rule = JSON.parse(hash); rule.id = details.id; - if ( details.includes?.size ) { - rule.condition[includeProp] = Array.from(details.includes); - } - if ( details.excludes?.size ) { - rule.condition[excludeProp] = Array.from(details.excludes); - } - if ( rule.condition[includeProp] ) { + if ( details.includes?.length ) { + rule.condition[includeProp] = Array.from(new Set(details.includes)); rule.condition[includeProp].sort(); } - if ( rule.condition[excludeProp] ) { + if ( details.excludes?.length ) { + rule.condition[excludeProp] = Array.from(new Set(details.excludes)); rule.condition[excludeProp].sort(); } out.push(rule); From 615a71a5827f7e1ecce41871f1f6f5e90cf20c19 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 19 Aug 2026 07:55:05 -0400 Subject: [PATCH 048/145] [mv3] Minor code review re commit 10ae629288 Related commit: https://github.com/gorhill/uBlock/commit/10ae629288424067952479ab3257244bb5981cae --- platform/mv3/extension/js/ubo-parser.js | 32 ++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/platform/mv3/extension/js/ubo-parser.js b/platform/mv3/extension/js/ubo-parser.js index f88ff5c5f402f..0e50e930cec93 100644 --- a/platform/mv3/extension/js/ubo-parser.js +++ b/platform/mv3/extension/js/ubo-parser.js @@ -142,9 +142,9 @@ function mergeDomains(rules, includeProp, excludeProp) { out.push(rule); continue; } - const includes = rule.condition[includeProp] ?? []; + const includes = rule.condition[includeProp]; rule.condition[includeProp] = undefined; - const excludes = rule.condition[excludeProp] ?? []; + const excludes = rule.condition[excludeProp]; rule.condition[excludeProp] = undefined; rule.id = undefined; const hash = JSON.stringify(rule, propertySorter); @@ -153,7 +153,7 @@ function mergeDomains(rules, includeProp, excludeProp) { details.initialized = true; distinctRules.set(hash, details); } - if ( includes.length === 0 ) { + if ( Boolean(includes?.length) === false ) { details.includes = []; } else if ( details.includes === undefined ) { details.includes = includes; @@ -162,7 +162,7 @@ function mergeDomains(rules, includeProp, excludeProp) { details.includes.push(hn); } } - if ( excludes.length ) { + if ( excludes?.length ) { if ( details.excludes === undefined ) { details.excludes = excludes; } else { @@ -176,12 +176,10 @@ function mergeDomains(rules, includeProp, excludeProp) { const rule = JSON.parse(hash); rule.id = details.id; if ( details.includes?.length ) { - rule.condition[includeProp] = Array.from(new Set(details.includes)); - rule.condition[includeProp].sort(); + rule.condition[includeProp] = Array.from(new Set(details.includes)).sort(); } if ( details.excludes?.length ) { - rule.condition[excludeProp] = Array.from(new Set(details.excludes)); - rule.condition[excludeProp].sort(); + rule.condition[excludeProp] = Array.from(new Set(details.excludes)).sort(); } out.push(rule); } @@ -200,13 +198,13 @@ function mergeArrays(rules, propertyPath, emptyIsAll = false) { out.push(rule); continue; } - if ( Array.isArray(owner[prop]) === false || owner[prop].length === 0 ) { + const collection = owner[prop]; + if ( Array.isArray(collection) === false || collection.length === 0 ) { if ( emptyIsAll === false ) { out.push(rule); continue; } } - const collection = new Set(owner[prop]); owner[prop] = undefined; rule.id = undefined; const hash = JSON.stringify(rule, propertySorter); @@ -215,12 +213,14 @@ function mergeArrays(rules, propertyPath, emptyIsAll = false) { details.initialized = true; distinctRules.set(hash, details); } - if ( collection.size === 0 ) { - details.collection = collection; + if ( Boolean(collection?.length) === false ) { + details.collection = []; } else if ( details.collection === undefined ) { details.collection = collection; - } else if ( details.collection.size ) { - details.collection = details.collection.union(collection); + } else if ( details.collection.length ) { + for ( const v of collection ) { + details.collection.push(v); + } } } for ( const [ hash, { id, collection } ] of distinctRules ) { @@ -228,9 +228,9 @@ function mergeArrays(rules, propertyPath, emptyIsAll = false) { if ( id ) { rule.id = id; } - if ( collection.size !== 0 ) { + if ( collection?.length ) { const { owner, prop } = ownerFromPropertyPath(rule, propertyPath); - owner[prop] = Array.from(collection).sort(); + owner[prop] = Array.from(new Set(collection)).sort(); } out.push(rule); } From 0c56103a40124eb8b7ac8d6b8d0b7c04b4a4e05d Mon Sep 17 00:00:00 2001 From: ryanbr Date: Thu, 20 Aug 2026 17:05:47 +1200 Subject: [PATCH 049/145] Add `env_brave` preparser token Brave can't be told apart from Chrome through the user agent string, so detection uses `navigator.brave` with `navigator.userAgentData.brands` as fallback. Both are synchronous, unlike `navigator.brave.isBrave()` -- the flavor must be settled before filter lists are compiled and cached. Brave still offers uBO in MV2, and a considerable number of Brave users run Brave Shields and uBO at the same time. Filters which are safe on their own can conflict when both blockers apply them, and list maintainers currently have no way to express that: https://github.com/uBlockOrigin/uAssets/pull/34162 --- platform/common/vapi-common.js | 12 ++++++++++++ src/js/static-filtering-parser.js | 2 ++ 2 files changed, 14 insertions(+) diff --git a/platform/common/vapi-common.js b/platform/common/vapi-common.js index 65e0c93c5c048..eafb02c425198 100644 --- a/platform/common/vapi-common.js +++ b/platform/common/vapi-common.js @@ -197,6 +197,18 @@ vAPI.webextFlavor = { .add('user_stylesheet'); } flavor.major = match && parseInt(match[1], 10) || 120; + // Brave can't be told apart through the user agent string, which is + // identical to Chrome's. Both tests below are synchronous, whereas + // navigator.brave.isBrave() is promise-based -- the flavor must be + // settled before filter lists are compiled and cached. Either test + // alone would do, the second one is a fallback for the first. + // https://github.com/brave/brave-browser/wiki/Detecting-Brave-(for-Websites) + if ( + navigator.brave instanceof Object || + navigator.userAgentData?.brands?.some(a => a.brand === 'Brave') + ) { + soup.add('brave'); + } } // Don't starve potential listeners diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index 5429d423d5f8d..d2a1af2f96363 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -604,6 +604,7 @@ export const preparserIfTokens = new Set([ 'ext_ublock', 'ext_ubol', 'ext_devbuild', + 'env_brave', 'env_chromium', 'env_edge', 'env_firefox', @@ -4230,6 +4231,7 @@ export const utils = (( ) => { [ 'ext_ublock', 'ublock' ], [ 'ext_ubol', 'ubol' ], [ 'ext_devbuild', 'devbuild' ], + [ 'env_brave', 'brave' ], [ 'env_chromium', 'chromium' ], [ 'env_edge', 'edge' ], [ 'env_firefox', 'firefox' ], From f94bf63c91e80c8cbcf561b09397182193ef483d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 20 Aug 2026 09:40:08 -0400 Subject: [PATCH 050/145] [mv3] Fix "Filter lists" rendering on reset/restore Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/749 --- platform/mv3/extension/js/background.js | 29 ++++++++++++----------- platform/mv3/extension/js/filter-lists.js | 10 +++++++- platform/mv3/extension/js/settings.js | 2 +- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index 7cd3598e61a1e..1916765a8f624 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -238,21 +238,22 @@ async function applyRulesets(rulesets) { const result = await enableRulesets(rulesets); const stockUpdated = result.stockUpdated ?? false; const importedUpdated = result.importedUpdated ?? false; - if ( (stockUpdated || importedUpdated) === false ) { return; } - rulesetConfig.enabledRulesets = result.enabledRulesets; - await saveRulesetConfig(); - const promises = []; - if ( importedUpdated ) { - promises.push( - updateCompiledFilters().then(( ) => - Promise.all([ registerUserScripts(), updateUserRules() ]) - ) - ); - } - if ( stockUpdated ) { - promises.push(registerContentScripts()); + if ( stockUpdated || importedUpdated ) { + rulesetConfig.enabledRulesets = result.enabledRulesets; + await saveRulesetConfig(); + const promises = []; + if ( importedUpdated ) { + promises.push( + updateCompiledFilters().then(( ) => + Promise.all([ registerUserScripts(), updateUserRules() ]) + ) + ); + } + if ( stockUpdated ) { + promises.push(registerContentScripts()); + } + await Promise.all(promises); } - await Promise.all(promises); broadcastMessage({ enabledRulesets: rulesetConfig.enabledRulesets }); } diff --git a/platform/mv3/extension/js/filter-lists.js b/platform/mv3/extension/js/filter-lists.js index b66d768a3d211..58efe7122452f 100644 --- a/platform/mv3/extension/js/filter-lists.js +++ b/platform/mv3/extension/js/filter-lists.js @@ -117,7 +117,10 @@ function isAdminRuleset(listkey) { /******************************************************************************/ -export async function renderFilterLists() { +export async function renderFilterLists(incremental = false) { + if ( incremental && renderFilterLists.visible !== true ) { return; } + renderFilterLists.visible = true; + const [ enabledRulesets, rulesetDetails, @@ -136,6 +139,7 @@ export async function renderFilterLists() { }); const listStatsTemplate = i18n$('perRulesetStats'); + const beforeListEntries = new Set(qsa$('#lists .listEntry:not([data-role="root"])')); const initializeListEntry = (ruleset, listEntry) => { const on = enabledRulesets.includes(ruleset.id); @@ -204,6 +208,7 @@ export async function renderFilterLists() { } for ( const [ listid, listDetails ] of treeEntries ) { const listEntry = createListEntry(listid, listDetails, depth); + beforeListEntries.delete(listEntry); const newEntry = listEntry.parentElement === null; if ( listDetails.lists === undefined ) { listEntry.dataset.rulesetid = listid; @@ -323,6 +328,9 @@ export async function renderFilterLists() { promoteLonelySublist(listTree[key]); } const listEntries = createListEntries('root', listTree); + for ( const listEntry of beforeListEntries ) { + listEntry.remove(); + } updateNodes(listEntries); diff --git a/platform/mv3/extension/js/settings.js b/platform/mv3/extension/js/settings.js index 7ee40a083b83c..a92e7d0611942 100644 --- a/platform/mv3/extension/js/settings.js +++ b/platform/mv3/extension/js/settings.js @@ -318,7 +318,7 @@ listen.onmessage = ev => { renderWidgets(); } if ( renderLists ) { - renderFilterLists(); + renderFilterLists(true); } }; From 39a0106ffc27837410108f66ce2e4a84e3a973b3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 20 Aug 2026 11:03:24 -0400 Subject: [PATCH 051/145] [mv3] Add missing configuration items from backup/restore Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/754 --- platform/mv3/extension/js/backup-restore.js | 24 ++++++++++++++++++- .../mv3/extension/js/filter-manager-ui.js | 2 ++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/platform/mv3/extension/js/backup-restore.js b/platform/mv3/extension/js/backup-restore.js index 392b46f9b461d..5c5c0d35d56af 100644 --- a/platform/mv3/extension/js/backup-restore.js +++ b/platform/mv3/extension/js/backup-restore.js @@ -37,13 +37,22 @@ export async function backupToObject(currentConfig) { const out = {}; const manifest = runtime.getManifest(); out.version = manifest.versionName ?? manifest.version; - const defaultConfig = await sendMessage({ what: 'getDefaultConfig' }); + const [ + defaultConfig, + sandboxFilters, + ] = await Promise.all([ + sendMessage({ what: 'getDefaultConfig' }), + sendMessage({ what: 'getSandboxFilters' }).then(a => a?.trim() ?? ''), + ]); if ( currentConfig.autoReload !== defaultConfig.autoReload ) { out.autoReload = currentConfig.autoReload; } if ( currentConfig.developerMode !== defaultConfig.developerMode ) { out.developerMode = currentConfig.developerMode; } + if ( currentConfig.popupBlockMode !== defaultConfig.popupBlockMode ) { + out.popupBlockMode = currentConfig.popupBlockMode; + } if ( currentConfig.showBlockedCount !== defaultConfig.showBlockedCount ) { out.showBlockedCount = currentConfig.showBlockedCount; } @@ -68,6 +77,9 @@ export async function backupToObject(currentConfig) { if ( customFilters.length !== 0 ) { out.customFilters = customFilters; } + if ( sandboxFilters !== '' ) { + out.sandboxFilters = sandboxFilters.split('\n'); + } const dnrRules = await localRead('userDnrRules'); if ( typeof dnrRules === 'string' && dnrRules.length !== 0 ) { out.dnrRules = dnrRules.split(/\n+/); @@ -100,6 +112,11 @@ export async function restoreFromObject(targetConfig) { state: targetConfig.strictBlockMode ?? defaultConfig.strictBlockMode }); + await sendMessage({ + what: 'setPopupBlockMode', + state: targetConfig.popupBlockMode ?? defaultConfig.popupBlockMode + }); + const enabledRulesets = defaultConfig.rulesets; for ( const entry of targetConfig.rulesets || [] ) { const id = entry.slice(1); @@ -167,6 +184,11 @@ export async function restoreFromObject(targetConfig) { }); } + await sendMessage({ + what: 'setSandboxFilters', + text: targetConfig.sandboxFilters?.join('\n') ?? '', + }); + const dnrRules = targetConfig.dnrRules ?? []; if ( dnrRules.length !== 0 ) { await localWrite('userDnrRules', dnrRules.join('\n')); diff --git a/platform/mv3/extension/js/filter-manager-ui.js b/platform/mv3/extension/js/filter-manager-ui.js index a4be6908e584e..e0eb861a44da1 100644 --- a/platform/mv3/extension/js/filter-manager-ui.js +++ b/platform/mv3/extension/js/filter-manager-ui.js @@ -631,6 +631,8 @@ async function start() { if ( area !== undefined && area !== 'local' ) { return; } if ( Object.keys(changes).some(a => a.startsWith('site.')) ) { debounceRenderCustomFilters(); + } else if ( changes.sandboxFilters ) { + startsSandboxEditor.editor.loadContent(); } }); From 57ade5f48404faaeda604f722eb28465ad5336fc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 21 Aug 2026 10:18:16 -0400 Subject: [PATCH 052/145] Improve scriptlets framework Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/4090 --- src/js/resources/prevent-addeventlistener.js | 4 ++-- src/js/resources/replace-argument.js | 2 +- src/js/resources/safe-self.js | 13 +++++-------- src/js/resources/scriptlets.js | 8 ++++---- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/js/resources/prevent-addeventlistener.js b/src/js/resources/prevent-addeventlistener.js index 7a9666ab71de1..1321edacaf9d5 100644 --- a/src/js/resources/prevent-addeventlistener.js +++ b/src/js/resources/prevent-addeventlistener.js @@ -91,8 +91,8 @@ function preventAddEventListener( return parts.join(''); }; const shouldPrevent = (thisArg, type, handler) => { - const matchesType = safe.RegExp_test.call(reType, type); - const matchesHandler = safe.RegExp_test.call(rePattern, handler); + const matchesType = safe.RegExp_test(reType, type); + const matchesHandler = safe.RegExp_test(rePattern, handler); const matchesEither = matchesType || matchesHandler; const matchesBoth = matchesType && matchesHandler; if ( safe.logLevel > 1 && matchesEither ) { diff --git a/src/js/resources/replace-argument.js b/src/js/resources/replace-argument.js index 783fac37abd1d..0c98217a44e02 100644 --- a/src/js/resources/replace-argument.js +++ b/src/js/resources/replace-argument.js @@ -109,7 +109,7 @@ export function trustedReplaceArgument( } const argBefore = getArg(context); if ( extraArgs.condition !== undefined ) { - if ( safe.RegExp_test.call(reCondition, argBefore) === false ) { + if ( safe.RegExp_test(reCondition, argBefore) === false ) { return context.reflect(); } } diff --git a/src/js/resources/safe-self.js b/src/js/resources/safe-self.js index 4a48fd8a119e9..19a06f9404916 100644 --- a/src/js/resources/safe-self.js +++ b/src/js/resources/safe-self.js @@ -35,8 +35,7 @@ export function safeSelf() { const safe = { 'Array_from': Array.from, 'Error': self.Error, - 'Function_toStringFn': self.Function.prototype.toString, - 'Function_toString': thisArg => safe.Function_toStringFn.call(thisArg), + 'Function_toString': Function.prototype.call.bind(self.Function.prototype.toString), 'Math_floor': Math.floor, 'Math_max': Math.max, 'Math_min': Math.min, @@ -49,7 +48,7 @@ export function safeSelf() { 'Object_hasOwn': Object.hasOwn.bind(Object), 'Object_toString': Object.prototype.toString, 'RegExp': self.RegExp, - 'RegExp_test': self.RegExp.prototype.test, + 'RegExp_test': Function.prototype.call.bind(self.RegExp.prototype.test), 'RegExp_exec': self.RegExp.prototype.exec, 'Request_clone': self.Request.prototype.clone, 'String': self.String, @@ -60,10 +59,8 @@ export function safeSelf() { 'removeEventListener': self.EventTarget.prototype.removeEventListener, 'fetch': self.fetch, 'JSON': self.JSON, - 'JSON_parseFn': self.JSON.parse, - 'JSON_stringifyFn': self.JSON.stringify, - 'JSON_parse': (...args) => safe.JSON_parseFn.call(safe.JSON, ...args), - 'JSON_stringify': (...args) => safe.JSON_stringifyFn.call(safe.JSON, ...args), + 'JSON_parse': Function.prototype.call.bind(self.JSON.parse, self.JSON), + 'JSON_stringify': Function.prototype.call.bind(self.JSON.stringify, self.JSON), 'log': console.log.bind(console), // Properties logLevel: 0, @@ -116,7 +113,7 @@ export function safeSelf() { testPattern(details, haystack) { if ( details.matchAll ) { return true; } if ( details.re ) { - return this.RegExp_test.call(details.re, haystack) === details.expect; + return this.RegExp_test(details.re, haystack) === details.expect; } return haystack.includes(details.pattern) === details.expect; }, diff --git a/src/js/resources/scriptlets.js b/src/js/resources/scriptlets.js index 6950bed588110..36503122fa1c0 100755 --- a/src/js/resources/scriptlets.js +++ b/src/js/resources/scriptlets.js @@ -123,14 +123,14 @@ function replaceNodeTextFn( const before = node.textContent; if ( reIncludes ) { reIncludes.lastIndex = 0; - if ( safe.RegExp_test.call(reIncludes, before) === false ) { return true; } + if ( safe.RegExp_test(reIncludes, before) === false ) { return true; } } if ( reExcludes ) { reExcludes.lastIndex = 0; - if ( safe.RegExp_test.call(reExcludes, before) ) { return true; } + if ( safe.RegExp_test(reExcludes, before) ) { return true; } } rePattern.lastIndex = 0; - if ( safe.RegExp_test.call(rePattern, before) === false ) { return true; } + if ( safe.RegExp_test(rePattern, before) === false ) { return true; } rePattern.lastIndex = 0; const after = pattern !== '' ? before.replace(rePattern, replacement) @@ -1935,7 +1935,7 @@ function trustedSuppressNativeMethod( } } if ( signatureArg.type === 'pattern' ) { - if ( safe.RegExp_test.call(signatureArg.re, targetArg) === false ) { + if ( safe.RegExp_test(signatureArg.re, targetArg) === false ) { return context.reflect(); } } From fb09b0947df3cd1691814e2b6615dc3e82e2f233 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 21 Aug 2026 11:39:24 -0400 Subject: [PATCH 053/145] Remove support for `cap_user_stylesheet` All supported browsers support user stylesheets, and in any case filter list maintainers shouldn't have to worry about whether user stylesheets are supported or not. --- platform/common/vapi-background.js | 24 +++++-------------- platform/common/vapi-common.js | 4 +--- .../extension/js/offscreen/compile-filters.js | 1 - platform/mv3/make-rulesets.js | 1 - src/js/static-filtering-parser.js | 1 - 5 files changed, 7 insertions(+), 24 deletions(-) diff --git a/platform/common/vapi-background.js b/platform/common/vapi-background.js index ff6ffd1e1f501..e4dc603b9b595 100644 --- a/platform/common/vapi-background.js +++ b/platform/common/vapi-background.js @@ -41,8 +41,6 @@ if ( vAPI.canWASM === false ) { vAPI.canWASM = csp !== undefined && csp.indexOf("'wasm-unsafe-eval'") !== -1; } -vAPI.supportsUserStylesheets = vAPI.webextFlavor.soup.has('user_stylesheet'); - /******************************************************************************/ vAPI.app = { @@ -342,14 +340,9 @@ vAPI.Tabs = class { } async insertCSS(tabId, details) { - if ( vAPI.supportsUserStylesheets ) { - details.cssOrigin = 'user'; - } - try { - await webext.tabs.insertCSS(...arguments); - } - catch { - } + details.cssOrigin = 'user'; + try { await webext.tabs.insertCSS(...arguments); } + catch { } } async query(queryInfo) { @@ -363,14 +356,9 @@ vAPI.Tabs = class { } async removeCSS(tabId, details) { - if ( vAPI.supportsUserStylesheets ) { - details.cssOrigin = 'user'; - } - try { - await webext.tabs.removeCSS(...arguments); - } - catch { - } + details.cssOrigin = 'user'; + try { await webext.tabs.removeCSS(...arguments); } + catch { } } // Properties of the details object: diff --git a/platform/common/vapi-common.js b/platform/common/vapi-common.js index eafb02c425198..ae9f2d837d0ac 100644 --- a/platform/common/vapi-common.js +++ b/platform/common/vapi-common.js @@ -186,15 +186,13 @@ vAPI.webextFlavor = { flavor.isGecko = extensionOrigin.startsWith('moz-extension://'); if ( flavor.isGecko ) { soup.add('firefox') - .add('user_stylesheet') .add('html_filtering'); const match = /Firefox\/(\d+)/.exec(ua); flavor.major = match && parseInt(match[1], 10) || 115; } else { const match = /\bChrom(?:e|ium)\/(\d+)/.exec(ua); if ( match !== null ) { - soup.add('chromium') - .add('user_stylesheet'); + soup.add('chromium'); } flavor.major = match && parseInt(match[1], 10) || 120; // Brave can't be told apart through the user agent string, which is diff --git a/platform/mv3/extension/js/offscreen/compile-filters.js b/platform/mv3/extension/js/offscreen/compile-filters.js index af2bb5a92f0dc..bd42caef7347d 100644 --- a/platform/mv3/extension/js/offscreen/compile-filters.js +++ b/platform/mv3/extension/js/offscreen/compile-filters.js @@ -327,7 +327,6 @@ async function updateList(list) { 'mv3', 'ublock', 'ubol', - 'user_stylesheet', ], }; const asset = { urls: [ list.id ] }; diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index bf8c42bba3705..ea8cab87204bf 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -82,7 +82,6 @@ const env = [ 'mv3', 'ublock', 'ubol', - 'user_stylesheet', ...envExtra, ]; diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index d2a1af2f96363..a8dd8bec8fb03 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -4240,7 +4240,6 @@ export const utils = (( ) => { [ 'env_mv3', 'mv3' ], [ 'env_safari', 'safari' ], [ 'cap_html_filtering', 'html_filtering' ], - [ 'cap_user_stylesheet', 'user_stylesheet' ], [ 'cap_ipaddress', 'ipaddress' ], [ 'false', 'false' ], // Hoping ABP-only list maintainers can at least make use of it to From ed52e20dfc787f8f298b56b08674a930fe01b972 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 21 Aug 2026 11:49:33 -0400 Subject: [PATCH 054/145] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f713303e2af00..86aaab42fed3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +- [Remove support for `cap_user_stylesheet`](https://github.com/gorhill/uBlock/commit/fb09b0947d) +- [Improve scriptlets framework](https://github.com/gorhill/uBlock/commit/57ade5f484) +- [Add `env_brave` preparser token](https://github.com/gorhill/uBlock/commit/0c56103a40) (by @ryanbr) +- [Add set/unset/given cookie values](https://github.com/gorhill/uBlock/commit/a796fd7daf) (by @ryanbr) - [Add procedural operator `content(...)`, to lookup elements inside `template` tags](https://github.com/gorhill/uBlock/commit/25d413803d) - [Improve `prevent-clipboard-write` scriptlet](https://github.com/gorhill/uBlock/commit/8a85e04907) - [Improve `json-edit` scriptlet](https://github.com/gorhill/uBlock/commit/0fdbfdb2b5) From 09ce0422efeb03bba5665f5b6b43fe86102eacff Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 21 Aug 2026 11:50:21 -0400 Subject: [PATCH 055/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index a7d23bfe411b6..71179a88cb357 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.73.1.4 \ No newline at end of file +1.73.1.5 \ No newline at end of file From 89e149e7c6ac7f67cd7289eb1a0e800ce555274e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 21 Aug 2026 11:55:12 -0400 Subject: [PATCH 056/145] Fix workflow --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2dbcddcc6084b..c90a2201c8ef0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -43,7 +43,7 @@ jobs: --title "${{ env.VERSION }}" \ --prerelease \ --draft \ - --notes-file release_body.txt + --notes-file release.body.txt gh release upload ${{ env.VERSION }} \ dist/build/uBlock0_${{ env.VERSION }}.chromium.zip dist/build/uBlock0_${{ env.VERSION }}.firefox.xpi From e64d0c0e0b4d3a35ab76445c1871b2d9047863c3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 21 Aug 2026 11:58:01 -0400 Subject: [PATCH 057/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index 8d3fd84d8ceef..d7aedadb63d53 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From a2fb47c414f4db5c06a43bbfb79ae6ee0e5d62db Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 21 Aug 2026 12:01:31 -0400 Subject: [PATCH 058/145] Fix workflow --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c90a2201c8ef0..b2cc2755fa005 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -45,5 +45,5 @@ jobs: --draft \ --notes-file release.body.txt gh release upload ${{ env.VERSION }} \ - dist/build/uBlock0_${{ env.VERSION }}.chromium.zip + dist/build/uBlock0_${{ env.VERSION }}.chromium.zip \ dist/build/uBlock0_${{ env.VERSION }}.firefox.xpi From e9ca5132326b774ae8eeefe8cb4ee4bbcede35ee Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 21 Aug 2026 12:02:07 -0400 Subject: [PATCH 059/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 71179a88cb357..854016af325d2 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.73.1.5 \ No newline at end of file +1.73.1.6 \ No newline at end of file From dcbfd0b7eda05ce2a7eb5502658d6cfd046c4e3b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 21 Aug 2026 12:07:59 -0400 Subject: [PATCH 060/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index d7aedadb63d53..47bbd5334d37f 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From 660d5c8d247554d99b6cc923610c2ee707a57b5d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 21 Aug 2026 13:32:43 -0400 Subject: [PATCH 061/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 134ec6cbb4142..817c224fa1190 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.73.1.4", + "version": "1.73.1.6", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b4/uBlock0_1.73.1b4.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b6/uBlock0_1.73.1b6.firefox.signed.xpi" } ] } From 20d3c5b9d041f4c89834b2f0ff466a18f5e154f5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 22 Aug 2026 07:43:26 -0400 Subject: [PATCH 062/145] Replace List-KR with filterslists-KO --- assets/assets.dev.json | 6 +++--- assets/assets.json | 6 +++--- platform/mv3/rulesets.json | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/assets/assets.dev.json b/assets/assets.dev.json index 4270ad53e3e20..c0d6a960536c0 100644 --- a/assets/assets.dev.json +++ b/assets/assets.dev.json @@ -754,11 +754,11 @@ "content": "filters", "group": "regions", "off": true, - "title": "🇰🇷kr: List-KR Classic", + "title": "🇰🇷kr: 한국어 (Korean)", "tags": "ads korean 한국어", "lang": "ko", - "contentURL": "https://cdn.jsdelivr.net/npm/@list-kr/filterslists@latest/dist/filterslist-uBlockOrigin-classic.txt", - "supportURL": "https://github.com/List-KR/List-KR#readme" + "contentURL": "https://cdn.jsdelivr.net/npm/@filteringdev/filterslists-ko@latest/dist/filterslist-uBlockOrigin-classic.txt", + "supportURL": "https://github.com/FilteringDev/filterslists-KO#filteringdevfilterslists-ko" }, "LTU-0": { "content": "filters", diff --git a/assets/assets.json b/assets/assets.json index 8c183004546ca..bc9f004f5da04 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -754,11 +754,11 @@ "content": "filters", "group": "regions", "off": true, - "title": "🇰🇷kr: List-KR Classic", + "title": "🇰🇷kr: 한국어 (Korean)", "tags": "ads korean 한국어", "lang": "ko", - "contentURL": "https://cdn.jsdelivr.net/npm/@list-kr/filterslists@latest/dist/filterslist-uBlockOrigin-classic.txt", - "supportURL": "https://github.com/List-KR/List-KR#readme" + "contentURL": "https://cdn.jsdelivr.net/npm/@filteringdev/filterslists-ko@latest/dist/filterslist-uBlockOrigin-classic.txt", + "supportURL": "https://github.com/FilteringDev/filterslists-KO#filteringdevfilterslists-ko" }, "LTU-0": { "content": "filters", diff --git a/platform/mv3/rulesets.json b/platform/mv3/rulesets.json index 09b33300d93d9..33ada91b7c584 100644 --- a/platform/mv3/rulesets.json +++ b/platform/mv3/rulesets.json @@ -424,13 +424,13 @@ "id": "kor-1", "group": "regions", "lang": "ko", - "name": "🇰🇷kr: List-KR Classic", + "name": "🇰🇷kr: 한국어 (Korean)", "tags": "ads korean 한국어", "enabled": false, "urls": [ - "https://cdn.jsdelivr.net/npm/@list-kr/filterslists@latest/dist/filterslist-uBlockOrigin-classic.txt" + "https://cdn.jsdelivr.net/npm/@filteringdev/filterslists-ko@latest/dist/filterslist-uBlockOrigin-classic.txt" ], - "homeURL": "https://github.com/List-KR/List-KR#readme" + "homeURL": "https://github.com/FilteringDev/filterslists-KO#filteringdevfilterslists-ko" }, { "id": "ltu-0", From 933efff4dd553c234c77c560dc093533e1616102 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 22 Aug 2026 08:33:47 -0400 Subject: [PATCH 063/145] Import google-ima-dai shim from AdGuard shims --- platform/mv3/extension/dashboard.html | 1 + src/about.html | 1 + src/js/redirect-resources.js | 2 + .../google-ima-dai.js | 630 ++++++++++++++++++ 4 files changed, 634 insertions(+) create mode 100644 src/web_accessible_resources/google-ima-dai.js diff --git a/platform/mv3/extension/dashboard.html b/platform/mv3/extension/dashboard.html index c8d8b0b9c6c90..8b5fcecaccaa2 100644 --- a/platform/mv3/extension/dashboard.html +++ b/platform/mv3/extension/dashboard.html @@ -188,6 +188,7 @@

_

+
diff --git a/src/about.html b/src/about.html index e747a93051d2a..9c69c7250ebd9 100644 --- a/src/about.html +++ b/src/about.html @@ -41,6 +41,7 @@ +
diff --git a/src/js/redirect-resources.js b/src/js/redirect-resources.js index d9d835d81c1db..42b21e9a7d9bc 100644 --- a/src/js/redirect-resources.js +++ b/src/js/redirect-resources.js @@ -99,6 +99,8 @@ export default new Map([ alias: 'google-ima3', /* adguard compatibility */ data: 'text', } ], + [ 'google-ima-dai.js', { + } ], [ 'googlesyndication_adsbygoogle.js', { alias: [ 'googlesyndication.com/adsbygoogle.js', diff --git a/src/web_accessible_resources/google-ima-dai.js b/src/web_accessible_resources/google-ima-dai.js new file mode 100644 index 0000000000000..365bc8fc66d19 --- /dev/null +++ b/src/web_accessible_resources/google-ima-dai.js @@ -0,0 +1,630 @@ +// Repo: https://github.com/AdguardTeam/Scriptlets +// Source: https://github.com/AdguardTeam/Scriptlets/blob/master/src/redirects/google-ima3-dai.ts +// License: https://github.com/AdguardTeam/Scriptlets/blob/master/LICENSE (GPLv3) +// Commit: https://github.com/AdguardTeam/Scriptlets/blob/eedd995c41/src/redirects/google-ima3-dai.ts +/* eslint-disable */ +(function(source, args) { + const flag = "done"; + const uniqueIdentifier = source.uniqueId + source.name + "_" + (Array.isArray(args) ? args.join("_") : ""); + if (source.uniqueId) { + if (Window.prototype.toString[uniqueIdentifier] === flag) { + return; + } + } + function GoogleIma3Dai(source) { + var streamEventTypes = { + AD_BREAK_ENDED: "adBreakEnded", + AD_BREAK_STARTED: "adBreakStarted", + AD_PERIOD_ENDED: "adPeriodEnded", + AD_PERIOD_STARTED: "adPeriodStarted", + AD_PROGRESS: "adProgress", + CLICK: "click", + COMPLETE: "complete", + CUEPOINTS_CHANGED: "cuepointsChanged", + ERROR: "error", + FIRST_QUARTILE: "firstquartile", + HIDE_AD_UI: "hideAdUi", + LOADED: "loaded", + MIDPOINT: "midpoint", + PAUSED: "paused", + RESUMED: "resumed", + SHOW_AD_UI: "showAdUi", + SKIPPABLE_STATE_CHANGED: "skippableStateChanged", + SKIPPED: "skip", + STARTED: "started", + STREAM_INITIALIZED: "streamInitialized", + THIRD_QUARTILE: "thirdquartile", + VIDEO_CLICKED: "videoClicked" + }; + var isRecord = function isRecord(value) { + return typeof value === "object" && value !== null; + }; + var schedule = function schedule(callback) { + if (typeof requestAnimationFrame === "function") { + requestAnimationFrame(callback); + return; + } + setTimeout(callback, 0); + }; + var toStringRecord = function toStringRecord(value) { + if (!isRecord(value)) { + return {}; + } + var result = {}; + var propertyNames = Object.keys(value); + for (var propertyIndex = 0; propertyIndex < propertyNames.length; propertyIndex += 1) { + var propertyName = propertyNames[propertyIndex]; + result[propertyName] = String(value[propertyName]); + } + return result; + }; + var getStringValue = function getStringValue(value) { + return typeof value === "string" && value.length > 0 ? value : null; + }; + var initializeEventHandler = function initializeEventHandler(instance) { + instance.listeners = new Map; + }; + var normalizeEventTypes = function normalizeEventTypes(type) { + if (typeof type === "string") { + return [ type ]; + } + if (!Array.isArray(type)) { + return []; + } + var eventTypes = []; + for (var eventTypeIndex = 0; eventTypeIndex < type.length; eventTypeIndex += 1) { + var eventType = type[eventTypeIndex]; + if (typeof eventType === "string") { + eventTypes.push(eventType); + } + } + return eventTypes; + }; + var initializeStreamRequest = function initializeStreamRequest(instance, streamRequest) { + instance.adTagParameters = {}; + instance.apiKey = null; + instance.authToken = null; + instance.format = "hls"; + instance.networkCode = null; + instance.omidAccessModeRules = null; + instance.streamActivityMonitorId = null; + if (isRecord(streamRequest)) { + Object.assign(instance, streamRequest); + } + instance.adTagParameters = toStringRecord(instance.adTagParameters); + if (typeof instance.format !== "string" || instance.format.length === 0) { + instance.format = "hls"; + } + }; + var initializePodStreamRequest = function initializePodStreamRequest(instance, podStreamRequest) { + initializeStreamRequest(instance, podStreamRequest); + instance.customAssetKey = typeof instance.customAssetKey === "string" ? instance.customAssetKey : ""; + }; + var EventHandler = function EventHandler() { + initializeEventHandler(this); + }; + EventHandler.prototype.addEventListener = function(type, listener) { + if (typeof listener !== "function") { + return; + } + var eventTypes = normalizeEventTypes(type); + for (var eventTypeIndex = 0; eventTypeIndex < eventTypes.length; eventTypeIndex += 1) { + var eventType = eventTypes[eventTypeIndex]; + if (!this.listeners.has(eventType)) { + this.listeners.set(eventType, new Set); + } + var listeners = this.listeners.get(eventType); + if (listeners) { + listeners.add(listener); + } + } + }; + EventHandler.prototype.removeEventListener = function(type, listener) { + if (typeof listener !== "function") { + return; + } + var eventTypes = normalizeEventTypes(type); + for (var eventTypeIndex = 0; eventTypeIndex < eventTypes.length; eventTypeIndex += 1) { + var listeners = this.listeners.get(eventTypes[eventTypeIndex]); + if (!listeners) { + continue; + } + listeners.delete(listener); + } + }; + EventHandler.prototype.dispatchEvent = function(streamEvent) { + var listeners = this.listeners.get(streamEvent.type); + if (!listeners) { + return; + } + for (var _i = 0, _Array$from = Array.from(listeners); _i < _Array$from.length; _i++) { + var _listener = _Array$from[_i]; + try { + _listener(streamEvent); + } catch (error) { + logMessage(source, error); + } + } + }; + var StreamRequest = function StreamRequest(streamRequest) { + initializeStreamRequest(this, streamRequest); + }; + var LiveStreamRequest = function LiveStreamRequest(liveStreamRequest) { + initializeStreamRequest(this, liveStreamRequest); + this.assetKey = typeof this.assetKey === "string" ? this.assetKey : ""; + }; + Object.setPrototypeOf(LiveStreamRequest.prototype, StreamRequest.prototype); + var PodStreamRequest = function PodStreamRequest(podStreamRequest) { + initializePodStreamRequest(this, podStreamRequest); + }; + Object.setPrototypeOf(PodStreamRequest.prototype, StreamRequest.prototype); + var VideoStitcherLiveStreamRequest = function VideoStitcherLiveStreamRequest(videoStitcherLiveStreamRequest) { + initializePodStreamRequest(this, videoStitcherLiveStreamRequest); + this.liveStreamEventId = typeof this.liveStreamEventId === "string" ? this.liveStreamEventId : ""; + this.oAuthToken = typeof this.oAuthToken === "string" ? this.oAuthToken : null; + this.projectNumber = typeof this.projectNumber === "string" ? this.projectNumber : null; + this.region = typeof this.region === "string" ? this.region : null; + this.videoStitcherSessionOptions = isRecord(this.videoStitcherSessionOptions) ? this.videoStitcherSessionOptions : null; + }; + Object.setPrototypeOf(VideoStitcherLiveStreamRequest.prototype, PodStreamRequest.prototype); + var VideoStitcherVodStreamRequest = function VideoStitcherVodStreamRequest(videoStitcherVodStreamRequest) { + initializeStreamRequest(this, videoStitcherVodStreamRequest); + this.adTagUrl = typeof this.adTagUrl === "string" ? this.adTagUrl : ""; + this.contentSourceUrl = typeof this.contentSourceUrl === "string" ? this.contentSourceUrl : ""; + this.oAuthToken = typeof this.oAuthToken === "string" ? this.oAuthToken : null; + this.projectNumber = typeof this.projectNumber === "string" ? this.projectNumber : null; + this.region = typeof this.region === "string" ? this.region : null; + this.videoStitcherSessionOptions = isRecord(this.videoStitcherSessionOptions) ? this.videoStitcherSessionOptions : null; + this.vodConfigId = typeof this.vodConfigId === "string" ? this.vodConfigId : ""; + }; + Object.setPrototypeOf(VideoStitcherVodStreamRequest.prototype, StreamRequest.prototype); + var VODStreamRequest = function VODStreamRequest(vodStreamRequest) { + initializeStreamRequest(this, vodStreamRequest); + this.contentSourceId = typeof this.contentSourceId === "string" ? this.contentSourceId : ""; + this.videoId = typeof this.videoId === "string" ? this.videoId : ""; + }; + Object.setPrototypeOf(VODStreamRequest.prototype, StreamRequest.prototype); + var StreamData = function StreamData(streamData) { + this.adPeriodData = null; + this.adProgressData = null; + this.cuepoints = []; + this.errorMessage = null; + this.manifestFormat = "HLS"; + this.streamId = null; + this.subtitles = []; + this.url = ""; + if (isRecord(streamData)) { + Object.assign(this, streamData); + } + }; + var StreamEvent = function StreamEvent(type, streamData, ad) { + this.type = type; + this.streamData = streamData || new StreamData; + this.ad = ad || null; + }; + StreamEvent.Type = streamEventTypes; + StreamEvent.prototype.getAd = function() { + return this.ad; + }; + StreamEvent.prototype.getStreamData = function() { + return this.streamData; + }; + var UiSettings = function UiSettings() { + this.locale = ""; + }; + UiSettings.prototype.getLocale = function() { + return this.locale; + }; + UiSettings.prototype.setLocale = function(locale) { + this.locale = locale; + }; + var daiSdkFeatureFlagsStorage = new WeakMap; + var getStoredDaiSdkFeatureFlags = function getStoredDaiSdkFeatureFlags(instance) { + var storedFeatureFlags = daiSdkFeatureFlagsStorage.get(instance); + if (storedFeatureFlags) { + return storedFeatureFlags; + } + var nextFeatureFlags = {}; + daiSdkFeatureFlagsStorage.set(instance, nextFeatureFlags); + return nextFeatureFlags; + }; + var DaiSdkSettingsContainer = function DaiSdkSettingsContainer() { + daiSdkFeatureFlagsStorage.set(this, {}); + }; + DaiSdkSettingsContainer.prototype.getFeatureFlags = function() { + return getStoredDaiSdkFeatureFlags(this); + }; + DaiSdkSettingsContainer.prototype.setFeatureFlags = function(featureFlags) { + daiSdkFeatureFlagsStorage.set(this, Object.assign({}, featureFlags)); + }; + var normalizeStreamRequest = function normalizeStreamRequest(streamRequest) { + if (streamRequest instanceof StreamRequest) { + return streamRequest; + } + if (isRecord(streamRequest)) { + if (typeof streamRequest.liveStreamEventId === "string") { + return new VideoStitcherLiveStreamRequest(streamRequest); + } + if (typeof streamRequest.contentSourceUrl === "string" || typeof streamRequest.vodConfigId === "string" || typeof streamRequest.adTagUrl === "string") { + return new VideoStitcherVodStreamRequest(streamRequest); + } + if (typeof streamRequest.customAssetKey === "string") { + return new PodStreamRequest(streamRequest); + } + if (typeof streamRequest.assetKey === "string") { + return new LiveStreamRequest(streamRequest); + } + if (typeof streamRequest.contentSourceId === "string" || typeof streamRequest.videoId === "string") { + return new VODStreamRequest(streamRequest); + } + } + return new StreamRequest; + }; + var hasLiveIdentifiers = function hasLiveIdentifiers(streamRequest) { + var liveStreamRequest = streamRequest; + return typeof liveStreamRequest.assetKey === "string" && liveStreamRequest.assetKey.length > 0; + }; + var hasVideoStitcherLiveIdentifiers = function hasVideoStitcherLiveIdentifiers(streamRequest) { + var videoStitcherLiveStreamRequest = streamRequest; + return typeof videoStitcherLiveStreamRequest.liveStreamEventId === "string" && videoStitcherLiveStreamRequest.liveStreamEventId.length > 0; + }; + var hasPodIdentifiers = function hasPodIdentifiers(streamRequest) { + var podStreamRequest = streamRequest; + return typeof podStreamRequest.networkCode === "string" && podStreamRequest.networkCode.length > 0 && typeof podStreamRequest.customAssetKey === "string" && podStreamRequest.customAssetKey.length > 0; + }; + var hasVideoStitcherVodIdentifiers = function hasVideoStitcherVodIdentifiers(streamRequest) { + var videoStitcherVodStreamRequest = streamRequest; + var hasContentSourceUrl = typeof videoStitcherVodStreamRequest.contentSourceUrl === "string" && videoStitcherVodStreamRequest.contentSourceUrl.length > 0; + var hasVodConfigId = typeof videoStitcherVodStreamRequest.vodConfigId === "string" && videoStitcherVodStreamRequest.vodConfigId.length > 0; + return hasContentSourceUrl || hasVodConfigId; + }; + var hasVodIdentifiers = function hasVodIdentifiers(streamRequest) { + var vodStreamRequest = streamRequest; + return typeof vodStreamRequest.contentSourceId === "string" && vodStreamRequest.contentSourceId.length > 0 && typeof vodStreamRequest.videoId === "string" && vodStreamRequest.videoId.length > 0; + }; + var hasIdentifiers = function hasIdentifiers(streamRequest) { + return hasLiveIdentifiers(streamRequest) || hasPodIdentifiers(streamRequest) || hasVideoStitcherLiveIdentifiers(streamRequest) || hasVideoStitcherVodIdentifiers(streamRequest) || hasVodIdentifiers(streamRequest); + }; + var getFallbackStreamId = function getFallbackStreamId(streamRequest) { + var liveStreamRequest = streamRequest; + var videoStitcherLiveStreamRequest = streamRequest; + var videoStitcherVodStreamRequest = streamRequest; + var vodStreamRequest = streamRequest; + if (typeof videoStitcherVodStreamRequest.vodConfigId === "string" && videoStitcherVodStreamRequest.vodConfigId.length > 0) { + return `mock-video-stitcher-vod-${videoStitcherVodStreamRequest.vodConfigId}`; + } + if (typeof videoStitcherVodStreamRequest.contentSourceUrl === "string" && videoStitcherVodStreamRequest.contentSourceUrl.length > 0) { + return "mock-video-stitcher-vod"; + } + if (typeof videoStitcherLiveStreamRequest.liveStreamEventId === "string" && videoStitcherLiveStreamRequest.liveStreamEventId.length > 0) { + return `mock-video-stitcher-live-${videoStitcherLiveStreamRequest.liveStreamEventId}`; + } + if (typeof liveStreamRequest.assetKey === "string" && liveStreamRequest.assetKey.length > 0) { + return `mock-live-${liveStreamRequest.assetKey}`; + } + if (typeof vodStreamRequest.videoId === "string" && vodStreamRequest.videoId.length > 0) { + return `mock-vod-${vodStreamRequest.videoId}`; + } + return "mock-stream"; + }; + var getDefaultManifestFormat = function getDefaultManifestFormat(streamRequest) { + return typeof streamRequest.format === "string" && streamRequest.format.toLowerCase() === "dash" ? "DASH" : "HLS"; + }; + var createStreamData = function createStreamData(streamRequest, cuepoints, errorMessage, streamDataOverrides) { + var streamData = new StreamData({ + cuepoints: cuepoints.slice(), + errorMessage: errorMessage, + manifestFormat: getDefaultManifestFormat(streamRequest), + streamId: getFallbackStreamId(streamRequest), + url: "" + }); + if (isRecord(streamDataOverrides)) { + Object.assign(streamData, streamDataOverrides); + } + return streamData; + }; + var appendRequestParameters = function appendRequestParameters(requestUrl, streamRequest) { + var parameterNames = Object.keys(streamRequest.adTagParameters); + for (var parameterIndex = 0; parameterIndex < parameterNames.length; parameterIndex += 1) { + var parameterName = parameterNames[parameterIndex]; + requestUrl.searchParams.set(parameterName, streamRequest.adTagParameters[parameterName]); + } + if (streamRequest.apiKey) { + requestUrl.searchParams.set("api-key", streamRequest.apiKey); + } + if (streamRequest.authToken) { + requestUrl.searchParams.set("auth-token", streamRequest.authToken); + } + if (streamRequest.streamActivityMonitorId) { + requestUrl.searchParams.set("dai-sam-id", streamRequest.streamActivityMonitorId); + } + }; + var buildLiveRequestUrl = function buildLiveRequestUrl(streamRequest, hostName) { + var requestUrl = new URL(`${hostName}/ssai/event/${streamRequest.assetKey}/streams`); + appendRequestParameters(requestUrl, streamRequest); + return requestUrl.toString(); + }; + var buildPodRequestUrl = function buildPodRequestUrl(streamRequest, hostName) { + var requestUrl = new URL(`${hostName}/ssai/pods/api/v1/network/${streamRequest.networkCode}` + `/custom_asset/${streamRequest.customAssetKey}/stream`); + var manifestType = streamRequest.format.toLowerCase() === "dash" ? "dash" : "hls"; + appendRequestParameters(requestUrl, streamRequest); + requestUrl.searchParams.set("manifest-type", manifestType); + return requestUrl.toString(); + }; + var buildVodRequestUrl = function buildVodRequestUrl(streamRequest, hostName) { + var requestFormat = streamRequest.format.toLowerCase() === "dash" ? "dash" : "hls"; + var requestUrl = new URL(`${hostName}/ondemand/${requestFormat}/content/${streamRequest.contentSourceId}` + `/vid/${streamRequest.videoId}/streams`); + appendRequestParameters(requestUrl, streamRequest); + return requestUrl.toString(); + }; + var MAIN_HOST_NAME = "https://dai.google.com"; + var FALLBACK_HOST_NAME = "https://pubads.g.doubleclick.net"; + var getStreamRequestUrls = function getStreamRequestUrls(streamRequest) { + if (hasPodIdentifiers(streamRequest)) { + return [ buildPodRequestUrl(streamRequest, MAIN_HOST_NAME), buildPodRequestUrl(streamRequest, FALLBACK_HOST_NAME) ]; + } + if (hasLiveIdentifiers(streamRequest)) { + return [ buildLiveRequestUrl(streamRequest, MAIN_HOST_NAME), buildLiveRequestUrl(streamRequest, FALLBACK_HOST_NAME) ]; + } + if (hasVodIdentifiers(streamRequest)) { + return [ buildVodRequestUrl(streamRequest, MAIN_HOST_NAME), buildVodRequestUrl(streamRequest, FALLBACK_HOST_NAME) ]; + } + return []; + }; + var readFetchResponseData = async function readFetchResponseData(response) { + var typedResponse = response; + if (typedResponse && typedResponse.ok === false) { + throw new Error(`Stream initialization failed with status ${String(typedResponse.status || 0)}`); + } + if (typedResponse && typeof typedResponse.json === "function") { + var jsonResponse = await typedResponse.json(); + return isRecord(jsonResponse) ? jsonResponse : {}; + } + return isRecord(response) ? response : {}; + }; + var getResponseErrorMessage = function getResponseErrorMessage(responseData) { + return getStringValue(responseData.errorMessage) || getStringValue(responseData.error_message); + }; + var createStreamDataFromResponse = function createStreamDataFromResponse(streamRequest, cuepoints, responseData) { + var podManifestUrl = getStringValue(responseData.pod_manifest_url) || getStringValue(responseData.podManifestUrl) || ""; + var responseStreamId = getStringValue(responseData.stream_id) || getStringValue(responseData.streamId); + var streamUrl = getStringValue(responseData.stream_manifest) || getStringValue(responseData.streamUrl) || podManifestUrl || ""; + var responseErrorMessage = getResponseErrorMessage(responseData); + var hasInitializedStream = streamUrl.length > 0 || responseStreamId !== null && responseStreamId.length > 0; + var errorMessage = responseErrorMessage || (hasInitializedStream ? null : "Stream initialization response missing stream URL"); + var manifestFormat = getStringValue(responseData.manifest_format) || getStringValue(responseData.manifestFormat) || getDefaultManifestFormat(streamRequest); + var streamId = responseStreamId || getFallbackStreamId(streamRequest); + var subtitles = Array.isArray(responseData.subtitles) ? responseData.subtitles : []; + return createStreamData(streamRequest, cuepoints, errorMessage, { + manifestFormat: manifestFormat, + podManifestUrl: podManifestUrl, + pod_manifest_url: podManifestUrl, + streamId: streamId, + subtitles: subtitles, + url: streamUrl + }); + }; + var getErrorMessage = function getErrorMessage(error) { + if (isRecord(error) && typeof error.message === "string" && error.message.length > 0) { + return error.message; + } + return "Stream initialization failed"; + }; + var hideAdUiElement = function hideAdUiElement(streamManager) { + if (!streamManager.adUiElement) { + return; + } + streamManager.adUiElement.style.display = "none"; + }; + var showVideoControls = function showVideoControls(streamManager) { + if (!streamManager.videoElement || streamManager.videoElement.controls) { + return; + } + streamManager.videoElement.controls = true; + }; + var handleContentLoaded = function handleContentLoaded(streamManager) { + hideAdUiElement(streamManager); + showVideoControls(streamManager); + }; + var isContentLoadedEventType = function isContentLoadedEventType(eventType) { + return eventType === StreamEvent.Type.LOADED || eventType === StreamEvent.Type.STREAM_INITIALIZED; + }; + var StreamManager = function StreamManager(videoElement, adUiElement, uiSettings) { + initializeEventHandler(this); + this.videoElement = videoElement || null; + this.adUiElement = adUiElement || null; + this.uiSettings = uiSettings || new UiSettings; + this.clickElement = adUiElement || null; + this.streamData = new StreamData; + this.streamMonitor = {}; + this.streamRequest = null; + this.cuepoints = []; + this.lastMetadata = null; + this.lastTimedMetadata = null; + }; + Object.setPrototypeOf(StreamManager.prototype, EventHandler.prototype); + StreamManager.prototype.contentTimeForStreamTime = function(streamTime) { + return typeof streamTime === "number" ? streamTime : 0; + }; + StreamManager.prototype.destroy = function() { + this.reset(); + }; + StreamManager.prototype.focus = function() { + var clickElement = this.clickElement; + if (!clickElement || typeof clickElement.focus !== "function") { + return; + } + try { + clickElement.focus(); + } catch (error) { + logMessage(source, error); + } + }; + StreamManager.prototype.getAdSkippableState = function() { + return true; + }; + StreamManager.prototype.getStreamData = function() { + return this.streamData; + }; + StreamManager.prototype.loadStreamMetadata = function() { + handleContentLoaded(this); + this.dispatchEvent(new StreamEvent(StreamEvent.Type.LOADED, this.streamData)); + }; + StreamManager.prototype.onTimedMetadata = function(metadata) { + this.lastTimedMetadata = metadata; + }; + StreamManager.prototype.previousCuePointForStreamTime = function(streamTime) { + var previousCuePoint = null; + for (var cuepointIndex = 0; cuepointIndex < this.cuepoints.length; cuepointIndex += 1) { + var cuepoint = this.cuepoints[cuepointIndex]; + if (typeof cuepoint.start !== "number") { + continue; + } + if (cuepoint.start <= streamTime) { + previousCuePoint = cuepoint; + } + } + return previousCuePoint; + }; + StreamManager.prototype.processMetadata = function(type, data, timestamp) { + this.lastMetadata = { + data: data, + timestamp: timestamp, + type: type + }; + }; + StreamManager.prototype.replaceAdTagParameters = function(adTagParameters) { + if (!this.streamRequest) { + this.streamRequest = new StreamRequest; + } + this.streamRequest.adTagParameters = toStringRecord(adTagParameters); + }; + StreamManager.prototype.requestStream = function(streamRequest) { + var _this = this; + var normalizedRequest = normalizeStreamRequest(streamRequest); + this.streamRequest = normalizedRequest; + var dispatchStreamEvent = function dispatchStreamEvent(eventType, streamData) { + _this.streamData = streamData; + if (isContentLoadedEventType(eventType)) { + handleContentLoaded(_this); + } + schedule((function() { + _this.dispatchEvent(new StreamEvent(StreamEvent.Type.STREAM_INITIALIZED, streamData)); + _this.dispatchEvent(new StreamEvent(eventType, streamData)); + })); + }; + if (!hasIdentifiers(normalizedRequest)) { + dispatchStreamEvent(StreamEvent.Type.ERROR, createStreamData(normalizedRequest, this.cuepoints, "Missing stream request identifiers")); + return; + } + var requestUrls = getStreamRequestUrls(normalizedRequest); + if (requestUrls.length > 0) { + var activeRequest = normalizedRequest; + var _fetchStreamData = async function fetchStreamData(requestIndex) { + try { + var fetchResponse = await fetch(requestUrls[requestIndex], { + method: "POST", + credentials: "include" + }); + var responseData = await readFetchResponseData(fetchResponse); + if (_this.streamRequest !== activeRequest) { + return; + } + var _streamData = createStreamDataFromResponse(activeRequest, _this.cuepoints, responseData); + var eventType = _streamData.errorMessage ? StreamEvent.Type.ERROR : StreamEvent.Type.LOADED; + dispatchStreamEvent(eventType, _streamData); + } catch (error) { + if (_this.streamRequest !== activeRequest) { + return; + } + if (requestIndex + 1 < requestUrls.length) { + await _fetchStreamData(requestIndex + 1); + return; + } + dispatchStreamEvent(StreamEvent.Type.ERROR, createStreamData(activeRequest, _this.cuepoints, getErrorMessage(error))); + } + }; + _fetchStreamData(0); + return; + } + dispatchStreamEvent(StreamEvent.Type.LOADED, createStreamData(normalizedRequest, this.cuepoints, null)); + }; + StreamManager.prototype.reset = function() { + this.cuepoints = []; + this.lastMetadata = null; + this.lastTimedMetadata = null; + this.streamData = new StreamData; + this.streamRequest = null; + }; + StreamManager.prototype.setClickElement = function(clickElement) { + if (this.adUiElement) { + return; + } + this.clickElement = clickElement; + }; + StreamManager.prototype.streamTimeForContentTime = function(contentTime) { + return typeof contentTime === "number" ? contentTime : 0; + }; + var api = { + DaiSdkSettings: new DaiSdkSettingsContainer, + LiveStreamRequest: LiveStreamRequest, + PodStreamRequest: PodStreamRequest, + StreamData: StreamData, + StreamEvent: StreamEvent, + StreamManager: StreamManager, + StreamRequest: StreamRequest, + UiSettings: UiSettings, + VideoStitcherLiveStreamRequest: VideoStitcherLiveStreamRequest, + VideoStitcherVodStreamRequest: VideoStitcherVodStreamRequest, + VODStreamRequest: VODStreamRequest + }; + var globalWindow = window; + var googleNamespace = isRecord(globalWindow.google) ? globalWindow.google : {}; + if (!isRecord(globalWindow.google)) { + globalWindow.google = googleNamespace; + } + var imaNamespace = isRecord(googleNamespace.ima) ? googleNamespace.ima : {}; + googleNamespace.ima = imaNamespace; + var daiNamespace = isRecord(imaNamespace.dai) ? imaNamespace.dai : {}; + imaNamespace.dai = daiNamespace; + var apiNamespace = isRecord(daiNamespace.api) ? daiNamespace.api : {}; + daiNamespace.api = apiNamespace; + Object.assign(apiNamespace, api); + hit(source); + } + function hit(e) { + if (e.verbose) { + try { + var n = console.trace.bind(console), i = "[AdGuard] "; + "corelibs" === e.engine ? i += e.ruleText : (e.domainName && (i += `${e.domainName}`), + e.args ? i += `#%#//scriptlet('${e.name}', '${e.args.join("', '")}')` : i += `#%#//scriptlet('${e.name}')`), + n && n(i); + } catch (e) {} + "function" == typeof window.__debug && window.__debug(e); + } + } + function logMessage(e, o) { + var r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2], a = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3], {name: n, verbose: g} = e; + if (r || g) { + var i = console.log; + a ? i(`${n}: ${o}`) : Array.isArray(o) ? i(`${n}:`, ...o) : i(`${n}:`, o); + } + } + const updatedArgs = args ? [].concat(source).concat(args) : [ source ]; + try { + GoogleIma3Dai.apply(this, updatedArgs); + if (source.uniqueId) { + Object.defineProperty(Window.prototype.toString, uniqueIdentifier, { + value: flag, + enumerable: false, + writable: false, + configurable: false + }); + } + } catch (e) { + console.log(e); + } +})({ + name: "google-ima3-dai", + args: [] +}, []); From 3ca8fb77fcdc1a22ab1ff604aabd67c7d49507ae Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 22 Aug 2026 08:49:26 -0400 Subject: [PATCH 064/145] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86aaab42fed3a..f5618c52b9ba9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- [Import `google-ima-dai` shim from AdGuard shims](https://github.com/gorhill/uBlock/commit/933efff4dd) +- [Replace List-KR with filterslists-KO](https://github.com/gorhill/uBlock/commit/20d3c5b9d0) - [Remove support for `cap_user_stylesheet`](https://github.com/gorhill/uBlock/commit/fb09b0947d) - [Improve scriptlets framework](https://github.com/gorhill/uBlock/commit/57ade5f484) - [Add `env_brave` preparser token](https://github.com/gorhill/uBlock/commit/0c56103a40) (by @ryanbr) From d2ad2c2bb8a1c3ddaa7d0293529069d4d21a6eb4 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 22 Aug 2026 08:51:47 -0400 Subject: [PATCH 065/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 854016af325d2..05aa71f1da724 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.73.1.6 \ No newline at end of file +1.73.1.7 \ No newline at end of file From c4200b7b5b8f005aa61e712ea5c1a4908b0259c4 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 22 Aug 2026 08:54:09 -0400 Subject: [PATCH 066/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index 47bbd5334d37f..dd211e01f1954 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From de7b65fd87e5e0a4c53924e3c160dfa33b2fba34 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 22 Aug 2026 08:58:08 -0400 Subject: [PATCH 067/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 817c224fa1190..193297c75360c 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.73.1.6", + "version": "1.73.1.7", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b6/uBlock0_1.73.1b6.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b7/uBlock0_1.73.1b7.firefox.signed.xpi" } ] } From fe277a4ea6d18a0a62757826bb665a92c04a0745 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 22 Aug 2026 12:07:28 -0400 Subject: [PATCH 068/145] Code review for 933efff4dd Related commit: https://github.com/gorhill/uBlock/commit/933efff4dd --- src/js/redirect-resources.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/js/redirect-resources.js b/src/js/redirect-resources.js index 42b21e9a7d9bc..323aa89eda124 100644 --- a/src/js/redirect-resources.js +++ b/src/js/redirect-resources.js @@ -100,6 +100,8 @@ export default new Map([ data: 'text', } ], [ 'google-ima-dai.js', { + aliases: [ 'google-ima3-dai' ], /* adguard compatibility */ + data: 'text', } ], [ 'googlesyndication_adsbygoogle.js', { alias: [ From a46d5c8e75009d78c87b26267948ae628df4d126 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 23 Aug 2026 08:08:52 -0400 Subject: [PATCH 069/145] Fix possible injection of scriptlets requiring trust from non-trusted sources Exception filters must never cause actual filters to be created. Reported via email by "syvb": > If you use both ~ and #@# in a filter rule, they cancel each other > out and the filter still runs. But the check for trusted filter rules > ignores all rules with #@#, even if they also use ~. So if you use > both ~ and #@# in the same filter rule it will still run and can use > trusted scriptlets, even when not in a trusted filter list. > > E.g. this filter runs JS on every page, even when not part of a > trusted filter list: > > ~*#@#+js(trusted-create-html, body, ) > > idk how big of a problem this is. but having ~ and #@# cancel each other out > doesn't seem like intended behavior anyways? > > thanks > [syvb] --- src/js/cosmetic-filtering.js | 10 ++++++---- src/js/html-filtering.js | 3 ++- src/js/scriptlet-filtering-core.js | 3 ++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/js/cosmetic-filtering.js b/src/js/cosmetic-filtering.js index 4b4e561d5612c..dcb3f8e5974ec 100644 --- a/src/js/cosmetic-filtering.js +++ b/src/js/cosmetic-filtering.js @@ -312,13 +312,15 @@ CosmeticFilteringEngine.prototype.compile = function(parser, writer) { // https://github.com/chrisaljoudi/uBlock/issues/151 // Negated hostname means the filter applies to all non-negated hostnames // of same filter OR globally if there is no non-negated hostnames. + const isException = parser.isException(); let applyGlobally = true; for ( const { hn, not, bad } of parser.getExtFilterDomainIterator() ) { if ( bad ) { continue; } if ( not === false ) { applyGlobally = false; } - this.compileSpecificSelector(parser, hn, not, writer); + if ( isException && not ) { continue; } + this.compileSpecificSelector(parser, hn, isException || not, writer); } if ( applyGlobally ) { this.compileGenericSelector(parser, writer); @@ -427,10 +429,10 @@ CosmeticFilteringEngine.prototype.compileGenericUnhideSelector = function( CosmeticFilteringEngine.prototype.compileSpecificSelector = function( parser, hostname, - not, + isException, writer ) { - const { raw, compiled, exception } = parser.result; + const { raw, compiled } = parser.result; if ( compiled === undefined ) { const who = writer.properties.get('name') || '?'; logger.writeOne({ @@ -442,7 +444,7 @@ CosmeticFilteringEngine.prototype.compileSpecificSelector = function( } writer.select('COSMETIC_FILTERS:SPECIFIC'); - const prefix = ((exception ? 1 : 0) ^ (not ? 1 : 0)) ? '-' : '+'; + const prefix = isException ? '-' : '+'; writer.push([ 8, hostname, `${prefix}${compiled}` ]); }; diff --git a/src/js/html-filtering.js b/src/js/html-filtering.js index 4fdba576e5dff..9557d0a256c2c 100644 --- a/src/js/html-filtering.js +++ b/src/js/html-filtering.js @@ -352,10 +352,11 @@ htmlFilteringEngine.compile = function(parser, writer) { let hasOnlyNegated = true; for ( const { hn, not, bad } of parser.getExtFilterDomainIterator() ) { if ( bad ) { continue; } - const prefix = ((isException ? 1 : 0) ^ (not ? 1 : 0)) ? '-' : '+'; if ( not === false ) { hasOnlyNegated = false; } + if ( isException && not ) { continue; } + const prefix = isException || not ? '-' : '+'; compiledFilters.push([ 64, hn, `${prefix}${compiled}` ]); } diff --git a/src/js/scriptlet-filtering-core.js b/src/js/scriptlet-filtering-core.js index 47d87fde072ab..fa65f7cde8a8a 100644 --- a/src/js/scriptlet-filtering-core.js +++ b/src/js/scriptlet-filtering-core.js @@ -160,7 +160,8 @@ export class ScriptletFilteringEngine { for ( const { hn, not, bad } of parser.getExtFilterDomainIterator() ) { if ( bad ) { continue; } - const prefix = ((isException ? 1 : 0) ^ (not ? 1 : 0)) ? '-' : '+'; + if ( isException && not ) { continue; } + const prefix = isException || not ? '-' : '+'; writer.push([ 32, hn, `${prefix}${normalized}` ]); } } From 23db37e58f2081f62de8af3e80cd3be2726c3737 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 23 Aug 2026 08:57:10 -0400 Subject: [PATCH 070/145] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5618c52b9ba9..5b8aebe1fe944 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Fix possible injection of scriptlets requiring trust from non-trusted sources](https://github.com/gorhill/uBlock/commit/a46d5c8e75) - [Import `google-ima-dai` shim from AdGuard shims](https://github.com/gorhill/uBlock/commit/933efff4dd) - [Replace List-KR with filterslists-KO](https://github.com/gorhill/uBlock/commit/20d3c5b9d0) - [Remove support for `cap_user_stylesheet`](https://github.com/gorhill/uBlock/commit/fb09b0947d) From 622ea0266b9359237ab1eb520929b651bb7d8256 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 23 Aug 2026 08:57:33 -0400 Subject: [PATCH 071/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 05aa71f1da724..ff14a42662f6d 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.73.1.7 \ No newline at end of file +1.73.1.8 \ No newline at end of file From e9c708ecb28f67df1eca4800f9ec4c0acef7c50b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 23 Aug 2026 09:10:04 -0400 Subject: [PATCH 072/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index dd211e01f1954..fd44559212c43 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From df7f5535eef56460ef3be2f4dc341a11234778c5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 23 Aug 2026 09:37:52 -0400 Subject: [PATCH 073/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 193297c75360c..cbf8ceee640d7 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.73.1.7", + "version": "1.73.1.8", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b7/uBlock0_1.73.1b7.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b8/uBlock0_1.73.1b8.firefox.signed.xpi" } ] } From ba8e0130f1f5799a75e9c443e6ac69280889e8b3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 25 Aug 2026 09:25:41 -0400 Subject: [PATCH 074/145] Prepare to release crx package for stable release --- Makefile | 4 +++- dist/chromium/update.xml | 0 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 dist/chromium/update.xml diff --git a/Makefile b/Makefile index 50b0b2c029048..830796543d2e1 100644 --- a/Makefile +++ b/Makefile @@ -106,7 +106,9 @@ publish-chromium: ghrepo=uBlock \ ghtag=$(version) \ ghasset=chromium \ - storeid=cjpalhdlnbpafiamejdnhcphjbkeiagm + storeid=cjpalhdlnbpafiamejdnhcphjbkeiagm \ + crxupdatepath=dist/chromium/update.xml \ + crxkeytoken=ubo_dev_key_path # Usage: make publish-edge version=? publish-edge: diff --git a/dist/chromium/update.xml b/dist/chromium/update.xml new file mode 100644 index 0000000000000..e69de29bb2d1d From 6dd2d95e50d134a477a4e183343c0b26e9147123 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 25 Aug 2026 09:30:55 -0400 Subject: [PATCH 075/145] New version for stable release --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index ff14a42662f6d..283edc6d723df 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.73.1.8 \ No newline at end of file +1.74.0 \ No newline at end of file From 309b9e8264532c0e5af4a5f903c2ccf5b215dc50 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 25 Aug 2026 09:42:09 -0400 Subject: [PATCH 076/145] Make Chromium dev build auto-update --- dist/chromium/update.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dist/chromium/update.xml b/dist/chromium/update.xml index e69de29bb2d1d..ac29fcf913463 100644 --- a/dist/chromium/update.xml +++ b/dist/chromium/update.xml @@ -0,0 +1,6 @@ + + + + + + From 48d25d3c3641abbb381e40ba97554cc9a1d9e91d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 25 Aug 2026 12:06:23 -0400 Subject: [PATCH 077/145] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/extension/_locales/ar/messages.json | 4 ++-- src/_locales/ko/messages.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index 56944a2165bc1..7c94ea4641bc7 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "لفرض عوامل تصفية تجميلية أو برمجية من القوائم المستوردة، يجب عليك منح uBO Lite إذنًا لتشغيل البرامج النصية للمستخدم.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "لفرض استخدام عوامل تصفية تجميلية أو برامج نصية من بيئة الاختبار المعزولة، يجب عليك منح uBO Lite إذنًا لتشغيل البرامج النصية للمستخدم.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/src/_locales/ko/messages.json b/src/_locales/ko/messages.json index 7a41435e84bdd..83ddbd8dc9f1d 100644 --- a/src/_locales/ko/messages.json +++ b/src/_locales/ko/messages.json @@ -488,7 +488,7 @@ "description": "Filter lists section name" }, "3pGroupCookies": { - "message": "쿠키 공지", + "message": "쿠키 알림", "description": "Filter lists section name" }, "3pGroupAnnoyances": { @@ -528,7 +528,7 @@ "description": "used as a tooltip for the clock icon beside a list" }, "3pUpdating": { - "message": "업데이트 중...", + "message": "업데이트 중…", "description": "used as a tooltip for the spinner icon beside a list" }, "3pNetworkError": { From 43d3c74ce7e114f1332187c3931b3149a88c9607 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 29 Aug 2026 11:48:27 -0400 Subject: [PATCH 078/145] Improve procedural operator `:matches-path()` Related discussion: https://github.com/uBlockOrigin/uBlock-issues/discussions/4101 --- src/js/contentscript-extra.js | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/js/contentscript-extra.js b/src/js/contentscript-extra.js index 01b83e3d0af15..713bd9880874e 100644 --- a/src/js/contentscript-extra.js +++ b/src/js/contentscript-extra.js @@ -45,6 +45,13 @@ const regexFromString = (s, exact = false) => { return new RegExp(exact ? `^${reStr}$` : reStr); }; +const triggerDOMChange = ( ) => { + if ( typeof vAPI !== 'object' ) { return; } + if ( vAPI === null ) { return; } + const filterer = vAPI.domFilterer && vAPI.domFilterer.proceduralFilterer; + filterer?.onDOMChanged([ null ]); +}; + // 'P' stands for 'Procedural' class PSelectorTask { @@ -159,13 +166,7 @@ class PSelectorMatchesMediaTask extends PSelectorTask { super(); this.mql = window.matchMedia(task[1]); if ( this.mql.media === 'not all' ) { return; } - this.mql.addEventListener('change', ( ) => { - if ( typeof vAPI !== 'object' ) { return; } - if ( vAPI === null ) { return; } - const filterer = vAPI.domFilterer && vAPI.domFilterer.proceduralFilterer; - if ( filterer instanceof Object === false ) { return; } - filterer.onDOMChanged([ null ]); - }); + this.mql.addEventListener('change', triggerDOMChange); } transpose(node, output) { if ( this.mql.matches === false ) { return; } @@ -179,12 +180,16 @@ class PSelectorMatchesPathTask extends PSelectorTask { this.needle = regexFromString( task[1].replace(/\P{ASCII}/gu, s => encodeURIComponent(s)) ); + if ( PSelectorMatchesPathTask.#listener ) { return; } + PSelectorMatchesPathTask.#listener = true; + self.navigation.addEventListener('navigate', triggerDOMChange); } transpose(node, output) { if ( this.needle.test(self.location.pathname + self.location.search) ) { output.push(node); } } + static #listener; } class PSelectorMatchesPropTask extends PSelectorTask { @@ -379,7 +384,6 @@ PSelectorUpwardTask.prototype.s = ''; class PSelectorWatchAttrs extends PSelectorTask { constructor(task) { super(); - this.observer = null; this.observed = new WeakSet(); this.observerOptions = { attributes: true, @@ -390,23 +394,16 @@ class PSelectorWatchAttrs extends PSelectorTask { this.observerOptions.attributeFilter = task[1]; } } - // TODO: Is it worth trying to re-apply only the current selector? - handler() { - const filterer = - vAPI.domFilterer && vAPI.domFilterer.proceduralFilterer; - if ( filterer instanceof Object ) { - filterer.onDOMChanged([ null ]); - } - } transpose(node, output) { output.push(node); if ( this.observed.has(node) ) { return; } - if ( this.observer === null ) { - this.observer = new MutationObserver(this.handler); + if ( PSelectorWatchAttrs.#observer === undefined ) { + PSelectorWatchAttrs.#observer = new MutationObserver(triggerDOMChange); } - this.observer.observe(node, this.observerOptions); + PSelectorWatchAttrs.#observer.observe(node, this.observerOptions); this.observed.add(node); } + static #observer; } class PSelectorXpathTask extends PSelectorTask { From b9663e6350bb23fbcef79d1c4b72b8f64243c84c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 29 Aug 2026 12:04:34 -0400 Subject: [PATCH 079/145] [mv3] Improve procedural operator `:matches-path()` Related commit: https://github.com/gorhill/uBlock/commit/43d3c74ce7 --- .../mv3/extension/js/scripting/css-procedural-api.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/platform/mv3/extension/js/scripting/css-procedural-api.js b/platform/mv3/extension/js/scripting/css-procedural-api.js index 45656d3a35948..2d7ab0f0a8dc8 100644 --- a/platform/mv3/extension/js/scripting/css-procedural-api.js +++ b/platform/mv3/extension/js/scripting/css-procedural-api.js @@ -29,6 +29,8 @@ if ( self.ProceduralFiltererAPI !== undefined ) { /******************************************************************************/ +const chrome = self.chrome ?? self.browser; + const nonVisualElements = { head: true, link: true, @@ -195,15 +197,22 @@ class PSelectorMatchesMediaTask extends PSelectorTask { class PSelectorMatchesPathTask extends PSelectorTask { constructor(filterer, task) { super(); + this.filterer = filterer; this.needle = regexFromString( task[1].replace(/\P{ASCII}/gu, s => encodeURIComponent(s)) ); + if ( PSelectorMatchesPathTask.#listener ) { return; } + PSelectorMatchesPathTask.#listener = true; + self.navigation.addEventListener('navigate', ( ) => { + this.filterer.uBOL_DOMChanged(); + }); } transpose(node, output) { if ( this.needle.test(self.location.pathname + self.location.search) ) { output.push(node); } } + static #listener; } /******************************************************************************/ From f05fd05713b0fb30078b935dd7e455a096a73c51 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 30 Aug 2026 13:07:38 -0400 Subject: [PATCH 080/145] Code review for 43d3c74ce7 Related feedback: https://github.com/gorhill/uBlock/commit/43d3c74ce7#commitcomment-198261704 --- platform/mv3/extension/js/scripting/css-procedural-api.js | 1 + src/js/contentscript-extra.js | 1 + 2 files changed, 2 insertions(+) diff --git a/platform/mv3/extension/js/scripting/css-procedural-api.js b/platform/mv3/extension/js/scripting/css-procedural-api.js index 2d7ab0f0a8dc8..040eafdc89540 100644 --- a/platform/mv3/extension/js/scripting/css-procedural-api.js +++ b/platform/mv3/extension/js/scripting/css-procedural-api.js @@ -203,6 +203,7 @@ class PSelectorMatchesPathTask extends PSelectorTask { ); if ( PSelectorMatchesPathTask.#listener ) { return; } PSelectorMatchesPathTask.#listener = true; + if ( Boolean(self.navigation) === false ) { return; } self.navigation.addEventListener('navigate', ( ) => { this.filterer.uBOL_DOMChanged(); }); diff --git a/src/js/contentscript-extra.js b/src/js/contentscript-extra.js index 713bd9880874e..482cb62e54a02 100644 --- a/src/js/contentscript-extra.js +++ b/src/js/contentscript-extra.js @@ -182,6 +182,7 @@ class PSelectorMatchesPathTask extends PSelectorTask { ); if ( PSelectorMatchesPathTask.#listener ) { return; } PSelectorMatchesPathTask.#listener = true; + if ( Boolean(self.navigation) === false ) { return; } self.navigation.addEventListener('navigate', triggerDOMChange); } transpose(node, output) { From 1235e4dd2744b062da090ecbb52fecf8261c61f2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 31 Aug 2026 09:16:02 -0400 Subject: [PATCH 081/145] Improve `xmlPrune` scriptlet Related issue: https://github.com/uBlockOrigin/uAssets/issues/34277 --- src/js/resources/prevent-xhr.js | 61 ++++++++++++++++++++++++++++++++- src/js/resources/proxy-apply.js | 26 ++++++++++++++ src/js/resources/scriptlets.js | 44 +++++------------------- 3 files changed, 95 insertions(+), 36 deletions(-) diff --git a/src/js/resources/prevent-xhr.js b/src/js/resources/prevent-xhr.js index e0bce3b8c9840..478470872a70f 100644 --- a/src/js/resources/prevent-xhr.js +++ b/src/js/resources/prevent-xhr.js @@ -25,7 +25,10 @@ import { matchObjectPropertiesFn, parsePropertiesToMatchFn, } from './utils.js'; -import { proxyApplyFn } from './proxy-apply.js'; +import { + proxyApplyFn, + proxyToStringFn, +} from './proxy-apply.js'; import { registerScriptlet } from './base.js'; import { safeSelf } from './safe-self.js'; @@ -34,6 +37,62 @@ import { safeSelf } from './safe-self.js'; /******************************************************************************/ +export function modifyXhrResponseFn( + propsToMatch = '', + modifierFn = '' +) { + if ( typeof propsToMatch !== 'string' ) { return; } + const safe = safeSelf(); + if ( modifyXhrResponseFn.xhrInstances === undefined ) { + modifyXhrResponseFn.xhrInstances = new WeakMap(); + } + const propNeedles = parsePropertiesToMatchFn(propsToMatch, 'url'); + const NativeXMLHttpRequest = self.XMLHttpRequest; + const TrappedXMLHttpRequest = class XMLHttpRequest extends NativeXMLHttpRequest { + open(method, url, ...args) { + const haystack = { method, url }; + if ( propsToMatch === '' ) { + safe.uboLog(`modifyXhrResponseFn() / Called: ${safe.JSON_stringify(haystack, null, 2)}`); + } else if ( matchObjectPropertiesFn(propNeedles, haystack) ) { + modifyXhrResponseFn.xhrInstances.set(this, modifierFn); + } + return super.open(method, url, ...args); + } + get response() { + const modifierFn = modifyXhrResponseFn.xhrInstances.get(this); + return modifierFn + ? modifierFn(this, super.response) + : super.response; + } + get responseText() { + const modifierFn = modifyXhrResponseFn.xhrInstances.get(this); + return modifierFn + ? modifierFn(this, super.responseText) + : super.responseText; + } + get responseXML() { + const modifierFn = modifyXhrResponseFn.xhrInstances.get(this); + return modifierFn + ? modifierFn(this, super.responseXML) + : super.responseXML; + } + }; + proxyToStringFn(TrappedXMLHttpRequest.prototype.open, NativeXMLHttpRequest.prototype.open); + proxyToStringFn(TrappedXMLHttpRequest, NativeXMLHttpRequest); + self.XMLHttpRequest = TrappedXMLHttpRequest; +} +registerScriptlet(modifyXhrResponseFn, { + name: 'modify-xhr-response.fn', + dependencies: [ + matchObjectPropertiesFn, + parsePropertiesToMatchFn, + proxyToStringFn, + safeSelf, + ], +}); + +/******************************************************************************/ + function preventXhrFn( trusted = false, propsToMatch = '', diff --git a/src/js/resources/proxy-apply.js b/src/js/resources/proxy-apply.js index c64b043e341f9..9f32a643ff387 100644 --- a/src/js/resources/proxy-apply.js +++ b/src/js/resources/proxy-apply.js @@ -24,6 +24,32 @@ import { registerScriptlet } from './base.js'; /******************************************************************************/ +export function proxyToStringFn(proxiedFn, nativeFn) { + if ( proxyToStringFn.proxies === undefined ) { + proxyToStringFn.proxies = new WeakMap(); + proxyToStringFn.nativeToString = Function.prototype.toString; + const proxiedToString = new Proxy(Function.prototype.toString, { + apply(target, thisArg) { + let proxied = thisArg; + for(;;) { + const fn = proxyToStringFn.proxies.get(proxied); + if ( fn === undefined ) { break; } + proxied = fn; + } + return proxyToStringFn.nativeToString.call(proxied); + } + }); + proxyToStringFn.proxies.set(proxiedToString, proxyToStringFn.nativeToString); + Function.prototype.toString = proxiedToString; + } + proxyToStringFn.proxies.set(proxiedFn, nativeFn); +} +registerScriptlet(proxyToStringFn, { + name: 'proxy-tostring.fn', +}); + +/******************************************************************************/ + export function proxyApplyFn( target = '', handler = '', diff --git a/src/js/resources/scriptlets.js b/src/js/resources/scriptlets.js index 36503122fa1c0..267b3e2f9c5c5 100755 --- a/src/js/resources/scriptlets.js +++ b/src/js/resources/scriptlets.js @@ -36,7 +36,6 @@ import './prevent-fetch.js'; import './prevent-innerHTML.js'; import './prevent-navigation.js'; import './prevent-settimeout.js'; -import './prevent-xhr.js'; import './replace-argument.js'; import './spoof-css.js'; @@ -54,6 +53,7 @@ import { runAt, runAtHtmlElementFn } from './run-at.js'; import { getAllCookiesFn } from './cookie.js'; import { getAllLocalStorageFn } from './localstorage.js'; import { matchesStackTraceFn } from './stack-trace.js'; +import { modifyXhrResponseFn } from './prevent-xhr.js'; import { proxyApplyFn } from './proxy-apply.js'; import { registeredScriptlets } from './base.js'; import { safeSelf } from './safe-self.js'; @@ -984,6 +984,7 @@ builtinScriptlets.push({ name: 'xml-prune.js', fn: xmlPrune, dependencies: [ + 'modify-xhr-response.fn', 'safe-self.fn', ], }); @@ -1089,41 +1090,14 @@ function xmlPrune( }); } }); - self.XMLHttpRequest.prototype.open = new Proxy(self.XMLHttpRequest.prototype.open, { - apply: async (target, thisArg, args) => { - if ( reUrl.test(urlFromArg(args[1])) === false ) { - return Reflect.apply(target, thisArg, args); - } - thisArg.addEventListener('readystatechange', function() { - if ( thisArg.readyState !== 4 ) { return; } - const type = thisArg.responseType; - if ( - type === 'document' || - type === '' && thisArg.responseXML instanceof XMLDocument - ) { - pruneFromDoc(thisArg.responseXML); - const serializer = new XMLSerializer(); - const textout = serializer.serializeToString(thisArg.responseXML); - Object.defineProperty(thisArg, 'responseText', { value: textout }); - if ( typeof thisArg.response === 'string' ) { - Object.defineProperty(thisArg, 'response', { value: textout }); - } - return; - } - if ( - type === 'text' || - type === '' && typeof thisArg.responseText === 'string' - ) { - const textin = thisArg.responseText; - const textout = pruneFromText(textin); - if ( textout === textin ) { return; } - Object.defineProperty(thisArg, 'response', { value: textout }); - Object.defineProperty(thisArg, 'responseText', { value: textout }); - return; - } - }); - return Reflect.apply(target, thisArg, args); + modifyXhrResponseFn(urlPattern, (xhr, before) => { + if ( before instanceof XMLDocument ) { + return pruneFromDoc(before); + } + if ( typeof before === 'string' ) { + return pruneFromText(before); } + return before; }); } From 84d6f155249fd57322c618bc56eb5c245b94cda1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 31 Aug 2026 09:17:21 -0400 Subject: [PATCH 082/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 283edc6d723df..b609a95acbc92 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.74.0 \ No newline at end of file +1.74.1.0 \ No newline at end of file From fd870e5d5b4b1e2445586c4866b865791f3bb6a9 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 31 Aug 2026 09:20:03 -0400 Subject: [PATCH 083/145] Update changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b8aebe1fe944..5ea05b2688818 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +- [Improve `xmlPrune` scriptlet](https://github.com/gorhill/uBlock/commit/1235e4dd27) +- [Improve procedural operator `:matches-path()`](https://github.com/gorhill/uBlock/commit/43d3c74ce7) + +---------- + +# 1.74.0 + - [Fix possible injection of scriptlets requiring trust from non-trusted sources](https://github.com/gorhill/uBlock/commit/a46d5c8e75) - [Import `google-ima-dai` shim from AdGuard shims](https://github.com/gorhill/uBlock/commit/933efff4dd) - [Replace List-KR with filterslists-KO](https://github.com/gorhill/uBlock/commit/20d3c5b9d0) From 9b8d164eea0a3e78ca9e1463b96e2d95ad887843 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 31 Aug 2026 09:29:03 -0400 Subject: [PATCH 084/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index fd44559212c43..c9ee35397ab54 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From 680f1b6dd32540e2b70030c7c45c7670b2f8b1dd Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 31 Aug 2026 09:34:20 -0400 Subject: [PATCH 085/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index cbf8ceee640d7..5d85fb7393a7f 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.73.1.8", + "version": "1.74.1.0", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.73.1b8/uBlock0_1.73.1b8.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.74.1b0/uBlock0_1.74.1b0.firefox.signed.xpi" } ] } From df8556adb23b763782f45c894c232cbcaf3028e1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 31 Aug 2026 16:27:08 -0400 Subject: [PATCH 086/145] Update makefile --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 830796543d2e1..9356b75636016 100644 --- a/Makefile +++ b/Makefile @@ -105,7 +105,7 @@ publish-chromium: ghowner=gorhill \ ghrepo=uBlock \ ghtag=$(version) \ - ghasset=chromium \ + ghasset=chromium.zip \ storeid=cjpalhdlnbpafiamejdnhcphjbkeiagm \ crxupdatepath=dist/chromium/update.xml \ crxkeytoken=ubo_dev_key_path @@ -116,7 +116,7 @@ publish-edge: ghowner=gorhill \ ghrepo=uBlock \ ghtag=$(version) \ - ghasset=chromium \ + ghasset=chromium.zip \ datebasedmajor=1 \ storeid=odfafepnkmbhccpbejgmiehpchacaeak \ productid=$(shell secret-tool lookup token ubo_edge_id) \ @@ -138,7 +138,7 @@ publish-dev-chromium: ghowner=gorhill \ ghrepo=uBlock \ ghtag=$(version) \ - ghasset=chromium \ + ghasset=chromium.zip \ storeid=cgbcahbpdhpcegmbfconppldiemgcoii \ crxupdatepath=dist/chromium/update-dev.xml \ crxkeytoken=ubo_dev_key_path From 323b4ce2797182bd000c87462725a74c1bd86122 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 31 Aug 2026 16:28:56 -0400 Subject: [PATCH 087/145] Add `mpegdash-prune` scriptlet Related issue: https://github.com/uBlockOrigin/uAssets/issues/34277 --- src/js/resources/scriptlets.js | 6 +- src/js/resources/vod.js | 175 +++++++++++++++++++++++++++++++++ 2 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 src/js/resources/vod.js diff --git a/src/js/resources/scriptlets.js b/src/js/resources/scriptlets.js index 267b3e2f9c5c5..41da2b851caf9 100755 --- a/src/js/resources/scriptlets.js +++ b/src/js/resources/scriptlets.js @@ -38,6 +38,7 @@ import './prevent-navigation.js'; import './prevent-settimeout.js'; import './replace-argument.js'; import './spoof-css.js'; +import './vod.js'; import { collateFetchArgumentsFn, @@ -48,7 +49,10 @@ import { onIdleFn, parsePropertiesToMatchFn, } from './utils.js'; -import { runAt, runAtHtmlElementFn } from './run-at.js'; +import { + runAt, + runAtHtmlElementFn, +} from './run-at.js'; import { getAllCookiesFn } from './cookie.js'; import { getAllLocalStorageFn } from './localstorage.js'; diff --git a/src/js/resources/vod.js b/src/js/resources/vod.js new file mode 100644 index 0000000000000..f74d259579ce8 --- /dev/null +++ b/src/js/resources/vod.js @@ -0,0 +1,175 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2026-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock + +*/ + +import { modifyXhrResponseFn } from './prevent-xhr.js'; +import { registerScriptlet } from './base.js'; +import { safeSelf } from './safe-self.js'; + +export function mpegdashPrune( + selector = '', + propsToMatch = '' +) { + if ( typeof selector !== 'string' ) { return; } + if ( selector === '' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('mpegdash-prune', selector, propsToMatch); + const queryAll = (xmlDoc, selector) => { + if ( selector.startsWith('xpath:') === false ) { + return Array.from(xmlDoc.querySelectorAll(selector)); + } + const xpr = xmlDoc.evaluate( + selector.slice(6), + xmlDoc, + null, + XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, + null + ); + const out = []; + for ( let i = 0; i < xpr.snapshotLength; i++ ) { + const node = xpr.snapshotItem(i); + out.push(node); + } + return out; + }; + const rePTparse = /^PT(\d+D)?(\d+H)?(\d+M)?([\d.]+S)?$/; + const secondsPerDay = 24 * 60 * 60; + const secondsPerHour = 60 * 60; + const secondsPerMinute = 60; + const secondsFromPT = pt => { + const match = rePTparse.exec(pt); + if ( match === null ) { return; } + let seconds = 0; + if ( match[1] ) { + const d = parseFloat(match[1].slice(0, -1)); + if ( isNaN(d) ) { return; } + seconds += d * secondsPerDay; + } + if ( match[2] ) { + const h = parseFloat(match[2].slice(0, -1)); + if ( isNaN(h) ) { return; } + seconds += h * secondsPerHour; + } + if ( match[3] ) { + const m = parseFloat(match[3].slice(0, -1)); + if ( isNaN(m) ) { return; } + seconds += m * secondsPerMinute; + } + if ( match[4] ) { + const s = parseFloat(match[4].slice(0, -1)); + if ( isNaN(s) ) { return; } + seconds += s; + } + return seconds; + }; + const ptFromSeconds = seconds => { + const parts = [ 'PT' ]; + const d = Math.floor(seconds / secondsPerDay); + if ( d ) { + parts.push(`${d}D`); + seconds -= d * secondsPerDay; + } + const h = Math.floor(seconds / secondsPerHour); + if ( h ) { + parts.push(`${h}H`); + seconds -= h * secondsPerHour; + } + const m = Math.floor(seconds / secondsPerMinute); + if ( m ) { + parts.push(`${m}M`); + seconds -= m * secondsPerMinute; + } + parts.push(`${seconds}S`); + return parts.join(''); + }; + const fixTimeAttributes = xmlDoc => { + try { + const periods = queryAll(xmlDoc, 'MPD > Period'); + if ( periods.length === 0 ) { return; } + let seconds = 0; + for ( const period of periods ) { + const startAttrBefore = period.getAttribute('start'); + const durAttr = period.getAttribute('duration'); + if ( startAttrBefore === null || durAttr === null ) { continue; } + const startAttrAfter = ptFromSeconds(seconds); + period.setAttribute('start', startAttrAfter); + if ( period.hasAttribute('id') ) { + const idAttr = period.getAttribute('id'); + period.setAttribute('id', idAttr.replace(startAttrBefore, startAttrAfter)); + } + seconds += secondsFromPT(durAttr); + } + const mpds = queryAll(xmlDoc, 'MPD[mediaPresentationDuration]'); + if ( mpds.length !== 1 ) { return; } + mpds[0].setAttribute('mediaPresentationDuration', ptFromSeconds(seconds)); + } catch { + } + }; + const pruneFromDoc = xmlDoc => { + try { + if ( selector === '' ) { + const serializer = new XMLSerializer(); + safe.uboLog(logPrefix, `Document is\n\t${serializer.serializeToString(xmlDoc)}`); + } + const items = queryAll(xmlDoc, selector); + if ( items.length === 0 ) { return xmlDoc; } + safe.uboLog(logPrefix, `Patching ${items.length} items`); + for ( const item of items ) { + if ( item.nodeType !== 1 ) { continue; } + item.setAttribute('duration', 'PT0S'); + } + fixTimeAttributes(xmlDoc); + } catch(ex) { + safe.uboErr(logPrefix, `Error: ${ex}`); + } + return xmlDoc; + }; + const pruneFromText = text => { + if ( (/^\s*\s*$/.test(text)) === false ) { + return text; + } + try { + const xmlParser = new DOMParser(); + const xmlDoc = xmlParser.parseFromString(text, 'text/xml'); + pruneFromDoc(xmlDoc); + const serializer = new XMLSerializer(); + text = serializer.serializeToString(xmlDoc); + } catch { + } + return text; + }; + modifyXhrResponseFn(propsToMatch, (xhr, before) => { + if ( before instanceof XMLDocument ) { + return pruneFromDoc(before); + } + if ( typeof before === 'string' ) { + return pruneFromText(before); + } + return before; + }); +} +registerScriptlet(mpegdashPrune, { + name: 'mpegdash-prune.js', + dependencies: [ + modifyXhrResponseFn, + safeSelf, + ], +}); From 4243597b4f8d8312a658f33b269e0a37439a8fbb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 31 Aug 2026 16:30:24 -0400 Subject: [PATCH 088/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index b609a95acbc92..098c75fb816fe 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.74.1.0 \ No newline at end of file +1.74.1.1 \ No newline at end of file From 5e3ee6663a349d5614b0e73452e730765890b84d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 31 Aug 2026 16:31:51 -0400 Subject: [PATCH 089/145] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ea05b2688818..e3a9728ff5edd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add `mpegdash-prune` scriptlet](https://github.com/gorhill/uBlock/commit/323b4ce279) - [Improve `xmlPrune` scriptlet](https://github.com/gorhill/uBlock/commit/1235e4dd27) - [Improve procedural operator `:matches-path()`](https://github.com/gorhill/uBlock/commit/43d3c74ce7) From 21faaae2c867ff91c5985addb078da8513f08ded Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 31 Aug 2026 16:37:26 -0400 Subject: [PATCH 090/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 5d85fb7393a7f..84ae02bb8d836 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.74.1.0", + "version": "1.74.1.1", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.74.1b0/uBlock0_1.74.1b0.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.74.1b1/uBlock0_1.74.1b1.firefox.signed.xpi" } ] } From ef89f4839c81b592ec1a74f4d323a23bb927822a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 31 Aug 2026 17:10:11 -0400 Subject: [PATCH 091/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index c9ee35397ab54..b972a8d4c20d7 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From 275bb2b09ff64d845a4178dc7d4a01ae1153a4d8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 31 Aug 2026 17:15:27 -0400 Subject: [PATCH 092/145] Update makefile and workflow notes "uBlock Origin dev build" is no longer available in the Chrome Web store. --- .github/workflows/RELEASE.HEAD.md | 2 +- Makefile | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/RELEASE.HEAD.md b/.github/workflows/RELEASE.HEAD.md index affc1ef1f07b3..7c3d9e2be5263 100644 --- a/.github/workflows/RELEASE.HEAD.md +++ b/.github/workflows/RELEASE.HEAD.md @@ -4,4 +4,4 @@ - **Firefox**: Download the build from [uBlock0_%version%.firefox.signed.xpi](https://github.com/gorhill/uBlock/releases/download/%version%/uBlock0_%version%.firefox.signed.xpi) uBO works best on Gecko-based browsers, check out [why](https://github.com/gorhill/uBlock/wiki/uBlock-Origin-works-best-on-Firefox) -- **Chromium**: Install directly from the [Chrome Web Store](https://chromewebstore.google.com/detail/ublock-origin-development/cgbcahbpdhpcegmbfconppldiemgcoii) +- **Chromium**: Install directly from [signed CRX package](https://github.com/gorhill/uBlock/releases/download/%version%/uBlock0_%version%.chromium.crx) diff --git a/Makefile b/Makefile index 9356b75636016..92035cf428576 100644 --- a/Makefile +++ b/Makefile @@ -139,7 +139,6 @@ publish-dev-chromium: ghrepo=uBlock \ ghtag=$(version) \ ghasset=chromium.zip \ - storeid=cgbcahbpdhpcegmbfconppldiemgcoii \ crxupdatepath=dist/chromium/update-dev.xml \ crxkeytoken=ubo_dev_key_path From 76508405c71cdee1771becd5fefd6bf137412470 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 31 Aug 2026 17:17:45 -0400 Subject: [PATCH 093/145] Update submodules --- publish-extension | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/publish-extension b/publish-extension index 990eb214e94ab..5798bcb1ce905 160000 --- a/publish-extension +++ b/publish-extension @@ -1 +1 @@ -Subproject commit 990eb214e94abdd97e7ef138d6d4c88fb1e5fa27 +Subproject commit 5798bcb1ce905222e1ca559c538eebb98108cd84 From 5b23c62c5be7182d24f221e588f5a9dde20db77f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 1 Sep 2026 13:05:08 -0400 Subject: [PATCH 094/145] Update makefile --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 92035cf428576..e3e30d4bf3cb4 100644 --- a/Makefile +++ b/Makefile @@ -106,7 +106,6 @@ publish-chromium: ghrepo=uBlock \ ghtag=$(version) \ ghasset=chromium.zip \ - storeid=cjpalhdlnbpafiamejdnhcphjbkeiagm \ crxupdatepath=dist/chromium/update.xml \ crxkeytoken=ubo_dev_key_path From 638e1286bc8c570aeb2cadae52ff53073f7de94c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 1 Sep 2026 13:15:07 -0400 Subject: [PATCH 095/145] Update readme --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 94fd57edb4609..236e623ed5ce4 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Badge License]][License] [![Badge NPM]][NPM] [![Badge Mozilla]][Mozilla] -[![Badge Chrome]][Chrome] +![Badge Chrome] [![Badge Edge]][Edge] *** @@ -21,7 +21,7 @@ uBlock Origin (uBO) | Get uBlock Origin for Firefox | Firefox Add-ons | [uBO works best on Firefox](https://github.com/gorhill/uBlock/wiki/uBlock-Origin-works-best-on-Firefox) | | Get uBlock Origin for Microsoft Edge | Edge Add-ons | "Moving the Microsoft Edge extensions ecosystem forward with Manifest Version 3": "Beginning in August 2026, Microsoft Edge will start the consumer transition away from Manifest Version 2 (MV2) extensions and toward MV3. Our goal is to complete the consumer transition by the end of 2026, with enterprise deprecation following in early 2027." | | Get uBlock Origin for Opera | Opera Add-ons | -| Get uBlock Origin for Chromium | Chrome Web Store | "Manifest V2 support timeline": "Aug 31st 2026: All remaining Manifest V2 extensions removed from the Chrome Web Store"
About Google Chrome's "This extension may soon no longer be supported" | +| Get uBlock Origin for Chromium | Removed | "Manifest V2 support timeline": "Aug 31st 2026: All remaining Manifest V2 extensions removed from the Chrome Web Store"
About Google Chrome's "This extension may soon no longer be supported" | | Get uBlock Origin for Thunderbird | Thunderbird Add-ons | [No longer updated and stuck at 1.49.2.](https://github.com/uBlockOrigin/uBlock-issues/issues/2928) Later versions require "GitHub - Releases". | | Get uBlock Origin through GitHub | GitHub - Releases | Stable and development versions on Firefox, Chromium MV2, and Thunderbird. Must be placed manually into web browsers; the Chromium and Thunderbird versions usually won't auto-update. @@ -95,14 +95,12 @@ uBO [works best][Works Best] on Firefox and is available for desktop and Android #### Chromium -[Chrome Web Store][Chrome] (Removal on 2026-08-31) +Chrome Web Store: Removed on 2026-08-31 [Microsoft Edge Add-ons][Edge] (Published by [Nicole Rolls][Nicole Rolls] until version 1.62. Ownership transfer at version 1.64.) [Opera Add-ons][Opera] -[Development Builds][Chrome Dev] - uBO should be compatible with any Chromium-based browser. #### Thunderbird @@ -149,11 +147,9 @@ If you ever want to contribute something, think about the people working hard to [Performance]: https://www.debugbear.com/blog/chrome-extensions-website-performance#the-impact-of-ad-blocking-on-website-performance [EasyPrivacy]: https://easylist.to/#easyprivacy [Thunderbird]: https://addons.thunderbird.net/thunderbird/addon/ublock-origin/ -[Chrome Dev]: https://chromewebstore.google.com/detail/ublock-origin-development/cgbcahbpdhpcegmbfconppldiemgcoii [EasyList]: https://easylist.to/#easylist [Mozilla]: https://addons.mozilla.org/addon/ublock-origin/ [Crowdin]: https://crowdin.com/project/ublock -[Chrome]: https://chromewebstore.google.com/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm [Reddit]: https://www.reddit.com/r/uBlockOrigin/ [Theft]: https://x.com/LeaVerou/status/518154828166725632 [Opera]: https://addons.opera.com/extensions/details/ublock/ From c9eb5b276d5e83c476ebf9fa92052ae50567a612 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 2 Sep 2026 09:52:29 -0400 Subject: [PATCH 096/145] Treat resources with data as redirectable Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/4107 --- src/js/redirect-engine.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/redirect-engine.js b/src/js/redirect-engine.js index d0f5fed4d4d7f..a41b151da775d 100644 --- a/src/js/redirect-engine.js +++ b/src/js/redirect-engine.js @@ -406,7 +406,7 @@ class RedirectEngine { for ( const [ name, entry ] of this.resources ) { out.set(name, { canInject: typeof entry.data === 'string', - canRedirect: entry.warURL !== undefined, + canRedirect: Boolean(entry.warURL ?? entry.data), aliasOf: '', extensionPath: entry.warURL, }); From 3ab731942ef27ae2405ca0d831f168fa23c2c17d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 2 Sep 2026 17:13:51 -0400 Subject: [PATCH 097/145] Address multiple static filter parser issues Add gutter widget in editor when a filter is not supported on the current platform: https://github.com/uBlockOrigin/uBlock-issues/issues/4096 Fix error count improperly updated when end of change is not at start of line: https://github.com/uBlockOrigin/uBlock-issues/issues/4097 Add support for redirectable resources to require trusted source: https://github.com/gorhill/uBlock/commit/933efff4dd#r198472817 Detect mismatch between resources requiring trusted source and untrusted source at static filter parsing time. --- .../extension/js/offscreen/compile-filters.js | 2 + src/css/codemirror.css | 14 +++-- src/css/themes/default.css | 2 +- src/js/1p-filters.js | 4 +- src/js/asset-viewer.js | 4 +- src/js/codemirror/ubo-static-filtering.js | 30 +++++++--- src/js/messaging.js | 7 ++- src/js/redirect-engine.js | 20 ------- src/js/redirect-resources.js | 3 +- src/js/scriptlet-filtering-core.js | 9 +-- src/js/static-dnr-filtering.js | 2 + src/js/static-filtering-parser.js | 30 ++++++++-- src/js/storage.js | 8 +-- src/js/trusted-tokens.js | 60 +++++++++++++++++++ tools/make-mv3.sh | 2 + 15 files changed, 141 insertions(+), 56 deletions(-) create mode 100644 src/js/trusted-tokens.js diff --git a/platform/mv3/extension/js/offscreen/compile-filters.js b/platform/mv3/extension/js/offscreen/compile-filters.js index bd42caef7347d..2305a7ce7433e 100644 --- a/platform/mv3/extension/js/offscreen/compile-filters.js +++ b/platform/mv3/extension/js/offscreen/compile-filters.js @@ -24,6 +24,7 @@ import * as s14e from '../../lib/s14e-serializer.js'; import * as sfp from '../static-filtering-parser.js'; import { minimizeRules, minimizeRuleset, validateRules } from '../ubo-parser.js'; import { fetchList } from './fetch-list.js'; +import { getTrustedTokens } from '../trusted-tokens.js'; import { makeCosmeticScripts } from './make-cosmetic-filters.js'; import { parseNetworkFilter } from '../ubo-parser.js'; import { safeReplace } from './safe-replace.js'; @@ -346,6 +347,7 @@ async function updateList(list) { const compiled = compileFilters(list.id, text, { nativeCssHas: true, + trustedTokens: getTrustedTokens(), }); if ( Boolean(compiled) === false ) { return; } diff --git a/src/css/codemirror.css b/src/css/codemirror.css index d56d8c0da1a13..f0bd4d26d6b4d 100644 --- a/src/css/codemirror.css +++ b/src/css/codemirror.css @@ -320,9 +320,12 @@ html:not(.mobile) .cm-search-widget .fa-icon:not(.fa-icon-ro):hover { .CodeMirror-lintmarker > * { position: absolute; } -.CodeMirror-lintmarker[data-error="y"] { +.CodeMirror-lintmarker[data-lint="error"] { background-color: var(--sf-error-ink); } +.CodeMirror-lintmarker[data-lint="warning"] { + background-color: var(--sf-warning-ink); + } .CodeMirror-lintmarker .msg { background-color: var(--surface-0); border: 1px solid var(--sf-error-ink); @@ -340,7 +343,8 @@ html:not(.mobile) .cm-search-widget .fa-icon:not(.fa-icon-ro):hover { top: 15%; width: 70%; } -.CodeMirror-lintmarker[data-error="y"] svg { +.CodeMirror-lintmarker[data-lint="error"] svg, +.CodeMirror-lintmarker[data-lint="warning"] svg { display: none; } .CodeMirror-lintmarker[data-fold="start"] { @@ -352,8 +356,10 @@ html:not(.mobile) .cm-search-widget .fa-icon:not(.fa-icon-ro):hover { .CodeMirror-lintmarker[data-fold="end"] { fill: var(--border-2); } -.CodeMirror-lintmarker[data-error="y"]:hover > span, -.CodeMirror-lintmarker[data-error="y"] > span:hover { +.CodeMirror-lintmarker[data-lint="error"]:hover > span, +.CodeMirror-lintmarker[data-lint="error"] > span:hover, +.CodeMirror-lintmarker[data-lint="warning"]:hover > span, +.CodeMirror-lintmarker[data-lint="warning"] > span:hover { display: initial; } diff --git a/src/css/themes/default.css b/src/css/themes/default.css index c78b4a255c513..d03e1f1231b49 100644 --- a/src/css/themes/default.css +++ b/src/css/themes/default.css @@ -290,7 +290,7 @@ --sf-unicode-ink: var(--ink-1); --sf-value-ink: #974900 /* h:30 S:100 Luv:40 */; --sf-variable-ink: var(--ink-1); - --sf-warning-ink: #e49d00; /* h:50 S:100 Luv:70 */ + --sf-warning-ink: #ffbb03; /* h:50 S:100 Luv:70 */ --sf-warning-surface: #e49d0033; /* h:50 S:100 Luv:70 @ 20% */ /* syntax highlight: dynamic filtering */ diff --git a/src/js/1p-filters.js b/src/js/1p-filters.js index 934acd466d17b..9396dd117979d 100644 --- a/src/js/1p-filters.js +++ b/src/js/1p-filters.js @@ -80,9 +80,9 @@ uBlockDashboard.patchCodeMirrorEditor(cmEditor); } vAPI.messaging.send('dashboard', { - what: 'getTrustedScriptletTokens', + what: 'getTrustedTokens', }).then(tokens => { - cmEditor.setOption('trustedScriptletTokens', tokens); + cmEditor.setOption('trustedTokens', tokens); }); /******************************************************************************/ diff --git a/src/js/asset-viewer.js b/src/js/asset-viewer.js index 62f90d2795013..697c468ed4e5f 100644 --- a/src/js/asset-viewer.js +++ b/src/js/asset-viewer.js @@ -73,9 +73,9 @@ import { dom, qs$ } from './dom.js'; }); vAPI.messaging.send('dashboard', { - what: 'getTrustedScriptletTokens', + what: 'getTrustedTokens', }).then(tokens => { - cmEditor.setOption('trustedScriptletTokens', tokens); + cmEditor.setOption('trustedTokens', tokens); }); const details = await vAPI.messaging.send('default', { diff --git a/src/js/codemirror/ubo-static-filtering.js b/src/js/codemirror/ubo-static-filtering.js index 2dea1f8ab66ad..dcf128cb79856 100644 --- a/src/js/codemirror/ubo-static-filtering.js +++ b/src/js/codemirror/ubo-static-filtering.js @@ -46,10 +46,10 @@ CodeMirror.defineOption('trustedSource', false, (cm, trusted) => { })); }); -CodeMirror.defineOption('trustedScriptletTokens', undefined, (cm, tokens) => { +CodeMirror.defineOption('trustedTokens', undefined, (cm, tokens) => { if ( tokens === undefined || tokens === null ) { return; } if ( typeof tokens[Symbol.iterator] !== 'function' ) { return; } - self.dispatchEvent(new CustomEvent('trustedScriptletTokens', { + self.dispatchEvent(new CustomEvent('trustedTokens', { detail: new Set(tokens), })); }); @@ -226,6 +226,7 @@ const uBOStaticFilteringMode = (( ) => { this.astParser = new sfp.AstFilterParser({ interactive: true, nativeCssHas: vAPI.webextFlavor.env.includes('native_css_has'), + canFilterResponseBody: vAPI.webextFlavor.env.includes('html_filtering'), }); this.astWalker = this.astParser.getWalker(); this.currentWalkerNode = 0; @@ -234,8 +235,8 @@ const uBOStaticFilteringMode = (( ) => { const { trusted } = ev.detail; this.astParser.options.trustedSource = trusted; }); - self.addEventListener('trustedScriptletTokens', ev => { - this.astParser.options.trustedScriptletTokens = ev.detail; + self.addEventListener('trustedTokens', ev => { + this.astParser.options.trustedTokens = ev.detail; }); } } @@ -346,6 +347,7 @@ function initHints() { const astParser = new sfp.AstFilterParser({ interactive: true, nativeCssHas: vAPI.webextFlavor.env.includes('native_css_has'), + canFilterResponseBody: vAPI.webextFlavor.env.includes('html_filtering'), }); const proceduralOperatorNames = new Map( Array.from(sfp.proceduralOperatorTokens) @@ -715,6 +717,7 @@ CodeMirror.registerHelper('fold', 'ubo-static-filtering', (( ) => { const astParser = new sfp.AstFilterParser({ interactive: true, nativeCssHas: vAPI.webextFlavor.env.includes('native_css_has'), + canFilterResponseBody: vAPI.webextFlavor.env.includes('html_filtering'), }); const changeset = []; @@ -760,6 +763,9 @@ CodeMirror.registerHelper('fold', 'ubo-static-filtering', (( ) => { case sfp.AST_ERROR_UNTRUSTED_SOURCE: msg = `${msg}: Filter requires trusted source`; break; + case sfp.AST_ERROR_CAPABILITY: + msg = `Filter unsupported on current platform`; + return { lint: 'warning', msg }; default: if ( astParser.isCosmeticFilter() && astParser.result.error ) { msg = `${msg}: ${astParser.result.error}`; @@ -819,6 +825,14 @@ CodeMirror.registerHelper('fold', 'ubo-static-filtering', (( ) => { '
', ], }, + 'warning': { + node: null, + html: [ + '
 ', + '', + '
', + ], + }, 'if-start': { node: null, html: [ @@ -963,8 +977,8 @@ CodeMirror.registerHelper('fold', 'ubo-static-filtering', (( ) => { }; const processDeletion = (doc, change) => { - let { from, to } = change; - doc.eachLine(from.line, to.line, lineHandle => { + const { from, to } = change; + doc.eachLine(from.line, to.line + (to.ch ? 1 : 0), lineHandle => { const marker = extractMarker(lineHandle); if ( marker === null ) { return; } if ( marker.dataset.error === 'y' ) { @@ -1116,8 +1130,8 @@ CodeMirror.registerHelper('fold', 'ubo-static-filtering', (( ) => { astParser.options.trustedSource = trusted; }); - self.addEventListener('trustedScriptletTokens', ev => { - astParser.options.trustedScriptletTokens = ev.detail; + self.addEventListener('trustedTokens', ev => { + astParser.options.trustedTokens = ev.detail; }); CodeMirror.defineInitHook(cm => { diff --git a/src/js/messaging.js b/src/js/messaging.js index 7735d77ba0a88..e76bd7ac42b03 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -42,6 +42,7 @@ import cacheStorage from './cachestorage.js'; import cosmeticFilteringEngine from './cosmetic-filtering.js'; import { denseBase64 } from './base64-custom.js'; import { filteringBehaviorChanged } from './broadcast.js'; +import { getTrustedTokens } from './trusted-tokens.js'; import htmlFilteringEngine from './html-filtering.js'; import { i18n$ } from './i18n.js'; import io from './assets.js'; @@ -155,7 +156,7 @@ const onMessage = function(request, sender, callback) { case 'getAppData': response = { - name: browser.runtime.getManifest().name, + name: self.browser.runtime.getManifest().name, version: vAPI.app.version, canBenchmark: µb.hiddenSettings.benchmarkDatasetURL !== 'unset', }; @@ -165,8 +166,8 @@ const onMessage = function(request, sender, callback) { response = getDomainNames(request.targets); break; - case 'getTrustedScriptletTokens': - response = redirectEngine.getTrustedScriptletTokens(); + case 'getTrustedTokens': + response = Array.from(getTrustedTokens()); break; case 'getWhitelist': diff --git a/src/js/redirect-engine.js b/src/js/redirect-engine.js index a41b151da775d..2c56ce48fe931 100644 --- a/src/js/redirect-engine.js +++ b/src/js/redirect-engine.js @@ -423,26 +423,6 @@ class RedirectEngine { }); } - getTrustedScriptletTokens() { - const out = []; - const isTrustedScriptlet = entry => { - if ( entry.requiresTrust !== true ) { return false; } - if ( entry.warURL !== undefined ) { return false; } - if ( typeof entry.data !== 'string' ) { return false; } - if ( entry.name.endsWith('.js') === false ) { return false; } - return true; - }; - for ( const [ name, entry ] of this.resources ) { - if ( isTrustedScriptlet(entry) === false ) { continue; } - out.push(name.slice(0, -3)); - } - for ( const [ alias, name ] of this.aliases ) { - if ( out.includes(name.slice(0, -3)) === false ) { continue; } - out.push(alias.slice(0, -3)); - } - return out; - } - selfieFromResources(storage) { return storage.toCache(RESOURCES_SELFIE_NAME, { version: RESOURCES_SELFIE_VERSION, diff --git a/src/js/redirect-resources.js b/src/js/redirect-resources.js index 323aa89eda124..313d50ba6a0f0 100644 --- a/src/js/redirect-resources.js +++ b/src/js/redirect-resources.js @@ -100,8 +100,9 @@ export default new Map([ data: 'text', } ], [ 'google-ima-dai.js', { - aliases: [ 'google-ima3-dai' ], /* adguard compatibility */ + alias: 'google-ima3-dai', /* adguard compatibility */ data: 'text', + requiresTrust: true, } ], [ 'googlesyndication_adsbygoogle.js', { alias: [ diff --git a/src/js/scriptlet-filtering-core.js b/src/js/scriptlet-filtering-core.js index fa65f7cde8a8a..d6960c863ee9b 100644 --- a/src/js/scriptlet-filtering-core.js +++ b/src/js/scriptlet-filtering-core.js @@ -25,18 +25,13 @@ import { redirectEngine as reng } from './redirect-engine.js'; /******************************************************************************/ -const normalizeRawFilter = (parser, sourceIsTrusted = false) => { +const normalizeRawFilter = parser => { const args = parser.getScriptletArgs(); if ( args.length !== 0 ) { let token = `${args[0]}.js`; if ( reng.aliases.has(token) ) { token = reng.aliases.get(token); } - if ( parser.isException() !== true ) { - if ( sourceIsTrusted !== true ) { - if ( reng.tokenRequiresTrust(token) ) { return; } - } - } args[0] = token.slice(0, -3); } return JSON.stringify(args); @@ -139,7 +134,7 @@ export class ScriptletFilteringEngine { // Only exception filters are allowed to be global. const isException = parser.isException(); - const normalized = normalizeRawFilter(parser, writer.properties.get('trustedSource')); + const normalized = normalizeRawFilter(parser); // Can fail if there is a mismatch with trust requirement if ( normalized === undefined ) { return; } diff --git a/src/js/static-dnr-filtering.js b/src/js/static-dnr-filtering.js index 149f4bd9d49a3..0183f49707b72 100644 --- a/src/js/static-dnr-filtering.js +++ b/src/js/static-dnr-filtering.js @@ -27,6 +27,7 @@ import { } from './static-filtering-io.js'; import { LineIterator } from './text-utils.js'; +import { getTrustedTokens } from './trusted-tokens.js'; import staticNetFilteringEngine from './static-net-filtering.js'; /******************************************************************************/ @@ -275,6 +276,7 @@ function addToDNR(context, list) { nativeCssHas: env.includes('native_css_has'), badTypes: [ sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE ], trustedSource: list.trustedSource || undefined, + trustedTokens: getTrustedTokens(), }); const compiler = staticNetFilteringEngine.createCompiler(); diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index a8dd8bec8fb03..aa63bc8d474e9 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -100,6 +100,7 @@ export const AST_ERROR_OPTION_BADVALUE = 1 << iota++; export const AST_ERROR_OPTION_EXCLUDED = 1 << iota++; export const AST_ERROR_IF_TOKEN_UNKNOWN = 1 << iota++; export const AST_ERROR_UNTRUSTED_SOURCE = 1 << iota++; +export const AST_ERROR_CAPABILITY = 1 << iota++; iota = 0; const NODE_RIGHT_INDEX = iota++; @@ -1456,12 +1457,29 @@ export class AstFilterParser { case NODE_TYPE_NET_OPTION_NAME_REDIRECT: case NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE: { realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount; + if ( realBad ) { break; } + if ( isException || isBadfilter ) { break; } + const { trustedSource, trustedTokens } = this.options; + if ( trustedSource ) { break; } + if ( trustedTokens instanceof Set === false ) { break; } + const value = this.getNetOptionValue(modifierType); + let { token } = parseRedirectValue(value); + if ( trustedTokens.has(token) ) { + this.astError = AST_ERROR_UNTRUSTED_SOURCE; + realBad = true; + } break; } case NODE_TYPE_NET_OPTION_NAME_REPLACE: { realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount; if ( realBad ) { break; } if ( isException || isBadfilter ) { break; } + if ( this.options.canFilterResponseBody !== true ) { + this.addFlags(AST_FLAG_HAS_ERROR); + this.astError = AST_ERROR_CAPABILITY; + realBad = true; + break; + } if ( this.options.trustedSource !== true ) { this.astError = AST_ERROR_UNTRUSTED_SOURCE; realBad = true; @@ -2342,12 +2360,12 @@ export class AstFilterParser { break; } case NODE_TYPE_EXT_PATTERN_SCRIPTLET_TOKEN: { - if ( this.interactive !== true ) { break; } if ( isException ) { break; } - const { trustedSource, trustedScriptletTokens } = this.options; - if ( trustedScriptletTokens instanceof Set === false ) { break; } + const { trustedSource, trustedTokens } = this.options; + if ( trustedSource ) { break; } + if ( trustedTokens instanceof Set === false ) { break; } const token = this.getNodeString(targetNode); - if ( trustedScriptletTokens.has(token) && trustedSource !== true ) { + if ( trustedTokens.has(token) ) { this.astError = AST_ERROR_UNTRUSTED_SOURCE; realBad = true; } @@ -2390,6 +2408,10 @@ export class AstFilterParser { return this.parseExtPatternResponseheader(parent); } this.astTypeFlavor = AST_TYPE_EXTENDED_HTML; + if ( this.options.canFilterResponseBody !== true ) { + this.astError = AST_ERROR_CAPABILITY; + return 0; + } return this.parseExtPatternHtml(parent); } // ##... diff --git a/src/js/storage.js b/src/js/storage.js index 66a3352394ab2..8de3e58f4cc1a 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -35,6 +35,7 @@ import { import { ubolog, ubologSet } from './console.js'; import cosmeticFilteringEngine from './cosmetic-filtering.js'; +import { getTrustedTokens } from './trusted-tokens.js'; import { hostnameFromURI } from './uri-utils.js'; import io from './assets.js'; import logger from './logger.js'; @@ -960,7 +961,6 @@ onBroadcast(msg => { if ( vAPI.Net.canSuspend() ) { vAPI.net.suspend(); } - redirectEngine.reset(); staticExtFilteringEngine.reset(); staticNetFilteringEngine.reset(); µb.selfieManager.destroy(); @@ -1107,16 +1107,16 @@ onBroadcast(msg => { // Populate the writer with information potentially useful to the // client compilers. - const trustedSource = details.trustedSource === true; if ( details.assetKey ) { writer.properties.set('name', details.assetKey); - writer.properties.set('trustedSource', trustedSource); } const assetName = details.assetKey ? details.assetKey : '?'; const parser = new sfp.AstFilterParser({ - trustedSource, + trustedSource: details.trustedSource === true, maxTokenLength: staticNetFilteringEngine.MAX_TOKEN_LENGTH, nativeCssHas: vAPI.webextFlavor.env.includes('native_css_has'), + canFilterResponseBody: µb.canFilterResponseData, + trustedTokens: getTrustedTokens(), }); const compiler = staticNetFilteringEngine.createCompiler(parser); const lineIter = new LineIterator( diff --git a/src/js/trusted-tokens.js b/src/js/trusted-tokens.js new file mode 100644 index 0000000000000..0e4b76ff1a800 --- /dev/null +++ b/src/js/trusted-tokens.js @@ -0,0 +1,60 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2026-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +import { builtinScriptlets } from './resources/scriptlets.js'; +import redirectResources from './redirect-resources.js'; + +/******************************************************************************/ + +const addTrustedToken = (out, ...tokens) => { + for ( const token of tokens ) { + out.add(token); + if ( token.endsWith('.js') === false ) { continue; } + out.add(token.slice(0, -3)); + } +}; + +let trustedTokens; + +/******************************************************************************/ + +export function getTrustedTokens() { + if ( trustedTokens ) { return trustedTokens; } + const out = new Set(); + for ( const { name, requiresTrust, aliases } of builtinScriptlets ) { + if ( requiresTrust !== true ) { continue; } + addTrustedToken(out, name); + if ( Array.isArray(aliases) === false ) { continue; } + addTrustedToken(out, ...aliases); + } + for ( const [ name, { requiresTrust, alias } ] of redirectResources ) { + if ( requiresTrust !== true ) { continue; } + addTrustedToken(out, name); + if ( alias === undefined ) { continue; } + if ( typeof alias === 'string' ) { + addTrustedToken(out, alias); + } else if ( Array.isArray(alias) ) { + addTrustedToken(out, ...alias); + } + } + trustedTokens = out; + return out; +} diff --git a/tools/make-mv3.sh b/tools/make-mv3.sh index d9a5938beb33b..62925783bbdca 100755 --- a/tools/make-mv3.sh +++ b/tools/make-mv3.sh @@ -88,6 +88,7 @@ cp "$UBO_DIR"/src/js/i18n.js "$UBOL_DIR"/js/ cp "$UBO_DIR"/src/js/jsonpath.js "$UBOL_DIR"/js/ cp "$UBO_DIR"/src/js/redirect-resources.js "$UBOL_DIR"/js/ cp "$UBO_DIR"/src/js/regex-analyzer.js "$UBOL_DIR"/js/offscreen/ +cp "$UBO_DIR"/src/js/trusted-tokens.js "$UBOL_DIR"/js/ cp -R "$UBO_DIR"/src/js/resources "$UBOL_DIR"/js/ cp "$UBO_DIR"/src/js/static-filtering-parser.js "$UBOL_DIR"/js/ cp "$UBO_DIR"/src/js/urlskip.js "$UBOL_DIR"/js/ @@ -140,6 +141,7 @@ cp platform/mv3/extension/js/utils.js "$UBOL_BUILD_DIR"/js/ cp "$UBO_DIR"/src/lib/punycode.js "$UBOL_BUILD_DIR"/js/ cp -R "$UBO_DIR"/src/lib/regexanalyzer "$UBOL_BUILD_DIR"/js/ cp -R "$UBO_DIR"/src/js/resources "$UBOL_BUILD_DIR"/js/ +cp "$UBO_DIR"/src/js/trusted-tokens.js "$UBOL_BUILD_DIR"/js/ cp -R platform/mv3/scriptlets "$UBOL_BUILD_DIR"/ cp -R platform/mv3/extension/js/offscreen "$UBOL_BUILD_DIR"/js/ cp "$UBO_DIR"/src/js/regex-analyzer.js "$UBOL_BUILD_DIR"/js/offscreen/ From f06666fb49948dc87ecc380fb5c3a261e6344c7f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 2 Sep 2026 17:23:46 -0400 Subject: [PATCH 098/145] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3a9728ff5edd..eec2e2372d8b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- [Address multiple static filter parser issues](https://github.com/gorhill/uBlock/commit/3ab731942e) +- [Treat resources with data as redirectable](https://github.com/gorhill/uBlock/commit/c9eb5b276d) - [Add `mpegdash-prune` scriptlet](https://github.com/gorhill/uBlock/commit/323b4ce279) - [Improve `xmlPrune` scriptlet](https://github.com/gorhill/uBlock/commit/1235e4dd27) - [Improve procedural operator `:matches-path()`](https://github.com/gorhill/uBlock/commit/43d3c74ce7) From 9072a9bb311f24982b880a0b4765af10395592bc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 2 Sep 2026 17:24:08 -0400 Subject: [PATCH 099/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 098c75fb816fe..79e27ad472663 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.74.1.1 \ No newline at end of file +1.74.1.2 \ No newline at end of file From 0ae5becd72115f794d3a5d4972d3f1a35f100582 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 2 Sep 2026 17:31:13 -0400 Subject: [PATCH 100/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index b972a8d4c20d7..954be5af5a4b2 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From 95eba8035945c16879e063ec9405f858991afad9 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 3 Sep 2026 18:49:40 -0400 Subject: [PATCH 101/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 84ae02bb8d836..9b75dfbaa3cf0 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.74.1.1", + "version": "1.74.1.2", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.74.1b1/uBlock0_1.74.1b1.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.74.1b2/uBlock0_1.74.1b2.firefox.signed.xpi" } ] } From 457c5100937c64c246a956e8496063df652b073f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Sep 2026 09:03:53 -0400 Subject: [PATCH 102/145] Improve `prevent-clipboard-write` scriptlet --- src/js/resources/prevent-clipboard-write.js | 38 ++++++++++----------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/js/resources/prevent-clipboard-write.js b/src/js/resources/prevent-clipboard-write.js index df6fbd1dea904..ca5432ab79add 100644 --- a/src/js/resources/prevent-clipboard-write.js +++ b/src/js/resources/prevent-clipboard-write.js @@ -54,19 +54,23 @@ function preventClipboardWrite(matches = '', ...varargs) { const extraArgs = safe.parseVarargs(varargs); const excludePattern = extraArgs.excludeMatches && safe.initPattern(extraArgs.excludeMatches); + const htmlTemplate = [ + '
', + '${warning}\n', + '', + '
', + ].join(''); const domAlert = clipboardText => { const doc = document; - const div = doc.createElement('div'); - const span = doc.createElement('span'); - span.style = 'flex-grow:1;padding:0.5em 0 0.5em 0.5em;'; const domAlert = extraArgs.domAlert.replace(/\\n/g, '\n'); - const placeholder = /\$\{text\}/.exec(domAlert); - if ( placeholder ) { + let html; + if ( domAlert.includes('${text}') ) { const code = doc.createElement('code'); const styles = [ 'background-color: #ddc', 'display: inline-block', 'font-family: monospace', + 'font-size: 100%', 'max-height: 8em', 'overflow: auto', 'padding: 0.25em', @@ -77,29 +81,23 @@ function preventClipboardWrite(matches = '', ...varargs) { } code.style = styles.join(';'); code.textContent = clipboardText; - span.append( - domAlert.slice(0, placeholder.index), - code, - domAlert.slice(placeholder.index + placeholder[0].length) + html = htmlTemplate.replace('${warning}', + domAlert.replace('${text}', code.outerHTML) ); } else { - span.append(domAlert); + html = htmlTemplate.replace('${warning}', domAlert); } - const button = doc.createElement('button'); - button.style = 'font-size:32px;padding:0.5em'; - button.textContent = '×'; + if ( currentAlert ) { currentAlert.remove(); } + const domParser = new DOMParser(); + const fragment = domParser.parseFromString(html, 'text/html'); + currentAlert = fragment.querySelector('div'); + const button = currentAlert.querySelector('button'); button.addEventListener('click', ( ) => { if ( currentAlert === null ) { return; } currentAlert.remove(); currentAlert = null; }); - div.append(span, button); - div.style = 'background-color:beige;color:black;border:1px solid black;display:flex;font-family:sans-serif;font-size:medium;position:fixed;top:0;white-space:pre-wrap;width:100%;z-index:2147483647'; - doc.documentElement.append(div); - if ( currentAlert ) { - currentAlert.remove(); - } - currentAlert = div; + doc.documentElement.append(currentAlert); }; let currentAlert = null; const prevent = text => { From 1b4456f99135ae48c1f3003031498266b0753de8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Sep 2026 09:06:02 -0400 Subject: [PATCH 103/145] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eec2e2372d8b6..d14557914c58d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `prevent-clipboard-write` scriptlet](https://github.com/gorhill/uBlock/commit/457c510093) - [Address multiple static filter parser issues](https://github.com/gorhill/uBlock/commit/3ab731942e) - [Treat resources with data as redirectable](https://github.com/gorhill/uBlock/commit/c9eb5b276d) - [Add `mpegdash-prune` scriptlet](https://github.com/gorhill/uBlock/commit/323b4ce279) From 71faa0b23f799940464e90b2a1dd4edda17c9a0c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Sep 2026 12:54:16 -0400 Subject: [PATCH 104/145] Improve `remove-node-text`/`replace-node-text` scriptlets --- src/js/resources/scriptlets.js | 92 +++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 40 deletions(-) diff --git a/src/js/resources/scriptlets.js b/src/js/resources/scriptlets.js index 41da2b851caf9..cc733487d75aa 100755 --- a/src/js/resources/scriptlets.js +++ b/src/js/resources/scriptlets.js @@ -101,15 +101,6 @@ function replaceNodeTextFn( const reExcludes = extraArgs.excludes ? safe.patternToRegex(extraArgs.excludes, 'ms') : null; - const stop = (takeRecord = true) => { - if ( takeRecord ) { - handleMutations(observer.takeRecords()); - } - observer.disconnect(); - if ( safe.logLevel > 1 ) { - safe.uboLog(logPrefix, 'Quitting'); - } - }; const textContentFactory = (( ) => { const out = { createScript: s => s }; const { trustedTypes: tt } = self; @@ -122,19 +113,19 @@ function replaceNodeTextFn( } return out; })(); - let sedCount = extraArgs.sedCount || 0; + let sedCount = extraArgs.sedCount ?? Number.MAX_SAFE_INTEGER; const handleNode = node => { const before = node.textContent; if ( reIncludes ) { reIncludes.lastIndex = 0; - if ( safe.RegExp_test(reIncludes, before) === false ) { return true; } + if ( safe.RegExp_test(reIncludes, before) === false ) { return; } } if ( reExcludes ) { reExcludes.lastIndex = 0; - if ( safe.RegExp_test(reExcludes, before) ) { return true; } + if ( safe.RegExp_test(reExcludes, before) ) { return; } } rePattern.lastIndex = 0; - if ( safe.RegExp_test(rePattern, before) === false ) { return true; } + if ( safe.RegExp_test(rePattern, before) === false ) { return; } rePattern.lastIndex = 0; const after = pattern !== '' ? before.replace(rePattern, replacement) @@ -146,44 +137,65 @@ function replaceNodeTextFn( safe.uboLog(logPrefix, `Text before:\n${before.trim()}`); } safe.uboLog(logPrefix, `Text after:\n${after.trim()}`); - return sedCount === 0 || (sedCount -= 1) !== 0; + sedCount -= 1; }; - const handleMutations = mutations => { - for ( const mutation of mutations ) { - for ( const node of mutation.addedNodes ) { - if ( reNodeName.test(node.nodeName) === false ) { continue; } - if ( handleNode(node) ) { continue; } - stop(false); return; - } - } - }; - const observer = new MutationObserver(handleMutations); - observer.observe(document, { childList: true, subtree: true }); - if ( document.documentElement ) { - const treeWalker = document.createTreeWalker( - document.documentElement, + const handleTree = root => { + const treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT ); + const { currentScript } = document; let count = 0; for (;;) { const node = treeWalker.nextNode(); - count += 1; if ( node === null ) { break; } - if ( reNodeName.test(node.nodeName) === false ) { continue; } - if ( node === document.currentScript ) { continue; } - if ( handleNode(node) ) { continue; } - stop(); break; + count += 1; + if ( node === currentScript ) { continue; } + if ( reNodeName.test(node.nodeName) ) { + handleNode(node); + } else if ( node.nodeName === 'TEMPLATE' ) { + count += handleTree(node.content); + } else { + continue; + } + if ( sedCount === 0 ) { break; } } + return count; + }; + if ( document.documentElement ) { + const count = handleTree(document.documentElement); safe.uboLog(logPrefix, `${count} nodes present before installing mutation observer`); } - if ( extraArgs.stay ) { return; } - runAt(( ) => { - const quitAfter = extraArgs.quitAfter || 0; - if ( quitAfter !== 0 ) { - setTimeout(( ) => { stop(); }, quitAfter); - } else { - stop(); + const stay = Boolean(extraArgs.stay); + if ( sedCount === 0 && stay === false ) { return; } + const stop = (takeRecord = true) => { + const mutations = takeRecord ? observer.takeRecords() : []; + observer.disconnect(); + handleMutations(mutations); + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, 'Quitting'); + } + }; + const handleMutations = mutations => { + for ( const mutation of mutations ) { + for ( const node of mutation.addedNodes ) { + if ( reNodeName.test(node.nodeName) ) { + handleNode(node); + } else if ( node.nodeName === 'TEMPLATE' ) { + handleTree(node.content); + } else { + continue; + } + if ( sedCount === 0 ) { return stop(false); } + } } + }; + const observer = new MutationObserver(handleMutations); + observer.observe(document, { childList: true, subtree: true }); + if ( stay ) { return; } + runAt(( ) => { + const quitAfter = extraArgs.quitAfter ?? 0; + if ( quitAfter === 0 ) { return stop(); } + setTimeout(( ) => { stop(); }, quitAfter); }, 'interactive'); } From b50dbd4db12bf46242d557c904b16bf1baae3eba Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Sep 2026 12:56:36 -0400 Subject: [PATCH 105/145] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d14557914c58d..400033aec881d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `remove-node-text`/`replace-node-text` scriptlets](https://github.com/gorhill/uBlock/commit/71faa0b23f) - [Improve `prevent-clipboard-write` scriptlet](https://github.com/gorhill/uBlock/commit/457c510093) - [Address multiple static filter parser issues](https://github.com/gorhill/uBlock/commit/3ab731942e) - [Treat resources with data as redirectable](https://github.com/gorhill/uBlock/commit/c9eb5b276d) From 78f750fdc51726c2e2b5c4d27578d6098ed7b3a4 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Sep 2026 12:56:54 -0400 Subject: [PATCH 106/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 79e27ad472663..d5558df94a5a5 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.74.1.2 \ No newline at end of file +1.74.1.3 \ No newline at end of file From d0b84d75f9c5a61304e4987b284baee3bd689d2b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Sep 2026 12:59:01 -0400 Subject: [PATCH 107/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index 954be5af5a4b2..99e7bbb3809f8 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From 2e6a889c171781af5c94dd27b768f68edd0f100a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Sep 2026 13:01:59 -0400 Subject: [PATCH 108/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 9b75dfbaa3cf0..8e6f3971667bc 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.74.1.2", + "version": "1.74.1.3", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.74.1b2/uBlock0_1.74.1b2.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.74.1b3/uBlock0_1.74.1b3.firefox.signed.xpi" } ] } From 96b477ef70ac534584a67d810a2a1d2b385e84bc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Sep 2026 13:26:04 -0400 Subject: [PATCH 109/145] Minor CSS --- src/js/resources/prevent-clipboard-write.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/js/resources/prevent-clipboard-write.js b/src/js/resources/prevent-clipboard-write.js index ca5432ab79add..a95308fe9e7c1 100644 --- a/src/js/resources/prevent-clipboard-write.js +++ b/src/js/resources/prevent-clipboard-write.js @@ -74,6 +74,7 @@ function preventClipboardWrite(matches = '', ...varargs) { 'max-height: 8em', 'overflow: auto', 'padding: 0.25em', + 'width: 100%;', 'word-break: break-all' ]; if ( Boolean(extraArgs.selectable ?? true) === false ) { From bfbd7f609e830bb75140601db840a45e2b120549 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Sep 2026 19:38:07 -0400 Subject: [PATCH 110/145] Fix parsing of invalid regex-like domain in static extended filters Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/4113 --- src/js/static-filtering-parser.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index aa63bc8d474e9..90a3c564fff96 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -2207,7 +2207,11 @@ export class AstFilterParser { if ( c0 === 0x2F /* / */ ) { this.domainRegexValueParser.nextArg(this.raw, beg+1); end = this.domainRegexValueParser.separatorEnd; - isRegex = true; + if ( end <= parentEnd ) { + isRegex = true; + } else { + end = -1; + } } else if ( c0 === 0x5B /* [ */ && this.startsWith('[$domain=/', beg) ) { end = this.indexOf('/]', beg + 10, parentEnd); if ( end !== -1 ) { end += 2; } From 31ffc132acd2ce38ff0a4e69c685786ba7ba10bd Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Sep 2026 19:44:08 -0400 Subject: [PATCH 111/145] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 400033aec881d..95d0b0ded0ec0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Fix parsing of invalid regex-like domain in static extended filters](https://github.com/gorhill/uBlock/commit/bfbd7f609e) - [Improve `remove-node-text`/`replace-node-text` scriptlets](https://github.com/gorhill/uBlock/commit/71faa0b23f) - [Improve `prevent-clipboard-write` scriptlet](https://github.com/gorhill/uBlock/commit/457c510093) - [Address multiple static filter parser issues](https://github.com/gorhill/uBlock/commit/3ab731942e) From 6edba1597f9defd730b1f0cb6d36b7580577124c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 5 Sep 2026 09:43:48 -0400 Subject: [PATCH 112/145] [mv3] Fix admin `noFiltering` not taking precedence over user changes Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/761 --- platform/mv3/extension/js/admin.js | 3 +- platform/mv3/extension/js/background.js | 43 ++++++++++++++++------- platform/mv3/extension/js/mode-manager.js | 41 +++++++++++++++++---- 3 files changed, 66 insertions(+), 21 deletions(-) diff --git a/platform/mv3/extension/js/admin.js b/platform/mv3/extension/js/admin.js index c8bc7d09c60da..94ff9b763cdc7 100644 --- a/platform/mv3/extension/js/admin.js +++ b/platform/mv3/extension/js/admin.js @@ -21,7 +21,7 @@ import { adminRead, - localRead, localRemove, localWrite, + localRead, localWrite, sessionRead, sessionWrite, } from './ext.js'; @@ -216,7 +216,6 @@ export async function adminReadEx(key) { if ( local ) { cacheValue = local.data; } - localRemove(`admin_${key}`); // TODO: remove eventually } adminRead(key).then(async value => { const adminKey = `admin.${key}`; diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index 1916765a8f624..e7eb34ea52c8d 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -130,6 +130,7 @@ import { updateCompiledFilters, } from './compiled-filters.js'; +import { deferredTasks } from './deferred-tasks.js'; import { dnr } from './ext-compat.js'; import { setPopupBlockMode } from './prevent-popup.js'; import { supportsOffscreenDocument } from './ext-offscreen.js'; @@ -269,6 +270,25 @@ async function setDeveloperMode(state) { /******************************************************************************/ +async function processDeferredTasks() { + if ( deferredTasks.size === 0 ) { return; } + const promises = []; + if ( deferredTasks.has('registerContentScripts') ) { + promises.push(registerContentScripts()); + } + if ( deferredTasks.has('registerUserScripts') ) { + promises.push(registerUserScripts()); + } + if ( deferredTasks.has('updateUserRules') ) { + promises.push(updateUserRules()); + } + deferredTasks.clear(); + if ( promises.length === 0 ) { return; } + return Promise.all(promises); +} + +/******************************************************************************/ + async function onMessage(request, sender) { const tabId = sender?.tab?.id ?? false; @@ -768,25 +788,20 @@ async function startSession() { // "When an extension updates, content scripts are cleared" // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/userScripts#extension_updates // "User scripts are cleared when an extension updates" - const promises = []; const shouldInject = isNewVersion || permissionsUpdated || isSideloaded && rulesetConfig.developerMode; if ( shouldInject || stockUpdated ) { - promises.push(registerContentScripts()); + deferredTasks.add('registerContentScripts'); } if ( importedUpdated ) { - promises.push( - updateCompiledFilters().then(( ) => - Promise.all([ registerUserScripts(), updateUserRules() ]) - ) - ); + await updateCompiledFilters(); + deferredTasks.add('registerUserScripts'); + deferredTasks.add('updateUserRules'); } else if ( shouldInject ) { - promises.push(registerUserScripts(), updateUserRules()); + deferredTasks.add('registerUserScripts'); + deferredTasks.add('updateUserRules'); } else if ( userScriptsChanged ) { - promises.push(registerUserScripts()); - } - if ( promises.length ) { - await Promise.all(promises); + deferredTasks.add('registerUserScripts'); } // Cosmetic filtering-related content scripts cache fitlering data in @@ -808,12 +823,14 @@ async function startSession() { if ( enableOptimal === false ) { const afterLevel = await setDefaultFilteringMode(MODE_BASIC); if ( afterLevel === MODE_BASIC ) { - await registerContentScripts(); + deferredTasks.add('registerContentScripts'); process.firstRun = false; } } } + await processDeferredTasks(); + // Required to ensure up to date properties are available when needed adminReadEx('disabledFeatures').then(items => { if ( Array.isArray(items) === false ) { return; } diff --git a/platform/mv3/extension/js/mode-manager.js b/platform/mv3/extension/js/mode-manager.js index 8a7831a0dba81..3baddd866edbd 100644 --- a/platform/mv3/extension/js/mode-manager.js +++ b/platform/mv3/extension/js/mode-manager.js @@ -38,6 +38,7 @@ import { } from './config.js'; import { adminReadEx } from './admin.js'; +import { deferredTasks } from './deferred-tasks.js'; import { filteringModesToDNR } from './ruleset-manager.js'; import { hasBroadHostPermissions } from './ext-utils.js'; @@ -103,6 +104,22 @@ const unserializeModeDetails = details => { /******************************************************************************/ +function fixFilteringModeDetails(details) { + const { none, basic, optimal, complete } = unserializeModeDetails(details); + // Descendant hostnames cannot override no-filtering mode + for ( const exclude of none ) { + basic.delete(exclude); + pruneDescendantHostnamesFromSet(exclude, basic); + optimal.delete(exclude); + pruneDescendantHostnamesFromSet(exclude, optimal); + complete.delete(exclude); + pruneDescendantHostnamesFromSet(exclude, complete); + } + return { none, basic, optimal, complete }; +} + +/******************************************************************************/ + function lookupFilteringMode(filteringModes, hostname) { const { none, basic, optimal, complete } = filteringModes; if ( hostname === 'all-urls' ) { @@ -258,13 +275,23 @@ export async function readFilteringModeDetails(bypassCache = false) { if ( adminNoFiltering.includes('-*') ) { userModes.none.clear(); } - for ( const hn of adminNoFiltering ) { - if ( hn.charAt(0) === '-' ) { - userModes.none.delete(hn.slice(1)); - } else { - applyFilteringMode(userModes, hn, 0); + let modified = false; + for ( const token of adminNoFiltering ) { + if ( token.charAt(0) === '-' ) { + const hn = token.slice(1); + if ( userModes.none.has(hn) === false ) { continue; } + userModes.none.delete(hn); + modified = true; + } else if ( userModes.none.has(token) === false ) { + userModes.none.add(token); + modified = true; } } + if ( modified ) { + deferredTasks.add('registerContentScripts'); + deferredTasks.add('registerUserScripts'); + } + userModes = fixFilteringModeDetails(userModes); } filteringModesToDNR(userModes); sessionWrite('filteringModeDetails', serializeModeDetails(userModes)); @@ -308,7 +335,9 @@ export async function getFilteringModeDetails(serializable = false) { } export async function setFilteringModeDetails(details) { - await localWrite('filteringModeDetails', serializeModeDetails(details)); + await localWrite('filteringModeDetails', + serializeModeDetails(fixFilteringModeDetails(details)) + ); await readFilteringModeDetails(true); } From 023906156362b2e1c27fc62f5b4de22d50d9cf07 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Sep 2026 09:48:19 -0400 Subject: [PATCH 113/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index d5558df94a5a5..62c5b1547964c 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.74.1.3 \ No newline at end of file +1.74.1.4 \ No newline at end of file From 4c3009174e1344fc1ccd7a38f1f29df4d094ff06 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Sep 2026 09:51:31 -0400 Subject: [PATCH 114/145] [mv3] Add missing JS file Related commit: https://github.com/gorhill/uBlock/commit/6edba1597f Forgot to add new dependency. --- platform/mv3/extension/js/deferred-tasks.js | 22 +++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 platform/mv3/extension/js/deferred-tasks.js diff --git a/platform/mv3/extension/js/deferred-tasks.js b/platform/mv3/extension/js/deferred-tasks.js new file mode 100644 index 0000000000000..2e24ba1481b0f --- /dev/null +++ b/platform/mv3/extension/js/deferred-tasks.js @@ -0,0 +1,22 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2026-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +export const deferredTasks = new Set(); From ffc00cc4a5fd2aa844e7e470c6835a63aa8b6fb9 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Sep 2026 09:54:47 -0400 Subject: [PATCH 115/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index 99e7bbb3809f8..af2aac14e8367 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From 869e052a2d52ffc58dab89d96e2ce9406970fce3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Sep 2026 10:03:47 -0400 Subject: [PATCH 116/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 8e6f3971667bc..4cb486f513b1b 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.74.1.3", + "version": "1.74.1.4", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.74.1b3/uBlock0_1.74.1b3.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.74.1b4/uBlock0_1.74.1b4.firefox.signed.xpi" } ] } From 55fd5fd3cc9f351afd03a94b22527c00501a0557 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Sep 2026 13:39:31 -0400 Subject: [PATCH 117/145] Remove unused `remove-cache-storage-item` scriplet Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/4114 --- src/js/resources/localstorage.js | 51 -------------------------------- 1 file changed, 51 deletions(-) diff --git a/src/js/resources/localstorage.js b/src/js/resources/localstorage.js index 601ea08b49e15..69c037090437a 100644 --- a/src/js/resources/localstorage.js +++ b/src/js/resources/localstorage.js @@ -127,57 +127,6 @@ registerScriptlet(setLocalStorageItemFn, { ], }); -/******************************************************************************/ - -export function removeCacheStorageItem( - cacheNamePattern = '', - requestPattern = '' -) { - if ( cacheNamePattern === '' ) { return; } - const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('remove-cache-storage-item', cacheNamePattern, requestPattern); - const cacheStorage = self.caches; - if ( cacheStorage instanceof Object === false ) { return; } - const reCache = safe.patternToRegex(cacheNamePattern, undefined, true); - const reRequest = safe.patternToRegex(requestPattern, undefined, true); - cacheStorage.keys().then(cacheNames => { - for ( const cacheName of cacheNames ) { - if ( reCache.test(cacheName) === false ) { continue; } - if ( requestPattern === '' ) { - cacheStorage.delete(cacheName).then(result => { - if ( safe.logLevel > 1 ) { - safe.uboLog(logPrefix, `Deleting ${cacheName}`); - } - if ( result !== true ) { return; } - safe.uboLog(logPrefix, `Deleted ${cacheName}: ${result}`); - }); - continue; - } - cacheStorage.open(cacheName).then(cache => { - cache.keys().then(requests => { - for ( const request of requests ) { - if ( reRequest.test(request.url) === false ) { continue; } - if ( safe.logLevel > 1 ) { - safe.uboLog(logPrefix, `Deleting ${cacheName}/${request.url}`); - } - cache.delete(request).then(result => { - if ( result !== true ) { return; } - safe.uboLog(logPrefix, `Deleted ${cacheName}/${request.url}: ${result}`); - }); - } - }); - }); - } - }); -} -registerScriptlet(removeCacheStorageItem, { - name: 'remove-cache-storage-item.fn', - world: 'ISOLATED', - dependencies: [ - safeSelf, - ], -}); - /******************************************************************************* * * set-local-storage-item.js From 7be44bfc813dbcd658cbdd7b7c981667fb1fe31d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Sep 2026 15:56:30 -0400 Subject: [PATCH 118/145] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/ar/messages.json | 6 +- .../mv3/extension/_locales/az/messages.json | 6 +- .../mv3/extension/_locales/be/messages.json | 6 +- .../mv3/extension/_locales/bg/messages.json | 2 +- .../mv3/extension/_locales/bn/messages.json | 2 +- .../mv3/extension/_locales/cy/messages.json | 2 +- .../mv3/extension/_locales/et/messages.json | 2 +- .../mv3/extension/_locales/fa/messages.json | 2 +- .../mv3/extension/_locales/gu/messages.json | 2 +- .../mv3/extension/_locales/he/messages.json | 2 +- .../mv3/extension/_locales/hi/messages.json | 2 +- .../mv3/extension/_locales/hu/messages.json | 2 +- .../mv3/extension/_locales/hy/messages.json | 6 +- .../mv3/extension/_locales/ka/messages.json | 2 +- .../mv3/extension/_locales/kk/messages.json | 2 +- .../mv3/extension/_locales/kn/messages.json | 2 +- .../mv3/extension/_locales/lt/messages.json | 2 +- .../mv3/extension/_locales/mk/messages.json | 2 +- .../mv3/extension/_locales/ml/messages.json | 2 +- .../mv3/extension/_locales/mr/messages.json | 2 +- .../mv3/extension/_locales/ms/messages.json | 2 +- .../mv3/extension/_locales/nb/messages.json | 12 ++-- .../mv3/extension/_locales/oc/messages.json | 2 +- .../mv3/extension/_locales/pa/messages.json | 2 +- .../mv3/extension/_locales/ro/messages.json | 4 +- .../mv3/extension/_locales/si/messages.json | 2 +- .../mv3/extension/_locales/sl/messages.json | 2 +- .../mv3/extension/_locales/so/messages.json | 2 +- .../mv3/extension/_locales/sq/messages.json | 2 +- .../mv3/extension/_locales/sw/messages.json | 2 +- .../mv3/extension/_locales/ta/messages.json | 4 +- .../mv3/extension/_locales/te/messages.json | 2 +- .../mv3/extension/_locales/tr/messages.json | 2 +- .../mv3/extension/_locales/uk/messages.json | 2 +- .../mv3/extension/_locales/ur/messages.json | 2 +- .../mv3/extension/_locales/vi/messages.json | 2 +- .../extension/_locales/zh_CN/messages.json | 2 +- src/_locales/az/messages.json | 66 +++++++++---------- src/_locales/hy/messages.json | 4 +- src/_locales/it/messages.json | 2 +- src/_locales/ro/messages.json | 2 +- src/_locales/sl/messages.json | 18 ++--- 42 files changed, 98 insertions(+), 98 deletions(-) diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index 7c94ea4641bc7..db206afd900ba 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "لفرض عوامل تصفية تجميلية أو برمجية من القوائم المستوردة، يجب عليك منح uBO Lite إذنًا لتشغيل البرامج النصية للمستخدم.", + "message": "لتطبيق مرشحات التجميل أو النصوص البرمجية الصغيرة من القوائم المستوردة، يجب منح uBO Lite إذنا لتشغيل نصوص المستخدم.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "لتطبيق مرشحات التجميل أو السكريبت من القوائم المستوردة، يجب منح uBO Lite إذنا لتشغيل نصوص المستخدم. افتح صفحة الإضافات في متصفحك (chrome://extensions في Chrome أو about:addons في Firefox)، ثم افتح تفاصيل
uBO Lite، وفعل خيار السماح بنصوص المستخدم (المعروف أيضا بـ \"نصوص الطرف الثالث غير الموثقة\").", + "message": "افتح صفحة الإضافات في متصفحك (chrome://extensions في Chrome أو about:addons في Firefox)، ثم افتح تفاصيل uBO Lite، وفعل خيار السماح بنصوص المستخدم (المعروف أيضا بـ \"نصوص الطرف الثالث غير الموثقة\").", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "لفرض استخدام عوامل تصفية تجميلية أو برامج نصية من بيئة الاختبار المعزولة، يجب عليك منح uBO Lite إذنًا لتشغيل البرامج النصية للمستخدم.", + "message": "لتطبيق مرشحات التجميل أو النصوص البرمجية الصغيرة من بيئة الاختبار، يجب منح uBO Lite إذنا لتشغيل نصوص المستخدم.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/az/messages.json b/platform/mv3/extension/_locales/az/messages.json index 6008907d4ff78..8162b8d3fc088 100644 --- a/platform/mv3/extension/_locales/az/messages.json +++ b/platform/mv3/extension/_locales/az/messages.json @@ -104,7 +104,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from imported lists, you must grant uBO Lite permission to run user scripts.", + "message": "İdxal olunmuş siyahılardan kosmetik və ya skriptlet filtrlərini tətbiq etmək üçün uBO Lite-a istifadəçi skriptlərini icra etmək icazəsi verəsiniz.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "customFiltersImportExportLabel": { @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "İdxal edilmiş siyahılardan kosmetik və ya skriptlet filtrlərini tətbiq etmək üçün uBO Lite-a istifadəçi skriptlərini işlətmək icazəsi verməlisiniz. Brauzerinizin genişləndirmələr səhifəsini açın (Chrome-da chrome://extensions və ya Firefox-da about:addons), uBO Lite bölməsinin təfərrüatlarını açın və İstifadəçi skriptlərinə icazə ver seçimini aktivləşdirin (bu seçim “təsdiqlənməmiş üçüncü tərəf skriptləri” kimi də adlandırılır).", + "message": "Brauzerinizin genişləndirmələr səhifəsini açın (Chrome-da chrome://extensions və ya Firefox-da about:addons), uBO Lite bölməsinin təfərrüatlarını açın və İstifadəçi skriptlərinə icazə ver seçimini aktivləşdirin (bu seçim “təsdiqlənməmiş üçüncü tərəf skriptləri” kimi də adlandırılır).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -292,7 +292,7 @@ "description": "Header for filter-creation section in the dashboard" }, "sandboxEditorUserScriptsInfo": { - "message": "To enforce cosmetic or scriptlet filters from the sandbox, you must grant uBO Lite permission to run user scripts.", + "message": "Sandbox-dan kosmetik və ya skriptlet filtrlərini tətbiq etmək üçün uBO Lite-a istifadəçi skriptlərini icra etmək icazəsi verəsiniz.", "description": "A notice to inform user that the enforcement of some filters requires permission to execute 'user scripts'" }, "developerModeLabel": { diff --git a/platform/mv3/extension/_locales/be/messages.json b/platform/mv3/extension/_locales/be/messages.json index b1ed647821567..b5158de374f2d 100644 --- a/platform/mv3/extension/_locales/be/messages.json +++ b/platform/mv3/extension/_locales/be/messages.json @@ -36,7 +36,7 @@ "description": "Link to privacy policy on GitHub (English)" }, "aboutDocumentation": { - "message": "Documentation", + "message": "Дакументацыя", "description": "Link to documentation in About pane" }, "popupFilteringModeLabel": { @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Каб прымяніць касметычныя фільтры або фільтры скрыптлетаў да імпартаваных спісаў, вы павінны даць uBO Lite дазвол на запуск карыстальніцкіх скрыптоў. Адкрыйце старонку пашырэнняў вашага браўзера (chrome://extensions у Chrome або about:addons у Firefox), адкрыйце падрабязнасці uBO Lite і ўключыце Дазволіць карыстальніцкія скрыпты (таксама вядомыя як «неправераныя староннія скрыпты»).", + "message": "Адкрыйце старонку пашырэнняў вашага браўзера (chrome://extensions у Chrome або about:addons у Firefox), адкрыйце падрабязнасці uBO Lite і ўключыце Дазволіць карыстальніцкія скрыпты (таксама вядомыя як «неправераныя староннія скрыпты»).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -384,7 +384,7 @@ "description": "An option in a dropdown list" }, "developOptionDnrRulesOf": { - "message": "Правілы у DNR", + "message": "Правілы у DNR …", "description": "A section header in a dropdown list" }, "developOptionDynamicRuleset": { diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index b31e44694cb6b..b5a5940cd29ca 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -384,7 +384,7 @@ "description": "An option in a dropdown list" }, "developOptionDnrRulesOf": { - "message": "Правила на DNR за ...", + "message": "Правила на DNR за …", "description": "A section header in a dropdown list" }, "developOptionDynamicRuleset": { diff --git a/platform/mv3/extension/_locales/bn/messages.json b/platform/mv3/extension/_locales/bn/messages.json index 7b9566f85bc89..31a53f76ca443 100644 --- a/platform/mv3/extension/_locales/bn/messages.json +++ b/platform/mv3/extension/_locales/bn/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "আমদানিকৃত তালিকা থেকে কসমেটিক বা স্ক্রিপ্টলেট ফিল্টার প্রয়োগ করতে, আপনাকে uBO Lite-কে ব্যবহারকারী স্ক্রিপ্ট চালানোর অনুমতি দিতে হবে। আপনার ব্রাউজারের এক্সটেনশন পৃষ্ঠা খুলুন (Chrome-এ chrome://extensions অথবা Firefox-এ about:addons), uBO Lite-এর বিস্তারিত খুলুন, এবং Allow user scripts (যা \"অযাচাইকৃত তৃতীয়-পক্ষ স্ক্রিপ্ট\" নামেও পরিচিত) চালু করুন।", + "message": "আপনার ব্রাউজারের এক্সটেনশন পৃষ্ঠা খুলুন (Chrome-এ chrome://extensions অথবা Firefox-এ about:addons), uBO Lite-এর বিস্তারিত খুলুন, এবং Allow user scripts (যা \"অযাচাইকৃত তৃতীয়-পক্ষ স্ক্রিপ্ট\" নামেও পরিচিত) চালু করুন।", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/cy/messages.json b/platform/mv3/extension/_locales/cy/messages.json index dc68906692a9d..21ff1a448afa7 100644 --- a/platform/mv3/extension/_locales/cy/messages.json +++ b/platform/mv3/extension/_locales/cy/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "I orfodi hidlau cosmetig neu sgriptlet o restrau wedi'u mewnforio, rhaid i chi roi caniatâd i uBO Lite redeg sgriptiau defnyddiwr. Agorwch dudalen estyniadau eich porwr (chrome://extensions yn Chrome neu about:addons yn Firefox), agorwch fanylion uBO Lite, a throwch Caniatáu sgriptiau defnyddiwr ymlaen (a elwir hefyd yn “sgriptiau trydydd parti heb eu gwirio”).", + "message": "Agorwch dudalen estyniadau eich porwr (chrome://extensions yn Chrome neu about:addons yn Firefox), agorwch fanylion uBO Lite, a throwch Caniatáu sgriptiau defnyddiwr ymlaen (a elwir hefyd yn “sgriptiau trydydd parti heb eu gwirio”).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/et/messages.json b/platform/mv3/extension/_locales/et/messages.json index a22823faf5a0d..67b850da0c03b 100644 --- a/platform/mv3/extension/_locales/et/messages.json +++ b/platform/mv3/extension/_locales/et/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Ilufiltrite või scriplet filtrite kasutamiseks imporditud nimekirjast pead lubama uBO Lite'il käivitada kasutajaskripte. Ava veebilehitseja laiendite lehekülg (chrome://extensions Chrome'is või about:addons Firefoxis), ava uBO Lite'i andmed ja luba Luba kasutajaskriptid (tuntud ka kui „kinnitamata muu osapoole skriptid“).", + "message": "Ava veebilehitseja laiendite lehekülg (chrome://extensions Chrome'is või about:addons Firefoxis), ava uBO Lite'i andmed ja luba Luba kasutajaskriptid (tuntud ka kui „kinnitamata muu osapoole skriptid“).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/fa/messages.json b/platform/mv3/extension/_locales/fa/messages.json index b17aa4f579f46..5ebdfa7062255 100644 --- a/platform/mv3/extension/_locales/fa/messages.json +++ b/platform/mv3/extension/_locales/fa/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "برای اعمال فیلترهای ظاهری یا اسکریپتلت از لیست‌های وارد شده، باید به uBO Lite اجازه اجرای اسکریپت‌های کاربر را بدهید. صفحه افزونه‌های مرورگر خود را باز کنید (chrome://extensions در کروم یا about:addons در فایرفاکس)، جزئیات uBO Lite را باز کنید و گزینه اجازه به اسکریپت‌های کاربر (که به عنوان \"اسکریپت‌های شخص ثالث تایید نشده\" نیز شناخته می‌شود) را فعال کنید.", + "message": "صفحه افزونه‌های مرورگر خود را باز کنید (chrome://extensions در کروم یا about:addons در فایرفاکس)، جزئیات uBO Lite را باز کنید و گزینه اجازه به اسکریپت‌های کاربر (که به عنوان \"اسکریپت‌های شخص ثالث تایید نشده\" نیز شناخته می‌شود) را فعال کنید.", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/gu/messages.json b/platform/mv3/extension/_locales/gu/messages.json index ea08b7d2395bf..761ef5fa2df75 100644 --- a/platform/mv3/extension/_locales/gu/messages.json +++ b/platform/mv3/extension/_locales/gu/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "આયાત કરેલ યાદીઓમાંથી કોસ્મેટિક અથવા સ્ક્રિપ્ટલેટ ફિલ્ટરો લાગુ કરવા માટે, તમારે uBO Lite ને વપરાશકર્તા સ્ક્રિપ્ટો ચલાવવાની પરવાનગી આપવી આવશ્યક છે. તમારા બ્રાઉઝરનું એક્સ્ટેંશન પેજ ખોલો (Chrome માં chrome://extensions અથવા Firefox માં about:addons), uBO Lite વિગતો ખોલો, અને વપરાશકર્તા સ્ક્રિપ્ટોને મંજૂરી આપો (જેને “અવેરિફાઇડ તૃતીય-પક્ષ સ્ક્રિપ્ટો” તરીકે પણ ઓળખવામાં આવે છે) ચાલુ કરો.", + "message": "તમારા બ્રાઉઝરનું એક્સ્ટેંશન પેજ ખોલો (Chrome માં chrome://extensions અથવા Firefox માં about:addons), uBO Lite વિગતો ખોલો, અને વપરાશકર્તા સ્ક્રિપ્ટોને મંજૂરી આપો (જેને “અવેરિફાઇડ તૃતીય-પક્ષ સ્ક્રિપ્ટો” તરીકે પણ ઓળખવામાં આવે છે) ચાલુ કરો.", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/he/messages.json b/platform/mv3/extension/_locales/he/messages.json index 4c7f10c4dfdfd..991fb5b3d7227 100644 --- a/platform/mv3/extension/_locales/he/messages.json +++ b/platform/mv3/extension/_locales/he/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "בכדי לאפשר מסננים קוסמטיים או scriptlet מרשימות מיובאות, יש לאפשר ל uBO Lite להריץ סקריפטים של המשתמש. פתחו את התוספים או ההרחבות בדפדפן שלכם (chrome://extensions בכרום או chrome://extensions בפיירפוקס), פתחו את הפרטים של uBO Lite, ותנו אישור לסקריפטים של משתמשים (או \"לאפשר לתסריטי צד שלישי לא מאומתים לגשת לנתונים שלך\").", + "message": "פתחו את התוספים או ההרחבות בדפדפן שלכם (chrome://extensions בכרום או chrome://extensions בפיירפוקס), פתחו את הפרטים של uBO Lite, ותנו אישור לסקריפטים של משתמשים (או \"לאפשר לתסריטי צד שלישי לא מאומתים לגשת לנתונים שלך\").", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/hi/messages.json b/platform/mv3/extension/_locales/hi/messages.json index 2530bdabde985..9f2c0abdb6ce8 100644 --- a/platform/mv3/extension/_locales/hi/messages.json +++ b/platform/mv3/extension/_locales/hi/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "आयातित सूचियों से कॉस्मेटिक या स्क्रिप्टलेट फ़िल्टर लागू करने के लिए, आपको uBO Lite को उपयोगकर्ता स्क्रिप्ट चलाने की अनुमति देनी होगी। अपने ब्राउज़र का एक्सटेंशन पेज खोलें (Chrome में chrome://extensions या Firefox में about:addons), uBO Lite विवरण खोलें, और उपयोगकर्ता स्क्रिप्ट की अनुमति दें (जिसे \"असत्यापित तृतीय-पक्ष स्क्रिप्ट\" भी कहा जाता है) को चालू करें।", + "message": "अपने ब्राउज़र का एक्सटेंशन पेज खोलें (Chrome में chrome://extensions या Firefox में about:addons), uBO Lite विवरण खोलें, और उपयोगकर्ता स्क्रिप्ट की अनुमति दें (जिसे \"असत्यापित तृतीय-पक्ष स्क्रिप्ट\" भी कहा जाता है) को चालू करें।", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index 84eb31db8ccd5..7a9a280625f8f 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Az importált listákból származó kozmetikai szűrők alkalmazásához engedélyezni kell az uBO Lite számára, hogy felhasználói parancsfájlokat futtatsson. Nyissa meg a böngészőkiegészítők vagy bővítmények oldalát (chrome://extensions a Chrome-ban vagy about:addons a Firefoxban), nyissa meg a uBO Lite részleteit, és kapcsolja be a Felhasználói parancsfájlok engedélyezése lehetőséget (más néven „nem ellenőrzött külső parancsfájlok”).", + "message": "Nyissa meg a böngészőkiegészítők vagy bővítmények oldalát (chrome://extensions a Chrome-ban vagy about:addons a Firefoxban), nyissa meg a uBO Lite részleteit, és kapcsolja be a Felhasználói parancsfájlok engedélyezése lehetőséget (más néven „nem ellenőrzött külső parancsfájlok”).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/hy/messages.json b/platform/mv3/extension/_locales/hy/messages.json index 106fc7da5cb31..41c8228a0d59b 100644 --- a/platform/mv3/extension/_locales/hy/messages.json +++ b/platform/mv3/extension/_locales/hy/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Ներմուծված ցանկերից կոսմետիկ կամ սկրիպտլետ զտիչները կիրառելու համար դուք պետք է uBO Lite-ին թույլատրեք գործարկել օգտատիրոջ սկրիպտները։ Բացեք ձեր դիտարկչի ընդլայնումների էջը (chrome://extensions Chrome-ում կամ about:addons Firefox-ում), բացեք uBO Lite-ի մանրամասները և միացրեք Թույլատրել օգտատիրոջ սկրիպտները (նաև կոչվում է “չստուգված երրորդ կողմի սկրիպտներ”)։", + "message": "Բացեք ձեր դիտարկչի ընդլայնումների էջը (chrome://extensions Chrome-ում կամ about:addons Firefox-ում), բացեք uBO Lite-ի մանրամասները և միացրեք Թույլատրել օգտատիրոջ սկրիպտները (նաև կոչվում է “չստուգված երրորդ կողմի սկրիպտներ”)։", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { @@ -164,7 +164,7 @@ "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Գտնել նմանատիպ հաղորդումներ GitHub-ում", + "message": "Գտնել նման զեկույցներ GitHub-ում", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { @@ -212,7 +212,7 @@ "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Ստեղծել նոր հաղորդում GitHub-ում", + "message": "Նոր զեկույց ստեղծել GitHub-ում", "description": "Text for button which opens an external web page in Support pane" }, "defaultFilteringModeSectionLabel": { diff --git a/platform/mv3/extension/_locales/ka/messages.json b/platform/mv3/extension/_locales/ka/messages.json index 91bd9b092c910..a526c6e0b4be7 100644 --- a/platform/mv3/extension/_locales/ka/messages.json +++ b/platform/mv3/extension/_locales/ka/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "გარეგნული ან მცირე სკრიპტის ფილტრების იძულებით ასამოქმედებლად შემოტანილი სიებიდან, uBO Lite უნდა იყოს სკრიპტების გაშვების ნებართვის მქონე. გახსენით ბრაუზერის გაფართოებების გვერდი (chrome://extensions Chrome-ში ან about:addons Firefox-ში), იხილეთ uBO Lite ვრცლად და გადართეთ მომხმარებლის სკრიპტების ნებართვა (აგრეთვე შეიძლება ეწეროს „დაუმოწმებელი გარეშე სკრიპტები“).", + "message": "გახსენით ბრაუზერის გაფართოებების გვერდი (chrome://extensions Chrome-ში ან about:addons Firefox-ში), იხილეთ uBO Lite ვრცლად და გადართეთ მომხმარებლის სკრიპტების ნებართვა (აგრეთვე შეიძლება ეწეროს „დაუმოწმებელი გარეშე სკრიპტები“).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/kk/messages.json b/platform/mv3/extension/_locales/kk/messages.json index fe6256604b07f..3db36a5dd5932 100644 --- a/platform/mv3/extension/_locales/kk/messages.json +++ b/platform/mv3/extension/_locales/kk/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Импортталған тізімдерден алынған көрнекілік немесе скрипт сүзгілерін қолдану үшін сіз uBO Lite-ке пайдаланушы скрипттерін іске қосу рұқсатын беруіңіз керек. Браузеріңіздің кеңейтулер бетін ашыңыз (chrome://extensions Chrome-да немесе about:addons Firefox-та), uBO Lite мәліметтерін ашып, Пайдаланушы скрипттеріне рұқсат ету (сонымен қатар “расталмаған үшінші тарап скрипттері” деп аталады) қосқышын қосыңыз.", + "message": "Браузеріңіздің кеңейтулер бетін ашыңыз (chrome://extensions Chrome-да немесе about:addons Firefox-та), uBO Lite мәліметтерін ашып, Пайдаланушы скрипттеріне рұқсат ету (сонымен қатар “расталмаған үшінші тарап скрипттері” деп аталады) қосқышын қосыңыз.", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/kn/messages.json b/platform/mv3/extension/_locales/kn/messages.json index fb6a282b500d7..fb1ddeb69e36d 100644 --- a/platform/mv3/extension/_locales/kn/messages.json +++ b/platform/mv3/extension/_locales/kn/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "ಆಮದು ಮಾಡಿದ ಪಟ್ಟಿಗಳಿಂದ ಸೌಂದರ್ಯ ಅಥವಾ ಸ್ಕ್ರಿಪ್ಟ್ಲೆಟ್ ಶೋಧಕಗಳನ್ನು ಜಾರಿಗೊಳಿಸಲು, ನೀವು uBO Lite ಗೆ ಬಳಕೆದಾರ ಸ್ಕ್ರಿಪ್ಟ್ಗಳನ್ನು ಚಲಾಯಿಸಲು ಅನುಮತಿ ನೀಡಬೇಕು. ನಿಮ್ಮ ಬ್ರೌಸರ್ನ ವಿಸ್ತರಣೆಗಳ ಪುಟವನ್ನು ತೆರೆಯಿರಿ (Chrome ನಲ್ಲಿ chrome://extensions ಅಥವಾ Firefox ನಲ್ಲಿ about:addons), uBO Lite ವಿವರಗಳನ್ನು ತೆರೆಯಿರಿ, ಮತ್ತು ಬಳಕೆದಾರ ಸ್ಕ್ರಿಪ್ಟ್ಗಳನ್ನು ಅನುಮತಿಸು ಅನ್ನು ಟಾಗಲ್ ಆನ್ ಮಾಡಿ (ಇದನ್ನು “ಪರಿಶೀಲಿಸದ ಮೂರನೇ-ಪಕ್ಷ ಸ್ಕ್ರಿಪ್ಟ್ಗಳು” ಎಂದೂ ಕರೆಯಲಾಗುತ್ತದೆ).", + "message": "ನಿಮ್ಮ ಬ್ರೌಸರ್ನ ವಿಸ್ತರಣೆಗಳ ಪುಟವನ್ನು ತೆರೆಯಿರಿ (Chrome ನಲ್ಲಿ chrome://extensions ಅಥವಾ Firefox ನಲ್ಲಿ about:addons), uBO Lite ವಿವರಗಳನ್ನು ತೆರೆಯಿರಿ, ಮತ್ತು ಬಳಕೆದಾರ ಸ್ಕ್ರಿಪ್ಟ್ಗಳನ್ನು ಅನುಮತಿಸು ಅನ್ನು ಟಾಗಲ್ ಆನ್ ಮಾಡಿ (ಇದನ್ನು “ಪರಿಶೀಲಿಸದ ಮೂರನೇ-ಪಕ್ಷ ಸ್ಕ್ರಿಪ್ಟ್ಗಳು” ಎಂದೂ ಕರೆಯಲಾಗುತ್ತದೆ).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/lt/messages.json b/platform/mv3/extension/_locales/lt/messages.json index f62681d2bd819..204119217a100 100644 --- a/platform/mv3/extension/_locales/lt/messages.json +++ b/platform/mv3/extension/_locales/lt/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Kad galėtumėte taikyti kosmetinius ar scenarijų filtrus iš importuotų sąrašų, turite suteikti uBO Lite leidimą vykdyti vartotojo scenarijus. Atidarykite naršyklės plėtinių puslapį (chrome://extensions sistemoje Chrome arba about:addons sistemoje Firefox), atidarykite uBO Lite išsamią informaciją ir įjunkite Leisti vartotojo scenarijus (taip pat vadinama „nepatikrintais trečiųjų šalių scenarijais“).", + "message": "Atidarykite naršyklės plėtinių puslapį (chrome://extensions sistemoje Chrome arba about:addons sistemoje Firefox), atidarykite uBO Lite išsamią informaciją ir įjunkite Leisti vartotojo scenarijus (taip pat vadinama „nepatikrintais trečiųjų šalių scenarijais“).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/mk/messages.json b/platform/mv3/extension/_locales/mk/messages.json index 09a38512e1e50..cf727102e5628 100644 --- a/platform/mv3/extension/_locales/mk/messages.json +++ b/platform/mv3/extension/_locales/mk/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "За да ги примените козметичките или скриплет филтрите од увезените листи, мора да му доделите на uBO Lite дозвола за извршување на кориснички скрипти. Отворете ја страницата за проширувања на вашиот прелистувач (chrome://extensions во Chrome или about:addons во Firefox), отворете ги деталите за uBO Lite и вклучете ја опцијата Дозволи кориснички скрипти (исто така наречени „непроверени скрипти од трети страни“).", + "message": "Отворете ја страницата за проширувања на вашиот прелистувач (chrome://extensions во Chrome или about:addons во Firefox), отворете ги деталите за uBO Lite и вклучете ја опцијата Дозволи кориснички скрипти (исто така наречени „непроверени скрипти од трети страни“).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/ml/messages.json b/platform/mv3/extension/_locales/ml/messages.json index a8ee09625a870..3cc50e122a232 100644 --- a/platform/mv3/extension/_locales/ml/messages.json +++ b/platform/mv3/extension/_locales/ml/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "ഇറക്കുമതി ചെയ്ത ലിസ്റ്റുകളിൽ നിന്നുള്ള കോസ്മെറ്റിക് അല്ലെങ്കിൽ സ്ക്രിപ്റ്റ്ലെറ്റ് ഫിൽറ്ററുകൾ നടപ്പിലാക്കാൻ, യൂസർ സ്ക്രിപ്റ്റുകൾ പ്രവർത്തിപ്പിക്കാനുള്ള അനുമതി uBO Lite-ന് നിങ്ങൾ നൽകണം. നിങ്ങളുടെ ബ്രൗസറിന്റെ എക്സ്റ്റൻഷനുകൾ പേജ് തുറക്കുക (Chrome-ൽ chrome://extensions അല്ലെങ്കിൽ Firefox-ൽ about:addons), uBO Lite വിശദാംശങ്ങൾ തുറക്കുക, യൂസർ സ്ക്രിപ്റ്റുകൾ അനുവദിക്കുക (മറ്റൊരു വിധത്തിൽ “പരിശോധിക്കാത്ത മൂന്നാം കക്ഷി സ്ക്രിപ്റ്റുകൾ” എന്നും അറിയപ്പെടുന്നു) ടോഗിൾ ഓണാക്കുക.", + "message": "നിങ്ങളുടെ ബ്രൗസറിന്റെ എക്സ്റ്റൻഷനുകൾ പേജ് തുറക്കുക (Chrome-ൽ chrome://extensions അല്ലെങ്കിൽ Firefox-ൽ about:addons), uBO Lite വിശദാംശങ്ങൾ തുറക്കുക, യൂസർ സ്ക്രിപ്റ്റുകൾ അനുവദിക്കുക (മറ്റൊരു വിധത്തിൽ “പരിശോധിക്കാത്ത മൂന്നാം കക്ഷി സ്ക്രിപ്റ്റുകൾ” എന്നും അറിയപ്പെടുന്നു) ടോഗിൾ ഓണാക്കുക.", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/mr/messages.json b/platform/mv3/extension/_locales/mr/messages.json index ad62e720b3cec..410b3f8b85fb1 100644 --- a/platform/mv3/extension/_locales/mr/messages.json +++ b/platform/mv3/extension/_locales/mr/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "आयात केलेल्या याद्यांमधील कॉस्मेटिक किंवा स्क्रिप्टलेट फिल्टर लागू करण्यासाठी, तुम्ही uBO Lite ला वापरकर्ता स्क्रिप्ट चालवण्याची परवानगी दिली पाहिजे. तुमच्या ब्राउझरचे विस्तारण पृष्ठ उघडा (Chrome मध्ये chrome://extensions किंवा Firefox मध्ये about:addons), uBO Lite तपशील उघडा, आणि Allow user scripts (ज्याला “unverified third-party scripts” असेही म्हणतात) टॉगल चालू करा.", + "message": "तुमच्या ब्राउझरचे विस्तारण पृष्ठ उघडा (Chrome मध्ये chrome://extensions किंवा Firefox मध्ये about:addons), uBO Lite तपशील उघडा, आणि Allow user scripts (ज्याला “unverified third-party scripts” असेही म्हणतात) टॉगल चालू करा.", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/ms/messages.json b/platform/mv3/extension/_locales/ms/messages.json index d7f7b71eded14..663a1a4e7702d 100644 --- a/platform/mv3/extension/_locales/ms/messages.json +++ b/platform/mv3/extension/_locales/ms/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Untuk menguatkuasakan penapis kosmetik atau scriptlet daripada senarai yang diimport, anda mesti memberikan kebenaran kepada uBO Lite untuk menjalankan skrip pengguna. Buka halaman sambungan pelayar anda (chrome://extensions dalam Chrome atau about:addons dalam Firefox), buka butiran uBO Lite, dan aktifkan Benarkan skrip pengguna (juga dirujuk sebagai \"skrip pihak ketiga yang tidak disahkan\").", + "message": "Buka halaman sambungan pelayar anda (chrome://extensions dalam Chrome atau about:addons dalam Firefox), buka butiran uBO Lite, dan aktifkan Benarkan skrip pengguna (juga dirujuk sebagai \"skrip pihak ketiga yang tidak disahkan\").", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/nb/messages.json b/platform/mv3/extension/_locales/nb/messages.json index 7cfb709a0fb00..59bf6ef199ab1 100644 --- a/platform/mv3/extension/_locales/nb/messages.json +++ b/platform/mv3/extension/_locales/nb/messages.json @@ -36,7 +36,7 @@ "description": "Link to privacy policy on GitHub (English)" }, "aboutDocumentation": { - "message": "Documentation", + "message": "Dokumentasjon", "description": "Link to documentation in About pane" }, "popupFilteringModeLabel": { @@ -92,11 +92,11 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupImported": { - "message": "Imported lists", + "message": "Importerte lister", "description": "Header for a ruleset section in 'Filter lists pane'" }, "customListImportLabel": { - "message": "Add filter list…", + "message": "Legg til filterlister…", "description": "Text label heading the import area of custom filter lists" }, "customListImportPlaceholder": { @@ -280,7 +280,7 @@ "description": "Short description for a checkbox in the options page" }, "enablePopupBlockLabel": { - "message": "Aktiver popup blokkering", + "message": "Aktiver popup-blokkering", "description": "Label for a checkbox in the options page" }, "enablePopupBlockLegend": { @@ -408,11 +408,11 @@ "description": "Text for buttons used to add content" }, "importAndAppendButton": { - "message": "Importer og legg til...", + "message": "Importer og legg til…", "description": "Text for buttons used to import and append content" }, "exportButton": { - "message": "Eksporter...", + "message": "Eksporter…", "description": "Text for buttons used to export content" }, "backupButton": { diff --git a/platform/mv3/extension/_locales/oc/messages.json b/platform/mv3/extension/_locales/oc/messages.json index 020106137c192..0f924a6ef94e3 100644 --- a/platform/mv3/extension/_locales/oc/messages.json +++ b/platform/mv3/extension/_locales/oc/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Per aplicar los filtres cosmetics o scriptlets de las listas importadas, deuatz acordar la permission a uBO Lite d'executar d'scripts utilizaire. Dobrissètz la pagina de las extensions de vòstre navigador (chrome://extensions dins Chrome o about:addons dins Firefox), dobrissètz los detalhs de uBO Lite, e activatz Permetre los scripts utilizaire (tanben nomenats “scripts tèrces pas verificats”).", + "message": "Dobrissètz la pagina de las extensions de vòstre navigador (chrome://extensions dins Chrome o about:addons dins Firefox), dobrissètz los detalhs de uBO Lite, e activatz Permetre los scripts utilizaire (tanben nomenats “scripts tèrces pas verificats”).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/pa/messages.json b/platform/mv3/extension/_locales/pa/messages.json index 4d402ddcd36dc..3c5de53eedc7e 100644 --- a/platform/mv3/extension/_locales/pa/messages.json +++ b/platform/mv3/extension/_locales/pa/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "ਆਯਾਤ ਕੀਤੀਆਂ ਸੂਚੀਆਂ ਤੋਂ ਕਾਸਮੈਟਿਕ ਜਾਂ ਸਕ੍ਰਿਪਟਲੈੱਟ ਫਿਲਟਰਾਂ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ uBO Lite ਨੂੰ ਉਪਭੋਗਤਾ ਸਕ੍ਰਿਪਟਾਂ ਚਲਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣੀ ਚਾਹੀਦੀ ਹੈ। ਆਪਣੇ ਬ੍ਰਾਊਜ਼ਰ ਦਾ ਐਕਸਟੈਂਸ਼ਨ ਪੰਨਾ ਖੋਲ੍ਹੋ (chrome://extensions Chrome ਵਿੱਚ ਜਾਂ about:addons Firefox ਵਿੱਚ), uBO Lite ਵੇਰਵੇ ਖੋਲ੍ਹੋ, ਅਤੇ Allow user scripts (ਜਿਸਨੂੰ “ਅਣਪ੍ਰਮਾਣਿਤ ਤੀਜੀ-ਧਿਰ ਸਕ੍ਰਿਪਟਾਂ” ਵੀ ਕਿਹਾ ਜਾਂਦਾ ਹੈ) ਨੂੰ ਚਾਲੂ ਕਰੋ।", + "message": "ਆਪਣੇ ਬ੍ਰਾਊਜ਼ਰ ਦਾ ਐਕਸਟੈਂਸ਼ਨ ਪੰਨਾ ਖੋਲ੍ਹੋ (chrome://extensions Chrome ਵਿੱਚ ਜਾਂ about:addons Firefox ਵਿੱਚ), uBO Lite ਵੇਰਵੇ ਖੋਲ੍ਹੋ, ਅਤੇ Allow user scripts (ਜਿਸਨੂੰ “ਅਣਪ੍ਰਮਾਣਿਤ ਤੀਜੀ-ਧਿਰ ਸਕ੍ਰਿਪਟਾਂ” ਵੀ ਕਿਹਾ ਜਾਂਦਾ ਹੈ) ਨੂੰ ਚਾਲੂ ਕਰੋ।", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/ro/messages.json b/platform/mv3/extension/_locales/ro/messages.json index 8443da5b7b00d..6dd6863b3963a 100644 --- a/platform/mv3/extension/_locales/ro/messages.json +++ b/platform/mv3/extension/_locales/ro/messages.json @@ -36,7 +36,7 @@ "description": "Link to privacy policy on GitHub (English)" }, "aboutDocumentation": { - "message": "Documentation", + "message": "Documentație", "description": "Link to documentation in About pane" }, "popupFilteringModeLabel": { @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Pentru a aplica filtrele cosmetice sau de tip scriptlet din listele importate, trebuie să îi acorzi uBO Lite permisiunea de a rula scripturi de utilizator. Deschide pagina de extensii a browserului tău (chrome://extensions în Chrome sau about:addons în Firefox), deschide detaliile uBO Lite și activează opțiunea Permite scripturile de utilizator (numite și „scripturi de la terți neverificate”).", + "message": "Deschide pagina de extensii a browserului tău (chrome://extensions în Chrome sau about:addons în Firefox), deschide detaliile uBO Lite și activează opțiunea Permite scripturile de utilizator (numite și „scripturi de la terți neverificate”).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/si/messages.json b/platform/mv3/extension/_locales/si/messages.json index 4bda33dd47728..9f33c06fdf743 100644 --- a/platform/mv3/extension/_locales/si/messages.json +++ b/platform/mv3/extension/_locales/si/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "ආයාත කළ ලැයිස්තු වලින් ආලේපන හෝ ස්ක්‍රිප්ට්ලට් පෙරහන් බලාත්මක කිරීම සඳහා, ඔබ uBO Lite වෙත පරිශීලක ස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීමට අවසර දිය යුතුය. ඔබගේ බ්‍රවුසරයේ දිගු පිටුව විවෘත කරන්න (Chrome හි chrome://extensions හෝ Firefox හි about:addons), uBO Lite විස්තර විවෘත කරන්න, සහ පරිශීලක ස්ක්‍රිප්ට් වලට ඉඩ දෙන්න (එය “සත්‍යාපනය නොකළ තෙවන පාර්ශවීය ස්ක්‍රිප්ට්” ලෙසද හැඳින්වේ) සක්‍රිය කරන්න.", + "message": "ඔබගේ බ්‍රවුසරයේ දිගු පිටුව විවෘත කරන්න (Chrome හි chrome://extensions හෝ Firefox හි about:addons), uBO Lite විස්තර විවෘත කරන්න, සහ පරිශීලක ස්ක්‍රිප්ට් වලට ඉඩ දෙන්න (එය “සත්‍යාපනය නොකළ තෙවන පාර්ශවීය ස්ක්‍රිප්ට්” ලෙසද හැඳින්වේ) සක්‍රිය කරන්න.", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/sl/messages.json b/platform/mv3/extension/_locales/sl/messages.json index f6b39ba843664..b97dd3f7d251d 100644 --- a/platform/mv3/extension/_locales/sl/messages.json +++ b/platform/mv3/extension/_locales/sl/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Če želite uveljaviti kozmetične ali skriptletne filtre iz uvoženih seznamov, morate podeliti dovoljenje za izvajanje uporabniških skriptov. Odprite stran z razširitvami v brskalniku (chrome://extensions v Chromu ali about:addons v Firefoxu), odprite podrobnosti za uBO Lite in omogočite Dovoli uporabniške skripte (imenovane tudi “nepreverjene skripte tretjih oseb”).", + "message": "Odprite stran z razširitvami v brskalniku (chrome://extensions v Chromu ali about:addons v Firefoxu), odprite podrobnosti za uBO Lite in omogočite Dovoli uporabniške skripte (imenovane tudi “nepreverjene skripte tretjih oseb”).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/so/messages.json b/platform/mv3/extension/_locales/so/messages.json index c9d4961197d85..df25f9db04036 100644 --- a/platform/mv3/extension/_locales/so/messages.json +++ b/platform/mv3/extension/_locales/so/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Si loo dhaqan geliyo shaandhooyinka qurxinta ama qoraal-yar ee liisaska la soo dejiyay, waa inaad siisaa uBO Lite ogolaansho si ay u waddo qoraallada isticmaalaha. Fur bogga kordhinta biraawsarkaaga (chrome://extensions Chrome ama about:addons Firefox), fur faahfaahinta uBO Lite, oo daawo Oggolow qoraallada isticmaalaha (oo sidoo kale loo yaqaan “qoraallada dhinac-saddexaad ee aan la xaqiijin”).", + "message": "Fur bogga kordhinta biraawsarkaaga (chrome://extensions Chrome ama about:addons Firefox), fur faahfaahinta uBO Lite, oo daawo Oggolow qoraallada isticmaalaha (oo sidoo kale loo yaqaan “qoraallada dhinac-saddexaad ee aan la xaqiijin”).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index 34207fe513195..dc67cbbd0d53d 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Për të zbatuar filtrat kozmetikë ose skriptesh nga listat e importuara, duhet t'i jepni uBO Lite leje për të ekzekutuar skriptet e përdoruesit. Hapni faqen e zgjerimeve të shfletuesit tuaj (chrome://extensions në Chrome ose about:addons në Firefox), hapni detajet e uBO Lite dhe aktivizoni Lejo skriptet e përdoruesit (të referuara edhe si \"skripte të palëve të treta të paverifikuara\").", + "message": "Hapni faqen e zgjerimeve të shfletuesit tuaj (chrome://extensions në Chrome ose about:addons në Firefox), hapni detajet e uBO Lite dhe aktivizoni Lejo skriptet e përdoruesit (të referuara edhe si \"skripte të palëve të treta të paverifikuara\").", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/sw/messages.json b/platform/mv3/extension/_locales/sw/messages.json index c13f98f71d130..86058c8be7054 100644 --- a/platform/mv3/extension/_locales/sw/messages.json +++ b/platform/mv3/extension/_locales/sw/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Ili kutekeleza vichujio vya urembo au scriptlet kutoka kwenye orodha zilizoingizwa, lazima uipe uBO Lite ruhusa ya kuendesha hati za mtumiaji. Fungua ukurasa wa viendelezi vya kivinjari chako (chrome://extensions kwenye Chrome au about:addons kwenye Firefox), fungua maelezo ya uBO Lite, na washa Ruhusu hati za mtumiaji (pia hujulikana kama \"hati zisizoidhinishwa za watu wengine\").", + "message": "Fungua ukurasa wa viendelezi vya kivinjari chako (chrome://extensions kwenye Chrome au about:addons kwenye Firefox), fungua maelezo ya uBO Lite, na washa Ruhusu hati za mtumiaji (pia hujulikana kama \"hati zisizoidhinishwa za watu wengine\").", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/ta/messages.json b/platform/mv3/extension/_locales/ta/messages.json index 21f51c357f1bd..2f3469db9f8fe 100644 --- a/platform/mv3/extension/_locales/ta/messages.json +++ b/platform/mv3/extension/_locales/ta/messages.json @@ -36,7 +36,7 @@ "description": "Link to privacy policy on GitHub (English)" }, "aboutDocumentation": { - "message": "ஆவணங்கள்", + "message": "ஆவணமாக்கல்", "description": "Link to documentation in About pane" }, "popupFilteringModeLabel": { @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "இறக்குமதி செய்யப்பட்ட பட்டியல்களில் இருந்து அழகியல் அல்லது ஸ்கிரிப்ட்லெட் வடிப்பான்களை செயல்படுத்த, நீங்கள் uBO Lite க்கு பயனர் ஸ்கிரிப்ட்களை இயக்க அனுமதி வழங்க வேண்டும். உங்கள் உலாவியின் நீட்டிப்புகள் பக்கத்தைத் திறக்கவும் (Chrome இல் chrome://extensions அல்லது Firefox இல் about:addons), uBO Lite விவரங்களைத் திறக்கவும், மேலும் பயனர் ஸ்கிரிப்ட்களை அனுமதி (இது “சரிபார்க்கப்படாத மூன்றாம் தரப்பு ஸ்கிரிப்ட்கள்” என்றும் குறிப்பிடப்படுகிறது) என்பதை இயக்கவும்.", + "message": "உங்கள் உலாவியின் நீட்டிப்புகள் பக்கத்தைத் திறக்கவும் (Chrome இல் chrome://extensions அல்லது Firefox இல் about:addons), uBO Lite விவரங்களைத் திறக்கவும், மேலும் பயனர் ஸ்கிரிப்ட்களை அனுமதி (இது “சரிபார்க்கப்படாத மூன்றாம் தரப்பு ஸ்கிரிப்ட்கள்” என்றும் குறிப்பிடப்படுகிறது) என்பதை இயக்கவும்.", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/te/messages.json b/platform/mv3/extension/_locales/te/messages.json index e25460e43b7d9..39cce771fae87 100644 --- a/platform/mv3/extension/_locales/te/messages.json +++ b/platform/mv3/extension/_locales/te/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "దిగుమతి చేసిన జాబితాల నుండి కాస్మెటిక్ లేదా స్క్రిప్ట్‌లెట్ ఫిల్టర్లను అమలు చేయడానికి, మీరు uBO Liteకి యూజర్ స్క్రిప్ట్‌లను అమలు చేసే అనుమతిని ఇవ్వాలి. మీ బ్రౌజర్ యొక్క ఎక్స్‌టెన్షన్ పేజీని తెరవండి (chrome://extensions Chromeలో లేదా about:addons Firefoxలో), uBO Lite వివరాలను తెరవండి, మరియు Allow user scripts (లేదా “unverified third-party scripts” అని కూడా పిలుస్తారు) టోగుల్ చేయండి.", + "message": "మీ బ్రౌజర్ యొక్క ఎక్స్‌టెన్షన్ పేజీని తెరవండి (chrome://extensions Chromeలో లేదా about:addons Firefoxలో), uBO Lite వివరాలను తెరవండి, మరియు Allow user scripts (లేదా “unverified third-party scripts” అని కూడా పిలుస్తారు) టోగుల్ చేయండి.", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/tr/messages.json b/platform/mv3/extension/_locales/tr/messages.json index 38309372954d9..af07e5a6b10e7 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "İçeri aktarılmış listelerdeki kozmetik veya kod filtrelerini uygulamak için uBO Lite'a kullanıcı komut dosyalarını çalıştırma izni vermeniz gerekir. İzni vermek için tarayıcınızın uzantılar sayfasını açın (Chrome için:chrome://extensions Firefox için:about:addons), uBO Lite'ın ayrıntılar sayfasına tıklayın ve Kullanıcı komut dosyalarına izin ver seçeneğine tıklayın (\"doğrulanmamış 3. parti komutlar\" olarak da adlandırılabilir).", + "message": "Tarayıcınızın uzantılar sayfasını açın (Chrome için:chrome://extensions Firefox için:about:addons), uBO Lite'ın ayrıntılar sayfasına tıklayın ve Kullanıcı komut dosyalarına izin ver seçeneğine tıklayın (\"doğrulanmamış 3. parti komutlar\" olarak da adlandırılabilir).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index 734343493c1e0..ed56d9250ed02 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Щоб застосувати косметичні фільтри або фільтри на основі скриптів із імпортованих списків, необхідно надати uBO Lite дозвіл на виконання користувацьких скриптів. Відкрийте сторінку розширень у браузері (chrome://extensions у Chrome або about:addons у Firefox), перейдіть до детальної інформації про uBO Lite та увімкніть опцію «Дозволити користувацькі скрипти» (також відомі як «неперевірені сторонні скрипти»).", + "message": "Відкрийте сторінку розширень у браузері (chrome://extensions у Chrome або about:addons у Firefox), перейдіть до детальної інформації про uBO Lite та увімкніть опцію «Дозволити користувацькі скрипти» (також відомі як «неперевірені сторонні скрипти»).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/ur/messages.json b/platform/mv3/extension/_locales/ur/messages.json index 24f0abfed2136..d8918aa838bbf 100644 --- a/platform/mv3/extension/_locales/ur/messages.json +++ b/platform/mv3/extension/_locales/ur/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "درآمد شدہ فہرستوں سے کاسمیٹک یا اسکرپٹلیٹ فلٹرز کو نافذ کرنے کے لیے، آپ کو uBO Lite کو صارف اسکرپٹس چلانے کی اجازت دینی ہوگی۔ اپنے براؤزر کے ایکسٹینشنز پیج (chrome://extensions Chrome میں یا about:addons Firefox میں) کو کھولیں، uBO Lite کی تفصیلات کھولیں، اور Allow user scripts کو آن کریں (جسے “unverified third-party scripts” بھی کہا جاتا ہے)۔", + "message": "اپنے براؤزر کے ایکسٹینشنز پیج (chrome://extensions Chrome میں یا about:addons Firefox میں) کو کھولیں، uBO Lite کی تفصیلات کھولیں، اور Allow user scripts کو آن کریں (جسے “unverified third-party scripts” بھی کہا جاتا ہے)۔", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/vi/messages.json b/platform/mv3/extension/_locales/vi/messages.json index eb111095d31e0..054595963316d 100644 --- a/platform/mv3/extension/_locales/vi/messages.json +++ b/platform/mv3/extension/_locales/vi/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "Để áp dụng các bộ lọc giao diện hoặc tập lệnh từ danh sách đã nhập, bạn phải cấp quyền cho uBO Lite chạy các tập lệnh người dùng. Mở trang tiện ích mở rộng của trình duyệt (chrome://extensions trong Chrome hoặc about:addons trong Firefox), mở chi tiết uBO Lite và bật Cho phép tập lệnh người dùng (còn được gọi là “tập lệnh của bên thứ ba chưa được xác minh”).", + "message": "Mở trang tiện ích mở rộng của trình duyệt (chrome://extensions trong Chrome hoặc about:addons trong Firefox), mở chi tiết uBO Lite và bật Cho phép tập lệnh người dùng (còn được gọi là “tập lệnh của bên thứ ba chưa được xác minh”).", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/platform/mv3/extension/_locales/zh_CN/messages.json b/platform/mv3/extension/_locales/zh_CN/messages.json index 309342e090505..fb8f0b6b5a557 100644 --- a/platform/mv3/extension/_locales/zh_CN/messages.json +++ b/platform/mv3/extension/_locales/zh_CN/messages.json @@ -116,7 +116,7 @@ "description": "Placeholder text which describes the purpose of the textarea widget" }, "userScriptsInfo": { - "message": "要强制执行来自导入列表的元素或脚本过滤规则,您必须授予 uBO Lite 运行用户脚本的权限。打开浏览器的扩展页面(Chrome 中为 chrome://extensions,Firefox 中为 about:addons),打开 uBO Lite 详情,然后开启 允许用户脚本(也称为“未经验证的第三方脚本”)。", + "message": "打开浏览器的扩展页面(Chrome 中为 chrome://extensions,Firefox 中为 about:addons),打开 uBO Lite 详情,然后开启 允许用户脚本(也称为“未经验证的第三方脚本”)。", "description": "A notice to inform user on how to enable 'user scripts' permission" }, "aboutChangelog": { diff --git a/src/_locales/az/messages.json b/src/_locales/az/messages.json index b4cfdc2f6afe3..df1f4e7e7b782 100644 --- a/src/_locales/az/messages.json +++ b/src/_locales/az/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Axır ki, prosessor və yaddaş yükünü azaldan səmərəli bir əngəlləyici var.", + "message": "Nəhayət, səmərəli bloklayıcı. Prosessor və yaddaşı yükləmir.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { @@ -12,15 +12,15 @@ "description": "English: uBlock₀ — Dashboard" }, "dashboardUnsavedWarning": { - "message": "Xəbərdarlıq: dəyişiklikləriniz yadda saxlanılmayıb!", + "message": "Xəbərdarlıq! Saxlamadığınız dəyişikliklər var", "description": "A warning in the dashboard when navigating away from unsaved changes" }, "dashboardUnsavedWarningStay": { - "message": "Qal", + "message": "Burada qal", "description": "Label for button to prevent navigating away from unsaved changes" }, "dashboardUnsavedWarningIgnore": { - "message": "Əhəmiyyət vermə", + "message": "Məhəl qoyma", "description": "Label for button to ignore unsaved changes" }, "settingsPageName": { @@ -48,7 +48,7 @@ "description": "appears as tab name in dashboard" }, "statsPageName": { - "message": "uBlock₀ — Jurnal", + "message": "uBlock₀ — Qeydiyyat jurnalı", "description": "Title for the logger window" }, "aboutPageName": { @@ -60,7 +60,7 @@ "description": "appears as tab name in dashboard" }, "assetViewerPageName": { - "message": "uBlock₀ — Resurslar", + "message": "uBlock₀ — Resurs baxıcısı", "description": "Title for the asset viewer page" }, "advancedSettingsPageName": { @@ -68,19 +68,19 @@ "description": "Title for the advanced settings page" }, "popupPowerSwitchInfo": { - "message": "Klikləmə: Bu sayt üçün uBlock₀-u fəallaşdır/sıradan çıxart.\n\nCtrl+klikləmə: Yalnız bu səhifə üçün uBlock₀-u sıradan çıxart.", + "message": "Klikləmə: uBlock₀-u bu sayt üçün qapadın/aktivləşdirin.\n\n​Ctrl+klikləmə: uBlock₀-u yalnız bu səhifədə qapadın.", "description": "English: Click: disable/enable uBlock₀ for this site.\n\nCtrl+click: disable uBlock₀ only on this page." }, "popupPowerSwitchInfo1": { - "message": "Bu sayt üçün uBlock₀-u sıradan çıxartmaq üçün klikləyin.\n\nYalnız bu səhifə üçün uBlock₀-u sıradan çıxartmaq üçün Ctrl+klikləyin.", + "message": "Bu sayt üçün uBlock₀-u qapatmaq məqsədilə klikləyin.\n\nYalnız bu səhifədə uBlock₀-u qapatmaq məqsədilə Ctrl+klikləyin.", "description": "Message to be read by screen readers" }, "popupPowerSwitchInfo2": { - "message": "Bu saytda uBlock₀-u fəallaşdırmaq üçün klikləyin.", + "message": "Bu sayt üçün uBlock₀-u aktivləşdirmək məqsədilə klikləyin.", "description": "Message to be read by screen readers" }, "popupBlockedRequestPrompt": { - "message": "tələb(request) bloklandı", + "message": "bloklanmış sorğular", "description": "English: requests blocked" }, "popupBlockedOnThisPagePrompt": { @@ -88,11 +88,11 @@ "description": "English: on this page" }, "popupBlockedStats": { - "message": "{{count}} və ya {{percent}}%", + "message": "{{count}} ({{percent}}%)", "description": "Example: 15 (13%)" }, "popupBlockedSinceInstallPrompt": { - "message": "quraşdırmadan bəri", + "message": "quraşdırılandan bəri", "description": "English: since install" }, "popupOr": { @@ -100,15 +100,15 @@ "description": "English: or" }, "popupBlockedOnThisPage_v2": { - "message": "Bu səhifədə əngəllənən", + "message": "Bu səhifədə əngəllənmiş", "description": "For the new mobile-friendly popup design" }, "popupBlockedSinceInstall_v2": { - "message": "Quraşdırmadan bəri əngəllənən", + "message": "Quraşdırılandan bəri bloklanıb", "description": "For the new mobile-friendly popup design" }, "popupDomainsConnected_v2": { - "message": "Bağlantı qurulmuş domenlər", + "message": "Qoşulmuş domenlər", "description": "For the new mobile-friendly popup design" }, "popupTipDashboard": { @@ -116,7 +116,7 @@ "description": "English: Click to open the dashboard" }, "popupTipZapper": { - "message": "Element silmə rejiminə keç", + "message": "Element təmizləyicisi rejiminə keç", "description": "Tooltip for the element-zapper icon in the popup panel" }, "popupTipPicker": { @@ -124,7 +124,7 @@ "description": "English: Enter element picker mode" }, "popupTipLog": { - "message": "Jurnalı aç", + "message": "Qeydiyyat jurnalını aç", "description": "Tooltip used for the logger icon in the panel" }, "popupTipReport": { @@ -132,7 +132,7 @@ "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipNoPopups": { - "message": "Bu sayt üçün bütün açılan pəncələri aç/bağla", + "message": "​Bu sayt üçün bütün açılan pəncərələrin bloklanmasını tənzimlə", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups1": { @@ -340,7 +340,7 @@ "description": "Section for controlling user interface appearance" }, "settingsThemeLabel": { - "message": "Mövzu", + "message": "Tema", "description": "Label for checkbox to enable a custom dark theme" }, "settingsThemeAccent0Label": { @@ -404,7 +404,7 @@ "description": "Section for controlling advanced-user settings" }, "settingsAdvancedSynopsis": { - "message": "Yalnız texniki istifadəçilərə uyğun parametrlər", + "message": "Yalnız təcrübəli istifadəçilər üçün nəzərdə tutulmuş funksiyalar", "description": "Description of section controlling advanced-user settings" }, "settingsAdvancedUserSettings": { @@ -456,7 +456,7 @@ "description": "Describes the purpose of the 'Ignore generic cosmetic filters' feature." }, "3pSuspendUntilListsAreLoaded": { - "message": "Filter siyahıları yüklənənə kimi şəbəkə fəaliyyətini dayandır", + "message": "Filtr siyahıları yüklənənə kimi şəbəkə fəaliyyətini dayandır", "description": "A checkbox in the 'Filter lists' pane" }, "3pListsOfBlockedHostsHeader": { @@ -472,7 +472,7 @@ "description": "Filter lists section name" }, "3pGroupAds": { - "message": "Reklam", + "message": "Reklamlar", "description": "Filter lists section name" }, "3pGroupPrivacy": { @@ -528,7 +528,7 @@ "description": "used as a tooltip for the clock icon beside a list" }, "3pUpdating": { - "message": "Yenilənir...", + "message": "Yenilənir…", "description": "used as a tooltip for the spinner icon beside a list" }, "3pNetworkError": { @@ -908,7 +908,7 @@ "description": "A clickable link in the filter issue reporter section" }, "supportS1H": { - "message": "Dokumentasiya", + "message": "Sənədləşmə", "description": "Header of 'Documentation' section in Support pane" }, "supportS1P1": { @@ -924,7 +924,7 @@ "description": "First paragraph of 'Questions and support' section in Support pane" }, "supportS3H": { - "message": "Filter problemləri / vebsəhifə işləmir", + "message": "Filtr problemləri / veb sayt işləmir", "description": "Header of 'Filter issues' section in Support pane" }, "supportS3P1": { @@ -952,7 +952,7 @@ "description": "Header of 'Troubleshooting Information' section in Support pane" }, "supportS5P1": { - "message": "Aşağıdaki könüllülər sizə probleminizi aradan qaldırmağa çalışırkən faydalı ola biləcək texniki məlumatdır.", + "message": "Aşağıda köməkçilər sizə kömək etmək üçün problemi həll etməyə çalışarkən faydalı ola biləcək texniki məlumatlar verilmişdir.", "description": "First paragraph of 'Troubleshooting Information' section in Support pane" }, "supportS6H": { @@ -976,7 +976,7 @@ "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "Səhifə...", + "message": "Səhifə…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { @@ -1056,7 +1056,7 @@ "description": "Shown in the About pane" }, "aboutBackupDataButton": { - "message": "Fayla yaz", + "message": "Fayla yaz…", "description": "Text for button to create a backup of all settings" }, "aboutBackupFilename": { @@ -1064,11 +1064,11 @@ "description": "English: my-ublock-backup_{{datetime}}.txt" }, "aboutRestoreDataButton": { - "message": "Fayldan bərpa et...", + "message": "Fayldan bərpa et…", "description": "English: Restore from file..." }, "aboutResetDataButton": { - "message": "Standart parametrləri yüklə...", + "message": "Standart parametrləri yüklə…", "description": "English: Reset to default settings..." }, "aboutRestoreDataConfirm": { @@ -1236,11 +1236,11 @@ "description": "" }, "contextMenuBlockElementInFrame": { - "message": "Çərçivədəki elementi əngəllə", + "message": "Çərçivədəki elementi əngəllə…", "description": "An entry in the browser's contextual menu" }, "contextMenuSubscribeToList": { - "message": "Filter siyahısına abunə ol", + "message": "Filter siyahısına abunə ol…", "description": "An entry in the browser's contextual menu" }, "contextMenuTemporarilyAllowLargeMediaElements": { @@ -1248,7 +1248,7 @@ "description": "A context menu entry, present when large media elements have been blocked on the current site" }, "contextMenuViewSource": { - "message": "Mənbə kodunu nəzərdən keçir...", + "message": "Mənbə kodunu nəzərdən keçir…", "description": "A context menu entry, to view the source code of the target resource" }, "shortcutCapturePlaceholder": { diff --git a/src/_locales/hy/messages.json b/src/_locales/hy/messages.json index 1d4369a2d41b0..552935f6ee43b 100644 --- a/src/_locales/hy/messages.json +++ b/src/_locales/hy/messages.json @@ -900,11 +900,11 @@ "description": "Text for button which open an external web page in Support pane" }, "supportReportSpecificButton": { - "message": "Նոր զեկույց ստեղծել", + "message": "Նոր զեկույց ստեղծել GitHub-ում", "description": "Text for button which open an external web page in Support pane" }, "supportFindSpecificButton": { - "message": "Գտնել նման զեկույցներ", + "message": "Գտնել նման զեկույցներ GitHub-ում", "description": "A clickable link in the filter issue reporter section" }, "supportS1H": { diff --git a/src/_locales/it/messages.json b/src/_locales/it/messages.json index f3beb10ea7638..343dada288788 100644 --- a/src/_locales/it/messages.json +++ b/src/_locales/it/messages.json @@ -76,7 +76,7 @@ "description": "Message to be read by screen readers" }, "popupPowerSwitchInfo2": { - "message": "Clicca per abilitare uBlock₀ per questo sito.", + "message": "Fai clic per attivare uBlock₀ per questo sito.", "description": "Message to be read by screen readers" }, "popupBlockedRequestPrompt": { diff --git a/src/_locales/ro/messages.json b/src/_locales/ro/messages.json index 90527d16296f4..fe9359ef8d1a4 100644 --- a/src/_locales/ro/messages.json +++ b/src/_locales/ro/messages.json @@ -40,7 +40,7 @@ "description": "appears as tab name in dashboard" }, "whitelistPageName": { - "message": "Situri de încredere", + "message": "Siteuri de încredere", "description": "appears as tab name in dashboard" }, "shortcutsPageName": { diff --git a/src/_locales/sl/messages.json b/src/_locales/sl/messages.json index 72725eae3e841..4cb1ddf97e564 100644 --- a/src/_locales/sl/messages.json +++ b/src/_locales/sl/messages.json @@ -12,7 +12,7 @@ "description": "English: uBlock₀ — Dashboard" }, "dashboardUnsavedWarning": { - "message": "Pozor! Spremembe niso shranjene.", + "message": "Pozor: spremembe niso shranjene!", "description": "A warning in the dashboard when navigating away from unsaved changes" }, "dashboardUnsavedWarningStay": { @@ -508,7 +508,7 @@ "description": "Filter lists section name" }, "3pImport": { - "message": "Uvozi …", + "message": "Uvozi…", "description": "The label for the checkbox used to import external filter lists" }, "3pExternalListsHint": { @@ -528,7 +528,7 @@ "description": "used as a tooltip for the clock icon beside a list" }, "3pUpdating": { - "message": "Posodabljanje …", + "message": "Posodabljanje…", "description": "used as a tooltip for the spinner icon beside a list" }, "3pNetworkError": { @@ -552,7 +552,7 @@ "description": "Button in the 'My filters' pane" }, "1pExport": { - "message": "Izvozi …", + "message": "Izvozi…", "description": "Button in the 'My filters' pane" }, "1pExportFilename": { @@ -592,11 +592,11 @@ "description": "Will discard manually-edited content and exit manual-edit mode" }, "rulesImport": { - "message": "Uvozi iz datoteke …", + "message": "Uvozi iz datoteke…", "description": "" }, "rulesExport": { - "message": "Izvozi v datoteko …", + "message": "Izvozi v datoteko…", "description": "Button in the 'My rules' pane" }, "rulesDefaultFileName": { @@ -628,7 +628,7 @@ "description": "English: a sort option for list of rules." }, "whitelistPrompt": { - "message": "Vaš seznam gostiteljskih naslovov, za katere želite, da je uBlock₀ izklopljen. En vnos na vrstico. Neveljavna gostiteljska imena bodo brez opozoril ignorirana.", + "message": "Vaš seznam gostiteljskih naslovov, za katere želite, da je uBlock Origin izklopljen. En vnos na vrstico.", "description": "A concise description of the 'Trusted sites' pane." }, "whitelistImport": { @@ -976,7 +976,7 @@ "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "Spletna stran …", + "message": "Spletna stran…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { @@ -1240,7 +1240,7 @@ "description": "An entry in the browser's contextual menu" }, "contextMenuSubscribeToList": { - "message": "Naroči se na seznam filtrov …", + "message": "Naroči se na seznam filtrov…", "description": "An entry in the browser's contextual menu" }, "contextMenuTemporarilyAllowLargeMediaElements": { From a93f94b6ac948c8813a3c2d4fd135693b7f786eb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Sep 2026 17:45:59 -0400 Subject: [PATCH 119/145] Update README.md --- platform/mv3/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/platform/mv3/README.md b/platform/mv3/README.md index 315821d47a7d3..3818a7b380001 100644 --- a/platform/mv3/README.md +++ b/platform/mv3/README.md @@ -9,8 +9,11 @@ The following assumes a linux environment. 3. `cd uBlock` 4. `git submodule init` 5. `git submodule update` -6. `make mv3-[platform]`, where `[platform]` is either `chromium`, `edge`, `firefox`, or `safari` -7. This will fully build uBO Lite, and during the process filter lists will be downloaded from their respective remote servers +6. cd platform/mv3/extension/lib/codemirror/codemirror-ubol/ +7. npm install +8. cd - +9. `make mv3-[platform]`, where `[platform]` is either `chromium`, `edge`, `firefox`, or `safari` +10. This will fully build uBO Lite, and during the process filter lists will be downloaded from their respective remote servers Upon completion of the script, the resulting extension package will become present in: From f826ded4c846806a7ae6bb1acb4537c8881ca76d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Sep 2026 17:46:20 -0400 Subject: [PATCH 120/145] Update README.md --- platform/mv3/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/mv3/README.md b/platform/mv3/README.md index 3818a7b380001..9f5ad1a4f86fe 100644 --- a/platform/mv3/README.md +++ b/platform/mv3/README.md @@ -9,9 +9,9 @@ The following assumes a linux environment. 3. `cd uBlock` 4. `git submodule init` 5. `git submodule update` -6. cd platform/mv3/extension/lib/codemirror/codemirror-ubol/ -7. npm install -8. cd - +6. `cd platform/mv3/extension/lib/codemirror/codemirror-ubol/` +7. `npm install` +8. `cd -` 9. `make mv3-[platform]`, where `[platform]` is either `chromium`, `edge`, `firefox`, or `safari` 10. This will fully build uBO Lite, and during the process filter lists will be downloaded from their respective remote servers From 0cf1a615bb950e512fa693efbbb65a08e3ac8bef Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Sep 2026 17:52:51 -0400 Subject: [PATCH 121/145] Update submodules --- platform/mv3/extension/lib/codemirror/codemirror-ubol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mv3/extension/lib/codemirror/codemirror-ubol b/platform/mv3/extension/lib/codemirror/codemirror-ubol index 30e88029af977..e819cd4af4800 160000 --- a/platform/mv3/extension/lib/codemirror/codemirror-ubol +++ b/platform/mv3/extension/lib/codemirror/codemirror-ubol @@ -1 +1 @@ -Subproject commit 30e88029af97777fc21a8b92044c2634612bddc9 +Subproject commit e819cd4af48006dcdd62a079891a29b92599d98f From 1e14c3e86281c385f0c8e78396ccacc823e9a27d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Sep 2026 18:55:07 -0400 Subject: [PATCH 122/145] Update submodules --- platform/mv3/extension/lib/codemirror/codemirror-ubol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mv3/extension/lib/codemirror/codemirror-ubol b/platform/mv3/extension/lib/codemirror/codemirror-ubol index e819cd4af4800..6a8aa61b29e49 160000 --- a/platform/mv3/extension/lib/codemirror/codemirror-ubol +++ b/platform/mv3/extension/lib/codemirror/codemirror-ubol @@ -1 +1 @@ -Subproject commit e819cd4af48006dcdd62a079891a29b92599d98f +Subproject commit 6a8aa61b29e494ecede6e067ac3782c184a8008b From 2cf4466da8f5b7ffce3b98698568330cdab94ff6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Sep 2026 18:59:24 -0400 Subject: [PATCH 123/145] Update build instructions --- platform/mv3/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/platform/mv3/README.md b/platform/mv3/README.md index 9f5ad1a4f86fe..7b2adb5a2cb6e 100644 --- a/platform/mv3/README.md +++ b/platform/mv3/README.md @@ -9,9 +9,6 @@ The following assumes a linux environment. 3. `cd uBlock` 4. `git submodule init` 5. `git submodule update` -6. `cd platform/mv3/extension/lib/codemirror/codemirror-ubol/` -7. `npm install` -8. `cd -` 9. `make mv3-[platform]`, where `[platform]` is either `chromium`, `edge`, `firefox`, or `safari` 10. This will fully build uBO Lite, and during the process filter lists will be downloaded from their respective remote servers From 12101e8fc7117ffb563386f0c63b40a3168503cc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 8 Sep 2026 19:20:58 -0400 Subject: [PATCH 124/145] Improve `prevent-clipboard-write` scriptlet --- src/js/resources/prevent-clipboard-write.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/js/resources/prevent-clipboard-write.js b/src/js/resources/prevent-clipboard-write.js index a95308fe9e7c1..917ed6b3cc109 100644 --- a/src/js/resources/prevent-clipboard-write.js +++ b/src/js/resources/prevent-clipboard-write.js @@ -21,6 +21,7 @@ import { proxyApplyFn } from './proxy-apply.js'; import { registerScriptlet } from './base.js'; +import { runAt } from './run-at.js'; import { safeSelf } from './safe-self.js'; /******************************************************************************/ @@ -129,16 +130,19 @@ function preventClipboardWrite(matches = '', ...varargs) { return context.reflect(); }, { skipToString: true }); }; - self.addEventListener('mousedown', installTraps, { - once: true, - capture: true, - }); + runAt(( ) => { + self.document.addEventListener('mousemove', installTraps, { + once: true, + capture: true, + }); + }, 'interactive') } registerScriptlet(preventClipboardWrite, { name: 'prevent-clipboard-write.js', requiresTrust: true, dependencies: [ proxyApplyFn, + runAt, safeSelf, ], }); From b603d0145600b0b0a01c336d277026501329955d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 8 Sep 2026 19:22:17 -0400 Subject: [PATCH 125/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 62c5b1547964c..97daf448ec3df 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.74.1.4 \ No newline at end of file +1.74.1.5 \ No newline at end of file From 5af5b5ae85273bc6bb5edeaa926f5f8d7196539a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 8 Sep 2026 19:25:27 -0400 Subject: [PATCH 126/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index af2aac14e8367..34e90d1452398 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From b2ae500fc138129d212316c9c1d7ec0682c943a7 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 8 Sep 2026 21:40:32 -0400 Subject: [PATCH 127/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 4cb486f513b1b..2388343f971f0 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.74.1.4", + "version": "1.74.1.5", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.74.1b4/uBlock0_1.74.1b4.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.74.1b5/uBlock0_1.74.1b5.firefox.signed.xpi" } ] } From c43d487f5c3ebeb9a174fa6d3c9839e7965a0d3b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 10 Sep 2026 09:25:03 -0400 Subject: [PATCH 128/145] Improve `prevent-clipboard-write` scriptlet --- src/js/resources/prevent-clipboard-write.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/js/resources/prevent-clipboard-write.js b/src/js/resources/prevent-clipboard-write.js index 917ed6b3cc109..83dcb3ed60cb9 100644 --- a/src/js/resources/prevent-clipboard-write.js +++ b/src/js/resources/prevent-clipboard-write.js @@ -57,8 +57,8 @@ function preventClipboardWrite(matches = '', ...varargs) { safe.initPattern(extraArgs.excludeMatches); const htmlTemplate = [ '
', - '${warning}\n', - '', + '${warning}\n', + '', '
', ].join(''); const domAlert = clipboardText => { @@ -75,6 +75,7 @@ function preventClipboardWrite(matches = '', ...varargs) { 'max-height: 8em', 'overflow: auto', 'padding: 0.25em', + 'user-select: all', 'width: 100%;', 'word-break: break-all' ]; From 87d21ff0cc64856dabcf5b94ca895176ce19e417 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 11 Sep 2026 08:14:42 -0400 Subject: [PATCH 129/145] Improve `prevent-clipboard-write` scriptlet --- src/js/resources/prevent-clipboard-write.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/resources/prevent-clipboard-write.js b/src/js/resources/prevent-clipboard-write.js index 83dcb3ed60cb9..d5064a3b63439 100644 --- a/src/js/resources/prevent-clipboard-write.js +++ b/src/js/resources/prevent-clipboard-write.js @@ -57,8 +57,8 @@ function preventClipboardWrite(matches = '', ...varargs) { safe.initPattern(extraArgs.excludeMatches); const htmlTemplate = [ '
', - '${warning}\n', - '', + '${warning}\n', + '', '
', ].join(''); const domAlert = clipboardText => { From bd98bcace0e93eccddfc7a89ccf18e74547992ff Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 11 Sep 2026 08:40:41 -0400 Subject: [PATCH 130/145] Improve `remove-attr` scriptlet --- src/js/resources/attribute.js | 105 ++++++++++++++++++++-------------- 1 file changed, 63 insertions(+), 42 deletions(-) diff --git a/src/js/resources/attribute.js b/src/js/resources/attribute.js index 47f65c08d3efe..82fb4bd990620 100644 --- a/src/js/resources/attribute.js +++ b/src/js/resources/attribute.js @@ -218,72 +218,81 @@ registerScriptlet(trustedSetAttr, { * * @param [behavior] * Optional. Space-separated tokens which modify the default behavior. - * - `asap`: Try to remove the attribute as soon as possible. Default behavior - * is to remove the attribute(s) asynchronously. * - `stay`: Keep trying to remove the specified attribute(s) on DOM mutations. + * + * @params [...varargs] + * Optional, any of following pairs of parameters: + * - `quitAfter, sec`: where `sec` is the number of seconds after which the + * scriptlet ceases to be active. This has precedence over `stay` behavior. * */ export function removeAttr( rawToken = '', rawSelector = '', - behavior = '' + behavior = '', + ...varargs ) { if ( typeof rawToken !== 'string' ) { return; } if ( rawToken === '' ) { return; } const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('remove-attr', rawToken, rawSelector, behavior); + const logPrefix = safe.makeLogPrefix('remove-attr', + rawToken, rawSelector, behavior, ...varargs + ); const tokens = safe.String_split.call(rawToken, /\s*\|\s*/); - const selector = tokens - .map(a => `${rawSelector}[${CSS.escape(a)}]`) - .join(','); + const selector = tokens.map(a => { + const b = CSS.escape(a); + return rawSelector.includes(`[${b}]`) ? rawSelector : `${rawSelector}[${b}]`; + }).join(','); + const lazily = /\basap\b/.test(behavior) === false; + const options = safe.parseVarargs(varargs); if ( safe.logLevel > 1 ) { safe.uboLog(logPrefix, `Target selector:\n\t${selector}`); } - const asap = /\basap\b/.test(behavior); - let timerId; - const rmattrAsync = ( ) => { - if ( timerId !== undefined ) { return; } - timerId = onIdleFn(( ) => { - timerId = undefined; - rmattr(); - }, { timeout: 17 }); - }; - const rmattr = ( ) => { - if ( timerId !== undefined ) { - offIdleFn(timerId); - timerId = undefined; + const rmattrFromNode = node => { + for ( const attr of tokens ) { + if ( node.hasAttribute(attr) === false ) { continue; } + node.removeAttribute(attr); + safe.uboLog(logPrefix, `Removed attribute '${attr}'`); } - try { - const nodes = document.querySelectorAll(selector); - for ( const node of nodes ) { - for ( const attr of tokens ) { - if ( node.hasAttribute(attr) === false ) { continue; } - node.removeAttribute(attr); - safe.uboLog(logPrefix, `Removed attribute '${attr}'`); - } - } - } catch { + }; + const rmattr = nodes => { + for ( const node of nodes ?? document.querySelectorAll(selector) ) { + rmattrFromNode(node); } }; + const rmAttrLazily = ( ) => { + if ( rmAttrLazily.timer !== undefined ) { return; } + rmAttrLazily.timer = onIdleFn(( ) => { + rmAttrLazily.timer = undefined; + rmattr(); + }, { timeout: 17 }); + }; const mutationHandler = mutations => { - if ( timerId !== undefined ) { return; } - let skip = true; - for ( let i = 0; i < mutations.length && skip; i++ ) { - const { type, addedNodes, removedNodes } = mutations[i]; - if ( type === 'attributes' ) { skip = false; } - for ( let j = 0; j < addedNodes.length && skip; j++ ) { - if ( addedNodes[j].nodeType === 1 ) { skip = false; break; } + for ( const { addedNodes, removedNodes } of mutations ) { + for ( const node of addedNodes ) { + if ( node.nodeType !== 1 ) { continue; } + if ( lazily ) { return rmAttrLazily(); } + if ( node.matches(selector) ) { + rmattrFromNode(node); + } + if ( node.childElementCount ) { + rmattr(node.querySelectorAll(selector)); + } } - for ( let j = 0; j < removedNodes.length && skip; j++ ) { - if ( removedNodes[j].nodeType === 1 ) { skip = false; break; } + if ( lazily ) { return; } + for ( const node of removedNodes ) { + if ( node.nodeType !== 1 ) { continue; } + if ( node.matches(selector) ) { + rmattrFromNode(node); + } } } - if ( skip ) { return; } - asap ? rmattr() : rmattrAsync(); }; const start = ( ) => { rmattr(); - if ( /\bstay\b/.test(behavior) === false ) { return; } + if ( /\bstay\b/.test(behavior) === false ) { + if ( options.quitAfter === undefined ) { return; } + } const observer = new MutationObserver(mutationHandler); observer.observe(document, { attributes: true, @@ -291,6 +300,18 @@ export function removeAttr( childList: true, subtree: true, }); + if ( options.quitAfter ) { + self.setTimeout(( ) => { + observer.disconnect(); + if ( rmAttrLazily.timer ) { + offIdleFn(rmAttrLazily.timer); + rmAttrLazily.timer = undefined; + } + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, 'Quitting'); + } + }, options.quitAfter * 1000); + } }; runAt(( ) => { start(); }, safe.String_split.call(behavior, /\s+/)); } From 381a3d927586a7b7b6a038a979abd828d83e47c2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 11 Sep 2026 08:42:52 -0400 Subject: [PATCH 131/145] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95d0b0ded0ec0..a2847a9609077 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `remove-attr` scriptlet](https://github.com/gorhill/uBlock/commit/bd98bcace0) - [Fix parsing of invalid regex-like domain in static extended filters](https://github.com/gorhill/uBlock/commit/bfbd7f609e) - [Improve `remove-node-text`/`replace-node-text` scriptlets](https://github.com/gorhill/uBlock/commit/71faa0b23f) - [Improve `prevent-clipboard-write` scriptlet](https://github.com/gorhill/uBlock/commit/457c510093) From 7d75bc0eef7a7b6dafacdddb851a065d6dab7c77 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 11 Sep 2026 08:43:13 -0400 Subject: [PATCH 132/145] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 97daf448ec3df..452c76fe220e9 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.74.1.5 \ No newline at end of file +1.74.1.6 \ No newline at end of file From 73069d91cd3fbcaf729e50c62d5352e59e8c0185 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 11 Sep 2026 08:50:46 -0400 Subject: [PATCH 133/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index 34e90d1452398..262bebe46f308 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From 3a6160d25c82cd66da9d23166f691b79801b8b50 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 12 Sep 2026 08:59:59 -0400 Subject: [PATCH 134/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index 262bebe46f308..34e90d1452398 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From e4ae99b6024273c0b9a46ffde87106b55fef2129 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 12 Sep 2026 09:00:06 -0400 Subject: [PATCH 135/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index 34e90d1452398..af2aac14e8367 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From 1b1c20ba7acbe2fe049ba5dbaa4ded155c2a2e38 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 12 Sep 2026 09:04:03 -0400 Subject: [PATCH 136/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index af2aac14e8367..262bebe46f308 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From 1d5f797c03f2f523e90bc3f2883fecbd5104763c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 12 Sep 2026 10:09:10 -0400 Subject: [PATCH 137/145] Improve `remove-attr` scriptlet --- src/js/resources/attribute.js | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/js/resources/attribute.js b/src/js/resources/attribute.js index 82fb4bd990620..b7052790fc4f5 100644 --- a/src/js/resources/attribute.js +++ b/src/js/resources/attribute.js @@ -288,29 +288,35 @@ export function removeAttr( } } }; + const stop = ( ) => { + if ( start.observer ) { + start.observer.disconnect(); + start.observer = undefined; + } + if ( rmAttrLazily.timer ) { + offIdleFn(rmAttrLazily.timer); + rmAttrLazily.timer = undefined; + } + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, 'Quitting'); + } + }; const start = ( ) => { rmattr(); if ( /\bstay\b/.test(behavior) === false ) { if ( options.quitAfter === undefined ) { return; } } - const observer = new MutationObserver(mutationHandler); - observer.observe(document, { + start.observer = new MutationObserver(mutationHandler); + start.observer.observe(document, { attributes: true, attributeFilter: tokens, childList: true, subtree: true, }); if ( options.quitAfter ) { - self.setTimeout(( ) => { - observer.disconnect(); - if ( rmAttrLazily.timer ) { - offIdleFn(rmAttrLazily.timer); - rmAttrLazily.timer = undefined; - } - if ( safe.logLevel > 1 ) { - safe.uboLog(logPrefix, 'Quitting'); - } - }, options.quitAfter * 1000); + runAt(( ) => { + self.setTimeout(stop, options.quitAfter * 1000); + }, 'load'); } }; runAt(( ) => { start(); }, safe.String_split.call(behavior, /\s+/)); From 7845ccde2967e4cac17d2d6a3d880c8ea50130d3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 14 Sep 2026 08:57:48 -0400 Subject: [PATCH 138/145] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.lv.txt | 4 ++-- .../mv3/extension/_locales/lv/messages.json | 6 ++--- .../mv3/extension/_locales/vi/messages.json | 4 ++-- src/_locales/lv/messages.json | 6 ++--- src/_locales/vi/messages.json | 24 +++++++++---------- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/platform/mv3/description/webstore.lv.txt b/platform/mv3/description/webstore.lv.txt index 129af3d1bbb85..ad3abd241cc5c 100644 --- a/platform/mv3/description/webstore.lv.txt +++ b/platform/mv3/description/webstore.lv.txt @@ -1,6 +1,6 @@ uBO Lite (uBOL) — uz MV3 balstīts satura aizturētājs. -Noklusējuma nosacījumu kopa atbilst uBock Origin noklusējuma aizturēšanas kopai: +Noklusējuma nosacījumu kopa atbilst uBock Origin noklusējuma atsijāšanas kopai: - uBlock Origin iebūvētie aizturēšanas saraksti - EasyList @@ -9,4 +9,4 @@ Noklusējuma nosacījumu kopa atbilst uBock Origin noklusējuma aizturēšanas k Vairāk nosacījumu kopu var iespējot iestatījumu sadaļā -- jāklikšķina _Zobratu_ ikona uznirstošajā logā. -uBOL ir pilnībā vispārīgs, kas nozīmē, ka nav nepieciešamības pēc pastāvīga uBOL procesa, lai notiktu aizturēšana, un uz CSS/JS ievietošanu balstīta satura aizturēšanu uzticami veic pārlūks, nevis paplašinājums. Tas nozīmē, ka uBOL pats par sevi neizmanto procesoru un atmiņu, kamēr satura aizturēšana ir notiekoša -- uBOL pakalpojuma strādņa process ir nepieciešams _tikai_ tad, kad notiek mijiedarbība ar uznirstošo logu vai iestatījumu sadaļām. +uBOL ir pilnībā vispārīgs, kas nozīmē, ka nav nepieciešamības pēc pastāvīga uBOL procesa, lai notiktu atsijāšana, un uz CSS/JS ievietošanu balstīta satura aizturēšanu uzticami veic pārlūks, nevis paplašinājums. Tas nozīmē, ka uBOL pats par sevi neizmanto procesoru un atmiņu, kamēr satura aizturēšana ir notiekoša — uBOL pakalpojuma strādņa process ir nepieciešams _tikai_ tad, kad notiek mijiedarbība ar uznirstošo logu vai iestatījumu sadaļām. diff --git a/platform/mv3/extension/_locales/lv/messages.json b/platform/mv3/extension/_locales/lv/messages.json index 66b96d7d27f35..a0bdaa280ac45 100644 --- a/platform/mv3/extension/_locales/lv/messages.json +++ b/platform/mv3/extension/_locales/lv/messages.json @@ -92,15 +92,15 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupImported": { - "message": "Imported lists", + "message": "Ievietotie saraksti", "description": "Header for a ruleset section in 'Filter lists pane'" }, "customListImportLabel": { - "message": "Add filter list…", + "message": "Pievienot atsijāšanas sarakstu…", "description": "Text label heading the import area of custom filter lists" }, "customListImportPlaceholder": { - "message": "URL of the filter list to add", + "message": "Pievienojamā atsijāšanas saraksta URL", "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { diff --git a/platform/mv3/extension/_locales/vi/messages.json b/platform/mv3/extension/_locales/vi/messages.json index 054595963316d..a0e801f6b5560 100644 --- a/platform/mv3/extension/_locales/vi/messages.json +++ b/platform/mv3/extension/_locales/vi/messages.json @@ -160,11 +160,11 @@ "description": "Label of 'Troubleshooting information' section in 'Report a filter issue' page" }, "supportS6P1S1": { - "message": "Để tránh tạo thêm gánh nặng cho các tình nguyện viên hai báo cáo tương tự, hãy chắc chắn rằng chưa từng có vấn đề tương tự được báo cáo. Lưu ý: bấm vào nút này sẽ khiến nguồn của trang web bị gửi tới Github.", + "message": "Để tránh tạo thêm gánh nặng trùng báo cáo cho tình nguyện viên, hãy chắc chắn rằng vấn đề tương tự chưa được báo cáo. Lưu ý: bấm vào nút này sẽ gửi nguồn của trang web đến GitHub.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Tìm các báo cáo tương tự trên Github", + "message": "Tìm báo cáo tương tự trên GitHub", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { diff --git a/src/_locales/lv/messages.json b/src/_locales/lv/messages.json index 716365db27385..e1427a53d6ae9 100644 --- a/src/_locales/lv/messages.json +++ b/src/_locales/lv/messages.json @@ -64,7 +64,7 @@ "description": "Title for the asset viewer page" }, "advancedSettingsPageName": { - "message": "Papildu iestatījumi", + "message": "Izvērstie iestatījumi", "description": "Title for the advanced settings page" }, "popupPowerSwitchInfo": { @@ -72,7 +72,7 @@ "description": "English: Click: disable/enable uBlock₀ for this site.\n\nCtrl+click: disable uBlock₀ only on this page." }, "popupPowerSwitchInfo1": { - "message": "Noklikšķināt, lai atslēgtu uBlock₀ šajā vietnē.\n\nCtrl + klikšķis, lai atslēgtu uBlock₀ tikai šajā lapā.", + "message": "Noklikšķināt, lai atspējotu uBlock₀ šajā vietnē.\n\nCtrl + klikšķis, lai atspējotu uBlock₀ tikai šajā lapā.", "description": "Message to be read by screen readers" }, "popupPowerSwitchInfo2": { @@ -104,7 +104,7 @@ "description": "For the new mobile-friendly popup design" }, "popupBlockedSinceInstall_v2": { - "message": "Pavisam aizturētas", + "message": "Pavisam aizturētas kopš uzstādīšanas", "description": "For the new mobile-friendly popup design" }, "popupDomainsConnected_v2": { diff --git a/src/_locales/vi/messages.json b/src/_locales/vi/messages.json index 9b09b9f0f1794..0aae824776633 100644 --- a/src/_locales/vi/messages.json +++ b/src/_locales/vi/messages.json @@ -104,7 +104,7 @@ "description": "For the new mobile-friendly popup design" }, "popupBlockedSinceInstall_v2": { - "message": "Đã bị chặn kể từ khi cài đặt", + "message": "Đã chặn từ khi cài đặt", "description": "For the new mobile-friendly popup design" }, "popupDomainsConnected_v2": { @@ -152,7 +152,7 @@ "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia2": { - "message": "Bấm để ngừng chặn các phần tử đa phương tiện kích thước lớn trên trang này", + "message": "Bấm để ngừng chặn các phần tử đa phương tiện nặng trên trang này", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoCosmeticFiltering": { @@ -352,7 +352,7 @@ "description": "" }, "settingsAdvancedUserPrompt": { - "message": "Tôi là một người dùng có kinh nghiệm (Yêu cầu đọc qua)", + "message": "Tôi là một người dùng có kinh nghiệm", "description": "Checkbox to let user access advanced, technical features" }, "settingsPrefetchingDisabledPrompt": { @@ -452,7 +452,7 @@ "description": "This will cause uBO to ignore all generic cosmetic filters." }, "3pIgnoreGenericCosmeticFiltersInfo": { - "message": "Bộ lọc phần tử chung là những bộ lọc phần tử được áp dụng cho cho mọi trang web. Kích hoạt tùy chọn này sẽ giảm bớt sức nặng lên cpu và bộ nhớ do không còn phải xử lí các bộ lọc phần tử chung.\n\nTùy chọn này được khuyến nghị kích hoạt trên thiết bị cấu hình thấp.", + "message": "Bộ lọc phần tử chung là những bộ lọc phần tử áp dụng trên mọi trang web. Kích hoạt tùy chọn này để giảm bớt sức nặng lên CPU và bộ nhớ do không còn phải xử lí các bộ lọc phần tử chung.\n\nNên kích hoạt tùy chọn này trên thiết bị cấu hình thấp.", "description": "Describes the purpose of the 'Ignore generic cosmetic filters' feature." }, "3pSuspendUntilListsAreLoaded": { @@ -512,7 +512,7 @@ "description": "The label for the checkbox used to import external filter lists" }, "3pExternalListsHint": { - "message": "Một URL mỗi dòng. URL không hợp lệ sẽ âm thầm bỏ qua.", + "message": "Một URL trên dòng. URL không hợp lệ sẽ âm thầm bỏ qua.", "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { @@ -524,7 +524,7 @@ "description": "used as a tooltip for eye icon beside a list" }, "3pLastUpdate": { - "message": "Cập nhật lần cuối: {{ago}}.\nBấm để buộc cập nhật.", + "message": "Cập nhật lần cuối: {{ago}}.\nNhấn để cập nhật ngay.", "description": "used as a tooltip for the clock icon beside a list" }, "3pUpdating": { @@ -628,7 +628,7 @@ "description": "English: a sort option for list of rules." }, "whitelistPrompt": { - "message": "Các đường dẫn trang web đáng tin cậy cố định mà uBlock Origin sẽ bị vô hiệu hóa trên trang đó. Một mục nhập cho mỗi dòng.", + "message": "Các đường dẫn trang web đáng tin cậy cố định vô hiệu hóa uBlock Origin. Một mục trên dòng.", "description": "A concise description of the 'Trusted sites' pane." }, "whitelistImport": { @@ -688,7 +688,7 @@ "description": "Tooltip for the popup panel button in the logger page" }, "loggerInfoTip": { - "message": "uBlock Origin wiki: Các logger", + "message": "uBlock Origin wiki: Các nhật ký", "description": "Tooltip for the top-right info label in the logger page" }, "loggerClearTip": { @@ -732,7 +732,7 @@ "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltinModified": { - "message": "đã sửa đổi", + "message": "sửa đổi", "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltin1p": { @@ -892,7 +892,7 @@ "description": "Label for radio-button to pick export text format" }, "loggerExportEncodeMarkdown": { - "message": "Đánh dấu", + "message": "Markdown", "description": "Label for radio-button to pick export text format" }, "supportOpenButton": { @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Đánh dấu \"NFSW\" - Not Safe For Work cho trang web.( Tìm hiểu về \"Not Safe For Work\")", + "message": "Đánh dấu trang web là \"NSFW\" (\"Not Safe For Work\", \"Không xem nơi đông người\")", "description": "A checkbox to use for NSFW sites" }, "aboutPrivacyPolicy": { @@ -1064,7 +1064,7 @@ "description": "English: my-ublock-backup_{{datetime}}.txt" }, "aboutRestoreDataButton": { - "message": "Khôi phục từ tệp tin…", + "message": "Khôi phục từ tệp…", "description": "English: Restore from file..." }, "aboutResetDataButton": { From 506ba30561485c4c0c5b1309e0b7bf39d4b2497d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 14 Sep 2026 10:31:35 -0400 Subject: [PATCH 139/145] Fix regression in list lookup feature in logger Related feedback: https://github.com/uBlockOrigin/uBlock-issues/discussions/4120 Related commit: https://github.com/gorhill/uBlock/commit/3ab731942e --- src/js/reverselookup.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/js/reverselookup.js b/src/js/reverselookup.js index c5bf10061fa80..1c4d83625d4dc 100644 --- a/src/js/reverselookup.js +++ b/src/js/reverselookup.js @@ -128,6 +128,7 @@ const fromNetFilter = async function(rawFilter) { trustedSource: true, maxTokenLength: staticNetFilteringEngine.MAX_TOKEN_LENGTH, nativeCssHas: vAPI.webextFlavor.env.includes('native_css_has'), + canFilterResponseBody: µb.canFilterResponseData, }); parser.parse(rawFilter); @@ -165,6 +166,7 @@ const fromExtendedFilter = async function(details) { const parser = new sfp.AstFilterParser({ trustedSource: true, nativeCssHas: vAPI.webextFlavor.env.includes('native_css_has'), + canFilterResponseBody: µb.canFilterResponseData, }); parser.parse(details.rawFilter); let needle; From ace294345289fae6e71a66b8c9d68e8bdc52b093 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 14 Sep 2026 10:33:42 -0400 Subject: [PATCH 140/145] new revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 452c76fe220e9..db9ab9549e81f 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.74.1.6 \ No newline at end of file +1.74.1.7 \ No newline at end of file From 9621a5c2d13ee3d3db8cc38bfe28790c13207b1f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 14 Sep 2026 10:58:28 -0400 Subject: [PATCH 141/145] Make Chromium dev build auto-update --- dist/chromium/update-dev.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update-dev.xml b/dist/chromium/update-dev.xml index 262bebe46f308..69ecab8999218 100644 --- a/dist/chromium/update-dev.xml +++ b/dist/chromium/update-dev.xml @@ -1,6 +1,6 @@ - + From 641586c81c554aa3216960f5a197bd123281d666 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 14 Sep 2026 11:02:13 -0400 Subject: [PATCH 142/145] Make Firefox dev build auto-update --- dist/firefox/updates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/firefox/updates.json b/dist/firefox/updates.json index 2388343f971f0..82f50dabc23a8 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,13 +3,13 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.74.1.5", + "version": "1.74.1.7", "browser_specific_settings": { "gecko": { "strict_min_version": "115.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.74.1b5/uBlock0_1.74.1b5.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.74.1b7/uBlock0_1.74.1b7.firefox.signed.xpi" } ] } From 3f60861bb754a5033bd7ff7f4a2e9119469d60d1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 16 Sep 2026 09:35:25 -0400 Subject: [PATCH 143/145] New version for stable release --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index db9ab9549e81f..5c8c298b55e50 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.74.1.7 \ No newline at end of file +1.75.0 \ No newline at end of file From 21f0e686506bb21b514b451c8c6cb9bf8c82d232 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 16 Sep 2026 09:41:29 -0400 Subject: [PATCH 144/145] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/extension/_locales/uk/messages.json | 2 +- platform/mv3/extension/_locales/vi/messages.json | 2 +- src/_locales/vi/messages.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index ed56d9250ed02..5dcbc42a87e6d 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -100,7 +100,7 @@ "description": "Text label heading the import area of custom filter lists" }, "customListImportPlaceholder": { - "message": "Вставте сюди URL-адресу списку фільтрів, який потрібно додати", + "message": "URL-адреса списку фільтрів, який потрібно додати", "description": "Placeholder text which describes the purpose of the textarea widget" }, "customListImportUserScriptsInfo": { diff --git a/platform/mv3/extension/_locales/vi/messages.json b/platform/mv3/extension/_locales/vi/messages.json index a0e801f6b5560..ef23b96375dba 100644 --- a/platform/mv3/extension/_locales/vi/messages.json +++ b/platform/mv3/extension/_locales/vi/messages.json @@ -356,7 +356,7 @@ "description": "A button to navigate to the blocked page" }, "zapperTipEnter": { - "message": "Chuyển sang chế độ chặn phần tử tạm thời", + "message": "Xóa một phần tử", "description": "Tooltip for the button used to enter zapper mode" }, "zapperTipQuit": { diff --git a/src/_locales/vi/messages.json b/src/_locales/vi/messages.json index 0aae824776633..6137b30a96315 100644 --- a/src/_locales/vi/messages.json +++ b/src/_locales/vi/messages.json @@ -904,7 +904,7 @@ "description": "Text for button which open an external web page in Support pane" }, "supportFindSpecificButton": { - "message": "Tìm các báo cáo tương tự trên Github", + "message": "Tìm báo cáo tương tự trên GitHub", "description": "A clickable link in the filter issue reporter section" }, "supportS1H": { From cf2f2076224003ae2baa8e80149969be7c2f30e3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 16 Sep 2026 10:21:08 -0400 Subject: [PATCH 145/145] Make Chromium build auto-update --- dist/chromium/update.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/chromium/update.xml b/dist/chromium/update.xml index ac29fcf913463..4b659794fa793 100644 --- a/dist/chromium/update.xml +++ b/dist/chromium/update.xml @@ -1,6 +1,6 @@ - +