From d5208ee5dd5fe56eba55f45402b231841236fed5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 7 Jun 2024 08:52:30 -0400 Subject: [PATCH 001/553] Add `isodate` as available placeholder for auto-comment Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3265 --- src/js/storage.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/js/storage.js b/src/js/storage.js index dfd9695c3218f..b26ff00c6462c 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -607,6 +607,7 @@ onBroadcast(msg => { const url = new URL(options.docURL); comment = '! ' + this.hiddenSettings.autoCommentFilterTemplate + .replace('{{isodate}}', d.toISOString().split('T')[0]) .replace('{{date}}', d.toLocaleDateString(undefined, { dateStyle: 'medium' })) .replace('{{time}}', d.toLocaleTimeString()) .replace('{{hostname}}', url.hostname) From 59b158217bd4b5779514a2b8d85484adca044074 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 7 Jun 2024 08:54:25 -0400 Subject: [PATCH 002/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7d8d3d6ba7b6..46c32f0d032fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add isodate as available placeholder for auto-comment](https://github.com/gorhill/uBlock/commit/d5208ee5dd) - [Improve `trusted-replace-outbound-text` scriptlet](https://github.com/gorhill/uBlock/commit/fa6740a059) - [Classify generic cosmetic filters with comma as highly generic](https://github.com/gorhill/uBlock/commit/8f81833efc) - [Raise max buffer size for response body filtering](https://github.com/gorhill/uBlock/commit/82a3992896) From f10a17a6dc329bd6c2e4722a7e7f0f6f1a178dee Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 7 Jun 2024 08:55:03 -0400 Subject: [PATCH 003/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 33894b4bb88e9..1aa4c8a329030 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.3 \ No newline at end of file +1.58.1.4 \ No newline at end of file From 79c2eec802508958e8b499490c3efd351f6c20a3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 7 Jun 2024 09:05:45 -0400 Subject: [PATCH 004/553] 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 66ccea57e3567..02f54020d1c66 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.3", + "version": "1.58.1.4", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b3/uBlock0_1.58.1b3.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b4/uBlock0_1.58.1b4.firefox.signed.xpi" } ] } From 91ee5bdeae6981cc20038b6610ab5c16b58623cf Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 11 Jun 2024 07:44:43 -0400 Subject: [PATCH 005/553] Improve `prevent-addEventListener` scriptlet Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3061#issuecomment-2159662039 --- assets/resources/scriptlets.js | 2 ++ platform/mv3/extension/_locales/zh_CN/messages.json | 2 +- src/_locales/be/messages.json | 2 +- src/_locales/eu/messages.json | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 54adfb623376a..da232b70affd1 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -1642,6 +1642,8 @@ function addEventListenerDefuser( const debug = shouldDebug(extraArgs); const targetSelector = extraArgs.elements || undefined; const elementMatches = elem => { + if ( targetSelector === 'window' ) { return elem === window; } + if ( targetSelector === 'document' ) { return elem === document; } if ( elem && elem.matches && elem.matches(targetSelector) ) { return true; } const elems = Array.from(document.querySelectorAll(targetSelector)); return elems.includes(elem); diff --git a/platform/mv3/extension/_locales/zh_CN/messages.json b/platform/mv3/extension/_locales/zh_CN/messages.json index ffbbf9c03badb..9195970cb1b11 100644 --- a/platform/mv3/extension/_locales/zh_CN/messages.json +++ b/platform/mv3/extension/_locales/zh_CN/messages.json @@ -156,7 +156,7 @@ "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { - "message": "在工具栏图标上显示已拦截的请求数", + "message": "在工具栏图标上显示拦截请求数", "description": "Label for a checkbox in the options page" } } diff --git a/src/_locales/be/messages.json b/src/_locales/be/messages.json index bb7a458505742..ca1ee35bc364d 100644 --- a/src/_locales/be/messages.json +++ b/src/_locales/be/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Нарэшце, эфектыўны блакіроўшчык. Не нагружае працэсар і памяць.", + "message": "Нарэшце, эфектыўны блакавальнік. Не нагружае працэсар і памяць.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { diff --git a/src/_locales/eu/messages.json b/src/_locales/eu/messages.json index b87b777e765fc..5cf4565fbe69f 100644 --- a/src/_locales/eu/messages.json +++ b/src/_locales/eu/messages.json @@ -540,7 +540,7 @@ "description": "Warning against copy-pasting filters from random sources" }, "1pEnableMyFiltersLabel": { - "message": "Enable my custom filters", + "message": "Aktibatu nire filtro pertsonalitsatuak", "description": "Label for the checkbox use to enable/disable 'My filters' list" }, "1pTrustMyFiltersLabel": { From b24793bc02e9ff9c3656fb389fcf1388ad591fc1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 11 Jun 2024 07:47:26 -0400 Subject: [PATCH 006/553] Import translation work from Crowdin --- platform/mv3/description/webstore.eu.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/platform/mv3/description/webstore.eu.txt b/platform/mv3/description/webstore.eu.txt index a15101de8214a..8f15a42a9bec0 100644 --- a/platform/mv3/description/webstore.eu.txt +++ b/platform/mv3/description/webstore.eu.txt @@ -3,13 +3,13 @@ uBO Lite (uBOL) irakargarri blokeatzailea de, baimen gutxiekin eta MV3ean basatu The default ruleset corresponds to uBlock Origin's default filterset: UblockOrigin-eko filtro lista -- EasyList +ZerrendaErraza PribazitateaErraza -- Peter Lowe’s Ad and tracking server list +Peter Lowe-ren Ad and tracker zerrenda -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Arau gehiago gehitu ditzakezu aukeren orrialdea bisitatuz. Sakatu _Cogs_ ikonoa popup panelean. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. +uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. Horrek esan nahi du uBOLek berak ez duela CPU/memoria baliabiderik kontsumitzen edukien blokeoa martxan dagoen bitartean... uBOLren zerbitzuko langileen prozesua _only_ behar da popup panelarekin edo aukera orriekin elkarreragiten denean. uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. @@ -25,6 +25,6 @@ You can set the default filtering mode from uBOL's options page. If you pick the Keep in mind this is still a work in progress, with these end goals: -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. +- Instalatzeko garaian, ez dago baimen zabalik. Erabiltzaileak esplizituki ematen ditu baimen zabalduak. - Entirely declarative for reliability and CPU/memory efficiency. From 3e35ea641421480abab6a097c3b2586a5986cd77 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 11 Jun 2024 15:36:16 -0400 Subject: [PATCH 007/553] Update changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46c32f0d032fb..4d24f7f7caba7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ -- [Add isodate as available placeholder for auto-comment](https://github.com/gorhill/uBlock/commit/d5208ee5dd) +- [Improve `prevent-addEventListener` scriptlet](https://github.com/gorhill/uBlock/commit/91ee5bdeae) +- [Add `isodate` as available placeholder for auto-comment](https://github.com/gorhill/uBlock/commit/d5208ee5dd) - [Improve `trusted-replace-outbound-text` scriptlet](https://github.com/gorhill/uBlock/commit/fa6740a059) - [Classify generic cosmetic filters with comma as highly generic](https://github.com/gorhill/uBlock/commit/8f81833efc) - [Raise max buffer size for response body filtering](https://github.com/gorhill/uBlock/commit/82a3992896) From b5819a29e90779f64c444c31e3a73d929dc90d55 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 11 Jun 2024 15:36:36 -0400 Subject: [PATCH 008/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 1aa4c8a329030..13f0a613ae0d0 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.4 \ No newline at end of file +1.58.1.5 \ No newline at end of file From 441cf7c2b8b91fb437cafa0ecd54051301ecc723 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 11 Jun 2024 15:40:47 -0400 Subject: [PATCH 009/553] 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 02f54020d1c66..adee00d9fd3a2 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.4", + "version": "1.58.1.5", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b4/uBlock0_1.58.1b4.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b5/uBlock0_1.58.1b5.firefox.signed.xpi" } ] } From 9072772f6134d80b4cfa4b90a10c624810a781fc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Jun 2024 09:32:30 -0400 Subject: [PATCH 010/553] Improve `trusted-replace-[fetch|xhr]-response` scriptlets Related discussion: https://github.com/uBlockOrigin/uBlock-discussions/discussions/831#discussioncomment-9750621 --- assets/resources/scriptlets.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index da232b70affd1..71c98dcc2201a 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -1332,6 +1332,8 @@ function replaceFetchResponseFn( if ( pattern === '*' ) { pattern = '.*'; } const rePattern = safe.patternToRegex(pattern); const propNeedles = parsePropertiesToMatch(propsToMatch, 'url'); + const extraArgs = safe.getExtraArgs(Array.from(arguments), 4); + const reIncludes = extraArgs.includes ? safe.patternToRegex(extraArgs.includes) : null; self.fetch = new Proxy(self.fetch, { apply: function(target, thisArg, args) { const fetchPromise = Reflect.apply(target, thisArg, args); @@ -1361,6 +1363,9 @@ function replaceFetchResponseFn( return fetchPromise.then(responseBefore => { const response = responseBefore.clone(); return response.text().then(textBefore => { + if ( reIncludes && reIncludes.test(textBefore) === false ) { + return responseBefore; + } const textAfter = textBefore.replace(rePattern, replacement); const outcome = textAfter !== textBefore ? 'match' : 'nomatch'; if ( outcome === 'nomatch' ) { return responseBefore; } @@ -4365,6 +4370,8 @@ function trustedReplaceXhrResponse( if ( pattern === '*' ) { pattern = '.*'; } const rePattern = safe.patternToRegex(pattern); const propNeedles = parsePropertiesToMatch(propsToMatch, 'url'); + const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); + const reIncludes = extraArgs.includes ? safe.patternToRegex(extraArgs.includes) : null; self.XMLHttpRequest = class extends self.XMLHttpRequest { open(method, url, ...args) { const outerXhr = this; @@ -4402,6 +4409,9 @@ function trustedReplaceXhrResponse( if ( typeof innerResponse !== 'string' ) { return (xhrDetails.response = innerResponse); } + if ( reIncludes && reIncludes.test(innerResponse) === false ) { + return (xhrDetails.response = innerResponse); + } const textBefore = innerResponse; const textAfter = textBefore.replace(rePattern, replacement); if ( textAfter !== textBefore ) { From 4611752f71e32eaa23c058ad602809add156a573 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Jun 2024 09:39:07 -0400 Subject: [PATCH 011/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d24f7f7caba7..a54360b74adaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `trusted-replace-[fetch|xhr]-response` scriptlets](https://github.com/gorhill/uBlock/commit/9072772f61) - [Improve `prevent-addEventListener` scriptlet](https://github.com/gorhill/uBlock/commit/91ee5bdeae) - [Add `isodate` as available placeholder for auto-comment](https://github.com/gorhill/uBlock/commit/d5208ee5dd) - [Improve `trusted-replace-outbound-text` scriptlet](https://github.com/gorhill/uBlock/commit/fa6740a059) From f499cd27425e59250690f751a67a57ecd17f9703 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Jun 2024 09:39:31 -0400 Subject: [PATCH 012/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 13f0a613ae0d0..fed0d5c50e183 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.5 \ No newline at end of file +1.58.1.6 \ No newline at end of file From 62fdd8b4a48170f783e760ae3f64152a8a11bb47 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 13 Jun 2024 09:45:44 -0400 Subject: [PATCH 013/553] 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 adee00d9fd3a2..1d1b3a3c0d23c 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.5", + "version": "1.58.1.6", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b5/uBlock0_1.58.1b5.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b6/uBlock0_1.58.1b6.firefox.signed.xpi" } ] } From bdb99862ce93d61e9202ee1bad656276e4a9ee5a Mon Sep 17 00:00:00 2001 From: Fanboynz Date: Fri, 14 Jun 2024 11:32:11 -0700 Subject: [PATCH 014/553] Add hide and hidden to set-cookie (#3918) --- assets/resources/scriptlets.js | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 71c98dcc2201a..41cd83f1db9b9 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -3785,6 +3785,7 @@ function setCookie( 'yes', 'y', 'no', 'n', 'necessary', 'required', 'approved', 'disapproved', + 'hide', 'hidden', ]; const normalized = value.toLowerCase(); const match = /^("?)(.+)\1$/.exec(normalized); From cb0f65e035e4cd40b0127079ff1fca76ee964fa0 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 18 Jun 2024 10:01:27 -0400 Subject: [PATCH 015/553] Improve `trusted-replace-node-text` scriptlet Related discussion: https://github.com/uBlockOrigin/uAssets/discussions/24143 --- assets/resources/scriptlets.js | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 41cd83f1db9b9..dacfe7f50f210 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -764,6 +764,7 @@ function replaceNodeTextFn( count += 1; if ( node === null ) { break; } if ( reNodeName.test(node.nodeName) === false ) { continue; } + if ( node === document.currentScript ) { continue; } if ( handleNode(node) ) { continue; } stop(); break; } From 58a9838e41bdb722dad6e6bc11300fd89db56287 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 18 Jun 2024 10:10:45 -0400 Subject: [PATCH 016/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a54360b74adaf..7fe32420b5c6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/cb0f65e035) - [Improve `trusted-replace-[fetch|xhr]-response` scriptlets](https://github.com/gorhill/uBlock/commit/9072772f61) - [Improve `prevent-addEventListener` scriptlet](https://github.com/gorhill/uBlock/commit/91ee5bdeae) - [Add `isodate` as available placeholder for auto-comment](https://github.com/gorhill/uBlock/commit/d5208ee5dd) From 1df4ea45067efbdaea3f0e9436fb1ecdeefd0c61 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 18 Jun 2024 10:11:03 -0400 Subject: [PATCH 017/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index fed0d5c50e183..df35a567cd2df 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.6 \ No newline at end of file +1.58.1.7 \ No newline at end of file From 8e3eaf1cc807b787a35025bf47843142f69a2fcb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 18 Jun 2024 10:15:54 -0400 Subject: [PATCH 018/553] 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 1d1b3a3c0d23c..d70356242eed7 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.6", + "version": "1.58.1.7", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b6/uBlock0_1.58.1b6.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b7/uBlock0_1.58.1b7.firefox.signed.xpi" } ] } From b4d8750f445cfa06bebd184a6f3cdb4d73148e72 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 19 Jun 2024 08:48:54 -0400 Subject: [PATCH 019/553] Improve `set-cookie` scriptlet Related feedback: https://github.com/uBlockOrigin/uBlock-issues/issues/3178#issuecomment-2178502856 --- assets/resources/scriptlets.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index dacfe7f50f210..2781fad3b0191 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -1009,6 +1009,8 @@ function setCookieFn( cookieParts.push(`; domain=${options.domain}`); } cookieParts.push('; Secure'); + } else if ( /^__(Host|Secure)-/.test(name) ) { + cookieParts.push('; Secure'); } try { From 297167755fd1fafd71ba9112f49558570c6cadfb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 19 Jun 2024 08:51:46 -0400 Subject: [PATCH 020/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fe32420b5c6c..0a7e40f5966ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/b4d8750f44) - [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/cb0f65e035) - [Improve `trusted-replace-[fetch|xhr]-response` scriptlets](https://github.com/gorhill/uBlock/commit/9072772f61) - [Improve `prevent-addEventListener` scriptlet](https://github.com/gorhill/uBlock/commit/91ee5bdeae) From cc860a67f80696e50aa23610e512b9f88e78d188 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 19 Jun 2024 08:52:07 -0400 Subject: [PATCH 021/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index df35a567cd2df..d8992862b105a 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.7 \ No newline at end of file +1.58.1.8 \ No newline at end of file From 7be7e0b8709d87f3e32fbf49063ed04ea05dc4c3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 19 Jun 2024 10:16:19 -0400 Subject: [PATCH 022/553] 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 d70356242eed7..9bc0dbc777640 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.7", + "version": "1.58.1.8", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b7/uBlock0_1.58.1b7.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b8/uBlock0_1.58.1b8.firefox.signed.xpi" } ] } From aca7674bacb9858b375c55f996d10dfabebbdb5e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 19 Jun 2024 19:06:53 -0400 Subject: [PATCH 023/553] Add `:matches-prop()` pseudo CSS operator `subject:matches-prop(arg)` Description: Allows to select an element by a property name (or chain of properties), and optionally the property value. Chainable: Yes. `subject`: Can be a plain CSS selector, or a procedural cosmetic filter. `arg`: A declaration in the form `chain=value`, where `chain` is a dot- separated string for the target property, and `value` is the optional property value to match. `value` can be literal text or literal regular expression. When no `value` is declared, the operator only tests for the presence of the target property Example: example.org##div:matches-prop(imanad) example.org##img:matches-prop(naturalWidth=160) --- src/js/contentscript-extra.js | 21 ++ src/js/static-filtering-parser.js | 509 +++++++++++++++--------------- 2 files changed, 276 insertions(+), 254 deletions(-) diff --git a/src/js/contentscript-extra.js b/src/js/contentscript-extra.js index 0c3104d91bf11..4d10bb8782464 100644 --- a/src/js/contentscript-extra.js +++ b/src/js/contentscript-extra.js @@ -173,6 +173,26 @@ class PSelectorMatchesPathTask extends PSelectorTask { } } +class PSelectorMatchesPropTask extends PSelectorTask { + constructor(task) { + super(); + this.props = task[1].attr.split('.'); + this.reValue = task[1].value !== '' + ? regexFromString(task[1].value, true) + : null; + } + transpose(node, output) { + let value = node; + for ( const prop of this.props ) { + if ( value === undefined ) { return; } + if ( value === null ) { return; } + value = value[prop]; + } + if ( this.reValue !== null && this.reValue.test(value) === false ) { return; } + output.push(node); + } +} + class PSelectorMinTextLengthTask extends PSelectorTask { constructor(task) { super(); @@ -461,6 +481,7 @@ PSelector.prototype.operatorToTaskMap = new Map([ [ 'matches-css-before', PSelectorMatchesCSSBeforeTask ], [ 'matches-media', PSelectorMatchesMediaTask ], [ 'matches-path', PSelectorMatchesPathTask ], + [ 'matches-prop', PSelectorMatchesPropTask ], [ 'min-text-length', PSelectorMinTextLengthTask ], [ 'not', PSelectorIfNotTask ], [ 'others', PSelectorOthersTask ], diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index 48c5f62e7aaf1..e89f7b3a30ce5 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -19,12 +19,10 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - /******************************************************************************/ -import Regex from '../lib/regexanalyzer/regex.js'; import * as cssTree from '../lib/csstree/css-tree.js'; +import Regex from '../lib/regexanalyzer/regex.js'; /******************************************************************************* * @@ -781,21 +779,21 @@ class DomainListIterator { let ready = false; while ( node !== 0 ) { switch ( this.parser.getNodeType(node) ) { - case NODE_TYPE_OPTION_VALUE_DOMAIN_RAW: - this.item.hn = ''; - this.item.not = false; - this.item.bad = this.parser.getNodeFlags(node, NODE_FLAG_ERROR) !== 0; - break; - case NODE_TYPE_OPTION_VALUE_NOT: - this.item.not = true; - break; - case NODE_TYPE_OPTION_VALUE_DOMAIN: - this.item.hn = this.parser.getNodeTransform(node); - this.value = this.item; - ready = true; - break; - default: - break; + case NODE_TYPE_OPTION_VALUE_DOMAIN_RAW: + this.item.hn = ''; + this.item.not = false; + this.item.bad = this.parser.getNodeFlags(node, NODE_FLAG_ERROR) !== 0; + break; + case NODE_TYPE_OPTION_VALUE_NOT: + this.item.not = true; + break; + case NODE_TYPE_OPTION_VALUE_DOMAIN: + this.item.hn = this.parser.getNodeTransform(node); + this.value = this.item; + ready = true; + break; + default: + break; } node = this.walker.next(); if ( ready ) { return this; } @@ -859,17 +857,17 @@ export class AstFilterParser { this.reInlineComment = /(?:\s+#).*?$/; this.reNetException = /^@@/; this.reNetAnchor = /(?:)\$[^,\w~]/; - this.reHnAnchoredPlainAscii = /^\|\|[0-9a-z%&,\-.\/:;=?_]+$/; + this.reHnAnchoredPlainAscii = /^\|\|[0-9a-z%&,\-./:;=?_]+$/; this.reHnAnchoredHostnameAscii = /^\|\|(?:[\da-z][\da-z_-]*\.)*[\da-z_-]*[\da-z]\^$/; this.reHnAnchoredHostnameUnicode = /^\|\|(?:[\p{L}\p{N}][\p{L}\p{N}\u{2d}]*\.)*[\p{L}\p{N}\u{2d}]*[\p{L}\p{N}]\^$/u; this.reHn3pAnchoredHostnameAscii = /^\|\|(?:[\da-z][\da-z_-]*\.)*[\da-z_-]*[\da-z]\^\$third-party$/; - this.rePlainAscii = /^[0-9a-z%&\-.\/:;=?_]{2,}$/; + this.rePlainAscii = /^[0-9a-z%&\-./:;=?_]{2,}$/; this.reNetHosts1 = /^127\.0\.0\.1 (?:[\da-z][\da-z_-]*\.)+[\da-z-]*[a-z]$/; this.reNetHosts2 = /^0\.0\.0\.0 (?:[\da-z][\da-z_-]*\.)+[\da-z-]*[a-z]$/; this.rePlainGenericCosmetic = /^##[.#][A-Za-z_][\w-]*$/; this.reHostnameAscii = /^(?:[\da-z][\da-z_-]*\.)*[\da-z][\da-z-]*[\da-z]$/; this.rePlainEntity = /^(?:[\da-z][\da-z_-]*\.)+\*$/; - this.reHostsSink = /^[\w%.:\[\]-]+\s+/; + this.reHostsSink = /^[\w%.:[\]-]+\s+/; this.reHostsRedirect = /(?:0\.0\.0\.0|broadcasthost|local|localhost(?:\.localdomain)?|ip6-\w+)(?:[^\w.-]|$)/; this.reNetOptionComma = /,(?:~?[13a-z-]+(?:=.*?)?|_+)(?:,|$)/; this.rePointlessLeftAnchor = /^\|\|?\*+/; @@ -886,8 +884,8 @@ export class AstFilterParser { this.rePreparseDirectiveIf = /^!#if /; this.rePreparseDirectiveAny = /^!#(?:else|endif|if |include )/; this.reURL = /\bhttps?:\/\/\S+/; - this.reHasPatternSpecialChars = /[\*\^]/; - this.rePatternAllSpecialChars = /[\*\^]+|[^\x00-\x7f]+/g; + this.reHasPatternSpecialChars = /[*^]/; + this.rePatternAllSpecialChars = /[*^]+|[^\x00-\x7f]+/g; // https://github.com/uBlockOrigin/uBlock-issues/issues/1146 // From https://codemirror.net/doc/manual.html#option_specialChars this.reHasInvalidChar = /[\x00-\x1F\x7F-\x9F\xAD\u061C\u200B-\u200F\u2028\u2029\uFEFF\uFFF9-\uFFFC]/; @@ -1315,218 +1313,218 @@ export class AstFilterParser { const hasValue = (flags & NODE_FLAG_OPTION_HAS_VALUE) !== 0; bad = false; realBad = false; switch ( type ) { - case NODE_TYPE_NET_OPTION_NAME_ALL: - realBad = isNegated || hasValue || modifierType !== 0; - break; - case NODE_TYPE_NET_OPTION_NAME_1P: - case NODE_TYPE_NET_OPTION_NAME_3P: - realBad = hasValue; - break; - case NODE_TYPE_NET_OPTION_NAME_BADFILTER: - badfilter = true; - /* falls through */ - case NODE_TYPE_NET_OPTION_NAME_NOOP: - realBad = isNegated || hasValue; - break; - case NODE_TYPE_NET_OPTION_NAME_CSS: - case NODE_TYPE_NET_OPTION_NAME_FONT: - case NODE_TYPE_NET_OPTION_NAME_IMAGE: - case NODE_TYPE_NET_OPTION_NAME_MEDIA: - case NODE_TYPE_NET_OPTION_NAME_OBJECT: - case NODE_TYPE_NET_OPTION_NAME_OTHER: - case NODE_TYPE_NET_OPTION_NAME_SCRIPT: - case NODE_TYPE_NET_OPTION_NAME_XHR: - realBad = hasValue; - if ( realBad ) { break; } - requestTypeCount += 1; - break; - case NODE_TYPE_NET_OPTION_NAME_CNAME: - realBad = isException === false || isNegated || hasValue; - if ( realBad ) { break; } - modifierType = type; - break; - case NODE_TYPE_NET_OPTION_NAME_CSP: - realBad = (hasValue || isException) === false || - modifierType !== 0 || - this.reBadCSP.test( - this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_CSP) - ); - if ( realBad ) { break; } - modifierType = type; - break; - case NODE_TYPE_NET_OPTION_NAME_DENYALLOW: - realBad = isNegated || hasValue === false || - this.getBranchFromType(NODE_TYPE_NET_OPTION_NAME_FROM) === 0; - break; - case NODE_TYPE_NET_OPTION_NAME_DOC: - case NODE_TYPE_NET_OPTION_NAME_FRAME: - realBad = hasValue; - if ( realBad ) { break; } - docTypeCount += 1; - break; - case NODE_TYPE_NET_OPTION_NAME_EHIDE: - case NODE_TYPE_NET_OPTION_NAME_GHIDE: - case NODE_TYPE_NET_OPTION_NAME_SHIDE: - realBad = isNegated || hasValue || modifierType !== 0; - if ( realBad ) { break; } - behaviorTypeCount += 1; - unredirectableTypeCount += 1; - break; - case NODE_TYPE_NET_OPTION_NAME_EMPTY: - case NODE_TYPE_NET_OPTION_NAME_MP4: - realBad = isNegated || hasValue || modifierType !== 0; - if ( realBad ) { break; } - modifierType = type; - break; - case NODE_TYPE_NET_OPTION_NAME_FROM: - case NODE_TYPE_NET_OPTION_NAME_METHOD: - case NODE_TYPE_NET_OPTION_NAME_TO: - realBad = isNegated || hasValue === false; - break; - case NODE_TYPE_NET_OPTION_NAME_GENERICBLOCK: - bad = true; - realBad = isException === false || isNegated || hasValue; - break; - case NODE_TYPE_NET_OPTION_NAME_HEADER: - realBad = isNegated || hasValue === false; - break; - case NODE_TYPE_NET_OPTION_NAME_IMPORTANT: - realBad = isException || isNegated || hasValue; - break; - case NODE_TYPE_NET_OPTION_NAME_INLINEFONT: - case NODE_TYPE_NET_OPTION_NAME_INLINESCRIPT: - realBad = hasValue; - if ( realBad ) { break; } - modifierType = type; - unredirectableTypeCount += 1; - break; - case NODE_TYPE_NET_OPTION_NAME_MATCHCASE: - realBad = this.isRegexPattern() === false; - break; - case NODE_TYPE_NET_OPTION_NAME_PERMISSIONS: - realBad = modifierType !== 0 || - (hasValue || isException) === false || - this.reBadPP.test( - this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_PERMISSIONS) - ); - if ( realBad ) { break; } - modifierType = type; - break; - case NODE_TYPE_NET_OPTION_NAME_PING: - case NODE_TYPE_NET_OPTION_NAME_WEBSOCKET: - realBad = hasValue; - if ( realBad ) { break; } - requestTypeCount += 1; - unredirectableTypeCount += 1; - break; - case NODE_TYPE_NET_OPTION_NAME_POPUNDER: - case NODE_TYPE_NET_OPTION_NAME_POPUP: - realBad = hasValue; - if ( realBad ) { break; } - abstractTypeCount += 1; - unredirectableTypeCount += 1; - break; - case NODE_TYPE_NET_OPTION_NAME_REDIRECT: - case NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE: - case NODE_TYPE_NET_OPTION_NAME_REPLACE: - case NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM: - realBad = isNegated || (isException || hasValue) === false || - modifierType !== 0; - if ( realBad ) { break; } - modifierType = type; - break; - case NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM: - realBad = isNegated || modifierType !== 0; - if ( realBad ) { break; } - modifierType = type; - break; - case NODE_TYPE_NET_OPTION_NAME_STRICT1P: - case NODE_TYPE_NET_OPTION_NAME_STRICT3P: - realBad = isNegated || hasValue; - break; - case NODE_TYPE_NET_OPTION_NAME_UNKNOWN: - this.astError = AST_ERROR_OPTION_UNKNOWN; - realBad = true; - break; - case NODE_TYPE_NET_OPTION_NAME_WEBRTC: - realBad = true; - break; - case NODE_TYPE_NET_PATTERN_RAW: - realBad = this.hasOptions() === false && - this.getNetPattern().length <= 1; - break; - default: - break; - } - if ( bad || realBad ) { - this.addNodeFlags(targetNode, NODE_FLAG_ERROR); - } - if ( realBad ) { - this.addFlags(AST_FLAG_HAS_ERROR); - } - } - const requiresTrustedSource = ( ) => - this.options.trustedSource !== true && - isException === false && badfilter === false; - switch ( modifierType ) { + case NODE_TYPE_NET_OPTION_NAME_ALL: + realBad = isNegated || hasValue || modifierType !== 0; + break; + case NODE_TYPE_NET_OPTION_NAME_1P: + case NODE_TYPE_NET_OPTION_NAME_3P: + realBad = hasValue; + break; + case NODE_TYPE_NET_OPTION_NAME_BADFILTER: + badfilter = true; + /* falls through */ + case NODE_TYPE_NET_OPTION_NAME_NOOP: + realBad = isNegated || hasValue; + break; + case NODE_TYPE_NET_OPTION_NAME_CSS: + case NODE_TYPE_NET_OPTION_NAME_FONT: + case NODE_TYPE_NET_OPTION_NAME_IMAGE: + case NODE_TYPE_NET_OPTION_NAME_MEDIA: + case NODE_TYPE_NET_OPTION_NAME_OBJECT: + case NODE_TYPE_NET_OPTION_NAME_OTHER: + case NODE_TYPE_NET_OPTION_NAME_SCRIPT: + case NODE_TYPE_NET_OPTION_NAME_XHR: + realBad = hasValue; + if ( realBad ) { break; } + requestTypeCount += 1; + break; case NODE_TYPE_NET_OPTION_NAME_CNAME: - realBad = abstractTypeCount || behaviorTypeCount || requestTypeCount; + realBad = isException === false || isNegated || hasValue; + if ( realBad ) { break; } + modifierType = type; break; case NODE_TYPE_NET_OPTION_NAME_CSP: - case NODE_TYPE_NET_OPTION_NAME_PERMISSIONS: - realBad = abstractTypeCount || behaviorTypeCount || requestTypeCount; + realBad = (hasValue || isException) === false || + modifierType !== 0 || + this.reBadCSP.test( + this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_CSP) + ); + if ( realBad ) { break; } + modifierType = type; + break; + case NODE_TYPE_NET_OPTION_NAME_DENYALLOW: + realBad = isNegated || hasValue === false || + this.getBranchFromType(NODE_TYPE_NET_OPTION_NAME_FROM) === 0; + break; + case NODE_TYPE_NET_OPTION_NAME_DOC: + case NODE_TYPE_NET_OPTION_NAME_FRAME: + realBad = hasValue; + if ( realBad ) { break; } + docTypeCount += 1; + break; + case NODE_TYPE_NET_OPTION_NAME_EHIDE: + case NODE_TYPE_NET_OPTION_NAME_GHIDE: + case NODE_TYPE_NET_OPTION_NAME_SHIDE: + realBad = isNegated || hasValue || modifierType !== 0; + if ( realBad ) { break; } + behaviorTypeCount += 1; + unredirectableTypeCount += 1; + break; + case NODE_TYPE_NET_OPTION_NAME_EMPTY: + case NODE_TYPE_NET_OPTION_NAME_MP4: + realBad = isNegated || hasValue || modifierType !== 0; + if ( realBad ) { break; } + modifierType = type; + break; + case NODE_TYPE_NET_OPTION_NAME_FROM: + case NODE_TYPE_NET_OPTION_NAME_METHOD: + case NODE_TYPE_NET_OPTION_NAME_TO: + realBad = isNegated || hasValue === false; + break; + case NODE_TYPE_NET_OPTION_NAME_GENERICBLOCK: + bad = true; + realBad = isException === false || isNegated || hasValue; + break; + case NODE_TYPE_NET_OPTION_NAME_HEADER: + realBad = isNegated || hasValue === false; + break; + case NODE_TYPE_NET_OPTION_NAME_IMPORTANT: + realBad = isException || isNegated || hasValue; break; case NODE_TYPE_NET_OPTION_NAME_INLINEFONT: case NODE_TYPE_NET_OPTION_NAME_INLINESCRIPT: - realBad = behaviorTypeCount; + realBad = hasValue; + if ( realBad ) { break; } + modifierType = type; + unredirectableTypeCount += 1; break; - case NODE_TYPE_NET_OPTION_NAME_EMPTY: - realBad = abstractTypeCount || behaviorTypeCount; + case NODE_TYPE_NET_OPTION_NAME_MATCHCASE: + realBad = this.isRegexPattern() === false; break; - case NODE_TYPE_NET_OPTION_NAME_MEDIA: - case NODE_TYPE_NET_OPTION_NAME_MP4: - realBad = abstractTypeCount || behaviorTypeCount || docTypeCount || requestTypeCount; + case NODE_TYPE_NET_OPTION_NAME_PERMISSIONS: + realBad = modifierType !== 0 || + (hasValue || isException) === false || + this.reBadPP.test( + this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_PERMISSIONS) + ); + if ( realBad ) { break; } + modifierType = type; break; - case NODE_TYPE_NET_OPTION_NAME_REDIRECT: - case NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE: { - realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount; + case NODE_TYPE_NET_OPTION_NAME_PING: + case NODE_TYPE_NET_OPTION_NAME_WEBSOCKET: + realBad = hasValue; + if ( realBad ) { break; } + requestTypeCount += 1; + unredirectableTypeCount += 1; break; - } - case NODE_TYPE_NET_OPTION_NAME_REPLACE: { - realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount; + case NODE_TYPE_NET_OPTION_NAME_POPUNDER: + case NODE_TYPE_NET_OPTION_NAME_POPUP: + realBad = hasValue; if ( realBad ) { break; } - if ( requiresTrustedSource() ) { - this.astError = AST_ERROR_UNTRUSTED_SOURCE; - realBad = true; - break; - } - const value = this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_REPLACE); - if ( parseReplaceValue(value) === undefined ) { - this.astError = AST_ERROR_OPTION_BADVALUE; - realBad = true; - } + abstractTypeCount += 1; + unredirectableTypeCount += 1; break; - } - case NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM: { - realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount; + case NODE_TYPE_NET_OPTION_NAME_REDIRECT: + case NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE: + case NODE_TYPE_NET_OPTION_NAME_REPLACE: + case NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM: + realBad = isNegated || (isException || hasValue) === false || + modifierType !== 0; if ( realBad ) { break; } - if ( requiresTrustedSource() ) { - this.astError = AST_ERROR_UNTRUSTED_SOURCE; - realBad = true; - break; - } - const value = this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM); - if ( value !== '' && parseReplaceValue(value) === undefined ) { - this.astError = AST_ERROR_OPTION_BADVALUE; - realBad = true; - } + modifierType = type; break; - } case NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM: - realBad = abstractTypeCount || behaviorTypeCount; + realBad = isNegated || modifierType !== 0; + if ( realBad ) { break; } + modifierType = type; + break; + case NODE_TYPE_NET_OPTION_NAME_STRICT1P: + case NODE_TYPE_NET_OPTION_NAME_STRICT3P: + realBad = isNegated || hasValue; + break; + case NODE_TYPE_NET_OPTION_NAME_UNKNOWN: + this.astError = AST_ERROR_OPTION_UNKNOWN; + realBad = true; + break; + case NODE_TYPE_NET_OPTION_NAME_WEBRTC: + realBad = true; + break; + case NODE_TYPE_NET_PATTERN_RAW: + realBad = this.hasOptions() === false && + this.getNetPattern().length <= 1; break; default: break; + } + if ( bad || realBad ) { + this.addNodeFlags(targetNode, NODE_FLAG_ERROR); + } + if ( realBad ) { + this.addFlags(AST_FLAG_HAS_ERROR); + } + } + const requiresTrustedSource = ( ) => + this.options.trustedSource !== true && + isException === false && badfilter === false; + switch ( modifierType ) { + case NODE_TYPE_NET_OPTION_NAME_CNAME: + realBad = abstractTypeCount || behaviorTypeCount || requestTypeCount; + break; + case NODE_TYPE_NET_OPTION_NAME_CSP: + case NODE_TYPE_NET_OPTION_NAME_PERMISSIONS: + realBad = abstractTypeCount || behaviorTypeCount || requestTypeCount; + break; + case NODE_TYPE_NET_OPTION_NAME_INLINEFONT: + case NODE_TYPE_NET_OPTION_NAME_INLINESCRIPT: + realBad = behaviorTypeCount; + break; + case NODE_TYPE_NET_OPTION_NAME_EMPTY: + realBad = abstractTypeCount || behaviorTypeCount; + break; + case NODE_TYPE_NET_OPTION_NAME_MEDIA: + case NODE_TYPE_NET_OPTION_NAME_MP4: + realBad = abstractTypeCount || behaviorTypeCount || docTypeCount || requestTypeCount; + break; + case NODE_TYPE_NET_OPTION_NAME_REDIRECT: + case NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE: { + realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount; + break; + } + case NODE_TYPE_NET_OPTION_NAME_REPLACE: { + realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount; + if ( realBad ) { break; } + if ( requiresTrustedSource() ) { + this.astError = AST_ERROR_UNTRUSTED_SOURCE; + realBad = true; + break; + } + const value = this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_REPLACE); + if ( parseReplaceValue(value) === undefined ) { + this.astError = AST_ERROR_OPTION_BADVALUE; + realBad = true; + } + break; + } + case NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM: { + realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount; + if ( realBad ) { break; } + if ( requiresTrustedSource() ) { + this.astError = AST_ERROR_UNTRUSTED_SOURCE; + realBad = true; + break; + } + const value = this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM); + if ( value !== '' && parseReplaceValue(value) === undefined ) { + this.astError = AST_ERROR_OPTION_BADVALUE; + realBad = true; + } + break; + } + case NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM: + realBad = abstractTypeCount || behaviorTypeCount; + break; + default: + break; } if ( realBad ) { const targetNode = this.getBranchFromType(modifierType); @@ -2061,15 +2059,15 @@ export class AstFilterParser { parentBeg + optionEnd ); switch ( nodeOptionType ) { - case NODE_TYPE_NET_OPTION_NAME_DENYALLOW: - this.linkDown(next, this.parseDomainList(next, '|'), 0b00000); - break; - case NODE_TYPE_NET_OPTION_NAME_FROM: - case NODE_TYPE_NET_OPTION_NAME_TO: - this.linkDown(next, this.parseDomainList(next, '|', 0b11010)); - break; - default: - break; + case NODE_TYPE_NET_OPTION_NAME_DENYALLOW: + this.linkDown(next, this.parseDomainList(next, '|'), 0b00000); + break; + case NODE_TYPE_NET_OPTION_NAME_FROM: + case NODE_TYPE_NET_OPTION_NAME_TO: + this.linkDown(next, this.parseDomainList(next, '|', 0b11010)); + break; + default: + break; } this.linkRight(prev, next); return this.throwHeadNode(head); @@ -2284,27 +2282,27 @@ export class AstFilterParser { if ( (flags & NODE_FLAG_ERROR) !== 0 ) { continue; } realBad = false; switch ( type ) { - case NODE_TYPE_EXT_PATTERN_RESPONSEHEADER: { - const pattern = this.getNodeString(targetNode); - realBad = - pattern !== '' && removableHTTPHeaders.has(pattern) === false || - pattern === '' && isException === false; - 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 token = this.getNodeString(targetNode); - if ( trustedScriptletTokens.has(token) && trustedSource !== true ) { - this.astError = AST_ERROR_UNTRUSTED_SOURCE; - realBad = true; - } - break; + case NODE_TYPE_EXT_PATTERN_RESPONSEHEADER: { + const pattern = this.getNodeString(targetNode); + realBad = + pattern !== '' && removableHTTPHeaders.has(pattern) === false || + pattern === '' && isException === false; + 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 token = this.getNodeString(targetNode); + if ( trustedScriptletTokens.has(token) && trustedSource !== true ) { + this.astError = AST_ERROR_UNTRUSTED_SOURCE; + realBad = true; } - default: - break; + break; + } + default: + break; } if ( realBad ) { this.addNodeFlags(targetNode, NODE_FLAG_ERROR); @@ -2420,7 +2418,7 @@ export class AstFilterParser { parentBeg + argsEnd ); this.linkDown(next, this.parseExtPatternScriptletArglist(next)); - prev = this.linkRight(prev, next); + this.linkRight(prev, next); return this.throwHeadNode(head); } @@ -2474,12 +2472,12 @@ export class AstFilterParser { const walker = this.getWalker(root); for ( let node = walker.next(); node !== 0; node = walker.next() ) { switch ( this.getNodeType(node) ) { - case NODE_TYPE_EXT_PATTERN_SCRIPTLET_TOKEN: - case NODE_TYPE_EXT_PATTERN_SCRIPTLET_ARG: - args.push(this.getNodeTransform(node)); - break; - default: - break; + case NODE_TYPE_EXT_PATTERN_SCRIPTLET_TOKEN: + case NODE_TYPE_EXT_PATTERN_SCRIPTLET_ARG: + args.push(this.getNodeTransform(node)); + break; + default: + break; } } walker.dispose(); @@ -3206,6 +3204,7 @@ class ExtSelectorCompiler { 'matches-css-before', 'matches-media', 'matches-path', + 'matches-prop', 'min-text-length', 'others', 'shadow', @@ -3842,6 +3841,7 @@ class ExtSelectorCompiler { case 'if-not': return this.compileSelector(arg); case 'matches-attr': + case 'matches-prop': return this.compileMatchAttrArgument(arg); case 'matches-css': return this.compileCSSDeclaration(arg); @@ -4037,7 +4037,7 @@ class ExtSelectorCompiler { compileAttrList(s) { if ( s === '' ) { return s; } - const attrs = s.split('\s*,\s*'); + const attrs = s.split(/\s*,\s*/); const out = []; for ( const attr of attrs ) { if ( attr !== '' ) { @@ -4075,6 +4075,7 @@ export const proceduralOperatorTokens = new Map([ [ 'matches-css', 0b11 ], [ 'matches-media', 0b11 ], [ 'matches-path', 0b11 ], + [ 'matches-prop', 0b11 ], [ 'min-text-length', 0b01 ], [ 'not', 0b01 ], [ 'nth-ancestor', 0b00 ], From ad3bdba7c922128a6046ed6e3b866a383d910fe6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 19 Jun 2024 19:22:04 -0400 Subject: [PATCH 024/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a7e40f5966ec..887521f3e136e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add `:matches-prop()` pseudo CSS operator](https://github.com/gorhill/uBlock/commit/aca7674bac) - [Improve `set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/b4d8750f44) - [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/cb0f65e035) - [Improve `trusted-replace-[fetch|xhr]-response` scriptlets](https://github.com/gorhill/uBlock/commit/9072772f61) From 459060f56455c946e251ee08b7145e90f20b9514 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 19 Jun 2024 19:22:28 -0400 Subject: [PATCH 025/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index d8992862b105a..b8e2859e134f5 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.8 \ No newline at end of file +1.58.1.9 \ No newline at end of file From aaceabeba1b54d07c5ec7045193821a3f4bd5b8e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 19 Jun 2024 19:31:19 -0400 Subject: [PATCH 026/553] 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 9bc0dbc777640..6d73ed717721b 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.8", + "version": "1.58.1.9", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b8/uBlock0_1.58.1b8.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b9/uBlock0_1.58.1b9.firefox.signed.xpi" } ] } From 83aee4a516524e95712280c1f34375960f59469a Mon Sep 17 00:00:00 2001 From: scripthunter7 Date: Thu, 20 Jun 2024 10:48:09 +0200 Subject: [PATCH 027/553] Update subscription URL for hufilter --- assets/assets.dev.json | 2 +- assets/assets.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/assets.dev.json b/assets/assets.dev.json index 354087f59c147..ab6ecfd6505de 100644 --- a/assets/assets.dev.json +++ b/assets/assets.dev.json @@ -634,7 +634,7 @@ "title": "🇭🇺hu: hufilter", "tags": "ads hungarian", "lang": "hu", - "contentURL": "https://raw.githubusercontent.com/hufilter/hufilter/master/hufilter-ublock.txt", + "contentURL": "https://cdn.jsdelivr.net/gh/hufilter/hufilter@gh-pages/hufilter-ublock.txt", "supportURL": "https://github.com/hufilter/hufilter" }, "IDN-0": { diff --git a/assets/assets.json b/assets/assets.json index 44ccc1bad8fde..bd8fd84550dce 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -634,7 +634,7 @@ "title": "🇭🇺hu: hufilter", "tags": "ads hungarian", "lang": "hu", - "contentURL": "https://raw.githubusercontent.com/hufilter/hufilter/master/hufilter-ublock.txt", + "contentURL": "https://cdn.jsdelivr.net/gh/hufilter/hufilter@gh-pages/hufilter-ublock.txt", "supportURL": "https://github.com/hufilter/hufilter" }, "IDN-0": { From 47b985a0563d8e75420ff89de65c6ab45fb0b01b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 20 Jun 2024 09:21:43 -0400 Subject: [PATCH 028/553] Fix `:matches-prop()` operator when no value provided --- src/js/contentscript-extra.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/js/contentscript-extra.js b/src/js/contentscript-extra.js index 4d10bb8782464..21feb1d390b32 100644 --- a/src/js/contentscript-extra.js +++ b/src/js/contentscript-extra.js @@ -188,7 +188,11 @@ class PSelectorMatchesPropTask extends PSelectorTask { if ( value === null ) { return; } value = value[prop]; } - if ( this.reValue !== null && this.reValue.test(value) === false ) { return; } + if ( this.reValue === null ) { + if ( value === undefined ) { return; } + } else if ( this.reValue.test(value) === false ) { + return; + } output.push(node); } } From 533c5c7c734fc6121c0fb15b8321d6397cd7e8f8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 20 Jun 2024 20:59:21 -0400 Subject: [PATCH 029/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index b8e2859e134f5..8aac1264dbb66 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.9 \ No newline at end of file +1.58.1.10 \ No newline at end of file From 5dd59889b9eae9ef9fb64761dc4f2dd086d448ac Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 20 Jun 2024 21:06:09 -0400 Subject: [PATCH 030/553] 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 6d73ed717721b..730d239ac4dcb 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.9", + "version": "1.58.1.10", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b9/uBlock0_1.58.1b9.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b10/uBlock0_1.58.1b10.firefox.signed.xpi" } ] } From 5c69159b36166f3b6cbc42735900eb5eb40558ba Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 22 Jun 2024 11:06:19 -0400 Subject: [PATCH 031/553] [mv3] Inject procedural cosmetic filtering script earlier Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/139 --- platform/mv3/extension/js/scripting-manager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mv3/extension/js/scripting-manager.js b/platform/mv3/extension/js/scripting-manager.js index e6eebf29f7b9b..10175fc92e952 100644 --- a/platform/mv3/extension/js/scripting-manager.js +++ b/platform/mv3/extension/js/scripting-manager.js @@ -276,7 +276,7 @@ function registerProcedural(context) { allFrames: true, matches, excludeMatches, - runAt: 'document_end', + runAt: 'document_start', }; // register From 88065d0091cb3c69861501dcdf81ec8dff09e433 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 22 Jun 2024 11:09:57 -0400 Subject: [PATCH 032/553] [mv3] Bring procdural cosmetic filtering code up to date with uBO --- .../extension/js/scripting/css-procedural.js | 57 ++++++++++++++----- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/platform/mv3/extension/js/scripting/css-procedural.js b/platform/mv3/extension/js/scripting/css-procedural.js index 7f50f80989d32..9f6f039d770ab 100644 --- a/platform/mv3/extension/js/scripting/css-procedural.js +++ b/platform/mv3/extension/js/scripting/css-procedural.js @@ -21,8 +21,6 @@ /* jshint esversion:11 */ -'use strict'; - /******************************************************************************/ // Important! @@ -112,18 +110,21 @@ const uBOL_injectCSS = (css, count = 10) => { }; const nonVisualElements = { + head: true, + link: true, + meta: true, script: true, style: true, }; const regexFromString = (s, exact = false) => { if ( s === '' ) { return /^/; } - const match = /^\/(.+)\/([i]?)$/.exec(s); + const match = /^\/(.+)\/([imu]*)$/.exec(s); if ( match !== null ) { return new RegExp(match[1], match[2] || undefined); } const reStr = s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - return new RegExp(exact ? `^${reStr}$` : reStr, 'i'); + return new RegExp(exact ? `^${reStr}$` : reStr); }; /******************************************************************************/ @@ -269,6 +270,32 @@ class PSelectorMatchesPathTask extends PSelectorTask { /******************************************************************************/ +class PSelectorMatchesPropTask extends PSelectorTask { + constructor(task) { + super(); + this.props = task[1].attr.split('.'); + this.reValue = task[1].value !== '' + ? regexFromString(task[1].value, true) + : null; + } + transpose(node, output) { + let value = node; + for ( const prop of this.props ) { + if ( value === undefined ) { return; } + if ( value === null ) { return; } + value = value[prop]; + } + if ( this.reValue === null ) { + if ( value === undefined ) { return; } + } else if ( this.reValue.test(value) === false ) { + return; + } + output.push(node); + } +} + +/******************************************************************************/ + class PSelectorMinTextLengthTask extends PSelectorTask { constructor(task) { super(); @@ -295,28 +322,27 @@ class PSelectorOthersTask extends PSelectorTask { const toKeep = new Set(this.targets); const toDiscard = new Set(); const body = document.body; + const head = document.head; let discard = null; for ( let keep of this.targets ) { - while ( keep !== null && keep !== body ) { + while ( keep !== null && keep !== body && keep !== head ) { toKeep.add(keep); toDiscard.delete(keep); discard = keep.previousElementSibling; while ( discard !== null ) { - if ( - nonVisualElements[discard.localName] !== true && - toKeep.has(discard) === false - ) { - toDiscard.add(discard); + if ( nonVisualElements[discard.localName] !== true ) { + if ( toKeep.has(discard) === false ) { + toDiscard.add(discard); + } } discard = discard.previousElementSibling; } discard = keep.nextElementSibling; while ( discard !== null ) { - if ( - nonVisualElements[discard.localName] !== true && - toKeep.has(discard) === false - ) { - toDiscard.add(discard); + if ( nonVisualElements[discard.localName] !== true ) { + if ( toKeep.has(discard) === false ) { + toDiscard.add(discard); + } } discard = discard.nextElementSibling; } @@ -570,6 +596,7 @@ PSelector.prototype.operatorToTaskMap = new Map([ [ 'matches-css-before', PSelectorMatchesCSSBeforeTask ], [ 'matches-media', PSelectorMatchesMediaTask ], [ 'matches-path', PSelectorMatchesPathTask ], + [ 'matches-prop', PSelectorMatchesPropTask ], [ 'min-text-length', PSelectorMinTextLengthTask ], [ 'not', PSelectorIfNotTask ], [ 'others', PSelectorOthersTask ], From 8eb3b19c69e5960da2868095d82dc9403302c478 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 25 Jun 2024 09:08:46 -0400 Subject: [PATCH 033/553] Improve logging in `prevent-addEventListener` scriptlet Related feedback: https://github.com/uBlockOrigin/uAssets/discussions/17907#discussioncomment-9871079 --- assets/resources/scriptlets.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 2781fad3b0191..18cdfadb55958 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -1661,7 +1661,9 @@ function addEventListenerDefuser( if ( elem instanceof Document ) { return 'document'; } if ( elem instanceof Element === false ) { return '?'; } const parts = []; - if ( elem.id !== '' ) { parts.push(`#${CSS.escape(elem.id)}`); } + // https://github.com/uBlockOrigin/uAssets/discussions/17907#discussioncomment-9871079 + const id = String(elem.id); + if ( id !== '' ) { parts.push(`#${CSS.escape(id)}`); } for ( let i = 0; i < elem.classList.length; i++ ) { parts.push(`.${CSS.escape(elem.classList.item(i))}`); } From 8447fc5d170fa76129d947acd0d0e174581e1314 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 25 Jun 2024 09:59:07 -0400 Subject: [PATCH 034/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 8aac1264dbb66..67372adde24f3 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.10 \ No newline at end of file +1.58.1.11 \ No newline at end of file From 6b349ca0ef76401b376d8eb487ffd3b20837bfb0 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 25 Jun 2024 10:05:54 -0400 Subject: [PATCH 035/553] 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 730d239ac4dcb..d5628408f488c 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.10", + "version": "1.58.1.11", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b10/uBlock0_1.58.1b10.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b11/uBlock0_1.58.1b11.firefox.signed.xpi" } ] } From 896737d098d329af1b44f6a93a145872a9086f96 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 26 Jun 2024 11:00:50 -0400 Subject: [PATCH 036/553] Fix race condition when loading redirect/scriptlet resources Related feedback: https://github.com/uBlockOrigin/uAssets/issues/23806#issuecomment-2190491767 --- src/js/storage.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/js/storage.js b/src/js/storage.js index b26ff00c6462c..1163483220996 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -1008,12 +1008,12 @@ onBroadcast(msg => { ubolog('loadFilterLists() Start'); t0 = Date.now(); loadedListKeys.length = 0; - loadingPromise = Promise.all([ - this.getAvailableLists().then(lists => onFilterListsReady(lists)), - this.loadRedirectResources().then(( ) => { - ubolog(`loadFilterLists() Redirects/scriptlets ready at ${elapsed()}`); - }), - ]).then(( ) => { + loadingPromise = this.loadRedirectResources().then(( ) => { + ubolog(`loadFilterLists() Redirects/scriptlets ready at ${elapsed()}`); + return this.getAvailableLists(); + }).then(lists => { + return onFilterListsReady(lists) + }).then(( ) => { onDone(); }); return loadingPromise; From 57ed2937606fe6c9876efb218724d01dc584498f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 28 Jun 2024 13:39:38 -0400 Subject: [PATCH 037/553] [mv3] Fix bad test re. managed storage --- platform/mv3/extension/js/ext.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mv3/extension/js/ext.js b/platform/mv3/extension/js/ext.js index 185fa9c92745d..0126c1894f7ad 100644 --- a/platform/mv3/extension/js/ext.js +++ b/platform/mv3/extension/js/ext.js @@ -107,7 +107,7 @@ export async function sessionWrite(key, value) { export async function adminRead(key) { if ( browser.storage instanceof Object === false ) { return; } - if ( browser.storage.local instanceof Object === false ) { return; } + if ( browser.storage.managed instanceof Object === false ) { return; } try { const bin = await browser.storage.managed.get(key); if ( bin instanceof Object === false ) { return; } From c154aaa69c6a2a4009d43923f1097c6298062b82 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 28 Jun 2024 13:40:19 -0400 Subject: [PATCH 038/553] Fix bad serialization of Date objects Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3283 --- src/js/s14e-serializer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/s14e-serializer.js b/src/js/s14e-serializer.js index 0c9200ebcaa14..8ef715a23ac10 100644 --- a/src/js/s14e-serializer.js +++ b/src/js/s14e-serializer.js @@ -592,7 +592,8 @@ const _serialize = data => { return; } if ( xtypeInt === I_DATE ) { - writeBuffer.push(C_DATE + _serialize(data.getTime())); + writeBuffer.push(C_DATE); + _serialize(data.getTime()); return; } // Reference to composite types From 1d7feb83a23bd3c9c70612f8ea2205eba0fde0b6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 5 Jul 2024 10:01:28 -0400 Subject: [PATCH 039/553] [firefox] Add entry for 128px icon Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3285 --- platform/firefox/manifest.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/firefox/manifest.json b/platform/firefox/manifest.json index aa49d395a9291..bd347e5eeadd8 100644 --- a/platform/firefox/manifest.json +++ b/platform/firefox/manifest.json @@ -99,7 +99,8 @@ "32": "img/ublock.svg", "48": "img/ublock.svg", "64": "img/ublock.svg", - "96": "img/ublock.svg" + "96": "img/ublock.svg", + "128": "img/ublock.svg" }, "manifest_version": 2, "name": "uBlock Origin", From 8c5918dec78f7217103eace03ec6f2c376224b90 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 5 Jul 2024 10:11:27 -0400 Subject: [PATCH 040/553] Prevent resizing of title bar in popup menu Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3284 --- src/popup-fenix.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/popup-fenix.html b/src/popup-fenix.html index 9abf3ddbab9a3..7c43e980ace09 100644 --- a/src/popup-fenix.html +++ b/src/popup-fenix.html @@ -16,7 +16,7 @@
-
­
+
­ 
lock From 9569969b55639dcd30c53a99212f2feeb1f20a71 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 5 Jul 2024 10:20:33 -0400 Subject: [PATCH 041/553] Fix distance calculation in picker Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3279 --- src/js/epicker-ui.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/epicker-ui.js b/src/js/epicker-ui.js index 981602b66f354..d2b14df65dce0 100644 --- a/src/js/epicker-ui.js +++ b/src/js/epicker-ui.js @@ -386,7 +386,7 @@ const onSvgTouch = (( ) => { const stopY = ev.changedTouches[0].screenY; const angle = Math.abs(Math.atan2(stopY - startY, stopX - startX)); const distance = Math.sqrt( - Math.pow(stopX - startX, 2), + Math.pow(stopX - startX, 2) + Math.pow(stopY - startY, 2) ); // Interpret touch events as a tap if: From efc16c7069e88625758bacf63e2b5898a548c91f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 5 Jul 2024 10:34:02 -0400 Subject: [PATCH 042/553] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 887521f3e136e..5a0b4497d8a1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +- [Fix distance calculation in picker](https://github.com/gorhill/uBlock/commit/9569969b55) +- [Fix bad serialization of Date objects](https://github.com/gorhill/uBlock/commit/c154aaa69c) +- [Fix race condition when loading redirect/scriptlet resources](https://github.com/gorhill/uBlock/commit/896737d098) +- [Improve logging in `prevent-addEventListener` scriptlet](https://github.com/gorhill/uBlock/commit/8eb3b19c69) - [Add `:matches-prop()` pseudo CSS operator](https://github.com/gorhill/uBlock/commit/aca7674bac) - [Improve `set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/b4d8750f44) - [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/cb0f65e035) From 7343035a170f3d8eb6ca7c6735235fbc55a51492 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 5 Jul 2024 10:34:26 -0400 Subject: [PATCH 043/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 67372adde24f3..2e21c3e9f0304 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.11 \ No newline at end of file +1.58.1.12 \ No newline at end of file From 966a2332197ed1c3ff9295699bcd42cde0549c64 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 5 Jul 2024 10:41:17 -0400 Subject: [PATCH 044/553] 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 d5628408f488c..cb8dce834d762 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.11", + "version": "1.58.1.12", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b11/uBlock0_1.58.1b11.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b12/uBlock0_1.58.1b12.firefox.signed.xpi" } ] } From 37d31a82d8d55a33e1c1ed86678183e51d209b23 Mon Sep 17 00:00:00 2001 From: Fanboynz Date: Mon, 8 Jul 2024 01:25:34 +1200 Subject: [PATCH 045/553] Add essential and nonessential to set-cookie (#3919) --- assets/resources/scriptlets.js | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 18cdfadb55958..7a967d394c212 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -3791,6 +3791,7 @@ function setCookie( 'necessary', 'required', 'approved', 'disapproved', 'hide', 'hidden', + 'essential', 'nonessential', ]; const normalized = value.toLowerCase(); const match = /^("?)(.+)\1$/.exec(normalized); From a3576ea6519dc08e5244dafc296dc8ac31b07655 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 7 Jul 2024 11:18:20 -0400 Subject: [PATCH 046/553] Add support for `$currentISODate$` in `trusted-set-cookie` scriptlet Related discussion: https://github.com/uBlockOrigin/uAssets/discussions/20789#discussioncomment-9979107 --- assets/resources/scriptlets.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 7a967d394c212..cc0f7033bf3e9 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -4248,6 +4248,9 @@ function trustedSetCookie( if ( value.includes('$currentDate$') ) { value = value.replaceAll('$currentDate$', time.toUTCString()); } + if ( value.includes('$currentISODate$') ) { + value = value.replaceAll('$currentISODate$', time.toISOString()); + } let expires = ''; if ( offsetExpiresSec !== '' ) { From 97d11c03c20bdc15877c342c404f179ca5c63ff6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 9 Jul 2024 13:03:50 -0400 Subject: [PATCH 047/553] Add `trusted-suppress-native-method` scriptlet Reference: https://github.com/AdguardTeam/Scriptlets/blob/5a92d79489/wiki/about-trusted-scriptlets.md#trusted-suppress-native-method This is a first draft version, see code comments for details. --- assets/resources/scriptlets.js | 100 +++++++++++++++++++++++++++++++-- 1 file changed, 95 insertions(+), 5 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index cc0f7033bf3e9..80c251fb58f5d 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -4756,24 +4756,29 @@ builtinScriptlets.push({ }); function trustedReplaceArgument( propChain = '', - argpos = '', + argposRaw = '', argraw = '' ) { if ( propChain === '' ) { return; } - if ( argpos === '' ) { return; } - if ( argraw === '' ) { return; } const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('trusted-replace-argument', propChain, argpos, argraw); + const logPrefix = safe.makeLogPrefix('trusted-replace-argument', propChain, argposRaw, argraw); + const argpos = parseInt(argposRaw, 10) || 0; const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); const normalValue = validateConstantFn(true, argraw); const reCondition = extraArgs.condition ? safe.patternToRegex(extraArgs.condition) : /^/; const reflector = proxyApplyFn(propChain, function(...args) { + if ( argposRaw === '' ) { + safe.uboLog(logPrefix, `Arguments:\n${args.join('\n')}`); + return reflector(...args); + } const arglist = args[args.length-1]; if ( Array.isArray(arglist) === false ) { return reflector(...args); } const argBefore = arglist[argpos]; - if ( reCondition.test(argBefore) === false ) { return reflector(...args); } + if ( safe.RegExp_test.call(reCondition, argBefore) === false ) { + return reflector(...args); + } arglist[argpos] = normalValue; safe.uboLog(logPrefix, `Replaced argument:\nBefore: ${JSON.stringify(argBefore)}\nAfter: ${normalValue}`); return reflector(...args); @@ -4830,4 +4835,89 @@ function trustedReplaceOutboundText( }); } +/******************************************************************************* + * + * Reference: + * https://github.com/AdguardTeam/Scriptlets/blob/5a92d79489/wiki/about-trusted-scriptlets.md#trusted-suppress-native-method + * + * This is a first version with current limitations: + * - Does not support matching arguments which are object or array + * - Does not support `stack` parameter + * + * If `signatureStr` parameter is not declared, the scriptlet will log all calls + * to `methodPath` along with the arguments passed and will not prevent the + * trapped method. + * + * */ + +builtinScriptlets.push({ + name: 'trusted-suppress-native-method.js', + requiresTrust: true, + fn: trustedSuppressNativeMethod, + dependencies: [ + 'proxy-apply.fn', + 'safe-self.fn', + ], +}); +function trustedSuppressNativeMethod( + methodPath = '', + signature = '', + how = '', + stack = '' +) { + if ( methodPath === '' ) { return; } + if ( stack !== '' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('trusted-suppress-native-method', methodPath, signature, how); + const signatureArgs = signature.split(/\s*\|\s*/).map(v => { + if ( /^".*"$/.test(v) ) { + return { type: 'pattern', re: safe.patternToRegex(v.slice(1, -1)) }; + } + if ( v === 'false' ) { + return { type: 'exact', value: false }; + } + if ( v === 'true' ) { + return { type: 'exact', value: true }; + } + if ( v === 'null' ) { + return { type: 'exact', value: null }; + } + if ( v === 'undefined' ) { + return { type: 'exact', value: undefined }; + } + }); + const reflector = proxyApplyFn(methodPath, function(...args) { + if ( signature === '' ) { + safe.uboLog(logPrefix, `Arguments:\n${args.join('\n')}`); + return reflector(...args); + } + const arglist = args[args.length-1]; + if ( Array.isArray(arglist) === false ) { + return reflector(...args); + } + if ( arglist.length < signatureArgs.length ) { + return reflector(...args); + } + for ( let i = 0; i < signatureArgs.length; i++ ) { + const signatureArg = signatureArgs[i]; + if ( signatureArg === undefined ) { continue; } + const targetArg = arglist[i]; + if ( signatureArg.type === 'exact' ) { + if ( targetArg !== signatureArg.value ) { + return reflector(...args); + } + } + if ( signatureArg.type === 'pattern' ) { + if ( safe.RegExp_test.call(signatureArg.re, targetArg) === false ) { + return reflector(...args); + } + } + } + safe.uboLog(logPrefix, `Suppressed:\n${args.join('\n')}`); + if ( how === 'abort' ) { + throw new ReferenceError(); + } + }); +} + /******************************************************************************/ From 25f8c03fde49990e926ba6832fc05cef9fbdaa0d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 9 Jul 2024 13:06:31 -0400 Subject: [PATCH 048/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a0b4497d8a1c..d8b94bce1604f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/97d11c03c2) - [Fix distance calculation in picker](https://github.com/gorhill/uBlock/commit/9569969b55) - [Fix bad serialization of Date objects](https://github.com/gorhill/uBlock/commit/c154aaa69c) - [Fix race condition when loading redirect/scriptlet resources](https://github.com/gorhill/uBlock/commit/896737d098) From 2bdbac1b84e6615a80ca2100f94ef594ac599030 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 9 Jul 2024 13:16:17 -0400 Subject: [PATCH 049/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.eu.txt | 6 +-- platform/mv3/description/webstore.id.txt | 2 +- platform/mv3/description/webstore.it.txt | 18 ++++---- platform/mv3/description/webstore.kn.txt | 8 ++-- .../mv3/extension/_locales/it/messages.json | 34 +++++++-------- .../mv3/extension/_locales/kn/messages.json | 8 ++-- .../mv3/extension/_locales/ro/messages.json | 4 +- src/_locales/it/messages.json | 42 +++++++++---------- src/_locales/kn/messages.json | 26 ++++++------ src/_locales/nb/messages.json | 4 +- 10 files changed, 76 insertions(+), 76 deletions(-) diff --git a/platform/mv3/description/webstore.eu.txt b/platform/mv3/description/webstore.eu.txt index 8f15a42a9bec0..f24ed1d5fe65e 100644 --- a/platform/mv3/description/webstore.eu.txt +++ b/platform/mv3/description/webstore.eu.txt @@ -1,6 +1,6 @@ uBO Lite (uBOL) irakargarri blokeatzailea de, baimen gutxiekin eta MV3ean basatua -The default ruleset corresponds to uBlock Origin's default filterset: +Lehenespenez, iragazki-zerrenda hauek ditu konfiguratuta: UblockOrigin-eko filtro lista ZerrendaErraza @@ -17,9 +17,9 @@ However, uBOL allows you to *explicitly* grant extended permissions on specific Leku jakin batean baimenak emateko, ireki panel emergentea eta aukeratu goiko iragazteko modu bat, optimo edo oso gisa. -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. +Nabigatzaileak orduan jakinaraziko dizu zer ondorio dituen luzapenak eskatutako baimen gehigarriak emateak egungo gunean, eta nabigatzaileari esan beharko diozu eskaera onartzen duzun edo uko egiten diozun. -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. +Baimen gehigarrien eskaera onartzen baduzu, oraingo gunean edukiak hobeto iragazi ahal izango ditu. You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. diff --git a/platform/mv3/description/webstore.id.txt b/platform/mv3/description/webstore.id.txt index 33c86b66979cc..8d6c7b8b15376 100644 --- a/platform/mv3/description/webstore.id.txt +++ b/platform/mv3/description/webstore.id.txt @@ -7,7 +7,7 @@ Kumpulan aturan bawaan sesuai dengan kumpulan penyaringan bawaan uBlock Origin: - EasyPrivacy - Daftar server iklan dan pelacak Peter Lowe -kamu dapat menambahkan rulesets di halaman opsi -- klik ikon _Cogs_ di panel popup. +Anda dapat menambahkan ruleset dengan mengunjungi halaman options -- klik ikon _Cogs_ di panel popup. uBOL sepenuhnya deklaratif, yang mana tidak membutuhkan proses permanen uBOL agar penyaringan dapat terjadi, dan penyaringan konten berbasis injeksi CSS/JS dilakukan sepenuhnya oleh peramban itu sendiri ketimbang oleh ekstensi. Ini berarti bahwa uBOL sendiri tidak mengkonsumsi sumber daya CPU/memori selama melakukan pemblokiran konten -- proses pekerja layanan uBOL dibutuhkan _hanya_ ketika Anda berinteraksi dengan panel popup atau opsi halaman. diff --git a/platform/mv3/description/webstore.it.txt b/platform/mv3/description/webstore.it.txt index 0aa86f4f846a6..03f1d7122c32a 100644 --- a/platform/mv3/description/webstore.it.txt +++ b/platform/mv3/description/webstore.it.txt @@ -1,30 +1,30 @@ uBO Lite (uBOL) è un sistema per bloccare contenuti che *non richiede autorizzazioni* basato su MV3. -L'insieme di regole predefinite corrisponde a quello di uBlock Origin: +L'insieme di regole predefinito corrisponde all'insieme di filtri predefinito di uBlock Origin: -- Elenco dei filtri integrati in uBlock Origin +- Liste dei filtri integrati di uBlock Origin - EasyList - EasyPrivacy -- Elenco dei server di tracciatura e pubblicità di Peter Lowe +- Elenco dei server pubblicitari e di tracciamento di Peter Lowe -Puoi aggiungere altre regole nella pagina delle opzioni. Clicca sull'icona _Ingranaggi_ nel pannello a comparsa. +Puoi aggiungere altri insiemi di regole visitando la pagina delle opzioni: clicca sull'icona con gli _Ingranaggi_ nel pannello a comparsa. -uBOL è interamente dichiarativo ovvero non è necessario un processo uBOL permanente per eseguire il filtraggio e il filtraggio dei contenuti CSS/JS inietattai viene eseguito in modo affidabile dal browser stesso piuttosto che dall'estensione. Ciò significa che lo stesso uBOL non consuma risorse di CPU/memoria mentre il blocco dei contenuti è in corso: il processo di lavoro di servizio di uBOL è richiesto _solo_ quando interagisci con il pannello popup o le pagine delle opzioni. +uBOL è interamente dichiarativo, ovvero non è necessario che ci sia un processo di uBOL permanente per poter eseguire il filtraggio; e il filtraggio dei contenuti basato sull'iniezione di elementi CSS/JS viene eseguito in modo affidabile dal browser stesso piuttosto che dall'estensione. Ciò significa che lo stesso uBOL non consuma risorse di CPU o memoria mentre il blocco dei contenuti viene eseguito: il processo che esegue il servizio di uBOL è richiesto _solamente_ quando interagisci con il pannello a comparsa o con le pagine delle opzioni. uBOL non richiede un'ampia autorizzazione di "lettura e modifica dei dati" al momento dell'installazione, da qui le sue capacità limitate rispetto a uBlock Origin o ad altre estensioni che richiedono ampie autorizzazioni di "lettura e modifica dei dati" al momento dell'installazione. Tuttavia, uBOL consente di concedere *esplicitamente* permessi estesi a siti specifici di vostra scelta, in modo da poter filtrare meglio tali siti utilizzando il filtraggio cosmetico e le iniezioni di scriptlet. -Per concedere autorizzazioni estese su un determinato sito, apri il pannello popup e scegli una modalità di filtraggio più restrittiva come Ottimale o Completa. +Per concedere autorizzazioni estese su un determinato sito, apri il pannello popup e scegli una modalità di filtraggio più elevata come Ottimale o Completa. -Il browser ti avviserà degli effetti della concessione delle autorizzazioni aggiuntive richieste dall'estensione sul sito corrente e dovrai comunicare al browser se accetti o rifiuti la richiesta. +Il browser quindi ti avviserà degli effetti della concessione delle autorizzazioni aggiuntive richieste dall'estensione sul sito corrente e dovrai comunicare al browser se accetti o rifiuti la richiesta. -Se accetti la richiesta di uBOL per ulteriori autorizzazioni sul sito corrente, sarà in grado di filtrare meglio i contenuti per il sito corrente. +Se accetti la richiesta di uBOL per autorizzazioni aggiuntive sul sito corrente, esso sarà in grado di filtrare meglio il contenuto per il sito corrente. Puoi impostare la modalità di filtraggio predefinita dalla pagina delle opzioni di uBOL. Se scegli come predefinita la modalità Ottimale o Completa, dovrai concedere a uBOL il permesso di leggere e modificare i dati di tutti i siti web. Tieni presente che questo è ancora un work in progress, con questi obiettivi finali: -- Nessuna autorizzazione host ampia al momento dell'installazione: le autorizzazioni estese vengono concesse esplicitamente dall'utente in base al sito. +- Nessuna autorizzazione estesa degli host al momento dell'installazione; le autorizzazioni estese vengono concesse esplicitamente dall'utente in base al sito. - Interamente dichiarativo per l'affidabilità e l'efficienza della CPU/memoria. diff --git a/platform/mv3/description/webstore.kn.txt b/platform/mv3/description/webstore.kn.txt index e03fa801ee7f0..535ab9a320dc5 100644 --- a/platform/mv3/description/webstore.kn.txt +++ b/platform/mv3/description/webstore.kn.txt @@ -9,9 +9,9 @@ The default ruleset corresponds to uBlock Origin's default filterset: You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. +uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. ಇದರರ್ಥ ವಿಷಯ ನಿರ್ಬಂಧಿಸುವಿಕೆಯು ನಡೆಯುತ್ತಿರುವಾಗ uBOL ಸ್ವತಃ CPU/ಮೆಮೊರಿ ಸಂಪನ್ಮೂಲಗಳನ್ನು ಬಳಸುವುದಿಲ್ಲ -- ನೀವು ಪಾಪ್ಅಪ್ ಪ್ಯಾನೆಲ್ ಅಥವಾ ಆಯ್ಕೆಯ ಪುಟಗಳೊಂದಿಗೆ ಸಂವಹನ ನಡೆಸಿದಾಗ uBOL ನ ಸೇವಾ ವರ್ಕರ್ ಪ್ರಕ್ರಿಯೆಯು _ಮಾತ್ರಾ_ ಅಗತ್ಯವಿದೆ. -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. +uBOL ಗೆ ಅನುಸ್ಥಾಪನೆಯ ಸಮಯದಲ್ಲಿ ವಿಶಾಲವಾದ "ಡೇಟಾವನ್ನು ಓದಲು ಮತ್ತು ಮಾರ್ಪಡಿಸಲು" ಅನುಮತಿಯ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ, ಆದ್ದರಿಂದ uBlock ಮೂಲಕ್ಕೆ ಹೋಲಿಸಿದರೆ ಅದರ ಸೀಮಿತ ಸಾಮರ್ಥ್ಯಗಳು ಅಥವಾ ಅನುಸ್ಥಾಪನೆಯ ಸಮಯದಲ್ಲಿ ವಿಶಾಲವಾದ "ಡೇಟಾವನ್ನು ಓದಲು ಮತ್ತು ಮಾರ್ಪಡಿಸಲು" ಅನುಮತಿಗಳ ಅಗತ್ಯವಿರುವ ಇತರ ವಿಷಯ ಬ್ಲಾಕರ್‌ಗಳಿಗೆ ಹೋಲಿಸಿದರೆ. However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. @@ -21,9 +21,9 @@ The browser will then warn you about the effects of granting the additional perm If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. +You can set the default filtering mode from uBOL's options page. ನೀವು ಆಪ್ಟಿಮಲ್ ಅಥವಾ ಕಂಪ್ಲೀಟ್ ಮೋಡ್ ಅನ್ನು ಡಿಫಾಲ್ಟ್ ಆಗಿ ಆರಿಸಿದರೆ, ಎಲ್ಲಾ ವೆಬ್‌ಸೈಟ್‌ಗಳಲ್ಲಿನ ಡೇಟಾವನ್ನು ಓದಲು ಮತ್ತು ಮಾರ್ಪಡಿಸಲು ನೀವು uBOL ಗೆ ಅನುಮತಿಯನ್ನು ನೀಡಬೇಕಾಗುತ್ತದೆ. -Keep in mind this is still a work in progress, with these end goals: +ಈ ಅಂತಿಮ ಗುರಿಗಳೊಂದಿಗೆ ಇದು ಇನ್ನೂ ಪ್ರಗತಿಯಲ್ಲಿದೆ ಎಂಬುದನ್ನು ನೆನಪಿನಲ್ಲಿಡಿ: - No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index beea941700736..cf3082df674f6 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -8,7 +8,7 @@ "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} Regole, convertite da {{filterCount}} filtri di rete", + "message": "{{ruleCount}} regole, convertite da {{filterCount}} filtri di rete", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { @@ -60,15 +60,15 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Disturbi", + "message": "Elementi fastidiosi", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Generici", + "message": "Varie", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Lingue e regioni", + "message": "Regioni, lingue", "description": "Header for a ruleset section in 'Filter lists pane'" }, "aboutChangelog": { @@ -92,27 +92,27 @@ "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Elenco filtri", + "message": "Liste dei filtri", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "Dipendenze esterne (in linea con la GPL v3):", + "message": "Dipendenze esterne (GPLv3-compatibili):", "description": "Shown in the About pane" }, "firstRunSectionLabel": { - "message": "Ciao", + "message": "Benvenuto", "description": "The header text for the welcome message section" }, "firstRunDescription": { - "message": "Hai installato uBO Lite. Scegli il filtro predefinito da usare ovunque.\n\nL'impostazione di fabbrica prevede la modalità Basilare che non richiede alcun tipo di autorizzazione. Puoi decidere di attivare il filtro avanzato se vuoi concedere a uBO Lite l'autorizzazione a rielaborare i dati di tutti i siti web che visiti, in modo da avere un sistema di filtraggio con altre funzioni in più.", + "message": "Hai appena installato uBO Lite. Qui puoi scegliere la modalità di filtraggio predefinita da utilizzare su tutti i siti web.\n\nPer impostazione predefinita, viene selezionata la modalità Basilare, perché non richiede l'autorizzazione per leggere e modificare i dati. Se ti fidi di uBO Lite, puoi concedergli un'ampia autorizzazione per leggere e modificare i dati su tutti i siti web, in modo da abilitare capacitità di filtraggio più avanzate per tutti i siti web in modo predefinito.", "description": "Descriptive text shown at first install time only " }, "defaultFilteringModeSectionLabel": { - "message": "Filtro predefinito", + "message": "Modalità di filtraggio predefinita", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "Il filtraggio predefinito può essere sostituito dal filtraggio personalizzato. Puoi regolare il filtraggio per ogni singolo sito web al fine di ottenere il risultato migliore. Ognuno dei filtraggi presenta vantaggi e svantaggi.", + "message": "La modalità di filtraggio predefinita sarà sovrascritta dalle modalità di filtraggio per sito web. È possibile regolare la modalità di filtraggio su un determinato sito web in base alla modalità che funziona meglio su quel sito. Ogni modalità presenta vantaggi e svantaggi.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { @@ -120,7 +120,7 @@ "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "di base", + "message": "basilare", "description": "Name of blocking mode 1" }, "filteringMode2Name": { @@ -132,19 +132,19 @@ "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Filtro di rete basilare basato su un elenco selezionato di filtri.\n\nNon servono autorizzazioni per rielaborare i dati dei siti web.", + "message": "Filtraggio di rete di base da liste di filtri selezionate.\n\nNon richiede l'autorizzazione per leggere e modificare i dati sui siti web.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Filtro di rete avanzato in aggiunta al filtro avanzato basato su un elenco selezionato di filtri.\n\nRichiede delle autorizzazioni specifiche per rielaborare i dati dei siti web.", + "message": "Filtraggio di rete avanzato più un filtraggio esteso specifico da liste di filtri selezionate.\n\nRichiede un'ampia autorizzazione per leggere e modificare i dati su tutti i siti web.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Filtro avanzato di rete in aggiunta al filtro esteso basato su un elenco selezionato di filtri.\n\nRichiede autorizzazioni estese per leggere e modificare i dati da ogni sito web.\n\nIl filtro esteso richiede più memoria e un maggiore impegno del processore.", + "message": "Filtraggio di rete avanzato più un filtraggio esteso specifico e generico da liste di filtri selezionate.\n\nRichiede un'ampia autorizzazione per leggere e modificare i dati su tutti i siti web.\n\nIl filtraggio esteso generico può causare un maggiore utilizzo delle risorse della pagina web.", "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Elenco degli host per i quali non viene effettuato nessun filtraggio", + "message": "Lista dei nomi host per i quali non verrà effettuato alcun filtraggio.", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { @@ -152,11 +152,11 @@ "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Ricarica la pagina quando scegli un altro metodo di filtraggio", + "message": "Ricarica la pagina automaticamente quando cambi la modalità di filtraggio", "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { - "message": "Mostra il numero di richieste bloccate sull'icona nella barra degli strumenti", + "message": "Mostra il numero delle richieste bloccate sull'icona nella barra degli strumenti", "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 30c578f94ffdd..7fc46b9e67b1d 100644 --- a/platform/mv3/extension/_locales/kn/messages.json +++ b/platform/mv3/extension/_locales/kn/messages.json @@ -28,7 +28,7 @@ "description": "Link to privacy policy on GitHub (English)" }, "popupFilteringModeLabel": { - "message": "filtering mode", + "message": "ಫಿಲ್ಟರಿಂಗ್ ಮೋಡ್", "description": "Label in the popup panel for the current filtering mode" }, "popupTipDashboard": { @@ -104,7 +104,7 @@ "description": "The header text for the welcome message section" }, "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", + "message": "ನೀವು ಈಗಷ್ಟೇ uBO Lite ಅನ್ನು ಸ್ಥಾಪಿಸಿರುವಿರಿ. ಇಲ್ಲಿ ನೀವು ಎಲ್ಲಾ ವೆಬ್‌ಸೈಟ್‌ಗಳಲ್ಲಿ ಬಳಸಲು ಡಿಫಾಲ್ಟ್ ಫಿಲ್ಟರಿಂಗ್ ಮೋಡ್ ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಬಹುದು.\n\nಪೂರ್ವನಿಯೋಜಿತವಾಗಿ, ಸಾಮಾನ್ಯ ಮೋಡ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ ಏಕೆಂದರೆ ಇದು ಡೇಟಾವನ್ನು ಓದಲು ಮತ್ತು ಮಾರ್ಪಡಿಸಲು ಅನುಮತಿಯ ಅಗತ್ಯವಿಲ್ಲ. ನೀವು uBO Lite ಅನ್ನು ನಂಬುತ್ತಿದ್ದರೆ, ಡೀಫಾಲ್ಟ್ ಆಗಿ ಎಲ್ಲಾ ವೆಬ್‌ಸೈಟ್‌ಗಳಿಗೆ ಹೆಚ್ಚು ಸುಧಾರಿತ ಫಿಲ್ಟರಿಂಗ್ ಸಾಮರ್ಥ್ಯಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ಎಲ್ಲಾ ವೆಬ್‌ಸೈಟ್‌ಗಳಲ್ಲಿನ ಡೇಟಾವನ್ನು ಓದಲು ಮತ್ತು ಮಾರ್ಪಡಿಸಲು ನೀವು ವಿಶಾಲವಾದ ಅನುಮತಿಯನ್ನು ನೀಡಬಹುದು.", "description": "Descriptive text shown at first install time only " }, "defaultFilteringModeSectionLabel": { @@ -124,7 +124,7 @@ "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "ಸೂಕ್ತ", "description": "Name of blocking mode 2" }, "filteringMode3Name": { @@ -148,7 +148,7 @@ "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "ನಡವಳಿಕೆ", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { diff --git a/platform/mv3/extension/_locales/ro/messages.json b/platform/mv3/extension/_locales/ro/messages.json index 70f9bf60ed171..ec8228953b77f 100644 --- a/platform/mv3/extension/_locales/ro/messages.json +++ b/platform/mv3/extension/_locales/ro/messages.json @@ -8,7 +8,7 @@ "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} de reguli convertite din {{filterCount}} filtre de rețea", + "message": "{{ruleCount}} de reguli, convertite din {{filterCount}} filtre de rețea", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { @@ -156,7 +156,7 @@ "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { - "message": "Show the number of blocked requests on the toolbar icon", + "message": "Arată numărul cererilor blocate pe simbolul extensiei", "description": "Label for a checkbox in the options page" } } diff --git a/src/_locales/it/messages.json b/src/_locales/it/messages.json index c87a90ff97181..726c6085ae0d1 100644 --- a/src/_locales/it/messages.json +++ b/src/_locales/it/messages.json @@ -380,7 +380,7 @@ "description": "" }, "settingsNoLargeMediaPrompt": { - "message": "Blocca elementi multimediali maggiori di {{input}} KB", + "message": "Blocca gli elementi multimediali di dimensioni maggiori di {{input}} KB", "description": "" }, "settingsNoRemoteFontsPrompt": { @@ -404,7 +404,7 @@ "description": "Section for controlling advanced-user settings" }, "settingsAdvancedSynopsis": { - "message": "Caratteristiche adatte solo ad utenti tecnici.", + "message": "Funzionalità adatte solo per gli utenti tecnici.", "description": "Description of section controlling advanced-user settings" }, "settingsAdvancedUserSettings": { @@ -440,11 +440,11 @@ "description": "A button in the in the _3rd-party filters_ pane" }, "3pParseAllABPHideFiltersPrompt1": { - "message": "Analizza e applica filtri cosmetici", + "message": "Analizza e applica i filtri cosmetici", "description": "English: Parse and enforce Adblock+ element hiding filters." }, "3pParseAllABPHideFiltersInfo": { - "message": "\nI filtri cosmetici servono a nascondere gli elementi in una pagina web che sono considerati un fastidio visivo, e che non possono essere bloccati dai motori di filtraggio basati sulla richiesta di rete.", + "message": "\nI filtri cosmetici servono a nascondere gli elementi in una pagina web che sono considerati visivamente fastidiosi e che non possono essere bloccati dai motori di filtraggio basati sulle richieste di rete.", "description": "Describes the purpose of the 'Parse and enforce cosmetic filters' feature." }, "3pIgnoreGenericCosmeticFilters": { @@ -456,7 +456,7 @@ "description": "Describes the purpose of the 'Ignore generic cosmetic filters' feature." }, "3pSuspendUntilListsAreLoaded": { - "message": "Sospendi l'attività di rete finché non vengono caricate tutte le liste filtri", + "message": "Sospendi l'attività di rete finché tutte le liste dei filtri sono caricate", "description": "A checkbox in the 'Filter lists' pane" }, "3pListsOfBlockedHostsHeader": { @@ -480,15 +480,15 @@ "description": "Filter lists section name" }, "3pGroupMalware": { - "message": "Domini con Malware", + "message": "Protezione dai malware, sicurezza", "description": "Filter lists section name" }, "3pGroupSocial": { - "message": "Widget sociali", + "message": "Widget dei social", "description": "Filter lists section name" }, "3pGroupCookies": { - "message": "Avviso sui cookie", + "message": "Avvisi sui cookie", "description": "Filter lists section name" }, "3pGroupAnnoyances": { @@ -512,7 +512,7 @@ "description": "The label for the checkbox used to import external filter lists" }, "3pExternalListsHint": { - "message": "Un URL per riga. URL non validi verranno silenziosamente ignorati.", + "message": "Un URL per riga. Gli URL non validi saranno silenziosamente ignorati.", "description": "Short information about how to use the textarea to import external filter lists by URL" }, "3pExternalListObsolete": { @@ -536,7 +536,7 @@ "description": "used as a tooltip for error icon beside a list" }, "1pTrustWarning": { - "message": "Non aggiungere filtri da fonti non attendibili.", + "message": "Non aggiungere filtri da fonti non affidabili.", "description": "Warning against copy-pasting filters from random sources" }, "1pEnableMyFiltersLabel": { @@ -688,7 +688,7 @@ "description": "Tooltip for the popup panel button in the logger page" }, "loggerInfoTip": { - "message": "uBlock Origin Wiki: Registro", + "message": "Wiki di uBlock Origin: Il registro", "description": "Tooltip for the top-right info label in the logger page" }, "loggerClearTip": { @@ -836,7 +836,7 @@ "description": "Below this sentence, the filter list(s) in which the filter was found" }, "loggerStaticFilteringFinderSentence2": { - "message": "Non è stato possibile trovare il filtro statico in nessuno degli elenchi di filtri attualmente abilitati", + "message": "Non è stato possibile trovare il filtro statico in alcuna delle liste dei filtri attualmente abilitate", "description": "Message to show when a filter cannot be found in any filter lists" }, "loggerSettingDiscardPrompt": { @@ -932,7 +932,7 @@ "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS3P2": { - "message": "Importante: Evita di utilizzare altre estensioni simili insieme a uBlock Origin, poiché ciò potrebbe causare problemi di filtro su specifici siti.", + "message": "Importante: Evita di utilizzare altre estensioni simili insieme a uBlock Origin, poiché ciò potrebbe causare problemi di filtraggio su specifici siti.", "description": "Second paragraph of 'Filter issues' section in Support pane" }, "supportS3P3": { @@ -952,7 +952,7 @@ "description": "Header of 'Troubleshooting Information' section in Support pane" }, "supportS5P1": { - "message": "Di seguito sono riportate le informazioni tecniche che potrebbero essere utili quando i volontari stanno cercando di aiutarti a risolvere un problema.", + "message": "Di seguito sono riportate informazioni tecniche che potrebbero essere utili quando i volontari cercheranno di aiutarti a risolvere un problema.", "description": "First paragraph of 'Troubleshooting Information' section in Support pane" }, "supportS5P2": { @@ -1024,11 +1024,11 @@ "description": "Text for 'Unredact' button" }, "aboutPrivacyPolicy": { - "message": "Codice di condotta sulla privacy", + "message": "Informativa sulla privacy", "description": "Link to privacy policy on GitHub (English)" }, "aboutChangelog": { - "message": "Changelog", + "message": "Registro delle modifiche", "description": "" }, "aboutCode": { @@ -1072,7 +1072,7 @@ "description": "English: my-ublock-backup_{{datetime}}.txt" }, "aboutRestoreDataButton": { - "message": "Ripristina configurazione", + "message": "Ripristina dal file...", "description": "English: Restore from file..." }, "aboutResetDataButton": { @@ -1168,7 +1168,7 @@ "description": "English: Close this window" }, "docblockedDontWarn": { - "message": "Non avvisarmi più per questo sito", + "message": "Non avvisarmi di nuovo riguardo questo sito", "description": "Label for checkbox in document-blocked page" }, "docblockedProceed": { @@ -1240,7 +1240,7 @@ "description": "A context menu entry, present when large media elements have been blocked on the current site" }, "contextMenuViewSource": { - "message": "Visualizza origine...", + "message": "Visualizza il codice sorgente…", "description": "A context menu entry, to view the source code of the target resource" }, "shortcutCapturePlaceholder": { @@ -1260,7 +1260,7 @@ "description": "Label for buttons used to select all text in editor" }, "toggleCosmeticFiltering": { - "message": "Attiva/Disattiva filtri cosmetici", + "message": "Attiva/Disattiva il filtraggio cosmetico", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, "toggleJavascript": { @@ -1296,7 +1296,7 @@ "description": "Summary of number of errors as reported by the linter " }, "unprocessedRequestTooltip": { - "message": "Non è stato possibile filtrare correttamente all'avvio del browser.\nRicaricare la pagina per garantire un filtraggio corretto", + "message": "Non è stato effettuato correttamente il filtraggio all'avvio del browser.\nRicarica la pagina per garantire un filtraggio adeguato.", "description": "A warning which will appear in the popup panel if needed" }, "dummy": { diff --git a/src/_locales/kn/messages.json b/src/_locales/kn/messages.json index 7ae8e6ff84e0a..eed3253f2c98b 100644 --- a/src/_locales/kn/messages.json +++ b/src/_locales/kn/messages.json @@ -72,7 +72,7 @@ "description": "English: Click: disable/enable uBlock₀ for this site.\n\nCtrl+click: disable uBlock₀ only on this page." }, "popupPowerSwitchInfo1": { - "message": "Click to disable uBlock₀ for this site.\n\nCtrl+click to disable uBlock₀ only on this page.", + "message": "ಈ ಸೈಟ್‌ಗಾಗಿ uBlock₀ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ.\n\nಈ ಪುಟದಲ್ಲಿ ಮಾತ್ರ uBlock₀ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು Ctrl+ಕ್ಲಿಕ್ ಮಾಡಿ.", "description": "Message to be read by screen readers" }, "popupPowerSwitchInfo2": { @@ -116,7 +116,7 @@ "description": "English: Click to open the dashboard" }, "popupTipZapper": { - "message": "Enter element zapper mode", + "message": "Element zapper ಮೋಡ್ ಅನ್ನು ಬಳಸಿ", "description": "Tooltip for the element-zapper icon in the popup panel" }, "popupTipPicker": { @@ -136,15 +136,15 @@ "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups1": { - "message": "Click to block all popups on this site", + "message": "ಈ ಸೈಟ್‌ನಲ್ಲಿ ಎಲ್ಲಾ ಪಾಪ್‌ಅಪ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups2": { - "message": "Click to no longer block all popups on this site", + "message": "ಈ ಸೈಟ್‌ನಲ್ಲಿ ಇನ್ನು ಮುಂದೆ ಎಲ್ಲಾ ಪಾಪ್‌ಅಪ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸದಿರಲು ಕ್ಲಿಕ್ ಮಾಡಿ", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoLargeMedia": { - "message": "Toggle the blocking of large media elements for this site", + "message": "ಈ ಸೈಟ್‌ಗಾಗಿ ದೊಡ್ಡ ಮಾಧ್ಯಮ ಅಂಶಗಳ ನಿರ್ಬಂಧಿಸುವಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia1": { @@ -188,15 +188,15 @@ "description": "Tooltip for the no-scripting per-site switch" }, "popupNoPopups_v2": { - "message": "Pop-up windows", + "message": "ಪಾಪ್-ಅಪ್ ವಿಂಡೋ", "description": "Caption for the no-popups per-site switch" }, "popupNoLargeMedia_v2": { - "message": "Large media elements", + "message": "ದೊಡ್ಡ ಮಾಧ್ಯಮ ಅಂಶಗಳು", "description": "Caption for the no-large-media per-site switch" }, "popupNoCosmeticFiltering_v2": { - "message": "Cosmetic filtering", + "message": "ಕಾಸ್ಮೆಟಿಕ್ ಫಿಲ್ಟರಿಂಗ್", "description": "Caption for the no-cosmetic-filtering per-site switch" }, "popupNoRemoteFonts_v2": { @@ -224,11 +224,11 @@ "description": "Tooltip when hovering the top-most cell of the local-rules column." }, "popupTipSaveRules": { - "message": "Click to make your changes permanent.", + "message": "ಶಾಶ್ವತ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಲು ಕ್ಲಿಕ್ ಮಾಡಿ", "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." }, "popupTipRevertRules": { - "message": "Click to revert your changes.", + "message": "ನಿಮ್ಮ ಬದಲಾವಣೆಗಳನ್ನು ಹಿಂತಿರುಗಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ", "description": "Tooltip when hovering over the eraser in the dynamic filtering pane." }, "popupAnyRulePrompt": { @@ -864,7 +864,7 @@ "description": "Logger settings: a sentence to describe the purpose of the checkboxes below" }, "loggerSettingHideColumnTime": { - "message": "{{input}} Time", + "message": "{{input}} ಗಂಟೆ", "description": "A label for the time column" }, "loggerSettingHideColumnFilter": { @@ -1144,7 +1144,7 @@ "description": "Used as a title for the document-blocked page" }, "docblockedPrompt1": { - "message": "uBlock Origin has prevented the following page from loading:", + "message": "uBlock Origin ಈ ಕೆಳಗಿನ ಪುಟವನ್ನು ಲೋಡ್ ಮಾಡುವುದನ್ನು ತಡೆಯುತ್ತದೆ:", "description": "Used in the strict-blocking page" }, "docblockedPrompt2": { @@ -1272,7 +1272,7 @@ "description": "Label for keyboard shortcut used to relax blocking mode" }, "storageUsed": { - "message": "Storage used: {{value}} {{unit}}", + "message": "ಉಪಯೊಗಿಸುತಿರುವ ಸಂಗ್ರಹಣೆ: {{value}} {{unit}}", "description": " In Setting pane, renders as (example): Storage used: 13.2 MB" }, "KB": { diff --git a/src/_locales/nb/messages.json b/src/_locales/nb/messages.json index 6451d65426f51..5baaf48f039c0 100644 --- a/src/_locales/nb/messages.json +++ b/src/_locales/nb/messages.json @@ -484,11 +484,11 @@ "description": "Filter lists section name" }, "3pGroupSocial": { - "message": "Sosiale medie-widgeter", + "message": "Sosiale mediers moduler", "description": "Filter lists section name" }, "3pGroupCookies": { - "message": "Cookie meldinger", + "message": "Infokapselmeldinger", "description": "Filter lists section name" }, "3pGroupAnnoyances": { From 462a4e0304e1c87ea88bc4acb9dad3817dedd6b6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 9 Jul 2024 13:16:54 -0400 Subject: [PATCH 050/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 2e21c3e9f0304..9c665a56e3e9a 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.12 \ No newline at end of file +1.58.1.100 \ No newline at end of file From e3b71a586183b0a8b984d93bcd5be58ab109f462 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 9 Jul 2024 13:25:30 -0400 Subject: [PATCH 051/553] 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 cb8dce834d762..4a93bdcf5dffd 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.12", + "version": "1.58.1.100", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1b12/uBlock0_1.58.1b12.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc0/uBlock0_1.58.1rc0.firefox.signed.xpi" } ] } From b98ef8141a27b1f6509be1af580d8fe11869ae0f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 10 Jul 2024 10:09:59 -0400 Subject: [PATCH 052/553] Fix CSP injection in non-document resources Related feedback: https://github.com/uBlockOrigin/uBlock-issues/issues/229#issuecomment-2220354261 https://old.reddit.com/r/uBlockOrigin/comments/1dz6du7/ Regression from: https://github.com/gorhill/uBlock/commit/7c3e060c01 --- src/js/traffic.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/js/traffic.js b/src/js/traffic.js index f28f57fbbb366..f8e98b8988311 100644 --- a/src/js/traffic.js +++ b/src/js/traffic.js @@ -945,6 +945,10 @@ const bodyFilterer = (( ) => { /******************************************************************************/ const injectCSP = function(fctxt, pageStore, responseHeaders) { + // https://github.com/uBlockOrigin/uBlock-issues/issues/229#issuecomment-2220354261 + // Inject CSP in document resource only + if ( fctxt.isDocument() === false ) { return; } + const cspSubsets = []; const requestType = fctxt.type; From 6fb697b490a98b14ee9581b2d96a3937a666e759 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 10 Jul 2024 10:16:17 -0400 Subject: [PATCH 053/553] Update changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8b94bce1604f..c9ee9002e224e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ +- [Fix CSP injection in non-document resources](https://github.com/gorhill/uBlock/commit/b98ef8141a) - [Add `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/97d11c03c2) +- [Add support for `$currentISODate$` in `trusted-set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/a3576ea651) +- [Add `essential` and `nonessential` to set-cookie](https://github.com/gorhill/uBlock/commit/37d31a82d8) (by @ryanbr) - [Fix distance calculation in picker](https://github.com/gorhill/uBlock/commit/9569969b55) - [Fix bad serialization of Date objects](https://github.com/gorhill/uBlock/commit/c154aaa69c) - [Fix race condition when loading redirect/scriptlet resources](https://github.com/gorhill/uBlock/commit/896737d098) @@ -6,7 +9,7 @@ - [Add `:matches-prop()` pseudo CSS operator](https://github.com/gorhill/uBlock/commit/aca7674bac) - [Improve `set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/b4d8750f44) - [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/cb0f65e035) -- [Improve `trusted-replace-[fetch|xhr]-response` scriptlets](https://github.com/gorhill/uBlock/commit/9072772f61) +- [Improve `trusted-replace-(fetch|xhr)-response` scriptlets](https://github.com/gorhill/uBlock/commit/9072772f61) - [Improve `prevent-addEventListener` scriptlet](https://github.com/gorhill/uBlock/commit/91ee5bdeae) - [Add `isodate` as available placeholder for auto-comment](https://github.com/gorhill/uBlock/commit/d5208ee5dd) - [Improve `trusted-replace-outbound-text` scriptlet](https://github.com/gorhill/uBlock/commit/fa6740a059) From 282f4f5ef4c9c83ab8fb786ffc8d072a4ade7f97 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 10 Jul 2024 10:28:29 -0400 Subject: [PATCH 054/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 9c665a56e3e9a..f537e472ff8fc 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.100 \ No newline at end of file +1.58.1.101 \ No newline at end of file From 9c1252ef9c537de4a821ff5167201707c87cdb7e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 10 Jul 2024 10:35:31 -0400 Subject: [PATCH 055/553] 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 4a93bdcf5dffd..197cf0b3e2751 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.100", + "version": "1.58.1.101", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc0/uBlock0_1.58.1rc0.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc1/uBlock0_1.58.1rc1.firefox.signed.xpi" } ] } From c90f4933df193f90624dff6a7da75c4c6f88ef49 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 10 Jul 2024 11:41:55 -0400 Subject: [PATCH 056/553] Fix CSP/PP header injection in non-document resources Related feedback: https://github.com/uBlockOrigin/uBlock-issues/issues/229#issuecomment-2220354261 https://old.reddit.com/r/uBlockOrigin/comments/1dz6du7/ Regression from: https://github.com/gorhill/uBlock/commit/7c3e060c01 --- src/js/traffic.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/js/traffic.js b/src/js/traffic.js index f8e98b8988311..4777a847004e0 100644 --- a/src/js/traffic.js +++ b/src/js/traffic.js @@ -553,11 +553,16 @@ const onHeadersReceived = function(details) { if ( httpheaderFilteringEngine.apply(fctxt, responseHeaders) === true ) { modifiedHeaders = true; } - if ( injectCSP(fctxt, pageStore, responseHeaders) === true ) { - modifiedHeaders = true; - } - if ( injectPP(fctxt, pageStore, responseHeaders) === true ) { - modifiedHeaders = true; + + // https://github.com/uBlockOrigin/uBlock-issues/issues/229#issuecomment-2220354261 + // Inject CSP/PP in document resource only + if ( fctxt.isDocument() ) { + if ( injectCSP(fctxt, pageStore, responseHeaders) === true ) { + modifiedHeaders = true; + } + if ( injectPP(fctxt, pageStore, responseHeaders) === true ) { + modifiedHeaders = true; + } } // https://bugzilla.mozilla.org/show_bug.cgi?id=1376932 @@ -945,10 +950,6 @@ const bodyFilterer = (( ) => { /******************************************************************************/ const injectCSP = function(fctxt, pageStore, responseHeaders) { - // https://github.com/uBlockOrigin/uBlock-issues/issues/229#issuecomment-2220354261 - // Inject CSP in document resource only - if ( fctxt.isDocument() === false ) { return; } - const cspSubsets = []; const requestType = fctxt.type; From 60a7812d7eb7fa69fa8f46bd2c468c0e8a2ffe66 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 10 Jul 2024 11:45:25 -0400 Subject: [PATCH 057/553] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9ee9002e224e..8abfe8134872d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -- [Fix CSP injection in non-document resources](https://github.com/gorhill/uBlock/commit/b98ef8141a) +- [Fix CSP/PP header injection in non-document resources](https://github.com/gorhill/uBlock/commit/c90f4933df) - [Add `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/97d11c03c2) - [Add support for `$currentISODate$` in `trusted-set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/a3576ea651) - [Add `essential` and `nonessential` to set-cookie](https://github.com/gorhill/uBlock/commit/37d31a82d8) (by @ryanbr) From dea9e77e2765a29c55a2cfe9e82614ae232cbb48 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 10 Jul 2024 11:46:00 -0400 Subject: [PATCH 058/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index f537e472ff8fc..68feaf13eeb88 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.101 \ No newline at end of file +1.58.1.102 \ No newline at end of file From 569c8cbe04e2ef9f8f58f5e1b9c68f3bc707a7e3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 10 Jul 2024 11:50:30 -0400 Subject: [PATCH 059/553] 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 197cf0b3e2751..93df6326aa848 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.101", + "version": "1.58.1.102", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc1/uBlock0_1.58.1rc1.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc2/uBlock0_1.58.1rc2.firefox.signed.xpi" } ] } From 66e3a1ad47162a89709e99072e5eaecdd83cb633 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 10 Jul 2024 12:43:36 -0400 Subject: [PATCH 060/553] Improve `href-sanitizer` scriptlet Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3297 Mind that the sanitized URL can have Unicode characters beyond ASCII. --- assets/resources/scriptlets.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 80c251fb58f5d..d3aedadc20f6c 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -3477,7 +3477,7 @@ function hrefSanitizer( }; const validateURL = text => { if ( text === '' ) { return ''; } - if ( /[^\x21-\x7e]/.test(text) ) { return ''; } + if ( /[\x00-\x20\x7f]/.test(text) ) { return ''; } try { const url = new URL(text, document.location); return url.href; From 7fbf792ba0db1edc4d33c0d6ba50f7e1bbde8567 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 11 Jul 2024 11:04:07 -0400 Subject: [PATCH 061/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8abfe8134872d..fb83f330008fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/66e3a1ad47) - [Fix CSP/PP header injection in non-document resources](https://github.com/gorhill/uBlock/commit/c90f4933df) - [Add `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/97d11c03c2) - [Add support for `$currentISODate$` in `trusted-set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/a3576ea651) From 23b0e08715a2b100dbfd79b7227ac5e1343e0f47 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 11 Jul 2024 11:04:34 -0400 Subject: [PATCH 062/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 68feaf13eeb88..5f0b49db6484c 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.102 \ No newline at end of file +1.58.1.103 \ No newline at end of file From a54d416143b89f26417393fde76de078dc0b1dc8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 11 Jul 2024 11:55:39 -0400 Subject: [PATCH 063/553] 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 93df6326aa848..7873e2f4f5482 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.102", + "version": "1.58.1.103", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc2/uBlock0_1.58.1rc2.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc3/uBlock0_1.58.1rc3.firefox.signed.xpi" } ] } From e785b99338ea364ed1b618cbc2b471ff065b15f3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 13 Jul 2024 11:02:54 -0400 Subject: [PATCH 064/553] Improve `prevent-fetch` scriptlet Related discussion: https://github.com/uBlockOrigin/uBlock-discussions/discussions/848#discussioncomment-10027757 Added support for AdGuard's `responseType` parameter. Extended the meaning of that 3rd parameter to also be a JSON string with properties to set on the returned response instance. Currently supported properties: - `ok`, supported values: `false`, `true` - `type, supported values: `"basic"`, `"cors"`, `"opaque"` Reference: https://github.com/AdguardTeam/Scriptlets/blob/master/wiki/about-scriptlets.md#-%EF%B8%8F-prevent-fetch --- assets/resources/scriptlets.js | 51 +++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index d3aedadc20f6c..f753ba5a89684 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -57,6 +57,7 @@ function safeSelf() { 'Math_random': Math.random, 'Object': Object, 'Object_defineProperty': Object.defineProperty.bind(Object), + 'Object_defineProperties': Object.defineProperties.bind(Object), 'Object_fromEntries': Object.fromEntries.bind(Object), 'Object_getOwnPropertyDescriptor': Object.getOwnPropertyDescriptor.bind(Object), 'RegExp': self.RegExp, @@ -2067,11 +2068,11 @@ builtinScriptlets.push({ }); function noFetchIf( propsToMatch = '', - responseBody = '' + responseBody = '', + responseType = '' ) { - if ( typeof propsToMatch !== 'string' ) { return; } const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('prevent-fetch', propsToMatch, responseBody); + const logPrefix = safe.makeLogPrefix('prevent-fetch', propsToMatch, responseBody, responseType); const needles = []; for ( const condition of propsToMatch.split(/\s+/) ) { if ( condition === '' ) { continue; } @@ -2086,6 +2087,26 @@ function noFetchIf( } needles.push({ key, re: safe.patternToRegex(value) }); } + const validResponseProps = { + ok: [ false, true ], + type: [ 'basic', 'cors', 'opaque' ], + }; + let responseProps; + if ( /^\{.*\}$/.test(responseType) ) { + responseProps = {}; + try { + Object.entries(JSON.parse(responseType)).forEach(([ p, v ]) => { + if ( validResponseProps[p] === undefined ) { return; } + if ( validResponseProps[p].includes(v) === false ) { return; } + responseProps[p] = { value: v }; + }); + } + catch(ex) {} + } else if ( responseType !== '' ) { + if ( validResponseProps.type.includes(responseType) ) { + responseProps = { type: { value: responseType } }; + } + } self.fetch = new Proxy(self.fetch, { apply: function(target, thisArg, args) { const details = args[0] instanceof self.Request @@ -2123,17 +2144,6 @@ function noFetchIf( if ( proceed ) { return Reflect.apply(target, thisArg, args); } - let responseType = ''; - if ( details.mode === undefined || details.mode === 'cors' ) { - try { - const desURL = new URL(details.url); - responseType = desURL.origin !== document.location.origin - ? 'cors' - : 'basic'; - } catch(ex) { - safe.uboErr(logPrefix, `Error: ${ex}`); - } - } return generateContentFn(responseBody).then(text => { safe.uboLog(logPrefix, `Prevented with response "${text}"`); const response = new Response(text, { @@ -2142,14 +2152,11 @@ function noFetchIf( 'Content-Length': text.length, } }); - safe.Object_defineProperty(response, 'url', { - value: details.url - }); - if ( responseType !== '' ) { - safe.Object_defineProperty(response, 'type', { - value: responseType - }); - } + const props = Object.assign( + { url: { value: details.url } }, + responseProps + ); + safe.Object_defineProperties(response, props); return response; }); } From b9717555c32c09dcc3c74e63868fa3d1409316a2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 13 Jul 2024 11:09:53 -0400 Subject: [PATCH 065/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb83f330008fa..69451674bcb14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `prevent-fetch` scriptlet](https://github.com/gorhill/uBlock/commit/e785b99338) - [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/66e3a1ad47) - [Fix CSP/PP header injection in non-document resources](https://github.com/gorhill/uBlock/commit/c90f4933df) - [Add `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/97d11c03c2) From 302ddad720cfae2b5ed0c1eb27ca7b12dfc1fcc6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 13 Jul 2024 11:10:16 -0400 Subject: [PATCH 066/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 5f0b49db6484c..bbe1b5e2df417 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.103 \ No newline at end of file +1.58.1.104 \ No newline at end of file From 324102cb659a23cacca71fd8c8f7d42b34722bb5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 13 Jul 2024 11:16:01 -0400 Subject: [PATCH 067/553] 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 7873e2f4f5482..b81090881e13e 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.103", + "version": "1.58.1.104", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc3/uBlock0_1.58.1rc3.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc4/uBlock0_1.58.1rc4.firefox.signed.xpi" } ] } From 9ce30563613495f5b609211c017aed580847a9cf Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 14 Jul 2024 12:15:53 -0400 Subject: [PATCH 068/553] Improve `prevent-fetch` scriptlet Add `statusText` as overridable property in response instance. Supported values are: `""`, `"Not Found"`. `statusText` defaults to `"OK"` when not overridden. --- assets/resources/scriptlets.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index f753ba5a89684..ab98966a14f81 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -2089,11 +2089,13 @@ function noFetchIf( } const validResponseProps = { ok: [ false, true ], - type: [ 'basic', 'cors', 'opaque' ], + statusText: [ '', 'Not Found' ], + type: [ 'basic', 'cors', 'default', 'error', 'opaque' ], + }; + const responseProps = { + statusText: { value: 'OK' }, }; - let responseProps; if ( /^\{.*\}$/.test(responseType) ) { - responseProps = {}; try { Object.entries(JSON.parse(responseType)).forEach(([ p, v ]) => { if ( validResponseProps[p] === undefined ) { return; } @@ -2104,7 +2106,7 @@ function noFetchIf( catch(ex) {} } else if ( responseType !== '' ) { if ( validResponseProps.type.includes(responseType) ) { - responseProps = { type: { value: responseType } }; + responseProps.type = { value: responseType }; } } self.fetch = new Proxy(self.fetch, { @@ -2147,7 +2149,6 @@ function noFetchIf( return generateContentFn(responseBody).then(text => { safe.uboLog(logPrefix, `Prevented with response "${text}"`); const response = new Response(text, { - statusText: 'OK', headers: { 'Content-Length': text.length, } From 68e81f640c3476fa7c3a7d028fc7c82a5a40c17e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 14 Jul 2024 17:44:52 -0400 Subject: [PATCH 069/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index bbe1b5e2df417..cabaf898c1449 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.104 \ No newline at end of file +1.58.1.105 \ No newline at end of file From fd054176a86c6dc4f6ca8d6debb3744b81e896be Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 15 Jul 2024 16:05:30 -0400 Subject: [PATCH 070/553] 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 b81090881e13e..e054b9642f560 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.104", + "version": "1.58.1.105", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc4/uBlock0_1.58.1rc4.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc5/uBlock0_1.58.1rc5.firefox.signed.xpi" } ] } From 77feb25c4d4d8a815da991b252ef2b1bbdbfd78c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 17 Jul 2024 09:36:55 -0400 Subject: [PATCH 071/553] Improve `set-constant` scriptlet Related feedback: https://github.com/uBlockOrigin/uBlock-discussions/discussions/881#discussioncomment-10072370 --- assets/resources/scriptlets.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index ab98966a14f81..9678724cc3b98 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -485,9 +485,8 @@ builtinScriptlets.push({ 'safe-self.fn', ], }); -function validateConstantFn(trusted, raw) { +function validateConstantFn(trusted, raw, extraArgs = {}) { const safe = safeSelf(); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 2); let value; if ( raw === 'undefined' ) { value = undefined; @@ -587,7 +586,7 @@ function setConstantFn( }; if ( trappedProp === '' ) { return; } const thisScript = document.currentScript; - let normalValue = validateConstantFn(trusted, rawValue); + let normalValue = validateConstantFn(trusted, rawValue, extraArgs); if ( rawValue === 'noopFunc' || rawValue === 'trueFunc' || rawValue === 'falseFunc' ) { normalValue = cloakFunc(normalValue); } @@ -4772,7 +4771,7 @@ function trustedReplaceArgument( const logPrefix = safe.makeLogPrefix('trusted-replace-argument', propChain, argposRaw, argraw); const argpos = parseInt(argposRaw, 10) || 0; const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); - const normalValue = validateConstantFn(true, argraw); + const normalValue = validateConstantFn(true, argraw, extraArgs); const reCondition = extraArgs.condition ? safe.patternToRegex(extraArgs.condition) : /^/; From b9ab889be54b6f82fb6e6bbe5f4f7a4f16bcd43c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 17 Jul 2024 11:06:31 -0400 Subject: [PATCH 072/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69451674bcb14..9ebb51689d551 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `set-constant` scriptlet](https://github.com/gorhill/uBlock/commit/77feb25c4d) - [Improve `prevent-fetch` scriptlet](https://github.com/gorhill/uBlock/commit/e785b99338) - [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/66e3a1ad47) - [Fix CSP/PP header injection in non-document resources](https://github.com/gorhill/uBlock/commit/c90f4933df) From 59d9bbf0b29f9b6b44bfa242b1e331658f19ba5d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 17 Jul 2024 11:06:48 -0400 Subject: [PATCH 073/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index cabaf898c1449..19fc7b2fc659d 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.105 \ No newline at end of file +1.58.1.106 \ No newline at end of file From 152983f031deb11845b613eb881f4ac4cfb49c98 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 18 Jul 2024 09:19:15 -0400 Subject: [PATCH 074/553] 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 e054b9642f560..db3cd2435f8c2 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.105", + "version": "1.58.1.106", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc5/uBlock0_1.58.1rc5.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc6/uBlock0_1.58.1rc6.firefox.signed.xpi" } ] } From f2c4328a2e4b8d270ac27ca391f7fb0256139eae Mon Sep 17 00:00:00 2001 From: Fanboynz Date: Sat, 20 Jul 2024 00:01:38 +1200 Subject: [PATCH 075/553] Switch to updated Icelandic ABP List (#3920) --- assets/assets.dev.json | 4 ++-- assets/assets.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/assets.dev.json b/assets/assets.dev.json index ab6ecfd6505de..a78998bf2b8a5 100644 --- a/assets/assets.dev.json +++ b/assets/assets.dev.json @@ -681,8 +681,8 @@ "title": "🇮🇸is: Icelandic ABP List", "tags": "ads icelandic", "lang": "is", - "contentURL": "https://adblock.gardar.net/is.abp.txt", - "supportURL": "https://adblock.gardar.net/" + "contentURL": "https://raw.githubusercontent.com/brave/adblock-lists/master/custom/is.txt", + "supportURL": "https://github.com/brave/adblock-lists/issues" }, "ISR-0": { "content": "filters", diff --git a/assets/assets.json b/assets/assets.json index bd8fd84550dce..454c954bb7439 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -681,8 +681,8 @@ "title": "🇮🇸is: Icelandic ABP List", "tags": "ads icelandic", "lang": "is", - "contentURL": "https://adblock.gardar.net/is.abp.txt", - "supportURL": "https://adblock.gardar.net/" + "contentURL": "https://raw.githubusercontent.com/brave/adblock-lists/master/custom/is.txt", + "supportURL": "https://github.com/brave/adblock-lists/issues" }, "ISR-0": { "content": "filters", From 8afd9e233d3c43f51d21e4e51d24e643089d9853 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 20 Jul 2024 08:57:11 -0400 Subject: [PATCH 076/553] Improve `trusted-replace-node-text` scriptlet Related discussion: https://github.com/uBlockOrigin/uAssets/discussions/23769#discussioncomment-10102276 --- assets/resources/scriptlets.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 9678724cc3b98..fa1457f87fde8 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -714,7 +714,8 @@ function replaceNodeTextFn( const reNodeName = safe.patternToRegex(nodeName, 'i', true); const rePattern = safe.patternToRegex(pattern, 'gms'); const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); - const reCondition = safe.patternToRegex(extraArgs.condition || '', 'ms'); + const reIncludes = safe.patternToRegex(extraArgs.includes || extraArgs.condition || '', 'ms'); + const reExcludes = safe.patternToRegex(extraArgs.excludes || '', 'ms'); const stop = (takeRecord = true) => { if ( takeRecord ) { handleMutations(observer.takeRecords()); @@ -727,8 +728,10 @@ function replaceNodeTextFn( let sedCount = extraArgs.sedCount || 0; const handleNode = node => { const before = node.textContent; - reCondition.lastIndex = 0; - if ( safe.RegExp_test.call(reCondition, before) === false ) { return true; } + reIncludes.lastIndex = 0; + if ( safe.RegExp_test.call(reIncludes, before) === false ) { return true; } + reExcludes.lastIndex = 0; + if ( safe.RegExp_test.call(reExcludes, before) ) { return true; } rePattern.lastIndex = 0; if ( safe.RegExp_test.call(rePattern, before) === false ) { return true; } rePattern.lastIndex = 0; From b871b00337cd0b142a759fb63ba148c35bf336f9 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 20 Jul 2024 08:58:56 -0400 Subject: [PATCH 077/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ebb51689d551..5dc86763ad714 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/8afd9e233d) - [Improve `set-constant` scriptlet](https://github.com/gorhill/uBlock/commit/77feb25c4d) - [Improve `prevent-fetch` scriptlet](https://github.com/gorhill/uBlock/commit/e785b99338) - [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/66e3a1ad47) From 86d751b2ecddff92fc503d0eecff31f706a28e60 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 20 Jul 2024 08:59:16 -0400 Subject: [PATCH 078/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 19fc7b2fc659d..d587c6675c569 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.106 \ No newline at end of file +1.58.1.107 \ No newline at end of file From db33eb9f41f41e9868c15fa3b2b1a6fd0a1a9682 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 20 Jul 2024 09:06:03 -0400 Subject: [PATCH 079/553] 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 db3cd2435f8c2..dda8596ede1e8 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.106", + "version": "1.58.1.107", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc6/uBlock0_1.58.1rc6.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc7/uBlock0_1.58.1rc7.firefox.signed.xpi" } ] } From 62f87b0ea81ce7f7f5821702083b0a89a100975c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 20 Jul 2024 09:43:08 -0400 Subject: [PATCH 080/553] Rename parameters as per earlier commit Related commit: https://github.com/gorhill/uBlock/commit/8afd9e233d3c43f51d21e4e51d24e643089d9853 --- assets/resources/scriptlets.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index fa1457f87fde8..8c9f8b007c8ca 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -3752,10 +3752,10 @@ builtinScriptlets.push({ }); function removeNodeText( nodeName, - condition, + includes, ...extraArgs ) { - replaceNodeTextFn(nodeName, '', '', 'condition', condition || '', ...extraArgs); + replaceNodeTextFn(nodeName, '', '', 'includes', includes || '', ...extraArgs); } /******************************************************************************* From c36f7822ef99922a69f65af34ee223e96f4945a5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 20 Jul 2024 09:44:22 -0400 Subject: [PATCH 081/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index d587c6675c569..ebf7a12d20135 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.107 \ No newline at end of file +1.58.1.108 \ No newline at end of file From f1c45a280084e6054546d9cfc0fbc34339fe6a6e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 20 Jul 2024 09:50:55 -0400 Subject: [PATCH 082/553] 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 dda8596ede1e8..51546a2207fd3 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.107", + "version": "1.58.1.108", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc7/uBlock0_1.58.1rc7.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc8/uBlock0_1.58.1rc8.firefox.signed.xpi" } ] } From 14d90418b8208ddaf0ba464c694cd6f0d7058afe Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 21 Jul 2024 08:34:18 -0400 Subject: [PATCH 083/553] Fix regression in `trusted-replace-node-text` scriptlet Related commit: https://github.com/gorhill/uBlock/commit/8afd9e233d3c43f51d21e4e51d24e643089d9853 --- assets/resources/scriptlets.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 8c9f8b007c8ca..f731a929f328c 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -715,7 +715,7 @@ function replaceNodeTextFn( const rePattern = safe.patternToRegex(pattern, 'gms'); const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); const reIncludes = safe.patternToRegex(extraArgs.includes || extraArgs.condition || '', 'ms'); - const reExcludes = safe.patternToRegex(extraArgs.excludes || '', 'ms'); + const reExcludes = safe.patternToRegex(extraArgs.excludes || '.^', 'ms'); const stop = (takeRecord = true) => { if ( takeRecord ) { handleMutations(observer.takeRecords()); From fa2a0a9549329febd18ccacb1cb114ac5ca232a7 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 21 Jul 2024 08:36:10 -0400 Subject: [PATCH 084/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index ebf7a12d20135..b6c997d9e524d 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.108 \ No newline at end of file +1.58.1.109 \ No newline at end of file From ec568b614d54db9f9c930b7e0146c37bd0d9a08d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 21 Jul 2024 08:45:51 -0400 Subject: [PATCH 085/553] 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 51546a2207fd3..800ac3a968897 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.108", + "version": "1.58.1.109", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc8/uBlock0_1.58.1rc8.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc9/uBlock0_1.58.1rc9.firefox.signed.xpi" } ] } From bf75dc2f9094a6ff8151624563bc3866a112aa6f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 22 Jul 2024 09:51:40 -0400 Subject: [PATCH 086/553] Code review of `trusted-replace-node-text` scriptlet --- assets/resources/scriptlets.js | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index f731a929f328c..55f512dde02a9 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -714,8 +714,12 @@ function replaceNodeTextFn( const reNodeName = safe.patternToRegex(nodeName, 'i', true); const rePattern = safe.patternToRegex(pattern, 'gms'); const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); - const reIncludes = safe.patternToRegex(extraArgs.includes || extraArgs.condition || '', 'ms'); - const reExcludes = safe.patternToRegex(extraArgs.excludes || '.^', 'ms'); + const reIncludes = extraArgs.includes || extraArgs.condition + ? safe.patternToRegex(extraArgs.includes || extraArgs.condition, 'ms') + : null; + const reExcludes = extraArgs.excludes + ? safe.patternToRegex(extraArgs.excludes, 'ms') + : null; const stop = (takeRecord = true) => { if ( takeRecord ) { handleMutations(observer.takeRecords()); @@ -728,10 +732,14 @@ function replaceNodeTextFn( let sedCount = extraArgs.sedCount || 0; const handleNode = node => { const before = node.textContent; - reIncludes.lastIndex = 0; - if ( safe.RegExp_test.call(reIncludes, before) === false ) { return true; } - reExcludes.lastIndex = 0; - if ( safe.RegExp_test.call(reExcludes, before) ) { return true; } + if ( reIncludes ) { + reIncludes.lastIndex = 0; + if ( safe.RegExp_test.call(reIncludes, before) === false ) { return true; } + } + if ( reExcludes ) { + reExcludes.lastIndex = 0; + if ( safe.RegExp_test.call(reExcludes, before) ) { return true; } + } rePattern.lastIndex = 0; if ( safe.RegExp_test.call(rePattern, before) === false ) { return true; } rePattern.lastIndex = 0; From 5526b035bdc5974972e8067817dd52cd5460d16d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 22 Jul 2024 10:32:45 -0400 Subject: [PATCH 087/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index b6c997d9e524d..726bf1384112a 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.109 \ No newline at end of file +1.58.1.110 \ No newline at end of file From a54e3c5e3973e759a6c56cfa5eb1947a3234e197 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 22 Jul 2024 10:41:52 -0400 Subject: [PATCH 088/553] 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 800ac3a968897..fd29665486240 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.109", + "version": "1.58.1.110", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc9/uBlock0_1.58.1rc9.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc10/uBlock0_1.58.1rc10.firefox.signed.xpi" } ] } From 84be9cde6d5ec3381a0a563796b92ed733c202a4 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 23 Jul 2024 09:19:16 -0400 Subject: [PATCH 089/553] Improve `href-sanitizer` scriptlet Support ability to recursively unwrap destination URL. Example: ...##+js(href-sanitizer, a.clickTracker, ?r?u) Related discussion: https://github.com/uBlockOrigin/uBlock-discussions/discussions/775#discussioncomment-10120835 --- assets/resources/scriptlets.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 55f512dde02a9..4cc2e938fc40d 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -3503,17 +3503,26 @@ function hrefSanitizer( } return ''; }; + const extractParam = (href, source) => { + if ( Boolean(source) === false ) { return href; } + const recursive = source.includes('?', 1); + const end = recursive ? source.indexOf('?', 1) : source.length; + try { + const url = new URL(href, document.location); + const value = url.searchParams.get(source.slice(1, end)); + if ( value === null ) { return href } + if ( recursive ) { return extractParam(value, source.slice(end)); } + return value; + } catch(x) { + } + return href; + }; const extractText = (elem, source) => { if ( /^\[.*\]$/.test(source) ) { return elem.getAttribute(source.slice(1,-1).trim()) || ''; } if ( source.startsWith('?') ) { - try { - const url = new URL(elem.href, document.location); - return url.searchParams.get(source.slice(1)) || ''; - } catch(x) { - } - return ''; + return extractParam(elem.href, source); } if ( source === 'text' ) { return elem.textContent From 45a1d61c87fbe40de57ca97c364eb3cfc3c8a267 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 23 Jul 2024 09:23:14 -0400 Subject: [PATCH 090/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dc86763ad714..44692a4e23e6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/84be9cde6d) - [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/8afd9e233d) - [Improve `set-constant` scriptlet](https://github.com/gorhill/uBlock/commit/77feb25c4d) - [Improve `prevent-fetch` scriptlet](https://github.com/gorhill/uBlock/commit/e785b99338) From b7676e8f9fd4a8765efec991d8c3f2693b1a2e61 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 23 Jul 2024 09:23:31 -0400 Subject: [PATCH 091/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 726bf1384112a..aff5d203cfe48 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.110 \ No newline at end of file +1.58.1.111 \ No newline at end of file From ac34aa975b814ee169d7ce497b2d7e287f3e06b2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 23 Jul 2024 09:40:31 -0400 Subject: [PATCH 092/553] 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 fd29665486240..6b426df1439eb 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.110", + "version": "1.58.1.111", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc10/uBlock0_1.58.1rc10.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc11/uBlock0_1.58.1rc11.firefox.signed.xpi" } ] } From 2a675785bc6a63dcb6f0a2847ba4fee67cdf12fd Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 24 Jul 2024 12:43:00 -0400 Subject: [PATCH 093/553] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 23e90367a14f8..3a4fbd0927da6 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,6 @@ uBlock Origin (uBO)

Get uBlock Origin for Firefox -Get uBlock Origin for Chromium Get uBlock Origin for Microsoft Edge Get uBlock Origin for Opera Get uBlock Origin for Thunderbird @@ -31,6 +30,13 @@ uBlock Origin (uBO) *** +

+Get uBlock Origin for Chromium
+Important: Will uBO automatically transition to uBO Lite in the Chrome Web Store? (tldr: no) +

+ +*** + uBlock Origin (uBO) is a CPU and memory-efficient [wide-spectrum content blocker][Blocking] for Chromium and Firefox. It blocks ads, trackers, coin miners, popups, annoying anti-blockers, malware sites, etc., by default using [EasyList][EasyList], [EasyPrivacy][EasyPrivacy], [Peter Lowe's Blocklist][Peter Lowe's Blocklist], [Online Malicious URL Blocklist][Malicious Blocklist], and uBO [filter lists][uBO Filters]. There are many other lists available to block even more. Hosts files are also supported. uBO uses the EasyList filter syntax and [extends][Extended Syntax] the syntax to work with custom rules and filters. You may easily unselect any preselected filter lists if you think uBO blocks too much. For reference, Adblock Plus installs with only EasyList, ABP filters, and Acceptable Ads enabled by default. From 2dd591c1d73a967486970e2a789625462333fd81 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 24 Jul 2024 12:43:57 -0400 Subject: [PATCH 094/553] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3a4fbd0927da6..79ffa966e181f 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ uBlock Origin (uBO)

Get uBlock Origin for Chromium
-Important: Will uBO automatically transition to uBO Lite in the Chrome Web Store? (tldr: no) +Important: Will uBO automatically transition to uBO Lite in the Chrome Web Store? (tldr: no)

*** From 76246f2c599c2f0a290dca490802d88ceba2d78c Mon Sep 17 00:00:00 2001 From: Fanboynz Date: Sun, 28 Jul 2024 00:26:59 +1200 Subject: [PATCH 095/553] Add dismissed to set-cookie (#3921) --- assets/resources/scriptlets.js | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 4cc2e938fc40d..c8af8f229775f 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -3819,6 +3819,7 @@ function setCookie( 'approved', 'disapproved', 'hide', 'hidden', 'essential', 'nonessential', + 'dismiss', 'dismissed', ]; const normalized = value.toLowerCase(); const match = /^("?)(.+)\1$/.exec(normalized); From ec633887dddd7cb98249959f81918e7cb325b8cb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 28 Jul 2024 10:44:17 -0400 Subject: [PATCH 096/553] Improve `abort-on-stack-trace` scriptlet Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3314 --- assets/resources/scriptlets.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index c8af8f229775f..6e9dcd60ea4b8 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -64,6 +64,7 @@ function safeSelf() { 'RegExp_test': self.RegExp.prototype.test, 'RegExp_exec': self.RegExp.prototype.exec, 'Request_clone': self.Request.prototype.clone, + 'String_fromCharCode': String.fromCharCode, 'XMLHttpRequest': self.XMLHttpRequest, 'addEventListener': self.EventTarget.prototype.addEventListener, 'removeEventListener': self.EventTarget.prototype.removeEventListener, @@ -211,7 +212,7 @@ builtinScriptlets.push({ function getExceptionToken() { const safe = safeSelf(); const token = - String.fromCharCode(Date.now() % 26 + 97) + + safe.String_fromCharCode(Date.now() % 26 + 97) + safe.Math_floor(safe.Math_random() * 982451653 + 982451653).toString(36); const oe = self.onerror; self.onerror = function(msg, ...args) { From c7b54af0a241963fc69e49f6ea8e2c583036be49 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 29 Jul 2024 14:54:46 -0400 Subject: [PATCH 097/553] [mv3] Add minimal ability to diagnose ruleset issue A new icon has been added to the popup panel, to open a popup window with a terse list of DNR events for the current tab, in reverse chronological order (most recent DNR event appears at the top). The new ability is available only when the extension is sideloaded, as per `declarativeNetRequestFeedback` documentation. Ref: https://developer.chrome.com/docs/extensions/reference/api/declarativeNetRequest#event-onRuleMatchedDebug Purposefully minimal, so as to have something rather than nothing when having to diagnose filtering issue with the DNR API. Example: https://github.com/uBlockOrigin/uBOL-home/issues/156 The content of the popup window does not dynamically update, force a refresh (F5) to get the most recent DNR events. This might be improved in the future. The DNR event buffer is not persisted, so the buffer is empty when service worker is restarted. This might be improved in the future by using session storage API. There is no output filtering ability in this first draft. This might be improved in the future. DNR rules are reported. The filter from which a DNR rule originates is not reported. Given that the rulesets are optimized after conversion from original filter lists to reduce the DNR rule count, this is unlikely to ever be possible. --- platform/mv3/extension/css/matched-rules.css | 28 ++++ platform/mv3/extension/js/background.js | 31 +++-- platform/mv3/extension/js/dashboard.js | 4 +- platform/mv3/extension/js/debug.js | 124 ++++++++++++++++++ platform/mv3/extension/js/ext.js | 7 +- platform/mv3/extension/js/matched-rules.js | 48 +++++++ platform/mv3/extension/js/popup.js | 23 +++- platform/mv3/extension/js/ruleset-manager.js | 8 +- .../mv3/extension/js/scripting-manager.js | 15 +-- platform/mv3/extension/js/utils.js | 30 +---- platform/mv3/extension/matched-rules.html | 33 +++++ platform/mv3/extension/popup.html | 2 +- src/js/dom.js | 12 +- tools/make-mv3.sh | 14 +- 14 files changed, 300 insertions(+), 79 deletions(-) create mode 100644 platform/mv3/extension/css/matched-rules.css create mode 100644 platform/mv3/extension/js/debug.js create mode 100644 platform/mv3/extension/js/matched-rules.js create mode 100644 platform/mv3/extension/matched-rules.html diff --git a/platform/mv3/extension/css/matched-rules.css b/platform/mv3/extension/css/matched-rules.css new file mode 100644 index 0000000000000..9db4d9c73f0fa --- /dev/null +++ b/platform/mv3/extension/css/matched-rules.css @@ -0,0 +1,28 @@ + +#matchedEntries { + display: flex; + flex-direction: column; + font-family: monospace; + font-size: small; + white-space: pre-wrap; + word-break: break-all; +} + +.matchInfo { + display: flex; + flex-wrap: nowrap; +} + +.matchInfo:nth-of-type(2n) { + background-color: lightgray; +} + +.requestInfo { + border-inline-end: 1px dotted black; + padding-inline-end: 0.5em; + width: 25vw; +} + +.ruleInfo { + padding-inline-start: 0.5em; +} diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index e65775e9db7f8..17601b114995a 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -19,8 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -/******************************************************************************/ - import { adminRead, browser, @@ -28,13 +26,9 @@ import { localRead, localWrite, runtime, sessionRead, sessionWrite, + windows, } from './ext.js'; -import { - broadcastMessage, - ubolLog, -} from './utils.js'; - import { defaultRulesetsFromLanguage, enableRulesets, @@ -54,8 +48,13 @@ import { } from './mode-manager.js'; import { - registerInjectables, -} from './scripting-manager.js'; + getMatchedRules, + isSideloaded, + ubolLog, +} from './debug.js'; + +import { broadcastMessage } from './utils.js'; +import { registerInjectables } from './scripting-manager.js'; /******************************************************************************/ @@ -253,6 +252,7 @@ function onMessage(request, sender, callback) { hasOmnipotence: results[1], hasGreatPowers: results[2], rulesetDetails: results[3], + isSideloaded, }); }); return true; @@ -308,6 +308,19 @@ function onMessage(request, sender, callback) { }); return true; + case 'getMatchedRules': + getMatchedRules(request.tabId).then(entries => { + callback(entries); + }); + return true; + + case 'showMatchedRules': + windows.create({ + type: 'popup', + url: `/matched-rules.html?tab=${request.tabId}`, + }); + break; + default: break; } diff --git a/platform/mv3/extension/js/dashboard.js b/platform/mv3/extension/js/dashboard.js index 363f30173fa16..b8c240d5c3c43 100644 --- a/platform/mv3/extension/js/dashboard.js +++ b/platform/mv3/extension/js/dashboard.js @@ -19,10 +19,8 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - -import { runtime } from './ext.js'; import { dom } from './dom.js'; +import { runtime } from './ext.js'; /******************************************************************************/ diff --git a/platform/mv3/extension/js/debug.js b/platform/mv3/extension/js/debug.js new file mode 100644 index 0000000000000..a5f1a852f9e62 --- /dev/null +++ b/platform/mv3/extension/js/debug.js @@ -0,0 +1,124 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2024-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 { browser, dnr } from './ext.js'; + +/******************************************************************************/ + +export const isSideloaded = (( ) => { + if ( dnr.onRuleMatchedDebug instanceof Object === false ) { return false; } + const { id } = browser.runtime; + // https://addons.mozilla.org/en-US/firefox/addon/ublock-origin-lite/ + if ( id === 'uBOLite@raymondhill.net' ) { return false; } + // https://chromewebstore.google.com/detail/ddkjiahejlhfcafbddmgiahcphecmpfh + if ( id === 'ddkjiahejlhfcafbddmgiahcphecmpfh' ) { return false; } + // https://microsoftedge.microsoft.com/addons/detail/cimighlppcgcoapaliogpjjdehbnofhn + if ( id === 'cimighlppcgcoapaliogpjjdehbnofhn' ) { return false; } + return true; +})(); + +/******************************************************************************/ + +export const ubolLog = (...args) => { + // Do not pollute dev console in stable releases. + if ( isSideloaded !== true ) { return; } + console.info('[uBOL]', ...args); +}; + +/******************************************************************************/ + +export const getMatchedRules = (( ) => { + const noopFn = ( ) => Promise.resolve([]); + if ( isSideloaded !== true ) { return noopFn; } + if ( dnr.onRuleMatchedDebug instanceof Object === false ) { return noopFn; } + + const rulesets = new Map(); + const bufferSize = 256; + const matchedRules = new Array(bufferSize); + matchedRules.fill(null); + let writePtr = 0; + + const pruneLongLists = list => { + if ( list.length <= 21 ) { return list; } + return [ ...list.slice(0, 10), '...', ...list.slice(-10) ]; + + }; + + const getRuleset = async rulesetId => { + if ( rulesets.has(rulesetId) ) { + return rulesets.get(rulesetId); + } + let rules; + if ( rulesetId === dnr.DYNAMIC_RULESET_ID ) { + rules = await dnr.getDynamicRules().catch(( ) => undefined); + } else { + const response = await fetch(`/rulesets/main/${rulesetId}.json`).catch(( ) => undefined); + if ( response === undefined ) { return; } + rules = await response.json().catch(( ) => undefined); + } + if ( Array.isArray(rules) === false ) { return; } + const ruleset = new Map(); + for ( const rule of rules ) { + const condition = rule.condition; + if ( condition ) { + if ( condition.requestDomains ) { + condition.requestDomains = pruneLongLists(condition.requestDomains); + } + if ( condition.initiatorDomains ) { + condition.initiatorDomains = pruneLongLists(condition.initiatorDomains); + } + } + const ruleId = rule.id; + rule.id = `${rulesetId}-${ruleId}`; + ruleset.set(ruleId, rule); + } + rulesets.set(rulesetId, ruleset); + return ruleset; + }; + + const getRuleDetails = async ruleInfo => { + const { rulesetId, ruleId } = ruleInfo.rule; + const ruleset = await getRuleset(rulesetId); + if ( ruleset === undefined ) { return; } + return { request: ruleInfo.request, rule: ruleset.get(ruleId) }; + }; + + dnr.onRuleMatchedDebug.addListener(ruleInfo => { + matchedRules[writePtr] = ruleInfo; + writePtr = (writePtr + 1) % bufferSize; + }); + + return async tabId => { + const promises = []; + for ( let i = 0; i < bufferSize; i++ ) { + const j = (writePtr + i) % bufferSize; + const ruleInfo = matchedRules[j]; + if ( ruleInfo === null ) { continue; } + if ( ruleInfo.request.tabId !== tabId ) { continue; } + const promise = getRuleDetails(ruleInfo); + if ( promise === undefined ) { continue; } + promises.unshift(promise); + } + return Promise.all(promises); + }; +})(); + +/******************************************************************************/ diff --git a/platform/mv3/extension/js/ext.js b/platform/mv3/extension/js/ext.js index 0126c1894f7ad..94d5118a211b5 100644 --- a/platform/mv3/extension/js/ext.js +++ b/platform/mv3/extension/js/ext.js @@ -19,12 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - export const browser = self.browser instanceof Object && self.browser instanceof Element === false @@ -34,6 +28,7 @@ export const browser = export const dnr = browser.declarativeNetRequest; export const i18n = browser.i18n; export const runtime = browser.runtime; +export const windows = browser.windows; /******************************************************************************/ diff --git a/platform/mv3/extension/js/matched-rules.js b/platform/mv3/extension/js/matched-rules.js new file mode 100644 index 0000000000000..75a17caf4f7c6 --- /dev/null +++ b/platform/mv3/extension/js/matched-rules.js @@ -0,0 +1,48 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-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 { dom, qs$ } from './dom.js'; +import { sendMessage } from './ext.js'; + +/******************************************************************************/ + +const url = new URL(document.location.href); +const tabId = parseInt(url.searchParams.get('tab'), 10) || 0; + +const entries = await sendMessage({ + what: 'getMatchedRules', + tabId, +}); + +const fragment = new DocumentFragment(); +const template = qs$('#matchInfo'); +for ( const entry of (entries || []) ) { + if ( entry instanceof Object === false ) { continue; } + const row = template.content.cloneNode(true); + qs$(row, '.requestInfo').textContent = JSON.stringify(entry.request, null, 2); + qs$(row, '.ruleInfo').textContent = JSON.stringify(entry.rule, null, 2); + fragment.append(row); +} + +dom.empty('#matchedEntries'); +qs$('#matchedEntries').append(fragment); + +/******************************************************************************/ diff --git a/platform/mv3/extension/js/popup.js b/platform/mv3/extension/js/popup.js index 29b993b24aa39..712dbbdf2ed3b 100644 --- a/platform/mv3/extension/js/popup.js +++ b/platform/mv3/extension/js/popup.js @@ -19,17 +19,11 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - import { browser, + localRead, localWrite, runtime, sendMessage, - localRead, localWrite, } from './ext.js'; import { dom, qs$ } from './dom.js'; @@ -271,6 +265,15 @@ dom.on('[data-i18n-title="popupTipDashboard"]', 'click', ev => { runtime.openOptionsPage(); }); +dom.on('#showMatchedRules', 'click', ev => { + if ( ev.isTrusted !== true ) { return; } + if ( ev.button !== 0 ) { return; } + sendMessage({ + what: 'showMatchedRules', + tabId: currentTab.id, + }); +}); + /******************************************************************************/ async function init() { @@ -303,6 +306,12 @@ async function init() { dom.text('#hostname', punycode.toUnicode(tabHostname)); + dom.cl.toggle('#showMatchedRules', 'enabled', + popupPanelData.isSideloaded === true && + typeof currentTab.id === 'number' && + isNaN(currentTab.id) === false + ); + const parent = qs$('#rulesetStats'); for ( const details of popupPanelData.rulesetDetails || [] ) { const div = dom.clone('#templates .rulesetDetails'); diff --git a/platform/mv3/extension/js/ruleset-manager.js b/platform/mv3/extension/js/ruleset-manager.js index a484e1d21d17d..749a83c708c0a 100644 --- a/platform/mv3/extension/js/ruleset-manager.js +++ b/platform/mv3/extension/js/ruleset-manager.js @@ -19,15 +19,9 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - import { browser, dnr, i18n } from './ext.js'; import { fetchJSON } from './fetch.js'; -import { ubolLog } from './utils.js'; +import { ubolLog } from './debug.js'; /******************************************************************************/ diff --git a/platform/mv3/extension/js/scripting-manager.js b/platform/mv3/extension/js/scripting-manager.js index 10175fc92e952..6502cbc0aea1c 100644 --- a/platform/mv3/extension/js/scripting-manager.js +++ b/platform/mv3/extension/js/scripting-manager.js @@ -19,18 +19,13 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ +import * as ut from './utils.js'; import { browser } from './ext.js'; import { fetchJSON } from './fetch.js'; -import { getFilteringModeDetails } from './mode-manager.js'; import { getEnabledRulesetsDetails } from './ruleset-manager.js'; - -import * as ut from './utils.js'; +import { getFilteringModeDetails } from './mode-manager.js'; +import { ubolLog } from './debug.js'; /******************************************************************************/ @@ -542,13 +537,13 @@ async function registerInjectables(origins) { toRemove.push(...Array.from(before.keys())); if ( toRemove.length !== 0 ) { - ut.ubolLog(`Unregistered ${toRemove} content (css/js)`); + ubolLog(`Unregistered ${toRemove} content (css/js)`); await browser.scripting.unregisterContentScripts({ ids: toRemove }) .catch(reason => { console.info(reason); }); } if ( toAdd.length !== 0 ) { - ut.ubolLog(`Registered ${toAdd.map(v => v.id)} content (css/js)`); + ubolLog(`Registered ${toAdd.map(v => v.id)} content (css/js)`); await browser.scripting.registerContentScripts(toAdd) .catch(reason => { console.info(reason); }); } diff --git a/platform/mv3/extension/js/utils.js b/platform/mv3/extension/js/utils.js index cadeaea0b64c3..cdfc98b25d12d 100644 --- a/platform/mv3/extension/js/utils.js +++ b/platform/mv3/extension/js/utils.js @@ -19,14 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ - -import { browser } from './ext.js'; - /******************************************************************************/ function parsedURLromOrigin(origin) { @@ -114,7 +106,7 @@ const hostnamesFromMatches = origins => { out.push('all-urls'); continue; } - const match = /^\*:\/\/(?:\*\.)?([^\/]+)\/\*/.exec(origin); + const match = /^\*:\/\/(?:\*\.)?([^/]+)\/\*/.exec(origin); if ( match === null ) { continue; } out.push(match[1]); } @@ -130,25 +122,6 @@ export const broadcastMessage = message => { /******************************************************************************/ -const ubolLog = (...args) => { - // Do not pollute dev console in stable releases. - if ( shouldLog !== true ) { return; } - console.info('[uBOL]', ...args); -}; - -const shouldLog = (( ) => { - const { id } = browser.runtime; - // https://addons.mozilla.org/en-US/firefox/addon/ublock-origin-lite/ - if ( id === 'uBOLite@raymondhill.net' ) { return false; } - // https://chromewebstore.google.com/detail/ddkjiahejlhfcafbddmgiahcphecmpfh - if ( id === 'ddkjiahejlhfcafbddmgiahcphecmpfh' ) { return false; } - // https://microsoftedge.microsoft.com/addons/detail/cimighlppcgcoapaliogpjjdehbnofhn - if ( id === 'cimighlppcgcoapaliogpjjdehbnofhn' ) { return false; } - return true; -})(); - -/******************************************************************************/ - export { parsedURLromOrigin, toBroaderHostname, @@ -158,5 +131,4 @@ export { subtractHostnameIters, matchesFromHostnames, hostnamesFromMatches, - ubolLog, }; diff --git a/platform/mv3/extension/matched-rules.html b/platform/mv3/extension/matched-rules.html new file mode 100644 index 0000000000000..ec392ca2338ab --- /dev/null +++ b/platform/mv3/extension/matched-rules.html @@ -0,0 +1,33 @@ + + + + + +Matched rules + + + + + + + + + + + +
+
+ + + + + + + + + diff --git a/platform/mv3/extension/popup.html b/platform/mv3/extension/popup.html index 7492469bd0290..990f6590af438 100644 --- a/platform/mv3/extension/popup.html +++ b/platform/mv3/extension/popup.html @@ -29,7 +29,7 @@ - + list-altShow matched rules cogs
diff --git a/src/js/dom.js b/src/js/dom.js index 5c4d19479f80d..241af9d525b1b 100644 --- a/src/js/dom.js +++ b/src/js/dom.js @@ -19,10 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; - /******************************************************************************/ const normalizeTarget = target => { @@ -113,6 +109,14 @@ class dom { } } + static empty(target) { + for ( const elem of normalizeTarget(target) ) { + while ( elem.firstElementChild !== null ) { + elem.firstElementChild.remove(); + } + } + } + // target, type, callback, [options] // target, type, subtarget, callback, [options] diff --git a/tools/make-mv3.sh b/tools/make-mv3.sh index 13f82f4db33c5..a4c20c48e5737 100755 --- a/tools/make-mv3.sh +++ b/tools/make-mv3.sh @@ -128,11 +128,19 @@ fi echo "*** uBOLite.mv3: extension ready" echo "Extension location: $DES/" -# Local build: use a different extension id than the official one -if [ -z "$TAGNAME" ] && [ "$PLATFORM" = "firefox" ]; then +# Local build +if [ -z "$TAGNAME" ]; then + # Enable DNR rule debugging tmp=$(mktemp) - jq '.browser_specific_settings.gecko.id = "uBOLite.dev@raymondhill.net"' "$DES/manifest.json" > "$tmp" \ + jq '.permissions += ["declarativeNetRequestFeedback"]' \ + "$DES/manifest.json" > "$tmp" \ && mv "$tmp" "$DES/manifest.json" + # Use a different extension id than the official one + if [ "$PLATFORM" = "firefox" ]; then + tmp=$(mktemp) + jq '.browser_specific_settings.gecko.id = "uBOLite.dev@raymondhill.net"' "$DES/manifest.json" > "$tmp" \ + && mv "$tmp" "$DES/manifest.json" + fi fi if [ "$FULL" = "yes" ]; then From 30e0d016569d0e60082b1909123c88f0aaf4ef01 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 29 Jul 2024 15:50:38 -0400 Subject: [PATCH 098/553] New revision for stable release --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index aff5d203cfe48..43eb9bc68ddfd 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.58.1.111 \ No newline at end of file +1.59.0 \ No newline at end of file From a0de43aba933bc7bd79a32a2f2b6b87bf2ca5f18 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 29 Jul 2024 16:05:15 -0400 Subject: [PATCH 099/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.be.txt | 2 +- platform/mv3/description/webstore.br_FR.txt | 12 ++-- platform/mv3/description/webstore.eu.txt | 12 ++-- platform/mv3/description/webstore.ur.txt | 6 +- .../mv3/extension/_locales/bs/messages.json | 2 +- .../mv3/extension/_locales/ka/messages.json | 2 +- .../mv3/extension/_locales/lt/messages.json | 2 +- .../mv3/extension/_locales/ms/messages.json | 2 +- .../mv3/extension/_locales/tr/messages.json | 2 +- .../mv3/extension/_locales/ur/messages.json | 60 +++++++++---------- src/_locales/br_FR/messages.json | 4 +- src/_locales/bs/messages.json | 10 ++-- src/_locales/lt/messages.json | 2 +- src/_locales/ms/messages.json | 18 +++--- src/_locales/sv/messages.json | 4 +- src/_locales/tr/messages.json | 8 +-- src/_locales/zh_TW/messages.json | 34 +++++------ 17 files changed, 91 insertions(+), 91 deletions(-) diff --git a/platform/mv3/description/webstore.be.txt b/platform/mv3/description/webstore.be.txt index d5a2e9812c0df..80b06a4940748 100644 --- a/platform/mv3/description/webstore.be.txt +++ b/platform/mv3/description/webstore.be.txt @@ -1,4 +1,4 @@ -uBO Lite (uBOL) is a *permission-less* MV3-based content blocker. +uBO Лайт (uBOL) гэта блакіроўшчык кантэнту з меншымі патрабаваннямі да дазволаў заснаваны на MV3 The default ruleset corresponds to uBlock Origin's default filterset: diff --git a/platform/mv3/description/webstore.br_FR.txt b/platform/mv3/description/webstore.br_FR.txt index 03354935ec791..5cf05df10d91a 100644 --- a/platform/mv3/description/webstore.br_FR.txt +++ b/platform/mv3/description/webstore.br_FR.txt @@ -5,19 +5,19 @@ Ar reolennoù dre ziouer a glot gant silañ dre ziouer uBlock Origin: - Rolloù siloù genidik a uBlock Origin - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list +- Roll bruderezh ha servijerioù heuliañ Peter Lowe Tu zo deoc'h ouzhpennañ reolennoù all en arventennoù -- klikit war an ikon _kendentadur_ er banell popup. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. +Disklêriañ a ra uBOL penn-da-benn, da lavaret eo n'eus ket ezhomm eus un argerzh uBOL padus evit ma c'hoarvezfe ar silañ, ha silañ endalc'hadoù diazezet war enlakaat CSS/JS a vez graet en un doare fizius gant ar merdeer e-unan kentoc'h eget gant an astenn. Kement-se a dalvez ne vez ket gounezet gant uBOL e-unan arc'hwelioù CPU/memor e-pad ma vez stanket an endalc'hadoù -- ezhomm zo eus argerzh al labourer servij uBOL _nemet_ pa vez etregweredet gant ar banell digeriñ pe ar pajennoù dibarzhioù. -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. +UBOL n'en deus ket ezhomm eus aotreoù ledan "lenn ha kemmañ roadennoù" e-pad ar staliañ, setu perak e c'halloudoù bevennet e-keñver uBlock Origin pe stankerien endalc'hadoù all a c'houlenn aotreoù ledan "lenn ha kemmañ roadennoù" e-pad ar staliañ. Koulskoude ez eus tu deoc'h reiñ *sklaer* aotreoù ouzhpenn da uBOL el lec'hiennoù ma fell deoc'h, mod-se e vint silet gwelloc'h en ur implij siloù kened hag ensinkladurioù scriplet. Evit reiñ aotreoù ouzhpenn da uBOL en ul lec'hienn bennak, n'ho peus nemet digeriñ ar prenestr pop-up ha diuzañ ul live silañ uheloc'h evel ar mod Gwellañ pe ar mod Klok -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. +Goude-se e vo kelaouet ac'hanoc'h gant ar merdeer diwar-benn efedoù reiñ an aotreoù ouzhpenn goulennet gant an astenn war al lec'hienn bremanel, ha ret e vo deoc'h lâret d'ar merdeer hag-eñ e vo degemeret pe nac'het ar goulenn ganeoc'h. Ma asantit da reiñ muioc'h a aotreoù da uBOL war ar bajenn-mañ e vo silet gwelloc'h. @@ -25,6 +25,6 @@ Gallout a rit termeniñ ar mod silañ dre ziouer e pajenn arventennoù uBOL. Ma Dalc'hit soñj ez eo uBOL ur raktres war ober c'hoazh hag a zo e bal: -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. +- Aotreoù ostiz ledan ebet e-pad ar staliañ -- aotreoù astennet a vez roet splann gant an implijer dre lec'hienn. -- Entirely declarative for reliability and CPU/memory efficiency. +- Disklêriañ penn-da-benn evit ar fiziañs hag an efedusted CPU/memor. diff --git a/platform/mv3/description/webstore.eu.txt b/platform/mv3/description/webstore.eu.txt index f24ed1d5fe65e..f32691b857e2b 100644 --- a/platform/mv3/description/webstore.eu.txt +++ b/platform/mv3/description/webstore.eu.txt @@ -9,11 +9,11 @@ Peter Lowe-ren Ad and tracker zerrenda Arau gehiago gehitu ditzakezu aukeren orrialdea bisitatuz. Sakatu _Cogs_ ikonoa popup panelean. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. Horrek esan nahi du uBOLek berak ez duela CPU/memoria baliabiderik kontsumitzen edukien blokeoa martxan dagoen bitartean... uBOLren zerbitzuko langileen prozesua _only_ behar da popup panelarekin edo aukera orriekin elkarreragiten denean. +uBOL guztiz deklaratiboa da, hau da, ez dago uBOL prozesu iraunkor baten beharrik iragazketa gertatzeko, eta CSS/JS injekzioan oinarritutako edukien iragazketa nabigatzaileak berak egiten du fidagarritasunez, luzapenaren arabera beharrean. Horrek esan nahi du uBOLek berak ez duela CPU/memoria baliabiderik kontsumitzen edukien blokeoa martxan dagoen bitartean... uBOLren zerbitzuko langileen prozesua _only_ behar da popup panelarekin edo aukera orriekin elkarreragiten denean. -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. +uBOLek ez du "irakurtzeko eta aldatzeko datuak" baimen zabalik behar instalazio-unean, horregatik bere gaitasun mugatuak uBlock Origin-ekin alderatuta edo beste eduki-blokeatzaile batzuekin alderatuta, "irakurtzeko eta aldatzeko datuak" baimen zabalak behar dituzten instalazio garaian. -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. +Hala ere, uBOLek aukera ematen dizu *esplizituki* baimen hedatuak zure aukeratutako gune espezifikoetan, gune horietan hobeto iragazteko iragazte kosmetikoak eta scriptlet injekzioak erabiliz. Leku jakin batean baimenak emateko, ireki panel emergentea eta aukeratu goiko iragazteko modu bat, optimo edo oso gisa. @@ -21,10 +21,10 @@ Nabigatzaileak orduan jakinaraziko dizu zer ondorio dituen luzapenak eskatutako Baimen gehigarrien eskaera onartzen baduzu, oraingo gunean edukiak hobeto iragazi ahal izango ditu. -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. +Iragazki modu lehenetsia uBOL-en aukeren orrialdetik ezar dezakezu. Modu hoberena edo osoa aukeratzen baduzu lehenetsitako moduan, uBOL-i webgune guztietako datuak irakurtzeko eta aldatzeko baimena eman beharko diozu. -Keep in mind this is still a work in progress, with these end goals: +Gogoan izan oraindik lan bat dela, azken helburu hauekin: - Instalatzeko garaian, ez dago baimen zabalik. Erabiltzaileak esplizituki ematen ditu baimen zabalduak. -- Entirely declarative for reliability and CPU/memory efficiency. +- Erabat deklaratiboa fidagarritasunagatik eta CPU/memoriaren eraginkortasunagatik. diff --git a/platform/mv3/description/webstore.ur.txt b/platform/mv3/description/webstore.ur.txt index e03fa801ee7f0..0175f6167ba20 100644 --- a/platform/mv3/description/webstore.ur.txt +++ b/platform/mv3/description/webstore.ur.txt @@ -1,8 +1,8 @@ -uBO Lite (uBOL) is a *permission-less* MV3-based content blocker. +uBO Lite (uBOL) ایک *اجازت سے کم* MV3 پر مبنی مواد بلاکر ہے۔ -The default ruleset corresponds to uBlock Origin's default filterset: +ڈیفالٹ رولسیٹ uBlock Origin کے ڈیفالٹ فلٹر سیٹ سے مساوی ہے: -- uBlock Origin's built-in filter lists +- یو بلاک اوریجن کی بلٹ ان فلٹر لسٹ - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list diff --git a/platform/mv3/extension/_locales/bs/messages.json b/platform/mv3/extension/_locales/bs/messages.json index ab768f6b72003..d221c1b43c10b 100644 --- a/platform/mv3/extension/_locales/bs/messages.json +++ b/platform/mv3/extension/_locales/bs/messages.json @@ -156,7 +156,7 @@ "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { - "message": "Show the number of blocked requests on the toolbar icon", + "message": "Prikažite broj blokiranih zahtjeva na ikoni trake sa alatkama", "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 c728583fa9ef8..f31582f7a4a55 100644 --- a/platform/mv3/extension/_locales/ka/messages.json +++ b/platform/mv3/extension/_locales/ka/messages.json @@ -156,7 +156,7 @@ "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { - "message": "Show the number of blocked requests on the toolbar icon", + "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 3f0bad82bbc7b..52c96b3ae207a 100644 --- a/platform/mv3/extension/_locales/lt/messages.json +++ b/platform/mv3/extension/_locales/lt/messages.json @@ -148,7 +148,7 @@ "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "Elgsena", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { diff --git a/platform/mv3/extension/_locales/ms/messages.json b/platform/mv3/extension/_locales/ms/messages.json index 817a81f39af9d..c9147fe236ec9 100644 --- a/platform/mv3/extension/_locales/ms/messages.json +++ b/platform/mv3/extension/_locales/ms/messages.json @@ -156,7 +156,7 @@ "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { - "message": "Show the number of blocked requests on the toolbar icon", + "message": "Tunjukkan bilangan permintaan yang disekat pada ikon bar alat", "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 b4e410117aedf..a4bf19312686b 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -152,7 +152,7 @@ "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Filtreleme modu değiştirildiğinde sayfayı yenile", + "message": "Filtreleme modunu değiştirirken sayfayı otomatik olarak yenile", "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { diff --git a/platform/mv3/extension/_locales/ur/messages.json b/platform/mv3/extension/_locales/ur/messages.json index 2705d513fd105..bb06300ced6cf 100644 --- a/platform/mv3/extension/_locales/ur/messages.json +++ b/platform/mv3/extension/_locales/ur/messages.json @@ -28,31 +28,31 @@ "description": "Link to privacy policy on GitHub (English)" }, "popupFilteringModeLabel": { - "message": "filtering mode", + "message": "فلٹرنگ موڈ", "description": "Label in the popup panel for the current filtering mode" }, "popupTipDashboard": { - "message": "Open the dashboard", + "message": "ڈیش بورڈ کھولیں۔", "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", + "message": "مزید", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "کم", "description": "Label to be used to hide popup panel sections" }, "3pGroupDefault": { - "message": "Default", + "message": "طے شدہ", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "اشتہارات", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "رازداری", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { @@ -60,31 +60,31 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "پریشانیاں", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "متفرق", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "علاقے، زبانیں۔", "description": "Header for a ruleset section in 'Filter lists pane'" }, "aboutChangelog": { - "message": "Changelog", + "message": "چینج لاگ", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "ماخذ کوڈ (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "تعاون کرنے والے", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "سورس کوڈ", "description": "Link text to source code repo" }, "aboutTranslations": { @@ -92,39 +92,39 @@ "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "فہرستوں کو فلٹر کریں۔", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "بیرونی انحصار (GPLv3-مطابق):", "description": "Shown in the About pane" }, "firstRunSectionLabel": { - "message": "Welcome", + "message": "خوش آمدید", "description": "The header text for the welcome message section" }, "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", + "message": "آپ نے ابھی یو بی او لائٹ انسٹال کیا ہے۔ یہاں آپ تمام ویب سائٹس پر استعمال کرنے کے لیے ڈیفالٹ فلٹرنگ موڈ کا انتخاب کر سکتے ہیں۔\n\nپہلے سے طے شدہ طور پر، بنیادی موڈ کو منتخب کیا جاتا ہے کیونکہ اسے ڈیٹا کو پڑھنے اور اس میں ترمیم کرنے کی اجازت کی ضرورت نہیں ہوتی ہے۔ اگر آپ کو uBO Lite پر بھروسہ ہے، تو آپ اسے تمام ویب سائٹس پر ڈیٹا کو پڑھنے اور اس میں ترمیم کرنے کی وسیع اجازت دے سکتے ہیں تاکہ تمام ویب سائٹس کے لیے پہلے سے طے شدہ فلٹرنگ کی مزید جدید صلاحیتوں کو فعال کیا جا سکے۔", "description": "Descriptive text shown at first install time only " }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "ڈیفالٹ فلٹرنگ موڈ", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "ڈیفالٹ فلٹرنگ موڈ کو فی ویب سائٹ فلٹرنگ موڈز کے ذریعے اوور رائیڈ کر دیا جائے گا۔ آپ کسی بھی ویب سائٹ پر فلٹرنگ موڈ کو ایڈجسٹ کرسکتے ہیں اس کے مطابق جو بھی موڈ اس ویب سائٹ پر بہترین کام کرتا ہے۔ ہر موڈ کے اپنے فوائد اور نقصانات ہیں۔", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "کوئی فلٹرنگ نہیں", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "بنیادی", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "بہترین", "description": "Name of blocking mode 2" }, "filteringMode3Name": { @@ -132,31 +132,31 @@ "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "منتخب فلٹر فہرستوں سے بنیادی نیٹ ورک فلٹرنگ۔\n\nویب سائٹس پر ڈیٹا کو پڑھنے اور اس میں ترمیم کرنے کے لیے اجازت کی ضرورت نہیں ہے۔", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "اعلی درجے کی نیٹ ورک فلٹرنگ کے علاوہ منتخب فلٹر فہرستوں سے مخصوص توسیعی فلٹرنگ۔\n\nتمام ویب سائٹس پر ڈیٹا کو پڑھنے اور اس میں ترمیم کرنے کے لیے وسیع اجازت درکار ہے۔", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "اعلی درجے کی نیٹ ورک فلٹرنگ کے علاوہ منتخب فلٹر فہرستوں سے مخصوص اور عام توسیعی فلٹرنگ۔\n\nتمام ویب سائٹس پر ڈیٹا کو پڑھنے اور اس میں ترمیم کرنے کے لیے وسیع اجازت درکار ہے۔\n\nعام توسیع شدہ فلٹرنگ ویب پیج کے وسائل کے زیادہ استعمال کا سبب بن سکتی ہے۔", "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "میزبان ناموں کی فہرست جن کے لیے کوئی فلٹرنگ نہیں ہوگی۔", "description": "A short description for the editable field which lists trusted sites" }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "رویہ", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "فلٹرنگ موڈ تبدیل کرتے وقت صفحہ خودکار طور پر دوبارہ لوڈ کریں۔", "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { - "message": "Show the number of blocked requests on the toolbar icon", + "message": "ٹول بار کے آئیکن پر بلاک شدہ درخواستوں کی تعداد دکھائیں۔", "description": "Label for a checkbox in the options page" } } diff --git a/src/_locales/br_FR/messages.json b/src/_locales/br_FR/messages.json index 2a27e9f019281..2722eb8de84fc 100644 --- a/src/_locales/br_FR/messages.json +++ b/src/_locales/br_FR/messages.json @@ -484,11 +484,11 @@ "description": "Filter lists section name" }, "3pGroupSocial": { - "message": "Social widgets", + "message": "Widgetoù sokial", "description": "Filter lists section name" }, "3pGroupCookies": { - "message": "Cookie notices", + "message": "Kemennadennoù diwar-benn an toupinoù", "description": "Filter lists section name" }, "3pGroupAnnoyances": { diff --git a/src/_locales/bs/messages.json b/src/_locales/bs/messages.json index d80ae9d7bb8ef..bd0810a6c6ab0 100644 --- a/src/_locales/bs/messages.json +++ b/src/_locales/bs/messages.json @@ -484,11 +484,11 @@ "description": "Filter lists section name" }, "3pGroupSocial": { - "message": "Social widgets", + "message": "Društveni widgeti", "description": "Filter lists section name" }, "3pGroupCookies": { - "message": "Cookie notices", + "message": "Obavještenja o kolačićima", "description": "Filter lists section name" }, "3pGroupAnnoyances": { @@ -540,11 +540,11 @@ "description": "Warning against copy-pasting filters from random sources" }, "1pEnableMyFiltersLabel": { - "message": "Enable my custom filters", + "message": "Omogući moje prilagođene filtere", "description": "Label for the checkbox use to enable/disable 'My filters' list" }, "1pTrustMyFiltersLabel": { - "message": "Allow custom filters requiring trust", + "message": "Dozvolite prilagođene filtere koji zahtijevaju povjerenje", "description": "Label for the checkbox use to trust the content of 'My filters' list" }, "1pImport": { @@ -1264,7 +1264,7 @@ "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, "toggleJavascript": { - "message": "Toggle JavaScript", + "message": "Uključi JavaScript", "description": "Label for keyboard shortcut used to toggle no-scripting switch" }, "relaxBlockingMode": { diff --git a/src/_locales/lt/messages.json b/src/_locales/lt/messages.json index a44db57fe1420..b7431aceaa93c 100644 --- a/src/_locales/lt/messages.json +++ b/src/_locales/lt/messages.json @@ -940,7 +940,7 @@ "description": "Third paragraph of 'Filter issues' section in Support pane" }, "supportS4H": { - "message": "Bug report", + "message": "Klaidos pranešimas", "description": "Header of 'Bug report' section in Support pane" }, "supportS4P1": { diff --git a/src/_locales/ms/messages.json b/src/_locales/ms/messages.json index ed5b060b45f94..5247e837f1f1c 100644 --- a/src/_locales/ms/messages.json +++ b/src/_locales/ms/messages.json @@ -8,7 +8,7 @@ "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { - "message": "uBlock₀ — Papanmuka", + "message": "uBlock₀ — Papan pemuka", "description": "English: uBlock₀ — Dashboard" }, "dashboardUnsavedWarning": { @@ -124,7 +124,7 @@ "description": "English: Enter element picker mode" }, "popupTipLog": { - "message": "Membuka catatan", + "message": "Buka pengelog", "description": "Tooltip used for the logger icon in the panel" }, "popupTipReport": { @@ -188,7 +188,7 @@ "description": "Tooltip for the no-scripting per-site switch" }, "popupNoPopups_v2": { - "message": "Tetingkap pop timbul", + "message": "Tingkap timbul", "description": "Caption for the no-popups per-site switch" }, "popupNoLargeMedia_v2": { @@ -200,7 +200,7 @@ "description": "Caption for the no-cosmetic-filtering per-site switch" }, "popupNoRemoteFonts_v2": { - "message": "Fon terpencil", + "message": "Font tersendiri", "description": "Caption for the no-remote-fonts per-site switch" }, "popupNoScripting_v2": { @@ -484,11 +484,11 @@ "description": "Filter lists section name" }, "3pGroupSocial": { - "message": "Social widgets", + "message": "Widget sosial", "description": "Filter lists section name" }, "3pGroupCookies": { - "message": "Cookie notices", + "message": "Notis kuki", "description": "Filter lists section name" }, "3pGroupAnnoyances": { @@ -540,11 +540,11 @@ "description": "Warning against copy-pasting filters from random sources" }, "1pEnableMyFiltersLabel": { - "message": "Enable my custom filters", + "message": "Dayakan penapis tersuai saya", "description": "Label for the checkbox use to enable/disable 'My filters' list" }, "1pTrustMyFiltersLabel": { - "message": "Allow custom filters requiring trust", + "message": "Benarkan penapis tersuai yang memerlukan kepercayaan", "description": "Label for the checkbox use to trust the content of 'My filters' list" }, "1pImport": { @@ -1264,7 +1264,7 @@ "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, "toggleJavascript": { - "message": "Toggle JavaScript", + "message": "Togol JavaScript", "description": "Label for keyboard shortcut used to toggle no-scripting switch" }, "relaxBlockingMode": { diff --git a/src/_locales/sv/messages.json b/src/_locales/sv/messages.json index 37a8070e4e476..3abea889d2536 100644 --- a/src/_locales/sv/messages.json +++ b/src/_locales/sv/messages.json @@ -928,7 +928,7 @@ "description": "Header of 'Filter issues' section in Support pane" }, "supportS3P1": { - "message": "Rapportera filterproblem med specifika webbplatser till uBlockOrigin/uAssets problemhanteringssystemet. Kräver ett GitHub-konto.", + "message": "Rapportera filterproblem med specifika webbplatser till problemhanteringssystemet uBlockOrigin/uAssets. Kräver ett GitHub-konto.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS3P2": { @@ -944,7 +944,7 @@ "description": "Header of 'Bug report' section in Support pane" }, "supportS4P1": { - "message": "Rapportera problem med själva uBlock Origin till uBlockOrigin/uBlock-issue ärendehanteringssystemet. Kräver ett GitHub-konto.", + "message": "Rapportera problem med själva uBlock Origin till problemhanteringssystemet uBlockOrigin/uBlock-issue. Kräver ett GitHub-konto.", "description": "First paragraph of 'Bug report' section in Support pane" }, "supportS5H": { diff --git a/src/_locales/tr/messages.json b/src/_locales/tr/messages.json index 31f6aa55ca6ee..41ac3b3d47b5a 100644 --- a/src/_locales/tr/messages.json +++ b/src/_locales/tr/messages.json @@ -484,7 +484,7 @@ "description": "Filter lists section name" }, "3pGroupSocial": { - "message": "Sosyal gereçler", + "message": "Sosyal medya tuşları", "description": "Filter lists section name" }, "3pGroupCookies": { @@ -548,11 +548,11 @@ "description": "Label for the checkbox use to trust the content of 'My filters' list" }, "1pImport": { - "message": "İçe aktar ve ekle", + "message": "İçe aktar ve ekle…", "description": "Button in the 'My filters' pane" }, "1pExport": { - "message": "Dışa aktar", + "message": "Dışa aktar…", "description": "Button in the 'My filters' pane" }, "1pExportFilename": { @@ -636,7 +636,7 @@ "description": "Button in the 'Trusted sites' pane" }, "whitelistExport": { - "message": "Dışa aktar", + "message": "Dışa aktar…", "description": "Button in the 'Trusted sites' pane" }, "whitelistExportFilename": { diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json index f07258b6a40cb..7c3bc17a10ce8 100644 --- a/src/_locales/zh_TW/messages.json +++ b/src/_locales/zh_TW/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "終於有套使用不多的 CPU 及記憶體資源的高效率阻擋器。", + "message": "終於,有款僅使用少量 CPU 及記憶體的高效率阻擋器。", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { @@ -12,7 +12,7 @@ "description": "English: uBlock₀ — Dashboard" }, "dashboardUnsavedWarning": { - "message": "警告!您有尚未儲存的變更", + "message": "警告!變更尚未儲存。", "description": "A warning in the dashboard when navigating away from unsaved changes" }, "dashboardUnsavedWarningStay": { @@ -40,7 +40,7 @@ "description": "appears as tab name in dashboard" }, "whitelistPageName": { - "message": "受信任網站", + "message": "白名單", "description": "appears as tab name in dashboard" }, "shortcutsPageName": { @@ -140,7 +140,7 @@ "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups2": { - "message": "點擊後將不再封鎖此網站的所有彈出式廣告", + "message": "點擊以停止阻擋此網站的所有彈出式視窗", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoLargeMedia": { @@ -176,7 +176,7 @@ "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoRemoteFonts2": { - "message": "點擊以停止封鎖此網站的遠端字型", + "message": "點擊以解除封鎖此網站的遠端字體", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoScripting1": { @@ -276,7 +276,7 @@ "description": "Example of use: Version 1.26.4" }, "popup3pScriptFilter": { - "message": "腳本", + "message": "指令碼", "description": "Appears as an option to filter out firewall rows" }, "popup3pFrameFilter": { @@ -324,7 +324,7 @@ "description": "English: Show the number of blocked requests on the icon" }, "settingsTooltipsPrompt": { - "message": "關閉提示文字功能", + "message": "停用提示框", "description": "A checkbox in the Settings pane" }, "settingsContextMenuPrompt": { @@ -384,7 +384,7 @@ "description": "" }, "settingsNoRemoteFontsPrompt": { - "message": "封鎖遠端字型", + "message": "封鎖遠端字體", "description": "" }, "settingsNoScriptingPrompt": { @@ -444,7 +444,7 @@ "description": "English: Parse and enforce Adblock+ element hiding filters." }, "3pParseAllABPHideFiltersInfo": { - "message": "「元素隱藏過濾規則」用於隱藏網頁中礙眼,且不能被以網路請求為基礎之過濾引擎所阻擋的元素。", + "message": "「網頁元素過濾規則」用來隱藏網頁中被認為礙眼,且不能被以網路請求為基礎之過濾引擎所阻擋的元素。", "description": "Describes the purpose of the 'Parse and enforce cosmetic filters' feature." }, "3pIgnoreGenericCosmeticFilters": { @@ -452,7 +452,7 @@ "description": "This will cause uBO to ignore all generic cosmetic filters." }, "3pIgnoreGenericCosmeticFiltersInfo": { - "message": "「通用元素隱藏過濾規則」是會套用在所有網站上的元素隱藏過濾規則。啟用此選項會消除網頁處理此類規則時增加的額外記憶體與 CPU 使用量。\n\n建議在較低效能的裝置上啟用此選項。", + "message": "「通用元素隱藏過濾規則」是會套用在所有網站上的網頁元素過濾規則。啟用此選項會消除網頁處理此類規則時增加的額外記憶體與 CPU 使用量。\n\n建議在擁有較低效能的裝置上啟用此選項。", "description": "Describes the purpose of the 'Ignore generic cosmetic filters' feature." }, "3pSuspendUntilListsAreLoaded": { @@ -992,7 +992,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "含有覆蓋物或其他滋擾", + "message": "含有覆蓋物或其他滋擾物", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { @@ -1000,7 +1000,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "有私穩相關問題", + "message": "有隱私權相關問題", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { @@ -1008,7 +1008,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "會開啟不想要的分頁或視窗", + "message": "會開啟不需要的分頁或視窗", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { @@ -1140,7 +1140,7 @@ "description": "Firefox-specific: appears as 'uBlock₀ (off)'" }, "docblockedTitle": { - "message": "頁面已阻擋", + "message": "已封鎖頁面", "description": "Used as a title for the document-blocked page" }, "docblockedPrompt1": { @@ -1208,7 +1208,7 @@ "description": "used as a prompt for the user to provide a custom device name" }, "advancedSettingsWarning": { - "message": "警告!修改進階設定時請自負風險。", + "message": "警告!修改進階設定時,請自負風險。", "description": "A warning to users at the top of 'Advanced settings' page" }, "genericSubmit": { @@ -1244,7 +1244,7 @@ "description": "A context menu entry, to view the source code of the target resource" }, "shortcutCapturePlaceholder": { - "message": "輸入快捷鍵", + "message": "鍵入快速鍵", "description": "Placeholder string for input field used to capture a keyboard shortcut" }, "genericMergeViewScrollLock": { @@ -1296,7 +1296,7 @@ "description": "Summary of number of errors as reported by the linter " }, "unprocessedRequestTooltip": { - "message": "無法在瀏覽器啟動的時候正確過濾頁面。請重新載入來確保過濾正確。", + "message": "無法在瀏覽器啟動時正確過濾頁面。請重新載入以確保過濾正常。", "description": "A warning which will appear in the popup panel if needed" }, "dummy": { From 0cc8b7864f9153339d9cfa6beaa21ef00e0544fc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 1 Aug 2024 10:37:22 -0400 Subject: [PATCH 100/553] Ignore transient py stuff --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index dee00e98d3b96..1f064b847d71f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.bak *.pem +__pycache__/ /dist/build/ /tmp/ From 9562b19a935018dbe54cf7727205ffadecc435aa Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 1 Aug 2024 11:24:42 -0400 Subject: [PATCH 101/553] Fall back to "Basic" when removing `all-urls` from "No filtering" Related discussion: https://github.com/uBlockOrigin/uBOL-home/issues/156#issuecomment-2254576670 --- platform/mv3/extension/js/mode-manager.js | 37 ++++++++++++----------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/platform/mv3/extension/js/mode-manager.js b/platform/mv3/extension/js/mode-manager.js index e75dbeef58339..c6e7ddba651c3 100644 --- a/platform/mv3/extension/js/mode-manager.js +++ b/platform/mv3/extension/js/mode-manager.js @@ -19,18 +19,17 @@ Home: https://github.com/gorhill/uBlock */ -/* jshint esversion:11 */ - -'use strict'; - -/******************************************************************************/ +import { + TRUSTED_DIRECTIVE_BASE_RULE_ID, + getDynamicRules, +} from './ruleset-manager.js'; import { + adminRead, browser, dnr, - localRead, localWrite, localRemove, + localRead, localRemove, localWrite, sessionRead, sessionWrite, - adminRead, } from './ext.js'; import { @@ -40,11 +39,6 @@ import { toBroaderHostname, } from './utils.js'; -import { - TRUSTED_DIRECTIVE_BASE_RULE_ID, - getDynamicRules -} from './ruleset-manager.js'; - /******************************************************************************/ // 0: no filtering @@ -288,13 +282,15 @@ async function writeFilteringModeDetails(afterDetails) { async function filteringModesToDNR(modes) { const dynamicRuleMap = await getDynamicRules(); - const presentRule = dynamicRuleMap.get(TRUSTED_DIRECTIVE_BASE_RULE_ID+0); - const presentNone = new Set( - presentRule && presentRule.condition.requestDomains - ); - if ( eqSets(presentNone, modes.none) ) { return; } + const trustedRule = dynamicRuleMap.get(TRUSTED_DIRECTIVE_BASE_RULE_ID+0); + const trustedDomainSet = new Set(trustedRule?.condition.requestDomains); + if ( trustedDomainSet.size !== 0 ) { + if ( eqSets(trustedDomainSet, modes.none) ) { return; } + } else if ( trustedRule !== undefined ) { + if ( modes.none.has('all-urls') ) { return; } + } const removeRuleIds = []; - if ( presentRule !== undefined ) { + if ( trustedRule !== undefined ) { removeRuleIds.push(TRUSTED_DIRECTIVE_BASE_RULE_ID+0); removeRuleIds.push(TRUSTED_DIRECTIVE_BASE_RULE_ID+1); dynamicRuleMap.delete(TRUSTED_DIRECTIVE_BASE_RULE_ID+0); @@ -394,6 +390,11 @@ export async function setTrustedSites(hostnames) { const { none } = filteringModes; const hnSet = new Set(hostnames); let modified = false; + // Set default mode to Basic when removing No-filtering as default mode + if ( none.has('all-urls') && hnSet.has('all-urls') === false ) { + applyFilteringMode(filteringModes, 'all-urls', MODE_BASIC); + modified = true; + } for ( const hn of none ) { if ( hnSet.has(hn) ) { hnSet.delete(hn); From cc50accd4cd77f58821a2ac040b6ce8bb801663e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 2 Aug 2024 10:58:03 -0400 Subject: [PATCH 102/553] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 79ffa966e181f..c068d9816438d 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ uBlock Origin (uBO)

Get uBlock Origin for Chromium
-Important: Will uBO automatically transition to uBO Lite in the Chrome Web Store? (tldr: no) +Important: About Chrome Web Store's "This extension may soon no longer be supported"

*** From 2d41dc89e5613a1ee80686155814c17f8d575102 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 2 Aug 2024 11:12:39 -0400 Subject: [PATCH 103/553] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c068d9816438d..61a18f54a64dc 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ uBlock Origin (uBO)

Get uBlock Origin for Chromium
-Important: About Chrome Web Store's "This extension may soon no longer be supported" +IMPORTANT: About Chrome Web Store's "This extension may soon no longer be supported"

*** From 23a113715dab11936249ddf61151587d144030ac Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 2 Aug 2024 11:20:34 -0400 Subject: [PATCH 104/553] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 61a18f54a64dc..d91e592142693 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ uBlock Origin (uBO)

Get uBlock Origin for Chromium
-IMPORTANT: About Chrome Web Store's "This extension may soon no longer be supported" +IMPORTANT: About Google Chrome's "This extension may soon no longer be supported"

*** From d42329a3a348b2e4d5475012373e73493e73d7b1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 3 Aug 2024 12:03:22 -0400 Subject: [PATCH 105/553] Rephrase more accurately Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/160 --- platform/mv3/description/webstore.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mv3/description/webstore.txt b/platform/mv3/description/webstore.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.txt +++ b/platform/mv3/description/webstore.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. From 4f0d1301ab48e62afb3424609834c6353a0a5eee Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 3 Aug 2024 20:09:21 -0400 Subject: [PATCH 106/553] Improve `trusted-replace-node-text` scriptlet Related discussion: https://github.com/brave/adblock-resources/pull/194 --- assets/resources/scriptlets.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 6e9dcd60ea4b8..c95412867332b 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -730,6 +730,18 @@ function replaceNodeTextFn( safe.uboLog(logPrefix, 'Quitting'); } }; + const textContentFactory = (( ) => { + const out = { createScript: s => s }; + const { trustedTypes: tt } = self; + if ( tt instanceof Object ) { + if ( typeof tt.getPropertyType === 'function' ) { + if ( tt.getPropertyType('script', 'textContent') === 'TrustedScript' ) { + return tt.createPolicy('uBO', out); + } + } + } + return out; + })(); let sedCount = extraArgs.sedCount || 0; const handleNode = node => { const before = node.textContent; @@ -747,7 +759,9 @@ function replaceNodeTextFn( const after = pattern !== '' ? before.replace(rePattern, replacement) : replacement; - node.textContent = after; + node.textContent = node.nodeName === 'SCRIPT' + ? textContentFactory.createScript(after) + : after; if ( safe.logLevel > 1 ) { safe.uboLog(logPrefix, `Text before:\n${before.trim()}`); } From de0a35e7cc4ba38a2167a2b0c57b2dc2664f9ce9 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 3 Aug 2024 20:11:51 -0400 Subject: [PATCH 107/553] Update changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44692a4e23e6f..1dddae8d0af72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +- [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/4f0d1301ab) + +---------- + +# 1.59.0 + +## Fixes / changes + - [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/84be9cde6d) - [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/8afd9e233d) - [Improve `set-constant` scriptlet](https://github.com/gorhill/uBlock/commit/77feb25c4d) From a577d5ff50de8bffc1c1847f6640c04f71a6b249 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 3 Aug 2024 20:12:19 -0400 Subject: [PATCH 108/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 43eb9bc68ddfd..010d58db08ef5 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.0 \ No newline at end of file +1.59.1.0 \ No newline at end of file From fea92ac110dac632d350fec4500c084ecc7848bf Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 3 Aug 2024 20:21:23 -0400 Subject: [PATCH 109/553] 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 6b426df1439eb..c6344aa21d8ed 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.58.1.111", + "version": "1.59.1.0", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.58.1rc11/uBlock0_1.58.1rc11.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b0/uBlock0_1.59.1b0.firefox.signed.xpi" } ] } From 3668445679b0996d5333d7ba7f5b4523ec0a9d95 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 4 Aug 2024 00:15:40 -0400 Subject: [PATCH 110/553] Use random trusted-types policy name Related commit: https://github.com/gorhill/uBlock/commit/4f0d1301ab48e62afb3424609834c6353a0a5eee --- assets/resources/scriptlets.js | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index c95412867332b..48f4958dd4768 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -203,17 +203,28 @@ function safeSelf() { /******************************************************************************/ builtinScriptlets.push({ - name: 'get-exception-token.fn', - fn: getExceptionToken, + name: 'get-random-token.fn', + fn: getRandomToken, dependencies: [ 'safe-self.fn', ], }); -function getExceptionToken() { +function getRandomToken() { const safe = safeSelf(); - const token = - safe.String_fromCharCode(Date.now() % 26 + 97) + + return safe.String_fromCharCode(Date.now() % 26 + 97) + safe.Math_floor(safe.Math_random() * 982451653 + 982451653).toString(36); +} +/******************************************************************************/ + +builtinScriptlets.push({ + name: 'get-exception-token.fn', + fn: getExceptionToken, + dependencies: [ + 'get-random-token.fn', + ], +}); +function getExceptionToken() { + const token = getRandomToken(); const oe = self.onerror; self.onerror = function(msg, ...args) { if ( typeof msg === 'string' && msg.includes(token) ) { return true; } @@ -701,6 +712,7 @@ builtinScriptlets.push({ name: 'replace-node-text.fn', fn: replaceNodeTextFn, dependencies: [ + 'get-random-token.fn', 'run-at.fn', 'safe-self.fn', ], @@ -736,7 +748,7 @@ function replaceNodeTextFn( if ( tt instanceof Object ) { if ( typeof tt.getPropertyType === 'function' ) { if ( tt.getPropertyType('script', 'textContent') === 'TrustedScript' ) { - return tt.createPolicy('uBO', out); + return tt.createPolicy(getRandomToken(), out); } } } From 417dab538c99adbf567279043d733fdad1465968 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 4 Aug 2024 11:58:09 -0400 Subject: [PATCH 111/553] [mv3] Fix generating `allowAllRequests` rule when default mode is no-filtering --- platform/mv3/extension/js/mode-manager.js | 76 +++++++++++++++-------- 1 file changed, 50 insertions(+), 26 deletions(-) diff --git a/platform/mv3/extension/js/mode-manager.js b/platform/mv3/extension/js/mode-manager.js index c6e7ddba651c3..c3b9a01bb877b 100644 --- a/platform/mv3/extension/js/mode-manager.js +++ b/platform/mv3/extension/js/mode-manager.js @@ -74,6 +74,7 @@ const pruneHostnameFromSet = (hostname, hnSet) => { /******************************************************************************/ const eqSets = (setBefore, setAfter) => { + if ( setBefore.size !== setAfter.size ) { return false; } for ( const hn of setAfter ) { if ( setBefore.has(hn) === false ) { return false; } } @@ -283,23 +284,48 @@ async function writeFilteringModeDetails(afterDetails) { async function filteringModesToDNR(modes) { const dynamicRuleMap = await getDynamicRules(); const trustedRule = dynamicRuleMap.get(TRUSTED_DIRECTIVE_BASE_RULE_ID+0); - const trustedDomainSet = new Set(trustedRule?.condition.requestDomains); - if ( trustedDomainSet.size !== 0 ) { - if ( eqSets(trustedDomainSet, modes.none) ) { return; } - } else if ( trustedRule !== undefined ) { - if ( modes.none.has('all-urls') ) { return; } + const beforeRequestDomainSet = new Set(trustedRule?.condition.requestDomains); + const beforeExcludedRrequestDomainSet = new Set(trustedRule?.condition.excludedRequestDomains); + if ( trustedRule !== undefined && beforeRequestDomainSet.size === 0 ) { + beforeRequestDomainSet.add('all-urls'); + } else { + beforeExcludedRrequestDomainSet.add('all-urls'); } - const removeRuleIds = []; - if ( trustedRule !== undefined ) { - removeRuleIds.push(TRUSTED_DIRECTIVE_BASE_RULE_ID+0); - removeRuleIds.push(TRUSTED_DIRECTIVE_BASE_RULE_ID+1); - dynamicRuleMap.delete(TRUSTED_DIRECTIVE_BASE_RULE_ID+0); - dynamicRuleMap.delete(TRUSTED_DIRECTIVE_BASE_RULE_ID+1); + + const noneHostnames = new Set([ ...modes.none ]); + const notNoneHostnames = new Set([ ...modes.basic, ...modes.optimal, ...modes.complete ]); + let afterRequestDomainSet = new Set(); + let afterExcludedRequestDomainSet = new Set(); + if ( noneHostnames.has('all-urls') ) { + afterRequestDomainSet = new Set([ 'all-urls' ]); + afterExcludedRequestDomainSet = notNoneHostnames; + } else { + afterRequestDomainSet = noneHostnames; + afterExcludedRequestDomainSet = new Set([ 'all-urls' ]); } + + if ( eqSets(beforeRequestDomainSet, afterRequestDomainSet) ) { + if ( eqSets(beforeExcludedRrequestDomainSet, afterExcludedRequestDomainSet) ) { + return; + } + } + + const removeRuleIds = [ + TRUSTED_DIRECTIVE_BASE_RULE_ID+0, + TRUSTED_DIRECTIVE_BASE_RULE_ID+1, + ]; + dynamicRuleMap.delete(TRUSTED_DIRECTIVE_BASE_RULE_ID+0); + dynamicRuleMap.delete(TRUSTED_DIRECTIVE_BASE_RULE_ID+1); + + const allowEverywhere = afterRequestDomainSet.delete('all-urls'); + afterExcludedRequestDomainSet.delete('all-urls'); + const addRules = []; - const noneHostnames = [ ...modes.none ]; - const notNoneHostnames = [ ...modes.basic, ...modes.optimal, ...modes.complete ]; - if ( noneHostnames.length !== 0 ) { + if ( + allowEverywhere || + afterRequestDomainSet.size !== 0 || + afterExcludedRequestDomainSet.size !== 0 + ) { const rule0 = { id: TRUSTED_DIRECTIVE_BASE_RULE_ID+0, action: { type: 'allowAllRequests' }, @@ -308,10 +334,10 @@ async function filteringModesToDNR(modes) { }, priority: 100, }; - if ( modes.none.has('all-urls') === false ) { - rule0.condition.requestDomains = noneHostnames.slice(); - } else if ( notNoneHostnames.length !== 0 ) { - rule0.condition.excludedRequestDomains = notNoneHostnames.slice(); + if ( afterRequestDomainSet.size !== 0 ) { + rule0.condition.requestDomains = Array.from(afterRequestDomainSet); + } else if ( afterExcludedRequestDomainSet.size !== 0 ) { + rule0.condition.excludedRequestDomains = Array.from(afterExcludedRequestDomainSet); } addRules.push(rule0); dynamicRuleMap.set(TRUSTED_DIRECTIVE_BASE_RULE_ID+0, rule0); @@ -324,21 +350,19 @@ async function filteringModesToDNR(modes) { }, priority: 100, }; - if ( modes.none.has('all-urls') === false ) { - rule1.condition.initiatorDomains = noneHostnames.slice(); - } else if ( notNoneHostnames.length !== 0 ) { - rule1.condition.excludedInitiatorDomains = notNoneHostnames.slice(); + if ( rule0.condition.requestDomains ) { + rule1.condition.initiatorDomains = rule0.condition.requestDomains.slice(); + } else if ( rule0.condition.excludedRequestDomains ) { + rule1.condition.excludedInitiatorDomains = rule0.condition.excludedRequestDomains.slice(); } addRules.push(rule1); dynamicRuleMap.set(TRUSTED_DIRECTIVE_BASE_RULE_ID+1, rule1); } - const updateOptions = {}; + + const updateOptions = { removeRuleIds }; if ( addRules.length ) { updateOptions.addRules = addRules; } - if ( removeRuleIds.length ) { - updateOptions.removeRuleIds = removeRuleIds; - } await dnr.updateDynamicRules(updateOptions); } From fb037e97d0878db2f13eef0702a893d1420e7264 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 6 Aug 2024 14:47:03 -0400 Subject: [PATCH 112/553] [mv3] Improve `remove-attr.js` scriptlet Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/166 --- assets/resources/scriptlets.js | 31 ++++++++++++++++++++++-------- platform/mv3/extension/js/popup.js | 4 +++- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 48f4958dd4768..866b306678d1e 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -163,6 +163,12 @@ function safeSelf() { } return self.requestAnimationFrame(fn); }, + offIdle(id) { + if ( self.requestIdleCallback ) { + return self.cancelIdleCallback(id); + } + return self.cancelAnimationFrame(id); + } }; scriptletGlobals.safeSelf = safe; if ( scriptletGlobals.bcSecret === undefined ) { return safe; } @@ -258,7 +264,7 @@ builtinScriptlets.push({ function runAt(fn, when) { const intFromReadyState = state => { const targets = { - 'loading': 1, + 'loading': 1, 'asap': 1, 'interactive': 2, 'end': 2, '2': 2, 'complete': 3, 'idle': 3, '3': 3, }; @@ -2266,9 +2272,20 @@ function removeAttr( if ( safe.logLevel > 1 ) { safe.uboLog(logPrefix, `Target selector:\n\t${selector}`); } - let timer; + const asap = /\basap\b/.test(behavior); + let timerId; + const rmattrAsync = ( ) => { + if ( timerId !== undefined ) { return; } + timerId = safe.onIdle(( ) => { + timerId = undefined; + rmattr(); + }, { timeout: 17 }); + }; const rmattr = ( ) => { - timer = undefined; + if ( timerId !== undefined ) { + safe.offIdle(timerId); + timerId = undefined; + } try { const nodes = document.querySelectorAll(selector); for ( const node of nodes ) { @@ -2282,7 +2299,7 @@ function removeAttr( } }; const mutationHandler = mutations => { - if ( timer !== undefined ) { return; } + if ( timerId !== undefined ) { return; } let skip = true; for ( let i = 0; i < mutations.length && skip; i++ ) { const { type, addedNodes, removedNodes } = mutations[i]; @@ -2295,7 +2312,7 @@ function removeAttr( } } if ( skip ) { return; } - timer = safe.onIdle(rmattr, { timeout: 67 }); + asap ? rmattr() : rmattrAsync(); }; const start = ( ) => { rmattr(); @@ -2308,9 +2325,7 @@ function removeAttr( subtree: true, }); }; - runAt(( ) => { - start(); - }, /\bcomplete\b/.test(behavior) ? 'idle' : 'interactive'); + runAt(( ) => { start(); }, behavior.split(/\s+/)); } /******************************************************************************/ diff --git a/platform/mv3/extension/js/popup.js b/platform/mv3/extension/js/popup.js index 712dbbdf2ed3b..123c20bc73fa1 100644 --- a/platform/mv3/extension/js/popup.js +++ b/platform/mv3/extension/js/popup.js @@ -91,7 +91,9 @@ async function commitFilteringMode() { setFilteringMode(actualLevel); } if ( actualLevel !== beforeLevel && popupPanelData.autoReload ) { - browser.tabs.reload(currentTab.id); + self.setTimeout(( ) => { + browser.tabs.reload(currentTab.id); + }, 437); } } From ae6b53479d29b3915aff3d3b4fd3fd1174a4f472 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 6 Aug 2024 14:55:30 -0400 Subject: [PATCH 113/553] [mv3] Minor change to debug output --- platform/mv3/extension/js/debug.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mv3/extension/js/debug.js b/platform/mv3/extension/js/debug.js index a5f1a852f9e62..0674cd9446b88 100644 --- a/platform/mv3/extension/js/debug.js +++ b/platform/mv3/extension/js/debug.js @@ -87,7 +87,7 @@ export const getMatchedRules = (( ) => { } } const ruleId = rule.id; - rule.id = `${rulesetId}-${ruleId}`; + rule.id = `${rulesetId}/${ruleId}`; ruleset.set(ruleId, rule); } rulesets.set(rulesetId, ruleset); From 277977aa8a3342c8cb7cb88d584d26a11df83a12 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 6 Aug 2024 15:00:59 -0400 Subject: [PATCH 114/553] [mv3] Remove useless arguments --- platform/mv3/extension/js/scripting/css-procedural.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/mv3/extension/js/scripting/css-procedural.js b/platform/mv3/extension/js/scripting/css-procedural.js index 9f6f039d770ab..58fd4d6d7efe6 100644 --- a/platform/mv3/extension/js/scripting/css-procedural.js +++ b/platform/mv3/extension/js/scripting/css-procedural.js @@ -243,7 +243,7 @@ class PSelectorMatchesMediaTask extends PSelectorTask { if ( this.mql.media === 'not all' ) { return; } this.mql.addEventListener('change', ( ) => { if ( proceduralFilterer instanceof Object === false ) { return; } - proceduralFilterer.onDOMChanged([ null ]); + proceduralFilterer.onDOMChanged(); }); } transpose(node, output) { @@ -487,7 +487,7 @@ class PSelectorWatchAttrs extends PSelectorTask { // TODO: Is it worth trying to re-apply only the current selector? handler() { if ( proceduralFilterer instanceof Object ) { - proceduralFilterer.onDOMChanged([ null ]); + proceduralFilterer.onDOMChanged(); } } transpose(node, output) { From 4697f18d0ec2c3840a4ca83d4faf217c5b8a627e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 6 Aug 2024 16:50:07 -0400 Subject: [PATCH 115/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dddae8d0af72..24b7c6b9a9d15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `remove-attr.js` scriptlet](https://github.com/gorhill/uBlock/commit/fb037e97d0) - [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/4f0d1301ab) ---------- From fa285f0e972a8471f59ebffca6f63d0a6b37dabc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 6 Aug 2024 16:50:33 -0400 Subject: [PATCH 116/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 010d58db08ef5..4c593fac9f49f 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.0 \ No newline at end of file +1.59.1.1 \ No newline at end of file From f0dd466f99da8588ac686e9b6e6dc59509a49fa0 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 6 Aug 2024 16:55:50 -0400 Subject: [PATCH 117/553] 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 c6344aa21d8ed..c3bc0cd6412ed 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.0", + "version": "1.59.1.1", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b0/uBlock0_1.59.1b0.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b1/uBlock0_1.59.1b1.firefox.signed.xpi" } ] } From 665648ba9776dcf5804d823502de324b3eb82a07 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 7 Aug 2024 10:03:03 -0400 Subject: [PATCH 118/553] [mv3] Re-word some text for accuracy --- platform/mv3/extension/_locales/en/messages.json | 6 +++++- platform/mv3/extension/dashboard.html | 2 +- platform/mv3/make-rulesets.js | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/platform/mv3/extension/_locales/en/messages.json b/platform/mv3/extension/_locales/en/messages.json index 878f3cc80b78c..9f281de19554b 100644 --- a/platform/mv3/extension/_locales/en/messages.json +++ b/platform/mv3/extension/_locales/en/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/dashboard.html b/platform/mv3/extension/dashboard.html index d2dc918d980db..1cf7582050951 100644 --- a/platform/mv3/extension/dashboard.html +++ b/platform/mv3/extension/dashboard.html @@ -92,7 +92,7 @@

_

-

+

diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index fd842db38eaa5..e0ab17135fa16 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -1278,7 +1278,7 @@ async function main() { // Handpicked rulesets from abroad await rulesetFromURLs({ id: 'stevenblack-hosts', - name: 'Steven Black\'s hosts file', + name: 'Steven Black’s Unified Hosts (adware + malware)', enabled: false, urls: [ 'https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts' ], homeURL: 'https://github.com/StevenBlack/hosts#readme', From 1822d1503f48c44a5a44f8527bf9c60d003e6223 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 12 Aug 2024 10:54:11 -0400 Subject: [PATCH 119/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.ar.txt | 2 +- platform/mv3/description/webstore.az.txt | 2 +- platform/mv3/description/webstore.be.txt | 2 +- platform/mv3/description/webstore.bg.txt | 2 +- platform/mv3/description/webstore.bn.txt | 2 +- platform/mv3/description/webstore.br_FR.txt | 2 +- platform/mv3/description/webstore.bs.txt | 2 +- platform/mv3/description/webstore.ca.txt | 2 +- platform/mv3/description/webstore.cs.txt | 2 +- platform/mv3/description/webstore.cv.txt | 2 +- platform/mv3/description/webstore.cy.txt | 2 +- platform/mv3/description/webstore.da.txt | 2 +- platform/mv3/description/webstore.de.txt | 2 +- platform/mv3/description/webstore.el.txt | 2 +- platform/mv3/description/webstore.en_GB.txt | 2 +- platform/mv3/description/webstore.eo.txt | 2 +- platform/mv3/description/webstore.es.txt | 2 +- platform/mv3/description/webstore.et.txt | 2 +- platform/mv3/description/webstore.eu.txt | 2 +- platform/mv3/description/webstore.fa.txt | 4 +- platform/mv3/description/webstore.fi.txt | 4 +- platform/mv3/description/webstore.fil.txt | 2 +- platform/mv3/description/webstore.fr.txt | 2 +- platform/mv3/description/webstore.fy.txt | 2 +- platform/mv3/description/webstore.gl.txt | 2 +- platform/mv3/description/webstore.gu.txt | 2 +- platform/mv3/description/webstore.he.txt | 2 +- platform/mv3/description/webstore.hi.txt | 2 +- platform/mv3/description/webstore.hr.txt | 2 +- platform/mv3/description/webstore.hu.txt | 18 +-- platform/mv3/description/webstore.hy.txt | 2 +- platform/mv3/description/webstore.id.txt | 2 +- platform/mv3/description/webstore.it.txt | 2 +- platform/mv3/description/webstore.ja.txt | 2 +- platform/mv3/description/webstore.ka.txt | 2 +- platform/mv3/description/webstore.kk.txt | 2 +- platform/mv3/description/webstore.kn.txt | 2 +- platform/mv3/description/webstore.ko.txt | 2 +- platform/mv3/description/webstore.lt.txt | 2 +- platform/mv3/description/webstore.lv.txt | 2 +- platform/mv3/description/webstore.mk.txt | 2 +- platform/mv3/description/webstore.ml.txt | 2 +- platform/mv3/description/webstore.mr.txt | 2 +- platform/mv3/description/webstore.ms.txt | 2 +- platform/mv3/description/webstore.nb.txt | 2 +- platform/mv3/description/webstore.nl.txt | 2 +- platform/mv3/description/webstore.oc.txt | 2 +- platform/mv3/description/webstore.pa.txt | 4 +- platform/mv3/description/webstore.pl.txt | 2 +- platform/mv3/description/webstore.pt_BR.txt | 2 +- platform/mv3/description/webstore.pt_PT.txt | 2 +- platform/mv3/description/webstore.ro.txt | 2 +- platform/mv3/description/webstore.ru.txt | 2 +- platform/mv3/description/webstore.si.txt | 2 +- platform/mv3/description/webstore.sk.txt | 2 +- platform/mv3/description/webstore.sl.txt | 2 +- platform/mv3/description/webstore.so.txt | 2 +- platform/mv3/description/webstore.sq.txt | 2 +- platform/mv3/description/webstore.sr.txt | 2 +- platform/mv3/description/webstore.sv.txt | 2 +- platform/mv3/description/webstore.sw.txt | 2 +- platform/mv3/description/webstore.ta.txt | 2 +- platform/mv3/description/webstore.te.txt | 2 +- platform/mv3/description/webstore.th.txt | 2 +- platform/mv3/description/webstore.tr.txt | 2 +- platform/mv3/description/webstore.uk.txt | 2 +- platform/mv3/description/webstore.ur.txt | 2 +- platform/mv3/description/webstore.vi.txt | 2 +- platform/mv3/description/webstore.zh_CN.txt | 2 +- platform/mv3/description/webstore.zh_TW.txt | 2 +- .../mv3/extension/_locales/ar/messages.json | 8 +- .../mv3/extension/_locales/az/messages.json | 6 +- .../mv3/extension/_locales/be/messages.json | 4 + .../mv3/extension/_locales/bg/messages.json | 4 + .../mv3/extension/_locales/bn/messages.json | 4 + .../extension/_locales/br_FR/messages.json | 4 + .../mv3/extension/_locales/bs/messages.json | 4 + .../mv3/extension/_locales/ca/messages.json | 4 + .../mv3/extension/_locales/cs/messages.json | 4 + .../mv3/extension/_locales/cv/messages.json | 6 +- .../mv3/extension/_locales/cy/messages.json | 6 +- .../mv3/extension/_locales/da/messages.json | 4 + .../mv3/extension/_locales/de/messages.json | 6 +- .../mv3/extension/_locales/el/messages.json | 4 + .../extension/_locales/en_GB/messages.json | 4 + .../mv3/extension/_locales/eo/messages.json | 6 +- .../mv3/extension/_locales/es/messages.json | 4 + .../mv3/extension/_locales/et/messages.json | 6 +- .../mv3/extension/_locales/eu/messages.json | 4 + .../mv3/extension/_locales/fa/messages.json | 6 +- .../mv3/extension/_locales/fi/messages.json | 4 + .../mv3/extension/_locales/fil/messages.json | 6 +- .../mv3/extension/_locales/fr/messages.json | 6 +- .../mv3/extension/_locales/fy/messages.json | 4 + .../mv3/extension/_locales/gl/messages.json | 4 + .../mv3/extension/_locales/gu/messages.json | 6 +- .../mv3/extension/_locales/he/messages.json | 4 + .../mv3/extension/_locales/hi/messages.json | 4 + .../mv3/extension/_locales/hr/messages.json | 4 + .../mv3/extension/_locales/hu/messages.json | 18 ++- .../mv3/extension/_locales/hy/messages.json | 4 + .../mv3/extension/_locales/id/messages.json | 4 + .../mv3/extension/_locales/it/messages.json | 4 + .../mv3/extension/_locales/ja/messages.json | 4 + .../mv3/extension/_locales/ka/messages.json | 4 + .../mv3/extension/_locales/kk/messages.json | 6 +- .../mv3/extension/_locales/kn/messages.json | 6 +- .../mv3/extension/_locales/ko/messages.json | 4 + .../mv3/extension/_locales/lt/messages.json | 6 +- .../mv3/extension/_locales/lv/messages.json | 4 + .../mv3/extension/_locales/mk/messages.json | 6 +- .../mv3/extension/_locales/ml/messages.json | 4 + .../mv3/extension/_locales/mr/messages.json | 6 +- .../mv3/extension/_locales/ms/messages.json | 4 + .../mv3/extension/_locales/nb/messages.json | 4 + .../mv3/extension/_locales/nl/messages.json | 4 + .../mv3/extension/_locales/oc/messages.json | 6 +- .../mv3/extension/_locales/pa/messages.json | 4 + .../mv3/extension/_locales/pl/messages.json | 4 + .../extension/_locales/pt_BR/messages.json | 6 +- .../extension/_locales/pt_PT/messages.json | 4 + .../mv3/extension/_locales/ro/messages.json | 4 + .../mv3/extension/_locales/ru/messages.json | 4 + .../mv3/extension/_locales/si/messages.json | 6 +- .../mv3/extension/_locales/sk/messages.json | 4 + .../mv3/extension/_locales/sl/messages.json | 6 +- .../mv3/extension/_locales/so/messages.json | 6 +- .../mv3/extension/_locales/sq/messages.json | 6 +- .../mv3/extension/_locales/sr/messages.json | 4 + .../mv3/extension/_locales/sv/messages.json | 4 + .../mv3/extension/_locales/sw/messages.json | 6 +- .../mv3/extension/_locales/ta/messages.json | 6 +- .../mv3/extension/_locales/te/messages.json | 4 + .../mv3/extension/_locales/th/messages.json | 28 ++-- .../mv3/extension/_locales/tr/messages.json | 4 + .../mv3/extension/_locales/uk/messages.json | 4 + .../mv3/extension/_locales/ur/messages.json | 4 + .../mv3/extension/_locales/vi/messages.json | 4 + .../extension/_locales/zh_CN/messages.json | 4 + .../extension/_locales/zh_TW/messages.json | 4 + src/_locales/ca/messages.json | 2 +- src/_locales/el/messages.json | 8 +- src/_locales/fi/messages.json | 6 +- src/_locales/gl/messages.json | 16 +-- src/_locales/hu/messages.json | 124 +++++++++--------- src/_locales/pa/messages.json | 8 +- src/_locales/sr/messages.json | 4 +- 147 files changed, 489 insertions(+), 209 deletions(-) diff --git a/platform/mv3/description/webstore.ar.txt b/platform/mv3/description/webstore.ar.txt index 97675121f0c9d..9053a997ad161 100644 --- a/platform/mv3/description/webstore.ar.txt +++ b/platform/mv3/description/webstore.ar.txt @@ -7,7 +7,7 @@ - الخصوصية السهلة - قائمة خادم الإعلانات والتتبع لبيتر لوي -يمكنك إضافة المزيد من القواعد من خلال زيارة صفحة الخيارات ومن ثم أنقر على رمز _Cogs_ في اللوحة المنبثقة. +يمكنك تفعيل المزيد من مجموعات القواعد من خلال زيارة صفحة الخيارات - انقر على أيقونة _الترس_ في لوحة الإشعارات. uBOL صريح تمامًا، مما يعني أنه لا تحتاج إلى uBOL بشكل دائم لحدوث تصفية المحتوى، يتم إجراء تصفية المحتوى من خلال إضافة CSS/JS بشكل موثوق به بواسطة المتصفح نفسه بدلًا من الإضافة. هذا يعني أن uBOL نفسه لا يستهلك موارد وحدة المعالجة المركزية/الذاكرة أثناء استمراره في حظر المحتوى. عملية عامل الخدمة في uBOL مطلوبة _فقط_ عند التفاعل مع اللوحة المنبثقة أو صفحة الخيارات. diff --git a/platform/mv3/description/webstore.az.txt b/platform/mv3/description/webstore.az.txt index 8ff852cf786a6..61d4f83dca739 100644 --- a/platform/mv3/description/webstore.az.txt +++ b/platform/mv3/description/webstore.az.txt @@ -7,7 +7,7 @@ Defolt qaydalar dəsti uBlock Origin-in defolt filtr dəstinə uyğundur: - EasyPrivacy - Peter Lowe-un Reklam və izləyici server siyahısı -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.be.txt b/platform/mv3/description/webstore.be.txt index 80b06a4940748..c23daa3fb6dd8 100644 --- a/platform/mv3/description/webstore.be.txt +++ b/platform/mv3/description/webstore.be.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.bg.txt b/platform/mv3/description/webstore.bg.txt index 6e58550d3cf46..3430ca651326e 100644 --- a/platform/mv3/description/webstore.bg.txt +++ b/platform/mv3/description/webstore.bg.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) е блокер за съдържание *без разреше - EasyPrivacy - Списък със сървъри на Peter Lowe за реклами и проследяване -Можете да добавите още набори от правила, като посетите страницата с опции – щракнете върху иконата _зъбно колело_ в изскачащия панел. +Можете да включите още набори от правила, като посетите страницата с опции – щракнете върху иконата „зъбно колело“ в изскачащия панел. uBOL е изцяло декларативен, което означава, че няма нужда от постоянен процес на uBOL за филтриране, а филтрирането на съдържание, базирано на инжектиране на CSS/JS, се извършва надеждно от самия браузър, а не от разширението. Това означава, че самият uBOL не консумира ресурси на процесора/паметта, докато тече блокирането на съдържанието – работният процес на услугата на uBOL е необходим _само_ когато взаимодействате с изскачащия панел или страниците с опции. diff --git a/platform/mv3/description/webstore.bn.txt b/platform/mv3/description/webstore.bn.txt index 83e739a19aebb..ba1fcbdc5e9d3 100644 --- a/platform/mv3/description/webstore.bn.txt +++ b/platform/mv3/description/webstore.bn.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) হল একটি *অনুমতি-হীন* MV3-ভিত - সহজ গোপনীয়তা - পিটার লো এর বিজ্ঞাপন এবং ট্র্যাকিং সার্ভার তালিকা -আপনি অপশন পেজে গিয়ে আরও নিয়ম সেট যোগ করতে পারেন -- পপআপ প্যানেলে _Cogs_ আইকনে ক্লিক করুন। +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL সম্পূর্ণরূপে ঘোষণামূলক, অর্থাৎ ফিল্টারিং করতে একটি স্থায়ী uBOL প্রক্রিয়ার প্রয়োজন নেই, এবং CSS/JS ইনজেকশন-ভিত্তিক বিষয়বস্তু ফিল্টারিং এক্সটেনশনের পরিবর্তে ব্রাউজার নিজেই নির্ভরযোগ্যভাবে এই কাজ করে থাকে। এর মানে হল যে কন্টেন্ট ব্লকিং চলমান থাকা অবস্থায় uBOL নিজেই CPU/মেমরি রিসোর্স ব্যবহার করে না -- uBOL-এর পরিষেবার প্রক্রিয়ার প্রয়োজন শুধুমাত্র_ যখন আপনি পপআপ প্যানেল বা অপশন পেজগুলির সাথে ইন্টারঅ্যাক্ট করেন। diff --git a/platform/mv3/description/webstore.br_FR.txt b/platform/mv3/description/webstore.br_FR.txt index 5cf05df10d91a..a768351889f18 100644 --- a/platform/mv3/description/webstore.br_FR.txt +++ b/platform/mv3/description/webstore.br_FR.txt @@ -7,7 +7,7 @@ Ar reolennoù dre ziouer a glot gant silañ dre ziouer uBlock Origin: - EasyPrivacy - Roll bruderezh ha servijerioù heuliañ Peter Lowe -Tu zo deoc'h ouzhpennañ reolennoù all en arventennoù -- klikit war an ikon _kendentadur_ er banell popup. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. Disklêriañ a ra uBOL penn-da-benn, da lavaret eo n'eus ket ezhomm eus un argerzh uBOL padus evit ma c'hoarvezfe ar silañ, ha silañ endalc'hadoù diazezet war enlakaat CSS/JS a vez graet en un doare fizius gant ar merdeer e-unan kentoc'h eget gant an astenn. Kement-se a dalvez ne vez ket gounezet gant uBOL e-unan arc'hwelioù CPU/memor e-pad ma vez stanket an endalc'hadoù -- ezhomm zo eus argerzh al labourer servij uBOL _nemet_ pa vez etregweredet gant ar banell digeriñ pe ar pajennoù dibarzhioù. diff --git a/platform/mv3/description/webstore.bs.txt b/platform/mv3/description/webstore.bs.txt index 96ba7d2ef9c3b..f0636858a031a 100644 --- a/platform/mv3/description/webstore.bs.txt +++ b/platform/mv3/description/webstore.bs.txt @@ -7,7 +7,7 @@ Zadani skup pravila odgovara zadanom skupu filtera uBlock Origin: - EasyPrivacy - Oglas Peter Lowe i lista servera za praćenje -Možete dodati još skupova pravila tako što ćete posjetiti stranicu sa opcijama -- kliknite na ikonu _Cogs_ na iskačućoj ploči. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL je potpuno deklarativno, što znači da nema potrebe za trajnim uBOL procesom da bi se filtriranje dogodilo, a filtriranje sadržaja zasnovano na CSS/JS injekcijama se pouzdano izvodi od strane samog pretraživača, a ne ekstenzije. To znači da sam uBOL ne troši CPU/memorijske resurse dok je blokiranje sadržaja u toku -- proces uBOL-a servisnog radnika je potreban _samo_ kada stupite u interakciju sa iskačućim panelom ili stranicama sa opcijama. diff --git a/platform/mv3/description/webstore.ca.txt b/platform/mv3/description/webstore.ca.txt index e75025530597a..1a5b9cd9aaa45 100644 --- a/platform/mv3/description/webstore.ca.txt +++ b/platform/mv3/description/webstore.ca.txt @@ -7,7 +7,7 @@ El conjunt de regles per defecte correspon al conjunt de filtres per defecte d'u - EasyPrivacy - Llista de servidors de seguiment i anuncis de Peter Lowe -Podeu afegir més conjunts de regles si visiteu la pàgina d'opcions: feu clic a la icona _Cogs_ al tauler emergent. +Podeu habilitar més conjunts de regles si visiteu la pàgina d'opcions: feu clic a la icona _Cogs_ al tauler emergent. L'uBOL és totalment declaratiu, és a dir, no cal un procés uBOL permanent perquè es produeixi el filtratge, i el filtratge de contingut basat en injecció CSS/JS es realitza de manera fiable pel propi navegador més que per l'extensió. Això vol dir que l'uBOL en si no consumeix recursos de CPU/memòria mentre el bloqueig de contingut està en curs; el procés de treballador de servei d'uBOL només es requereix quan interactueu amb el tauler emergent o les pàgines d'opcions. diff --git a/platform/mv3/description/webstore.cs.txt b/platform/mv3/description/webstore.cs.txt index 05ca248f754a1..e698d696b48e5 100644 --- a/platform/mv3/description/webstore.cs.txt +++ b/platform/mv3/description/webstore.cs.txt @@ -7,7 +7,7 @@ Výchozí sada pravidel koresponduje k výchozím sadám filtrů uBlock Origin: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -Můžete přidat více sad pravidel navštívením stránky nastavení -- klikněte na ikonu ozubených kol ve vyskakovácím panelu. +Další sady pravidel můžete povolit na stránce nastavení - klikněte na ikonu _Ozubeného kolečka_ ve vyskakovacím panelu. uBOL je zcela deklarativní, což znamená, že pro filtrování není potřeba permanentní proces uBOL a filtrování obsahu založené na vstřikování CSS/JS je spolehlivě prováděno samotným prohlížečem, nikoli rozšířením. To znamená, že samotný uBOL nespotřebovává zdroje CPU/paměti, zatímco probíhá blokování obsahu – proces servisního pracovníka uBOL je vyžadován _pouze_ při interakci s vyskakovacím panelem nebo stránkami nastavení. diff --git a/platform/mv3/description/webstore.cv.txt b/platform/mv3/description/webstore.cv.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.cv.txt +++ b/platform/mv3/description/webstore.cv.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.cy.txt b/platform/mv3/description/webstore.cy.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.cy.txt +++ b/platform/mv3/description/webstore.cy.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.da.txt b/platform/mv3/description/webstore.da.txt index 1d3218873cb5a..34a84077d1281 100644 --- a/platform/mv3/description/webstore.da.txt +++ b/platform/mv3/description/webstore.da.txt @@ -7,7 +7,7 @@ Standardregelsættet svarer til uBlock Origins standardfiltersæt: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -Flere regelsæt kan tilføjes ved at gå til indstillingssiden -- klik på ikonet _Cogs_ i pop op-panelet. +Flere regelsæt kan aktiveres ved at gå til indstillingssiden -- klik på ikonet _Tandhjul_ i pop op-panelet. uBOL er fuldstændig deklarativ, hvilket betyder, at ingen permanent uBOL-proces behøves for at filtreringen kan finde sted, og CSS/JS-injektionsbaseret indholdsfiltrering udføres pålideligt af browseren selv i stedet for af udvidelsen. Dette betyder, at uBOL ikke selv forbruger CPU-/hukommelsesressourcer under indholdsblokeringen -- uBOLs tjenestearbejdsproces er _kun_ nødvendig under interaktion med pop op-panelet eller indstillingssiderne. diff --git a/platform/mv3/description/webstore.de.txt b/platform/mv3/description/webstore.de.txt index 807ec84c1d918..df224daac5367 100644 --- a/platform/mv3/description/webstore.de.txt +++ b/platform/mv3/description/webstore.de.txt @@ -7,7 +7,7 @@ Die Standardregeln entsprechen den Standardfiltern von uBlock Origin: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -Sie können weitere Regeln hinzufügen, indem Sie die Optionen aufrufen — klicken Sie dazu im Pop-up-Fenster auf das Symbol mit den _Zahnrädern_. +Sie können weitere Regeln aktivieren, indem Sie die Einstellungen aufrufen — klicken Sie dazu im Pop-up-Fenster auf das Symbol mit den _Zahnrädern_. uBOL ist vollständig deklarativ, d. h. es ist kein dauerhafter uBOL-Prozess für das Filtern erforderlich, und die auf CSS/JS-Injektion basierende Inhaltsfilterung wird zuverlässig vom Browser selbst und nicht von der Erweiterung durchgeführt. Das bedeutet, dass uBOL selbst keine CPU-/Speicherressourcen verbraucht, während der Inhalt blockiert wird — der uBOL-Service-Worker-Prozess wird _nur_ benötigt, wenn Sie mit dem Pop-up-Fenster oder den Optionen interagieren. diff --git a/platform/mv3/description/webstore.el.txt b/platform/mv3/description/webstore.el.txt index 32d043db89b31..ae5aed364399c 100644 --- a/platform/mv3/description/webstore.el.txt +++ b/platform/mv3/description/webstore.el.txt @@ -7,7 +7,7 @@ - EasyPrivacy - Peter Lowe’s Ad and tracking server list -Μπορείτε να προσθέσετε περισσότερα σύνολα κανόνων μεταβαίνοντας στη σελίδα επιλογών -- κάντε κλικ στο εικονίδιο _Cogs_ στον αναδυόμενο πίνακα. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. Το uBOL είναι εξ'ολοκλήρου δηλωτικό, πράγμα που σημαίνει ότι δεν υπάρχει ανάγκη για μόνιμη διαδικασία uBOL για να πραγματοποιηθεί το φιλτράρισμα, και το φιλτράρισμα περιεχομένου που βασίζεται σε έγχυση CSS/JS εκτελείται αξιόπιστα από το ίδιο το πρόγραμμα περιήγησης και όχι από την επέκταση. Αυτό σημαίνει ότι το ίδιο το uBOL δεν καταναλώνει πόρους CPU/μνήμης ενώ ο αποκλεισμός περιεχομένου είναι σε εξέλιξη -- η διαδικασία του service worker του uBOL απαιτείται _μόνο_ όταν αλληλεπιδράτε με τον αναδυόμενο πίνακα ή τις σελίδες επιλογών. diff --git a/platform/mv3/description/webstore.en_GB.txt b/platform/mv3/description/webstore.en_GB.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.en_GB.txt +++ b/platform/mv3/description/webstore.en_GB.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.eo.txt b/platform/mv3/description/webstore.eo.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.eo.txt +++ b/platform/mv3/description/webstore.eo.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.es.txt b/platform/mv3/description/webstore.es.txt index 2ea6cfff29121..b89c567215bb5 100644 --- a/platform/mv3/description/webstore.es.txt +++ b/platform/mv3/description/webstore.es.txt @@ -7,7 +7,7 @@ Por defecto ya trae configuradas las siguientes listas de filtros: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -Puedes añadir más conjuntos de reglas visitando la página de opciones, haz clic en el icono de _engranaje_ del panel emergente. +Puedes activar más ruletas visitando la página de opciones --pulsa el icono _Cogs_ en la ventana del panel uBOL es completamente declarativo, lo que significa que no hay necesidad de un proceso uBOL permanente para que se produzca el filtrado, y el filtrado de contenido basado en la inyección de CSS/JS se realiza de forma confiable por el propio navegador en lugar de la extensión. Esto significa que uBOL en sí mismo no consume recursos de CPU/memoria mientras el bloqueo de contenido está en curso, el proceso service worker de uBOL se requiere _solo_ cuando se interactúa con el panel emergente o las páginas de opciones. diff --git a/platform/mv3/description/webstore.et.txt b/platform/mv3/description/webstore.et.txt index 520e4ce134edc..0f81da1126305 100644 --- a/platform/mv3/description/webstore.et.txt +++ b/platform/mv3/description/webstore.et.txt @@ -7,7 +7,7 @@ Tavaline reeglitekogum vastab uBlock Origini tavalisele filtritekogumile: - EasyPrivacy Peter Lowe'i reklaamide ja jälitusserverite loend -Reeglitekogumeid saate lisada valikute lehelt ehk avanenud paneelis klõpsake _Cogs_ ikooni. +Rohkem reegleid valikutest ehk toksake _Cogs_ ikooni hüpikpaneelis. uBOL on läbinisti deklaratiivne ehk filtreerimiseks pole vaja kogu aeg töötavat uBOLi protsessi ja CSS/JS süstipõhist sisu filtreerib tegelikult brauser, mitte laiendus. Teisisõnu, uBOL ei kasuta sisu tõkestamisel protsessori/mälu ressursse. uBOLi teenuse toimimise protsessi on vaja _vaid_ juhul, kui kasutate hüpikpaneeli või valikute lehekülgi. diff --git a/platform/mv3/description/webstore.eu.txt b/platform/mv3/description/webstore.eu.txt index f32691b857e2b..c0ebbdfb27e0d 100644 --- a/platform/mv3/description/webstore.eu.txt +++ b/platform/mv3/description/webstore.eu.txt @@ -7,7 +7,7 @@ ZerrendaErraza PribazitateaErraza Peter Lowe-ren Ad and tracker zerrenda -Arau gehiago gehitu ditzakezu aukeren orrialdea bisitatuz. Sakatu _Cogs_ ikonoa popup panelean. +Ruleta gehiago aktibatu ahal duzu aukerak orria --klikatu _Cogs_ ikonoa panelearen lehioan uBOL guztiz deklaratiboa da, hau da, ez dago uBOL prozesu iraunkor baten beharrik iragazketa gertatzeko, eta CSS/JS injekzioan oinarritutako edukien iragazketa nabigatzaileak berak egiten du fidagarritasunez, luzapenaren arabera beharrean. Horrek esan nahi du uBOLek berak ez duela CPU/memoria baliabiderik kontsumitzen edukien blokeoa martxan dagoen bitartean... uBOLren zerbitzuko langileen prozesua _only_ behar da popup panelarekin edo aukera orriekin elkarreragiten denean. diff --git a/platform/mv3/description/webstore.fa.txt b/platform/mv3/description/webstore.fa.txt index e03fa801ee7f0..b85b55d27092c 100644 --- a/platform/mv3/description/webstore.fa.txt +++ b/platform/mv3/description/webstore.fa.txt @@ -1,13 +1,13 @@ uBO Lite (uBOL) is a *permission-less* MV3-based content blocker. -The default ruleset corresponds to uBlock Origin's default filterset: +مجموعه قوانین پیش فرض آن مطابق با مجموعه قوانین پیش فرض uBlock Origin است: - uBlock Origin's built-in filter lists - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.fi.txt b/platform/mv3/description/webstore.fi.txt index 7e5693c715911..672396d3a9f7b 100644 --- a/platform/mv3/description/webstore.fi.txt +++ b/platform/mv3/description/webstore.fi.txt @@ -7,7 +7,7 @@ Oletusarvoiset sääntömääritykset vastaavat uBlock Origin -laajennuksen olet - EasyPrivacy - Peter Lowe’s Ad and tracking server list -Voit lisätä sääntömäärityksiä asetussivulta -- paina ponnahduspaneelin _Rataskuvaketta_. +Voit aktivoida lisää sääntömäärityksiä laajennuksen asetuksista – paina ponnahduspaneelin _Ratas_-kuvaketta. uBOL on täysin deklaratiivinen, eli suodatus ei edellytä pysyvää uBOL-prosessia ja CSS-/JS-koodin manipulointiin perustuva sisällönsuodatuksen suorittaa laajennusprosessin sijaan luotettavasti selainsovellus. Tämän ansiosta itse uBOL ei kuormita prosessoria tai keskusmuistia sisällöneston tapahtuessa -- uBOL:n työprosessia tarvitaan _ainoastaan_ ponnahduspaneelia ja asetussivuja käytettäessä. @@ -15,7 +15,7 @@ uBOL ei edellytä laajan tietojen luku- ja muokkausoikeuden myöntämistä asenn On kuitenkin mahdollista myöntää *yksinomaisesti* uBOL:lle laajennetut käyttöoikeudet sivustokohtaisesti niiden suodatuksen tehostamiseksi kosmeettisella suodatuksella ja scriplet-injektoinnilla. -Laajemmat oikeudet myönnetään avoimelle sivustolle avaamalla ponnahduspaneeli ja valitsemalla korkeampi suodatustaso, kuten Optimaalinen tai Täysi. +Laajemmat oikeudet myönnetään avoimelle sivustolle avaamalla ponnahduspaneeli ja valitsemalla korkeampi suodatustaso, kuten "Optimaalinen" tai "Täysi". Tällöin selain varoittaa laajennuksen avoimelle sivustolle pyytämien käyttöoikeuksien seurauksista ja pyytää hyväksymään tai hylkäämään pyynnön. diff --git a/platform/mv3/description/webstore.fil.txt b/platform/mv3/description/webstore.fil.txt index 0bb5710c6e233..b859f25bf3182 100644 --- a/platform/mv3/description/webstore.fil.txt +++ b/platform/mv3/description/webstore.fil.txt @@ -7,7 +7,7 @@ Tulad ng uBlock Origin, ito rin ang mga default na listahan ng mga filter: - EasyPrivacy - Listahan ni Peter Lowe sa mga ad at tracking server (Peter Lowe’s Ad and tracking server list) -Makakapagdagdag ka ng higit pang mga patakaran sa pahina ng mga opsyon -- pindutin ang icon ng _gulong_ sa popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. Deklaratibo lamang ang uBOL, kaya hindi nito kailangan ng permanenteng proseso upang mag-filter, at mainam na ginagawa ng browser mismo imbes na ekstensyon ang pagfi-filter sa content na nakabase sa CSS o JS. Ibig-sabihin, hindi kumokonsyumo ng CPU o memorya ang uBOL habang nanghaharang -- ang proseso ng trabahante ng serbisyo ay kailangan _lang_ kung nasa popup panel o pahina ng opsyon ka. diff --git a/platform/mv3/description/webstore.fr.txt b/platform/mv3/description/webstore.fr.txt index 12b9d01d1f4f8..cdf03fc490487 100644 --- a/platform/mv3/description/webstore.fr.txt +++ b/platform/mv3/description/webstore.fr.txt @@ -7,7 +7,7 @@ Les règles par défaut correspondent au filtrage par défaut d'uBlock Origin : - EasyPrivacy - La liste anti-serveurs pub et pistage de Peter Lowe -Vous pouvez ajouter plus de règles en consultant la page des paramètres -- Cliquez sur l'_Engrenage_ dans le panneau pop-up. +Vous pouvez ajouter plus de règles en consultant la page des paramètres -- Cliquez sur l'icône de l'_Engrenage_ dans le panneau pop-up. uBOL est entièrement déclarative, c'est-à-dire qu'il n'y a pas besoin d'un processus uBOL permanent pour filtrer, et le filtrage basé sur l'injection CSS/JavaScript se fait en toute fiabilité par le navigateur lui-même. Cela veut dire qu'en soi, uBOL ne consomme pas de ressources processeur/mémoire pendant le blocage de contenu -- l'agent de service d'uBOL n'est sollicité _que_ quand vous interagissez avec le panneau pop-up ou la page des paramètres. diff --git a/platform/mv3/description/webstore.fy.txt b/platform/mv3/description/webstore.fy.txt index 63fa94a819b56..2f070096fc3ce 100644 --- a/platform/mv3/description/webstore.fy.txt +++ b/platform/mv3/description/webstore.fy.txt @@ -7,7 +7,7 @@ De standert regelset komt oerien mei de standert filterset fan uBlock Origin: - EasyPrivacy - Peter Lowe’s Ad and tracking-serverlist -Jo kinne mear regelsets tafoegje troch de opsjesside te besykjen – klik op it _tântsjilpiktogram_ yn it pop-uppaniel. +Jo kinne mear regelsets ynskeakelje troch de opsjesside te besykjen – klik op it _tântsjilpiktogram_ yn it pop-uppaniel. uBOL is folslein deklaratyf, wat betsjut dat in permanint uBOL-proses foar de filtering net nedich is, en ynhâldsfiltering op basis fan CSS/JS-ynjeksje op in betroubere manier troch de browser sels útfierd wurdt yn stee fan de útwreiding. Dit betsjut dat uBOL sels gjin CPU-/ûnthâldboarnen brûkt wylst ynhâldsblokkearring aktyf is – it serviceworker-proses fan uBOL is _allinnich_ fereaske as jo mei it pop-uppaniel of de opsjessiden wurkje. diff --git a/platform/mv3/description/webstore.gl.txt b/platform/mv3/description/webstore.gl.txt index a82432f3762c8..6dca35b6e6fbd 100644 --- a/platform/mv3/description/webstore.gl.txt +++ b/platform/mv3/description/webstore.gl.txt @@ -7,7 +7,7 @@ O conxunto de regras predeterminado corresponde ao conxunto de filtros predeterm - EasyPrivacy Lista de servidores de seguimento e anuncios de Peter Lowe -Podes engadir máis conxuntos de regras visitando a páxina de opcións: fai clic na icona _Cogs_ no panel emerxente. +Podes activar máis grupos de regras indo á páxina de opcións -- preme na roda dentada no panel emerxente. uBOL é totalmente declarativo, o que significa que non é necesario un proceso permanente de uBOL para que se produza o filtrado e o filtrado de contido baseado en inxección de CSS/JS realízao de forma fiable o propio navegador en lugar da extensión. Isto significa que o propio uBOL non consume recursos de CPU/memoria mentres o bloqueo de contido está en curso -- o proceso do traballador do servizo de uBOL é necesario _só_ cando interactúas co panel emerxente ou coas páxinas de opcións. diff --git a/platform/mv3/description/webstore.gu.txt b/platform/mv3/description/webstore.gu.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.gu.txt +++ b/platform/mv3/description/webstore.gu.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.he.txt b/platform/mv3/description/webstore.he.txt index d931b3dae4271..e9d1100485df9 100644 --- a/platform/mv3/description/webstore.he.txt +++ b/platform/mv3/description/webstore.he.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) הוא חוסם תוכן *ללא הרשאות* מבוסס MV3. - EasyPrivacy - רשימת שרתי מודעות ומעקב של פיטר לואו -ניתן להוסיף ערכות כללים נוספות מעמוד האפשרויות –על ידי הקשה על סמל _Cogs_ בלוח הצץ. +ניתן לאפשר קבוצות חוקים נוספות בדף האפשרויות - עם לחיצה על סמליל _גלגלי השיניים_ בחלונית הקופצת. uBOL הוא הכרזתי לחלוטין, כלומר אין צורך בתהליך uBOL קבוע כדי שהסינון יתרחש, וסינון תוכן מבוסס הזרקת CSS/JS מבוצע באופן אמין על ידי הדפדפן עצמו ולא על ידי ההרחבה. המשמעות היא ש־uBOL עצמו לא צורכך משאבי מעבד/זיכרון בזמן שחסימת התוכן מתרחשת – תהליך ה־service worker של uBOL נדרש _אך ורק_ בזמן הידוד עם החלון הקופץ או עם עמוד האפשרויות. diff --git a/platform/mv3/description/webstore.hi.txt b/platform/mv3/description/webstore.hi.txt index 7b361bc8c5bed..1f8ba632744af 100644 --- a/platform/mv3/description/webstore.hi.txt +++ b/platform/mv3/description/webstore.hi.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) एक *अनुमति-रहित* MV3-आधारित - EasyPrivacy - Peter Lowe की विज्ञापन एवं ट्रैकिंग सर्वर सू‍ची -आप विकल्प पृष्ठ पर जाकर और अधिक रूलसेट जोड़ सकते हैं -- पॉपअप पैनल में _Cogs_ आइकन पर क्लिक करें। +आप विकल्प पृष्ठ पर जाकर और अधिक नियम-सेट सक्षम कर सकते हैं -- पॉपअप पैनल में _Cogs_ आइकन पर क्लिक करें। uBOL पूरी तरह से वर्णनात्मक है, जिसका यह अर्थ है कि फ़िल्टरिंग के लिए एक स्थायी uBOL प्रक्रिया की कोई आवश्यकता नहीं है, और CSS/JS इंजेक्शन-आधारित कन्टेन्ट फ़िल्टरिंग एक्सटेंशन के बजाय ब्राउज़र द्वारा विश्वसनीय रूप से की जाती है। इसका यह अर्थ है कि कन्टेन्ट ब्लॉक करते समय uBOL द्वारा सीपीयू/मेमोरी संसाधनों का उपभोग स्वयं नहीं किया जाता है -- uBOL की सर्विस प्रोसेस की आवश्यकता _केवल_ तब होती है जब आप पॉपअप पैनल या विकल्प पृष्ठों पर कोई अंत:क्रिया करते हैं। diff --git a/platform/mv3/description/webstore.hr.txt b/platform/mv3/description/webstore.hr.txt index 898bc2002f3f0..0addfd46d3509 100644 --- a/platform/mv3/description/webstore.hr.txt +++ b/platform/mv3/description/webstore.hr.txt @@ -7,7 +7,7 @@ Zadana lista pravila odgovara uBlock Origin-ovoj zadanoj listi filtera: - EasyPrivacy - Peter Lowe-ova lista oglasa i pratećih servera -Možete dodati više skupova pravila tako što ćete posjetiti stranicu s opcijama -- kliknite ikonu _zupčanika_ na skočnoj ploči. +Možete omogućiti više skupova pravila tako što ćete posjetiti stranicu s opcijama -- kliknite ikonu _Cogs_ na skočnoj ploči. uBOL je u potpunosti deklarativan, što znači da nema potrebe za trajnim uBOL procesom za filtriranje, a filtriranje sadržaja temeljeno na ubacivanju CSS/JS pouzdano izvodi sam preglednik, a ne ekstenzija. To znači da sam uBOL ne troši CPU/memorijske resurse dok je blokiranje sadržaja u tijeku -- uBOL-ov servisni radni proces potreban je _samo_ kada komunicirate s skočnom pločom ili stranicama s opcijama. diff --git a/platform/mv3/description/webstore.hu.txt b/platform/mv3/description/webstore.hu.txt index 4d54e2f1f1aa5..bc2d5f2e77fba 100644 --- a/platform/mv3/description/webstore.hu.txt +++ b/platform/mv3/description/webstore.hu.txt @@ -1,4 +1,4 @@ -Az uBO Lite (uBOL) egy *engedélyt nem igénylő* MV3-alapú tartalomblokkoló. +A uBO Lite (uBOL) egy *engedélyt nem igénylő* MV3-alapú tartalomblokkoló. Az alapértelmezett szabálykészlet megfelel a uBlock Origin alapértelmezett szűrőkészletének: @@ -7,15 +7,15 @@ Az alapértelmezett szabálykészlet megfelel a uBlock Origin alapértelmezett s - EasyPrivacy - Peter Lowe hirdetési és nyomkövető-kiszolgálókat tartalmazó listája -További szabályokat adhat hozzá a beállítások oldalon – kattintson a _Fogaskerekek_ ikonra a felugró panelen. +További szabályokat engedélyezhet a beállítások oldalon – kattintson a _Fogaskerekek_ ikonra a felugró panelen. -Az uBOL teljes mértékben deklaratív, vagyis nincs szükség állandó uBOL folyamatra a szűréshez, és a CSS/JS injektálás-alapú tartalomszűrést maga a böngésző végzi megbízhatóan, nem pedig a kiegészítő. Ez azt jelenti, hogy az uBOL maga nem fogyaszt CPU/memória erőforrásokat, amíg a tartalom blokkolása folyamatban van – az uBOL service worker folyamatára _csak_ akkor van szükség, amikor az felugró panellel vagy a beállítási oldalakkal érintkezik. +A uBOL teljes mértékben deklaratív, vagyis nincs szükség állandó uBOL folyamatra a szűréshez, és a CSS/JS injektálás-alapú tartalomszűrést maga a böngésző végzi megbízhatóan, nem pedig a kiegészítő. Ez azt jelenti, hogy az uBOL maga nem fogyaszt CPU/memória erőforrásokat, amíg a tartalom blokkolása folyamatban van – az uBOL service worker folyamatára _csak_ akkor van szükség, amikor az felugró panellel vagy a beállítási oldalakkal érintkezik. -Az uBOL nem igényel széles körű „adatok módosítása és olvasása” engedélyt a telepítéskor, ezért korlátozott képességei vannak az uBlock Originhez vagy más tartalomblokkolókhoz képest, amelyek széles körű „adatok olvasása és módosítása” engedélyeket igényelnek a telepítésükkor. +A uBOL nem igényel széles körű „adatok módosítása és olvasása” engedélyt a telepítéskor, ezért korlátozott képességei vannak a uBlock Originhez vagy más tartalomblokkolókhoz képest, amelyek széles körű „adatok olvasása és módosítása” engedélyeket igényelnek a telepítésükkor. -Az uBOL azonban lehetővé teszi, hogy *kifejezetten* kiterjesztett engedélyeket adjon az Ön által választott bizonyos webhelyekhez, hogy jobban szűrhessen ezeken a webhelyeken kozmetikai szűréssel és szkriptlet-injekciókkal. +Az uBOL azonban lehetővé teszi, hogy *kifejezetten* kiterjesztett engedélyeket adjon az Ön által választott bizonyos webhelyeknél, hogy jobban szűrhessen ezeken a webhelyeken kozmetikai szűréssel és parancsfájlbeillesztéssel. -Ha kiterjesztett engedélyeket szeretne adni egy adott webhelyen, nyissa meg az előugró panelt, és válasszon magasabb szűrési módot, például Optimális vagy Teljes. +Ha kiterjesztett engedélyeket szeretne adni egy adott webhelyen, nyissa meg a felugró panelt, és válasszon magasabb szűrési módot, mint az Optimális vagy a Teljes. A böngésző ekkor figyelmezteti Önt a bővítmény által kért további engedélyek megadásának hatásaira az aktuális webhelyen, és közölnie kell a böngészővel, hogy elfogadja-e vagy elutasítja a kérést. @@ -23,8 +23,8 @@ Ha elfogadja az uBOL további engedélyekre vonatkozó kérését az aktuális w Az alapértelmezett szűrési módot az uBOL beállítási oldalán állíthatja be. Ha az Optimális vagy a Teljes módot választja alapértelmezettként, akkor az uBOL-nak engedélyt kell adnia az adatok olvasására és módosítására az összes webhelyen. -Ne feledje, hogy ez még folyamatban van, a következő célokkal: +Ne feledje, hogy ez még egy folyamatban lévő fejlesztés, a következő célokkal: -- Nincsenek széles körű gazdagép-engedélyek a telepítés során – a kiterjesztett engedélyeket a felhasználó kifejezetten webhelyenként adja meg. +- Nincsenek széles körű kiszolgálókra vonatkozó engedélyek a telepítés során – a kiterjesztett engedélyeket a felhasználó kifejezetten webhelyenként adja meg. -- Teljesen deklaratív a nagyobb megbízhatóság illetve CPU- és memóriahatékonyság érdekében. +- Teljesen deklaratív a nagyobb megbízhatóság, illetve CPU- és memóriahatékonyság érdekében. diff --git a/platform/mv3/description/webstore.hy.txt b/platform/mv3/description/webstore.hy.txt index c847ac69df042..cf9ca080ecd5c 100644 --- a/platform/mv3/description/webstore.hy.txt +++ b/platform/mv3/description/webstore.hy.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL)-ը բովանդակության արգելափակիչ է, որ - EasyPrivacy - Peter Lowe-ի գովազդային և հետագծող սպասարկիչների ցուցակ -Դուք կարող եք ավելացնել ուրիշ կանոններ՝ այցելելով ընտրանքների էջը. կտտացրեք Ժանանվակի_պատկերակին դուրս լողացող վահանակում։ +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL-ն ամբողջությամբ դեկլարատիվ է, այսինքն՝ զտման համար անընդհատ կատարվող uBOL գործընթացի կարիք չկա, իսկ CSS/JS արմատավորման վրա հիմնված բովանդակության զտումը հուսալիորեն իրականացվում է զննիչի կողմից, այլ ոչ թե ընդլայնման միջոցով։ Սա նշանակում է, որ uBOL հավելումը չի սպառում մշակիչի/հիշողության որևէ ռեսուրս, երբ տեղի է ունենում գովազդի արգելափակումը. uBOL աշխատանքային գործընթացն աշխատում է _միայն_ երբ Դուք փոփոխություններ եք կատարում դուրս լողացող վահանակում կամ ընտրանքների էջում։ diff --git a/platform/mv3/description/webstore.id.txt b/platform/mv3/description/webstore.id.txt index 8d6c7b8b15376..b9ba140a727ec 100644 --- a/platform/mv3/description/webstore.id.txt +++ b/platform/mv3/description/webstore.id.txt @@ -7,7 +7,7 @@ Kumpulan aturan bawaan sesuai dengan kumpulan penyaringan bawaan uBlock Origin: - EasyPrivacy - Daftar server iklan dan pelacak Peter Lowe -Anda dapat menambahkan ruleset dengan mengunjungi halaman options -- klik ikon _Cogs_ di panel popup. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL sepenuhnya deklaratif, yang mana tidak membutuhkan proses permanen uBOL agar penyaringan dapat terjadi, dan penyaringan konten berbasis injeksi CSS/JS dilakukan sepenuhnya oleh peramban itu sendiri ketimbang oleh ekstensi. Ini berarti bahwa uBOL sendiri tidak mengkonsumsi sumber daya CPU/memori selama melakukan pemblokiran konten -- proses pekerja layanan uBOL dibutuhkan _hanya_ ketika Anda berinteraksi dengan panel popup atau opsi halaman. diff --git a/platform/mv3/description/webstore.it.txt b/platform/mv3/description/webstore.it.txt index 03f1d7122c32a..edf67f69a8798 100644 --- a/platform/mv3/description/webstore.it.txt +++ b/platform/mv3/description/webstore.it.txt @@ -7,7 +7,7 @@ L'insieme di regole predefinito corrisponde all'insieme di filtri predefinito di - EasyPrivacy - Elenco dei server pubblicitari e di tracciamento di Peter Lowe -Puoi aggiungere altri insiemi di regole visitando la pagina delle opzioni: clicca sull'icona con gli _Ingranaggi_ nel pannello a comparsa. +Puoi abilitare altri set di regole visitando la pagina delle opzioni: clicca sull'icona _Cogs_ nel pannello a comparsa. uBOL è interamente dichiarativo, ovvero non è necessario che ci sia un processo di uBOL permanente per poter eseguire il filtraggio; e il filtraggio dei contenuti basato sull'iniezione di elementi CSS/JS viene eseguito in modo affidabile dal browser stesso piuttosto che dall'estensione. Ciò significa che lo stesso uBOL non consuma risorse di CPU o memoria mentre il blocco dei contenuti viene eseguito: il processo che esegue il servizio di uBOL è richiesto _solamente_ quando interagisci con il pannello a comparsa o con le pagine delle opzioni. diff --git a/platform/mv3/description/webstore.ja.txt b/platform/mv3/description/webstore.ja.txt index 5ae015f74dd89..c6ef50e37d00b 100644 --- a/platform/mv3/description/webstore.ja.txt +++ b/platform/mv3/description/webstore.ja.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) は権限を必要としない MV3 ベースのコンテンツ - EasyPrivacy - Peter Lowe’s Ad and tracking server list -オプションページでルールセットを追加できます -- ポップアップ パネルの「歯車」アイコンをクリックします。 +オプションページでルールセットを有効化できます。ポップアップパネルの「歯車」アイコンをクリックしてください。 uBOL は完全に宣言的です。つまり、フィルタリングを行うための恒久的な uBOL プロセスは必要なく、CSS/JS インジェクション ベースのコンテンツフィルタリングは拡張機能ではなくブラウザによって、確実に実行されます。 これは uBOL がコンテンツブロッキングの際に CPU、メモリを消費しないことを意味します。uBOL のサービス ワーカーは ポップアップ パネルや設定ページでのみ必要とされます。 diff --git a/platform/mv3/description/webstore.ka.txt b/platform/mv3/description/webstore.ka.txt index ffcc9851bd291..7fb68dd2508b8 100644 --- a/platform/mv3/description/webstore.ka.txt +++ b/platform/mv3/description/webstore.ka.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) *ნებართვებისგან თავისუ - EasyPrivacy - Peter Lowe – სარეკლამო სერვერების სია -შეგიძლიათ სხვა კრებულებიც დაამატეთ პარამეტრების გვერდიდან -- დაწკაპეთ _Cogs_ ხატულაზე ამომხტომ არეში. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL სრულად დეკლარაციულია, ანუ არაა საჭირო მუდმივად იყოს გაშვებული uBOL-პროცესი გასაფილტრად, CSS/JS ჩანაცვლებით შიგთავსის გაფილტვრას თავად ბრაუზერი უზრუნველყოფს ნაცვლად გაფართოებისა, რაც მეტად საიმედოა. შესაბამისად, uBOL თავად არ დატვირთავს პროცესორს/ოპერატიულს შიგთავსის შეზღუდვის დროს -- uBOL-ის შუამავალი მომსახურე პროცესი საჭიროა _მხოლოდ_ მაშინ, როცა ამომხტომ არესთან ურთიერთქმედებთ ან ცვლით პარამეტრებს. diff --git a/platform/mv3/description/webstore.kk.txt b/platform/mv3/description/webstore.kk.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.kk.txt +++ b/platform/mv3/description/webstore.kk.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.kn.txt b/platform/mv3/description/webstore.kn.txt index 535ab9a320dc5..3a7ef1f211ced 100644 --- a/platform/mv3/description/webstore.kn.txt +++ b/platform/mv3/description/webstore.kn.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. ಇದರರ್ಥ ವಿಷಯ ನಿರ್ಬಂಧಿಸುವಿಕೆಯು ನಡೆಯುತ್ತಿರುವಾಗ uBOL ಸ್ವತಃ CPU/ಮೆಮೊರಿ ಸಂಪನ್ಮೂಲಗಳನ್ನು ಬಳಸುವುದಿಲ್ಲ -- ನೀವು ಪಾಪ್ಅಪ್ ಪ್ಯಾನೆಲ್ ಅಥವಾ ಆಯ್ಕೆಯ ಪುಟಗಳೊಂದಿಗೆ ಸಂವಹನ ನಡೆಸಿದಾಗ uBOL ನ ಸೇವಾ ವರ್ಕರ್ ಪ್ರಕ್ರಿಯೆಯು _ಮಾತ್ರಾ_ ಅಗತ್ಯವಿದೆ. diff --git a/platform/mv3/description/webstore.ko.txt b/platform/mv3/description/webstore.ko.txt index c23291c36032e..37bf49d9252ff 100644 --- a/platform/mv3/description/webstore.ko.txt +++ b/platform/mv3/description/webstore.ko.txt @@ -7,7 +7,7 @@ uBO Lite(uBOL)는 *적은 권한을 요구하는* MV3 기반 콘텐츠 차단기 - EasyPrivacy - Peter Lowe’s Ad and tracking server list -설정 페이지에서 규칙 목록을 더욱 추가할 수 있습니다. 팝업 창의 _Cogs_ 아이콘을 누르세요. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL은 완전히 선언적이라 필터링 중 영구적으로 실행되는 uBOL 프로세스를 필요로 하지 않으며, CSS/JS 주입 기반 콘텐츠 필터링이 확장 프로그램이 아닌 브라우저 자체에서 더욱 안정적으로 동작합니다. 즉 uBOL 자체는 콘텐츠 차단을 하는 동안 CPU/메모리 리소스를 소비하지 않습니다. uBOL 서비스워커 프로세스는 사용자가 팝업 창이나 설정을 열었을 _때에만_ 동작합니다. diff --git a/platform/mv3/description/webstore.lt.txt b/platform/mv3/description/webstore.lt.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.lt.txt +++ b/platform/mv3/description/webstore.lt.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.lv.txt b/platform/mv3/description/webstore.lv.txt index 078cf7f4f9b48..b2b17768b8fad 100644 --- a/platform/mv3/description/webstore.lv.txt +++ b/platform/mv3/description/webstore.lv.txt @@ -7,7 +7,7 @@ Noklusējuma nosacījumu kopa atbilst uBokc Origin noklusējuma aizturēšanas k - EasyPrivacy - Pētera Lova (Peter Lowe) reklāmu un izsakošanas serveru saraksts -Vairāk nosacījumu kopu var pievienot iestatījumu sadaļā -- jāklikšķina _Zobratu_ ikona uznirstošajā logā. +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. diff --git a/platform/mv3/description/webstore.mk.txt b/platform/mv3/description/webstore.mk.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.mk.txt +++ b/platform/mv3/description/webstore.mk.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.ml.txt b/platform/mv3/description/webstore.ml.txt index 9237bc276067f..547aa6234890f 100644 --- a/platform/mv3/description/webstore.ml.txt +++ b/platform/mv3/description/webstore.ml.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) ഒരു *അനുമതി-കുറവ്* MV3 അടിസ - ഈസി സ്വകാര്യത - പീറ്റർ ലോവിന്റെ പരസ്യവും ട്രാക്കിംഗ് സെർവർ ലിസ്റ്റും -ഓപ്ഷനുകൾ പേജ് സന്ദർശിച്ച് നിങ്ങൾക്ക് കൂടുതൽ നിയമങ്ങൾ ചേർക്കാൻ കഴിയും -- പോപ്പ്അപ്പ് പാനലിലെ _Cogs_ ഐക്കണിൽ ക്ലിക്കുചെയ്യുക. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL പൂർണ്ണമായും ഡിക്ലറേറ്റീവ് ആണ്, അതായത് ഫിൽട്ടറിംഗ് സംഭവിക്കുന്നതിന് ഒരു സ്ഥിരമായ uBOL പ്രക്രിയയുടെ ആവശ്യമില്ല, കൂടാതെ CSS/JS ഇഞ്ചക്ഷൻ അടിസ്ഥാനമാക്കിയുള്ള ഉള്ളടക്ക ഫിൽട്ടറിംഗ്, എക്സ്റ്റൻഷനേക്കാൾ വിശ്വസനീയമായി ബ്രൗസർ തന്നെ നിർവഹിക്കുന്നു. ഉള്ളടക്കം തടയൽ നടന്നുകൊണ്ടിരിക്കുമ്പോൾ uBOL തന്നെ CPU/മെമ്മറി ഉറവിടങ്ങൾ ഉപയോഗിക്കില്ല എന്നാണ് ഇതിനർത്ഥം -- നിങ്ങൾ പോപ്പ്അപ്പ് പാനലുമായോ ഓപ്‌ഷൻ പേജുകളുമായോ സംവദിക്കുമ്പോൾ _only_ uBOL-ന്റെ സേവന വർക്കർ പ്രോസസ്സ് ആവശ്യമാണ്. diff --git a/platform/mv3/description/webstore.mr.txt b/platform/mv3/description/webstore.mr.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.mr.txt +++ b/platform/mv3/description/webstore.mr.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.ms.txt b/platform/mv3/description/webstore.ms.txt index 2a48cf613a824..07948a0608641 100644 --- a/platform/mv3/description/webstore.ms.txt +++ b/platform/mv3/description/webstore.ms.txt @@ -7,7 +7,7 @@ Set peraturan lalai sepadan dengan set penapis lalai uBlock Origin: - EasyPrivacy - Senarai pelayan iklan dan penjejakan 'Peter Lowe' -Anda boleh menambah lebih banyak set peraturan dengan melawat halaman pilihan -- klik the _Cogs_ icon pada panel timbul. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL adalah deklaratif sepenuhnya, bermakna tidak ada keperluan untuk proses uBOL kekal untuk penapisan berlaku, dan penapisan kandungan berasaskan suntikan CSS/JS dilakukan sepenuhnya oleh penyemak imbas itu sendiri dan bukannya oleh sambungan. Ini bermakna uBOL sendiri tidak menggunakan sumber CPU/memori semasa penyekatan kandungan sedang berjalan -- proses pekerja perkhidmatan uBOL diperlukan _hanya_ apabila anda berinteraksi dengan panel timbul atau halaman pilihan. diff --git a/platform/mv3/description/webstore.nb.txt b/platform/mv3/description/webstore.nb.txt index c45f9a527c080..756166aba704d 100644 --- a/platform/mv3/description/webstore.nb.txt +++ b/platform/mv3/description/webstore.nb.txt @@ -7,7 +7,7 @@ Standardregelsettet tilsvarer standardfiltersettet til uBlock Origin: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -Du kan legge til flere regelsett ved å gå til innstillingssiden -- klikk _Tannhjul_-ikonet i oppsprettspanelet. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL er fullstendig deklarativ, noe som betyr at det ikke er behov for en permanent uBOL-prosess for at filtreringen skal skje, og CSS/JS-injeksjonsbasert innholdsfiltrering utføres pålitelig av nettleseren selv i stedet for av utvidelsen. Dette betyr at uBOL selv ikke bruker CPU/minneressurser mens innholdsblokkering pågår -- uBOL's service worker-prosess kreves _bare_ når du samhandler med oppsprettspanelet eller innstillingssidene. diff --git a/platform/mv3/description/webstore.nl.txt b/platform/mv3/description/webstore.nl.txt index ecdf0c3465e51..f94d6521586a9 100644 --- a/platform/mv3/description/webstore.nl.txt +++ b/platform/mv3/description/webstore.nl.txt @@ -7,7 +7,7 @@ De standaard regelset komt overeen met de standaard filterset van uBlock Origin: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -U kunt meer regelsets toevoegen door de optiespagina te bezoeken -- klik op het _tandwielpictogram_ in het pop-uppaneel. +U kunt meer regelsets inschakelen door de optiespagina te bezoeken -- klik hiervoor op het _tandwielpictogram_ in het pop-uppaneel. uBOL is volledig declaratief, wat betekent dat er geen permanent uBOL-proces voor de filtering nodig is, en inhoudsfiltering op basis van CSS/JS-injectie op een betrouwbare manier door de browser zelf wordt uitgevoerd in plaats van door de extensie. Dit betekent dat uBOL zelf geen CPU-/geheugenbronnen gebruikt terwijl inhoudsblokkering actief is -- het serviceworker-proces van uBOL is _alleen_ vereist als u met het pop-uppaneel of de optiespagina’s werkt. diff --git a/platform/mv3/description/webstore.oc.txt b/platform/mv3/description/webstore.oc.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.oc.txt +++ b/platform/mv3/description/webstore.oc.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.pa.txt b/platform/mv3/description/webstore.pa.txt index b413fe39a4862..bcd747436bbfe 100644 --- a/platform/mv3/description/webstore.pa.txt +++ b/platform/mv3/description/webstore.pa.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) ਇੱਕ *ਬਿਨਾਂ ਇਜਾਜ਼ਤਾਂ* ਵਾਲਾ M -ਸੌਖੀ ਪਰਦੇਦਾਰੀ - Peter Lowe ਦੀ ਇਸ਼ਤਿਹਾਰ ਅਤੇ ਟਰੈਕਿੰਗ ਸਰਵਰ ਸੂਚੀ -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +ਤੁਸੀਂ ਚੋਣਾਂ ਸਫ਼ੇ ਨੂੰ ਖੋਲ੍ਹ ਕੇ ਹੋਰ ਰੂਲ-ਸੈੱਟ ਸਮਰੱਥ ਕਰ ਕਦੇ ਹੋ -- ਪੌਪ-ਅੱਪ ਪੈਨਲ ਵਿੱਚ _Cogs_ icon ਨੂੰ ਕਲਿੱਕ ਕਰੋ। uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. @@ -19,7 +19,7 @@ To grant extended permissions on a given site, open the popup panel and pick a h The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. +ਜੇ ਤੁਸੀਂ ਮੌਜੂਦਾ ਸਾਈਟਾਂ ਉੱਤੇ ਹੋਰ ਇਜਾਜਤਾਂ ਲਈ uBOL ਦੀ ਬੇਨਤੀ ਨੂੰ ਮਨਜ਼ੂਰ ਕੀਤਾ ਤਾਂ ਇਹ ਮੌਜੂਦਾ ਸਾਈਟ ਬਾਰੇ ਵਧੀਆ ਫਿਲਟਰ ਸਮੱਗਰੀ ਨੂੰ ਸਮਰੱਥ ਕਰੇਗੀ। You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. diff --git a/platform/mv3/description/webstore.pl.txt b/platform/mv3/description/webstore.pl.txt index 4f5c5247c872f..a6a17bc2efc8c 100644 --- a/platform/mv3/description/webstore.pl.txt +++ b/platform/mv3/description/webstore.pl.txt @@ -7,7 +7,7 @@ Domyślny zestaw reguł odpowiada domyślnemu zestawowi filtrów uBlock Origin: – EasyPrivacy – lista serwerów śledzących i reklam Petera Lowe'a -Możesz dodać więcej zestawów reguł, odwiedzając stronę opcji – kliknij ikonę _koła zębatego_ w wyskakującym panelu. +Możesz włączyć więcej zestawów reguł, odwiedzając stronę opcji – kliknij ikonę _koła zębatego_ w wyskakującym panelu. uBOL jest całkowicie deklaratywny, co oznacza, że nie jest potrzebny stały proces uBOL w celu filtrowania, a filtrowanie treści oparte na wstrzykiwaniu CSS/JS jest wykonywane niezawodnie przez samą przeglądarkę, a nie przez rozszerzenie. Oznacza to, że sam uBOL nie zużywa zasobów procesora/pamięci, gdy trwa blokowanie treści – proces Service Worker uBOL jest wymagany _tylko_ podczas interakcji z panelem wyskakującym lub stronami opcji. diff --git a/platform/mv3/description/webstore.pt_BR.txt b/platform/mv3/description/webstore.pt_BR.txt index 884ec649a4499..1478cb2af743e 100644 --- a/platform/mv3/description/webstore.pt_BR.txt +++ b/platform/mv3/description/webstore.pt_BR.txt @@ -7,7 +7,7 @@ O conjunto de regras padrão corresponde ao conjunto de filtros padrão do uBloc - EasyPrivacy - Lista de servidores de anúncios e rastreadores do Peter Lowe -Você pode adicionar mais conjuntos de regras visitando a página das opções -- clique no ícone _Engrenagens_ no painel do pop-up. +Você pode ativar mais conjuntos de regras visitando a página das opções — clique no ícone da _Engranagem_ no painel do popup. O uBOL é totalmente declarativo, significando que não há necessidade de um processo permanente do uBOL para a filtragem ocorrer e a filtragem de conteúdo baseada em injeção do CSS/JS é realizada confiavelmente pelo próprio navegador ao invés da extensão. Isto significa que o próprio uBOL não consome recursos de CPU/memória enquanto o bloqueio de conteúdo está em andamento -- o processo do service worker do uBOL _só_ é necessário quando você interage com o painel do pop-up ou as páginas das opções. diff --git a/platform/mv3/description/webstore.pt_PT.txt b/platform/mv3/description/webstore.pt_PT.txt index fcd3823801406..56560c1d7515d 100644 --- a/platform/mv3/description/webstore.pt_PT.txt +++ b/platform/mv3/description/webstore.pt_PT.txt @@ -7,7 +7,7 @@ O conjunto de regras padrão corresponde ao conjunto de filtros padrão do uBloc - EasyPrivacy - Peter Lowe’s Ad and tracking server list -Pode adicionar mais conjuntos de regras visitando a página de opções -- clique no ícone _Cogs_ na janela flutuante. +Pode ativar mais conjuntos de regras visitando a página de opções -- clique no ícone _Cogs_ na janela flutuante. O uBOL é totalmente declarativo, o que elimina a necessidade de um processo ativo constante para a filtragem ocorrer. A injeção de CSS e JS para filtragem de conteúdo é efetuada de maneira confiável pelo navegador, não dependendo da extensão. Isso significa que o uBOL por si só não gasta recursos de CPU/memória enquanto o bloqueio de conteúdo está a acontecer -- o processo do trabalhador de serviço do uBOL é necessário apenas quando se interage com a janela flutuante ou as páginas de opções. diff --git a/platform/mv3/description/webstore.ro.txt b/platform/mv3/description/webstore.ro.txt index 6e1f05d38f5f0..61c81d41a5d24 100644 --- a/platform/mv3/description/webstore.ro.txt +++ b/platform/mv3/description/webstore.ro.txt @@ -7,7 +7,7 @@ Listele de filtre încorporate de uBlock Origin - EasyPrivacy - Oglas Peter Lowe i lista servera za praćenje -Puteți adăuga mai multe seturi de reguli vizitând pagina de opțiuni -- făcând clic pe pictograma _Cogs_ din panoul pop-up +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL este în întregime declarativ, ceea ce înseamnă că nu este nevoie de un proces uBOL permanent pentru ca filtrarea să aibă loc, iar filtrarea conținutului pe bază de injecție CSS/JS este realizată în mod sigur de browser în sine, mai degrabă decât de extensie. Aceasta înseamnă că uBOL în sine nu consumă resurse CPU/memorie în timp ce blocarea conținutului este în desfășurare -- procesul de lucru al serviciului uBOL este necesar _doar_ atunci când interacționați cu panoul pop-up sau cu paginile de opțiuni. diff --git a/platform/mv3/description/webstore.ru.txt b/platform/mv3/description/webstore.ru.txt index 637d7cb444841..4abdcf400e533 100644 --- a/platform/mv3/description/webstore.ru.txt +++ b/platform/mv3/description/webstore.ru.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) — это блокировщик содержимого, *не - EasyPrivacy - Список рекламных и отслеживающих серверов от Peter Lowe -Вы можете добавить больше правил, посетив страницу настроек -- нажмите на значок_Шестеренок на всплывающей панели. +Вы можете активировать больше списков правил на странице настроек -- нажмите на значок _Шестерёнки_ на всплывающей панели. uBOL - полностью декларативный, т.е. для фильтрации не нужен постоянно выполняющийся uBOL процесс, а фильтрация контента, основанная на внедрении CSS/JS, производится непосредственно браузером. Это значит, что дополнение uBOL не расходует ресурсы ЦПУ/памяти, когда происходит блокировка рекламы -- служебный процесс uBOL запускается, _только_ когда вы вносите изменения на всплывающей панели или странице настроек. diff --git a/platform/mv3/description/webstore.si.txt b/platform/mv3/description/webstore.si.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.si.txt +++ b/platform/mv3/description/webstore.si.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.sk.txt b/platform/mv3/description/webstore.sk.txt index 686e41f918185..1b2ef413a7b7f 100644 --- a/platform/mv3/description/webstore.sk.txt +++ b/platform/mv3/description/webstore.sk.txt @@ -7,7 +7,7 @@ Predvolený súbor pravidiel zodpovedá predvolenému súboru filtrov uBlock Ori - EasyPrivacy - Zoznam reklamných a sledovacích serverov Petra Lowea -Ďalšie súbory pravidiel môžete pridať na stránke s možnosťami – kliknite na ikonu _súkolesia_ vo vyskakovacom paneli. +Ďalšie súbory pravidiel môžete povoliť na stránke s možnosťami – kliknite na ikonu _súkolesia_ vo vyskakovacom paneli. uBOL je úplne deklaratívny, čo znamená, že na filtrovanie nie je potrebný trvalý proces uBOL a filtrovanie obsahu založené na injektovaní CSS/JS spoľahlivo vykonáva samotný prehliadač, a nie rozšírenie. To znamená, že samotný uBOL nespotrebúva zdroje CPU/pamäte, kým prebieha blokovanie obsahu -- proces uBOL Service Worker je potrebný _len_ pri interakcii s vyskakovacím panelom alebo stránkami možností. diff --git a/platform/mv3/description/webstore.sl.txt b/platform/mv3/description/webstore.sl.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.sl.txt +++ b/platform/mv3/description/webstore.sl.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.so.txt b/platform/mv3/description/webstore.so.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.so.txt +++ b/platform/mv3/description/webstore.so.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.sq.txt b/platform/mv3/description/webstore.sq.txt index 6b087c3c404ac..197520dde7b87 100644 --- a/platform/mv3/description/webstore.sq.txt +++ b/platform/mv3/description/webstore.sq.txt @@ -7,7 +7,7 @@ Rregullat e tij janë të barasvlershme me filtrat standardë që përdor uBlock - EasyPrivacy - Lista e Peter Lowe për reklamat dhe gjurmuesit -Në faqen e opsioneve mund të shtoni rregulla të tjera – klikoni ikonën e _ingranazhit_ në panelin modal. +Në faqen e opsioneve mund të aktivizoni rregulla të tjera – klikoni ikonën e _ingranazhit_ në panelin modal. uBOL është tërësisht deklarativ, domethënë filtrimi ndodh pa qenë nevoja që procesi i uBOL të vijojë vazhdimisht në sfond, ndërsa injektimi i filtrave CSS/JS te materialet kryhet me saktësi nga vetë shfletuesi. Pra, uBOL i bllokon materialet pa konsumuar resurset e procesorit/memories – asetet e uBOL nevojiten _vetëm_ kur ndërveproni me panelin modal ose faqen e opsioneve të tij. diff --git a/platform/mv3/description/webstore.sr.txt b/platform/mv3/description/webstore.sr.txt index 065d6c0249db2..da4d7dd90cfa1 100644 --- a/platform/mv3/description/webstore.sr.txt +++ b/platform/mv3/description/webstore.sr.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) је блокатор садржаја *без дозвола*, - EasyPrivacy - Peter Lowe’s Ad and tracking server list -Можете додати још скупова правила тако што ћете посетити страницу са опцијама - кликните на иконицу зупчаника у искачућем панелу. +Можете омогућити још скупова правила тако што ћете посетити страницу са опцијама -- кликните на иконицу зупчаника у искачућем панелу. uBOL је потпуно декларативан, што значи да нема потребе за трајним uBOL процесом да би дошло до филтрирања, а филтрирање садржаја засновано на убацивању CSS/JS се обавља поуздано од стране самог прегледача, а не проширења. То значи да сам uBOL не троши CPU/меморијске ресурсе док је блокирање садржаја у току -- сервисни радни процес uBOL-а је потребан _само_ када ступите у интеракцију са искачућим панелом или страницама опција. diff --git a/platform/mv3/description/webstore.sv.txt b/platform/mv3/description/webstore.sv.txt index 0355bd0ae45b3..50266fdc13d30 100644 --- a/platform/mv3/description/webstore.sv.txt +++ b/platform/mv3/description/webstore.sv.txt @@ -7,7 +7,7 @@ Standardregeluppsättningen motsvarar uBlock Origins standardfilteruppsättning: - EasyPrivacy - Peter Lowes reklam- och spårningsserverlista -Du kan lägga till fler regeluppsättningar genom att besöka alternativsidan -- klicka på ikonen _Kugghjulet_ i popup-panelen. +Du kan lägga till fler regeluppsättningar i alternativ -- klicka på _Kugghjulet_ i popup-panelen. uBOL är helt deklarativt, vilket innebär att det inte finns något behov av en permanent uBOL-process för att filtreringen ska ske och CSS/JS-injektionsbaserad innehållsfiltrering utförs på ett tillförlitligt sätt av webbläsaren själv snarare än av tillägget. Detta innebär att uBOL själv inte förbrukar CPU/minnesresurser medan innehållsblockering pågår -- uBOLs serviceworkerprocess krävs _endast_ när du interagerar med popup-panelen eller alternativsidorna. diff --git a/platform/mv3/description/webstore.sw.txt b/platform/mv3/description/webstore.sw.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.sw.txt +++ b/platform/mv3/description/webstore.sw.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.ta.txt b/platform/mv3/description/webstore.ta.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.ta.txt +++ b/platform/mv3/description/webstore.ta.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.te.txt b/platform/mv3/description/webstore.te.txt index 2f0c87d02703a..f14c2563da3c5 100644 --- a/platform/mv3/description/webstore.te.txt +++ b/platform/mv3/description/webstore.te.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.th.txt b/platform/mv3/description/webstore.th.txt index e03fa801ee7f0..7669a5939f98c 100644 --- a/platform/mv3/description/webstore.th.txt +++ b/platform/mv3/description/webstore.th.txt @@ -7,7 +7,7 @@ The default ruleset corresponds to uBlock Origin's default filterset: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.tr.txt b/platform/mv3/description/webstore.tr.txt index 125ca901419c5..05bc267cfd5b7 100644 --- a/platform/mv3/description/webstore.tr.txt +++ b/platform/mv3/description/webstore.tr.txt @@ -7,7 +7,7 @@ Varsayılan kural seti, uBlock Origin'in varsayılan filtre setine karşılık g - EasyPrivacy - Peter Lowe'un Reklam ve izleme sunucusu listesi -Seçenekler sayfasını ziyaret ederek daha fazla kural seti ekleyebilirsiniz -- açılan paneldeki _Cogs_ simgesine tıklayın. +Seçenekler ekranına uğrayarak daha çok kuralı uygulatabilirsiniz, bunun için açılır paneldeki _dişli_ simgesine tıklayın. uBOL tamamen bildirimseldir, yani filtrelemenin gerçekleşmesi için kalıcı bir uBOL işlemine gerek yoktur, içerik filtreleme eklenti yerine tarayıcının kendisi tarafından CSS/JS yerleştirerek gerçekleştirilir. Bu, içerik engelleme devam ederken uBOL'nin kendisinin CPU/bellek kaynaklarını tüketmediği anlamına gelir -- uBOL'un hizmet çalışanı işlemi, _only_ açılan panel veya seçenek sayfalarıyla etkileşim kurduğunuzda gereklidir. diff --git a/platform/mv3/description/webstore.uk.txt b/platform/mv3/description/webstore.uk.txt index 799bdec1c77aa..9fbd578480a61 100644 --- a/platform/mv3/description/webstore.uk.txt +++ b/platform/mv3/description/webstore.uk.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) - це блокувальник вмісту на основі M - EasyPrivacy - Список серверів реклами та стеження від Peter Lowe -Ви можете додати більше наборів правил, перейшовши на сторінку налаштувань — натисніть на піктограму _Шестерень_ на спливній панелі. +Ви можете ввімкнути більше наборів правил, перейшовши на сторінку налаштувань — натисніть на піктограму _Шестерень_ на спливній панелі. uBOL повністю декларативний, тобто немає необхідності в постійному процесі uBOL для здійснення фільтрації, а фільтрація вмісту на основі CSS/JS-ін'єкцій надійно виконується самим браузером, а не розширенням. Це означає, що сам uBOL не споживає ресурси процесора/пам'яті під час блокування вмісту — службовий робочий процес uBOL потрібен _лише_ під час взаємодії зі спливною панеллю або сторінками опцій. diff --git a/platform/mv3/description/webstore.ur.txt b/platform/mv3/description/webstore.ur.txt index 0175f6167ba20..5aa5b35b240c1 100644 --- a/platform/mv3/description/webstore.ur.txt +++ b/platform/mv3/description/webstore.ur.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) ایک *اجازت سے کم* MV3 پر مبنی مواد بلا - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can add more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. diff --git a/platform/mv3/description/webstore.vi.txt b/platform/mv3/description/webstore.vi.txt index 70d6d591f7ef3..249df6a5e8e37 100644 --- a/platform/mv3/description/webstore.vi.txt +++ b/platform/mv3/description/webstore.vi.txt @@ -7,7 +7,7 @@ Bộ quy tắc mặc định tương tự bộ lọc của uBlock Origin: - EasyPrivacy - Danh sách máy chủ chạy quảng cáo và trình theo dõi của Pete Lowe -Bạn có thể tự thêm quy tắc mới ở trang cài đặt -- click vào icon _Bánh răng_ ở trong cửa sổ popup. +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL mang tính khai báo hoàn toàn, vì vậy uBOL sẽ không cần phải liên tục chạy để chặn nội dung. Thay vào đó, chính trình duyệt sẽ thực hiện lọc nội dung bằng cách sử dụng công cụ chèn CSS/JS hiệu quả hơn có sẵn của nó. Điều này cũng đồng thời có nghĩa là uBOL sẽ không tiêu tốn tài nguyên CPU/bộ nhớ của bạn để chặn nội dung. uBOL sẽ chỉ chạy _khi và chỉ khi_ bạn đang xem cửa sổ popup của uBOL, hoặc bạn đang cấu hình uBOL ở trang cài đặt. diff --git a/platform/mv3/description/webstore.zh_CN.txt b/platform/mv3/description/webstore.zh_CN.txt index b307f534d48bf..413f499ea0d50 100644 --- a/platform/mv3/description/webstore.zh_CN.txt +++ b/platform/mv3/description/webstore.zh_CN.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) 是一个基于最新浏览器扩展接口(Manifest Version 3 - EasyPrivacy - Peter Lowe’s Ad and tracking server list -您可以通过设置页面添加更多过滤规则列表——点击弹出面板的“齿轮”图标。 +You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. uBOL 的过滤规则是完全声明式的,并不需要固定保留一个 uBOL 扩展进程,基于 CSS/JS 注入的内容过滤更是交由浏览器进行调度,比起扩展本身更为可靠。 这也即是说当内容被过滤时 uBOL 自身并不占用额外 CPU 和内存资源,只有在您打开弹出面板或是设置页面时才会生成 uBOL 扩展进程。 diff --git a/platform/mv3/description/webstore.zh_TW.txt b/platform/mv3/description/webstore.zh_TW.txt index 1add144ac7cf5..8af192573f3b8 100644 --- a/platform/mv3/description/webstore.zh_TW.txt +++ b/platform/mv3/description/webstore.zh_TW.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) 是款以 MV3 為基礎的「免權限」內容阻擋器。 - EasyPrivacy - Peter Lowe’s Ad and tracking server list -您可以前往選項頁面(按下彈出面板的 **齒輪** 按鈕)新增更多規則集。 +您可以前往選項頁面(按下彈出面板的 **齒輪** 按鈕)啟用更多規則集。 uBOL 是完全宣告式的,意即過濾過程中不需要持續性的 uBOL 處理程序參與,且以 CSS/JS 注入為基礎進行的內容過濾由可靠的瀏覽器執行,而非是擴充功能。 這就代表 uBOL 在內容阻擋過程不會佔用 CPU 和記憶體資源——除了和彈出面板或選項頁面互動的場景外,都不需要 uBOL 的 Service Worker 程序。 diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index 6b6b476ca35f0..7aa0a40b9cce3 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -4,11 +4,11 @@ "description": "extension name." }, "extShortDesc": { - "message": "حاجب محتوى و بأقل التراخيص المسبقة. يحجب الإعلانات والمتتبعات والمعدنات والكثير فوراً عند التثبيت.", + "message": "أداة لحظر المحتوى بدون إذن. يحظر الإعلانات وأدوات التتبع وأدوات التعدين وغيرها فور التثبيت.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} شرط محولة من {{filterCount}} مصفيّات الشبكة ", + "message": "{{ruleCount}} قواعد، محولة من {{filterCount}} مرشحات الشبكة", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { @@ -147,6 +147,10 @@ "message": "قائمة بأسماء المضيفين التي لن تتم أي تصفية لها", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "السلوك", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/az/messages.json b/platform/mv3/extension/_locales/az/messages.json index deef8d2510f1b..5f8c5ae1aaf27 100644 --- a/platform/mv3/extension/_locales/az/messages.json +++ b/platform/mv3/extension/_locales/az/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/be/messages.json b/platform/mv3/extension/_locales/be/messages.json index e230e07e93238..d15851fd1aad0 100644 --- a/platform/mv3/extension/_locales/be/messages.json +++ b/platform/mv3/extension/_locales/be/messages.json @@ -147,6 +147,10 @@ "message": "Спіс назваў хостаў, для якіх не будзе праводзіцца фільтраванне", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[толькі назвы хостаў]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Паводзіны", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index f4606dd26de7d..6ac57860653fc 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -147,6 +147,10 @@ "message": "Списък с имена на хостове, за които няма да се извършва филтриране", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[само имена на хостове]\nprimer.com\nigri.primer\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Поведение", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/bn/messages.json b/platform/mv3/extension/_locales/bn/messages.json index d706ab1c8592c..f987c1850a676 100644 --- a/platform/mv3/extension/_locales/bn/messages.json +++ b/platform/mv3/extension/_locales/bn/messages.json @@ -147,6 +147,10 @@ "message": "হোস্টনেমের তালিকা যেগুলোর কোনো ফিল্টারিং হবে না", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "আচরণ", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index 30395963560de..dce348fb2e778 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -147,6 +147,10 @@ "message": "Roll anvioù domanioù ha ne vint ket silet.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[anvioù herberc'hierien hepken]\nskouer.com\nchoariou.skouer\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Emzalc'h", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/bs/messages.json b/platform/mv3/extension/_locales/bs/messages.json index d221c1b43c10b..6f7f257782a20 100644 --- a/platform/mv3/extension/_locales/bs/messages.json +++ b/platform/mv3/extension/_locales/bs/messages.json @@ -147,6 +147,10 @@ "message": "Lista imena hostova za koja se neće vršiti filtriranje", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Ponašanje", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/ca/messages.json b/platform/mv3/extension/_locales/ca/messages.json index 5e1f1eb9c7d60..ea727755353db 100644 --- a/platform/mv3/extension/_locales/ca/messages.json +++ b/platform/mv3/extension/_locales/ca/messages.json @@ -147,6 +147,10 @@ "message": "Llistat de noms d'amfitrió als quals no s'aplicarà cap filtre", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[només noms d'amfitrió]\nexemple.com\njocs.exemple\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportament", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/cs/messages.json b/platform/mv3/extension/_locales/cs/messages.json index db051f05d1ad1..6daf4a73a9f51 100644 --- a/platform/mv3/extension/_locales/cs/messages.json +++ b/platform/mv3/extension/_locales/cs/messages.json @@ -147,6 +147,10 @@ "message": "Seznam názvů hostitelů, pro které nebude probíhat žádné filtrování", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[pouze názvy hostitelů]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Chování", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/cv/messages.json b/platform/mv3/extension/_locales/cv/messages.json index 4bbb5e389bf08..30c719d52722d 100644 --- a/platform/mv3/extension/_locales/cv/messages.json +++ b/platform/mv3/extension/_locales/cv/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/cy/messages.json b/platform/mv3/extension/_locales/cy/messages.json index c9d0e36583d83..56a6d66e186bf 100644 --- a/platform/mv3/extension/_locales/cy/messages.json +++ b/platform/mv3/extension/_locales/cy/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Ymddygiad", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/da/messages.json b/platform/mv3/extension/_locales/da/messages.json index ae494fe74a254..303d3bd3810ee 100644 --- a/platform/mv3/extension/_locales/da/messages.json +++ b/platform/mv3/extension/_locales/da/messages.json @@ -147,6 +147,10 @@ "message": "Liste over værtsnavne, for hvilke ingen filtrering vil ske.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[kun værtsnavne]\neksempel.dk\nspil.eksempel\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Adfærd", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index 13829f3e919fb..7e8e072ca80f5 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Liste der Hostnamen, für die nicht gefiltert wird.", + "message": "Liste der Websites, für die nicht gefiltert wird.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[nur Hostnamen]\nexample.com\ngames.example\n…", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Verhalten", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index 8e3bc5ed1fe52..484b2f4ae268b 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -147,6 +147,10 @@ "message": "Λίστα των hostnames για τα οποία δεν θα πραγματοποιηθεί φιλτράρισμα", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Συμπεριφορά", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/en_GB/messages.json b/platform/mv3/extension/_locales/en_GB/messages.json index 884d7c1960243..42cde830929ad 100644 --- a/platform/mv3/extension/_locales/en_GB/messages.json +++ b/platform/mv3/extension/_locales/en_GB/messages.json @@ -147,6 +147,10 @@ "message": "List of hostnames for which no filtering will take place", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behaviour", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/eo/messages.json b/platform/mv3/extension/_locales/eo/messages.json index ba5cfde43e504..4481c48f28e8e 100644 --- a/platform/mv3/extension/_locales/eo/messages.json +++ b/platform/mv3/extension/_locales/eo/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 53ff70b95a657..2d3cd2fd6c68d 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -147,6 +147,10 @@ "message": "Lista de nombres de dominio para los cuales no se realizará ningún filtrado.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[solo nombres de hospedador]\nejemplo.com\njuegos.ejemplo\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportamiento", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/et/messages.json b/platform/mv3/extension/_locales/et/messages.json index 69f6aa21932e4..bdbf31a3afafd 100644 --- a/platform/mv3/extension/_locales/et/messages.json +++ b/platform/mv3/extension/_locales/et/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Hostinimede loend, kus filtreerimine keelatakse", + "message": "Veebilehtede loend, kus filtreid ei kasutata.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[ainult hostinimed]\nnäide.com\nmängud.näide\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Käitumine", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/eu/messages.json b/platform/mv3/extension/_locales/eu/messages.json index 353f3b79c3eed..ac5c05b345274 100644 --- a/platform/mv3/extension/_locales/eu/messages.json +++ b/platform/mv3/extension/_locales/eu/messages.json @@ -147,6 +147,10 @@ "message": "Filtrorik ezarriko ez zaien zerbitzarien izenak", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "portaera or jokaera", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/fa/messages.json b/platform/mv3/extension/_locales/fa/messages.json index a18a6ed3a7cb3..169540c053e57 100644 --- a/platform/mv3/extension/_locales/fa/messages.json +++ b/platform/mv3/extension/_locales/fa/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/fi/messages.json b/platform/mv3/extension/_locales/fi/messages.json index 05d42117aa0ed..5e8ef6de8dc4b 100644 --- a/platform/mv3/extension/_locales/fi/messages.json +++ b/platform/mv3/extension/_locales/fi/messages.json @@ -147,6 +147,10 @@ "message": "Listaus osotteista, joita ei suodateta.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[vain isäntänimiä]\nesimerkki.fi\npelit.esimerkki\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Toiminta", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/fil/messages.json b/platform/mv3/extension/_locales/fil/messages.json index fe5daa48fba7e..8b48cf12d2ac3 100644 --- a/platform/mv3/extension/_locales/fil/messages.json +++ b/platform/mv3/extension/_locales/fil/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Ugali", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/fr/messages.json b/platform/mv3/extension/_locales/fr/messages.json index 0152c8e9139c3..a0c557d0ea923 100644 --- a/platform/mv3/extension/_locales/fr/messages.json +++ b/platform/mv3/extension/_locales/fr/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Liste des noms de domaine qu'uBO Lite ne devra pas filtrer", + "message": "Liste des noms de domaine pour lesquels aucun filtrage n'aura lieu.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[noms de domaine uniquement]\nexemple.com\njeux.exemple\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportement", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/fy/messages.json b/platform/mv3/extension/_locales/fy/messages.json index f583e4b49e1c1..634f28c88f3de 100644 --- a/platform/mv3/extension/_locales/fy/messages.json +++ b/platform/mv3/extension/_locales/fy/messages.json @@ -147,6 +147,10 @@ "message": "List fan hostnammen wêrfoar gjin filtering plakfynt.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[allinnich hostnammen]\nexample.com\ngames.example\n…", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Gedrach", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/gl/messages.json b/platform/mv3/extension/_locales/gl/messages.json index 760c65c899a85..1dcc3844d46da 100644 --- a/platform/mv3/extension/_locales/gl/messages.json +++ b/platform/mv3/extension/_locales/gl/messages.json @@ -147,6 +147,10 @@ "message": "Lista de nomes de host para os que non se fará filtrado", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[só nomes de servidor]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportamento", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/gu/messages.json b/platform/mv3/extension/_locales/gu/messages.json index 4bbb5e389bf08..30c719d52722d 100644 --- a/platform/mv3/extension/_locales/gu/messages.json +++ b/platform/mv3/extension/_locales/gu/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/he/messages.json b/platform/mv3/extension/_locales/he/messages.json index beb73f27377fd..d76b50ebb83d1 100644 --- a/platform/mv3/extension/_locales/he/messages.json +++ b/platform/mv3/extension/_locales/he/messages.json @@ -147,6 +147,10 @@ "message": "רשימה של שמות אתרים שלא יתבצע עליהם סינון", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[שמות אתרים בלבד]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "התנהגות", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/hi/messages.json b/platform/mv3/extension/_locales/hi/messages.json index 244acb89cb7b6..0cfd586195cc7 100644 --- a/platform/mv3/extension/_locales/hi/messages.json +++ b/platform/mv3/extension/_locales/hi/messages.json @@ -147,6 +147,10 @@ "message": "होस्टनामों की सूची जिनके लिए कोई फ़िल्टरिंग नहीं होगी", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[केवल होस्ट का नाम]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "व्यवहार", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/hr/messages.json b/platform/mv3/extension/_locales/hr/messages.json index 2ae0291a129f3..5ca15ed148feb 100644 --- a/platform/mv3/extension/_locales/hr/messages.json +++ b/platform/mv3/extension/_locales/hr/messages.json @@ -147,6 +147,10 @@ "message": "Popis naziva hostova za koje se neće izvršiti filtriranje.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[samo nazivi hostova]\nexample.com\ngames.example", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Ponašanje", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index 3ec2b0e2ece25..a27467b005740 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Kísérleti, engedélyt nem igénylő nélküli tartalomblokkoló. A telepítés után azonnal blokkolja a hirdetéseket, nyomkövetőket, bányászokat és egyebeket.", + "message": "Kísérleti, engedélyeket nem igénylő nélküli tartalomblokkoló. A telepítés után azonnal blokkolja a hirdetéseket, nyomkövetőket, bányászprogramokat és egyebeket.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -100,15 +100,15 @@ "description": "Shown in the About pane" }, "firstRunSectionLabel": { - "message": "Üdvözlünk", + "message": "Üdvözöljük", "description": "The header text for the welcome message section" }, "firstRunDescription": { - "message": "Alapértelmezés szerint az Alap mód van kiválasztva, mert nem igényel engedélyt az adatok olvasásához és módosításához. Ha megbízik az uBO Lite-ban, széles körű engedélyt adhat neki az adatok olvasására és módosítására az összes webhelyen, hogy alapértelmezés szerint fejlettebb szűrési lehetőségeket tegyen lehetővé minden webhelyen.", + "message": "Most telepítette a uBO Lite-ot. Itt választhatja ki az összes weboldalon használandó alapértelmezett szűrési módot.\n\nAlapértelmezés szerint az Alapvetú mód van kiválasztva, mert nem igényel engedélyt az adatok olvasásához és módosításához. Ha megbízik az uBO Lite-ban, széles körű engedélyt adhat neki az adatok olvasására és módosítására az összes webhelyen, hogy alapértelmezés szerint fejlettebb szűrési lehetőségeket tegyen lehetővé minden webhelyen.", "description": "Descriptive text shown at first install time only " }, "defaultFilteringModeSectionLabel": { - "message": "Alapértelmezett szűrő", + "message": "Alapértelmezett szűrési mód", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { @@ -116,11 +116,11 @@ "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "Nincs szűrés", + "message": "nincs szűrés", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "alapok", + "message": "alapvető", "description": "Name of blocking mode 1" }, "filteringMode2Name": { @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Azon hosztnevek listája, amelyek esetében nem történik szűrés", + "message": "Azon gépnevek listája, amelyek esetében nem történik szűrés.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Viselkedés", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/hy/messages.json b/platform/mv3/extension/_locales/hy/messages.json index 6de0ec8a17e86..36cd1cc8e60ac 100644 --- a/platform/mv3/extension/_locales/hy/messages.json +++ b/platform/mv3/extension/_locales/hy/messages.json @@ -147,6 +147,10 @@ "message": "Հյուրերի անունների ցանկ, որոնց համար զտում չի իրականացվի", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Վարք", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/id/messages.json b/platform/mv3/extension/_locales/id/messages.json index 421f091afb516..8041d111ad497 100644 --- a/platform/mv3/extension/_locales/id/messages.json +++ b/platform/mv3/extension/_locales/id/messages.json @@ -147,6 +147,10 @@ "message": "Daftar nama host yang tidak akan difilter.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Perilaku", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index cf3082df674f6..e504d5b206d85 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -147,6 +147,10 @@ "message": "Lista dei nomi host per i quali non verrà effettuato alcun filtraggio.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportamento", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/ja/messages.json b/platform/mv3/extension/_locales/ja/messages.json index 28ad8753b9d6f..53ad766bb031a 100644 --- a/platform/mv3/extension/_locales/ja/messages.json +++ b/platform/mv3/extension/_locales/ja/messages.json @@ -147,6 +147,10 @@ "message": "フィルタリングを行わないホスト名のリスト", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[ホスト名のみ]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "動作", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/ka/messages.json b/platform/mv3/extension/_locales/ka/messages.json index f31582f7a4a55..a0550c66e1a05 100644 --- a/platform/mv3/extension/_locales/ka/messages.json +++ b/platform/mv3/extension/_locales/ka/messages.json @@ -147,6 +147,10 @@ "message": "სია მისამართებისა, რომლებზეც ფილტრები არ იმოქმედებს", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "მოქმედება", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/kk/messages.json b/platform/mv3/extension/_locales/kk/messages.json index 4bbb5e389bf08..30c719d52722d 100644 --- a/platform/mv3/extension/_locales/kk/messages.json +++ b/platform/mv3/extension/_locales/kk/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/kn/messages.json b/platform/mv3/extension/_locales/kn/messages.json index 7fc46b9e67b1d..c1261b1651f77 100644 --- a/platform/mv3/extension/_locales/kn/messages.json +++ b/platform/mv3/extension/_locales/kn/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "ನಡವಳಿಕೆ", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/ko/messages.json b/platform/mv3/extension/_locales/ko/messages.json index d066b63af68a8..d7de8ce1654d5 100644 --- a/platform/mv3/extension/_locales/ko/messages.json +++ b/platform/mv3/extension/_locales/ko/messages.json @@ -147,6 +147,10 @@ "message": "필터링을 비활성화할 호스트 이름 목록", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "동작", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/lt/messages.json b/platform/mv3/extension/_locales/lt/messages.json index 52c96b3ae207a..497cd30837082 100644 --- a/platform/mv3/extension/_locales/lt/messages.json +++ b/platform/mv3/extension/_locales/lt/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Elgsena", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/lv/messages.json b/platform/mv3/extension/_locales/lv/messages.json index a37ba6dda83c1..4514c75b4f19a 100644 --- a/platform/mv3/extension/_locales/lv/messages.json +++ b/platform/mv3/extension/_locales/lv/messages.json @@ -147,6 +147,10 @@ "message": "Saraksts ar saimniekdatoru nosaukumiem, kuriem netiks pielietota aizturēšana", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[tikai saimniekdatoru nosaukumi]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Uzvedība", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/mk/messages.json b/platform/mv3/extension/_locales/mk/messages.json index cb7631b2bbf95..73d13cc15b35b 100644 --- a/platform/mv3/extension/_locales/mk/messages.json +++ b/platform/mv3/extension/_locales/mk/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/ml/messages.json b/platform/mv3/extension/_locales/ml/messages.json index 2bffd1a1ffc61..42db083577715 100644 --- a/platform/mv3/extension/_locales/ml/messages.json +++ b/platform/mv3/extension/_locales/ml/messages.json @@ -147,6 +147,10 @@ "message": "ഫിൽട്ടറിംഗ് നടക്കാത്ത ഹോസ്റ്റ് നെയിമുകളുടെ ലിസ്റ്റ്", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "പെരുമാറ്റം", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/mr/messages.json b/platform/mv3/extension/_locales/mr/messages.json index 4bbb5e389bf08..30c719d52722d 100644 --- a/platform/mv3/extension/_locales/mr/messages.json +++ b/platform/mv3/extension/_locales/mr/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/ms/messages.json b/platform/mv3/extension/_locales/ms/messages.json index c9147fe236ec9..71f193001665a 100644 --- a/platform/mv3/extension/_locales/ms/messages.json +++ b/platform/mv3/extension/_locales/ms/messages.json @@ -147,6 +147,10 @@ "message": "Senarai nama hos yang tiada penapisan akan berlaku", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Tingkah laku", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/nb/messages.json b/platform/mv3/extension/_locales/nb/messages.json index ed850b77db4ad..44234c059857e 100644 --- a/platform/mv3/extension/_locales/nb/messages.json +++ b/platform/mv3/extension/_locales/nb/messages.json @@ -147,6 +147,10 @@ "message": "Liste over vertsnavn der ingen filtrering vil finne sted", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Virkemåte", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/nl/messages.json b/platform/mv3/extension/_locales/nl/messages.json index d73b801d6118f..a32f81e591895 100644 --- a/platform/mv3/extension/_locales/nl/messages.json +++ b/platform/mv3/extension/_locales/nl/messages.json @@ -147,6 +147,10 @@ "message": "Lijst van hostnamen waarvoor geen filtering plaatsvindt.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[alleen hostnamen]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Gedrag", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/oc/messages.json b/platform/mv3/extension/_locales/oc/messages.json index 4bbb5e389bf08..30c719d52722d 100644 --- a/platform/mv3/extension/_locales/oc/messages.json +++ b/platform/mv3/extension/_locales/oc/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/pa/messages.json b/platform/mv3/extension/_locales/pa/messages.json index 868cc48068375..aff262e364ead 100644 --- a/platform/mv3/extension/_locales/pa/messages.json +++ b/platform/mv3/extension/_locales/pa/messages.json @@ -147,6 +147,10 @@ "message": "ਹੋਸਟ-ਨਾਵਾਂ ਦੀ ਸੂਚੀ, ਜਿਨ੍ਹਾਂ ਲਈ ਕੋਈ ਫਿਲਟਰ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "ਰਵੱਈਆ", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/pl/messages.json b/platform/mv3/extension/_locales/pl/messages.json index 1c7b89f236beb..61a1b8eb16fe5 100644 --- a/platform/mv3/extension/_locales/pl/messages.json +++ b/platform/mv3/extension/_locales/pl/messages.json @@ -147,6 +147,10 @@ "message": "Lista nazw hostów, dla których nie będzie stosowane żadne filtrowanie", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[tylko nazwy hostów]\nexample.com\ngry.przykład\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Zachowanie", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index e6265efab5275..671006eacf313 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -147,6 +147,10 @@ "message": "Lista de nomes dos hospedeiros para os quais nenhuma filtragem acontecerá.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[só nomes de hospedeiros]\nexemplo.com\njogos.exemplo", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportamento", "description": "The header text for the 'Behavior' section" @@ -156,7 +160,7 @@ "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { - "message": "Mostrar o número de solicitações bloqueadas no ícone da barra de ferramentas", + "message": "Mostrar o número de requisições bloqueadas no ícone da barra de ferramentas", "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 511db27ff621a..2f637e25713e8 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -147,6 +147,10 @@ "message": "Lista de nomes de anfitriões para os quais não será efetuada qualquer filtragem.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexemplo.com\njogos.exemplo\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportamento", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/ro/messages.json b/platform/mv3/extension/_locales/ro/messages.json index ec8228953b77f..c953b4626e9e1 100644 --- a/platform/mv3/extension/_locales/ro/messages.json +++ b/platform/mv3/extension/_locales/ro/messages.json @@ -147,6 +147,10 @@ "message": "Lista numelor mașinilor pentru care nu se va face filtrare", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Comportament", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/ru/messages.json b/platform/mv3/extension/_locales/ru/messages.json index f13511e62cf28..63fee1591a597 100644 --- a/platform/mv3/extension/_locales/ru/messages.json +++ b/platform/mv3/extension/_locales/ru/messages.json @@ -147,6 +147,10 @@ "message": "Список имён хостов, для которых не будет производиться фильтрация.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[только имена хостов]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Поведение", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/si/messages.json b/platform/mv3/extension/_locales/si/messages.json index 4bbb5e389bf08..30c719d52722d 100644 --- a/platform/mv3/extension/_locales/si/messages.json +++ b/platform/mv3/extension/_locales/si/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/sk/messages.json b/platform/mv3/extension/_locales/sk/messages.json index 91ebfc926a1c6..b4ad74ba2fecc 100644 --- a/platform/mv3/extension/_locales/sk/messages.json +++ b/platform/mv3/extension/_locales/sk/messages.json @@ -147,6 +147,10 @@ "message": "Zoznam názvov hostiteľov s vylúčeným filtrovaním", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[len názvy hostiteľov]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Správanie", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/sl/messages.json b/platform/mv3/extension/_locales/sl/messages.json index 4bbb5e389bf08..30c719d52722d 100644 --- a/platform/mv3/extension/_locales/sl/messages.json +++ b/platform/mv3/extension/_locales/sl/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/so/messages.json b/platform/mv3/extension/_locales/so/messages.json index 4bbb5e389bf08..30c719d52722d 100644 --- a/platform/mv3/extension/_locales/so/messages.json +++ b/platform/mv3/extension/_locales/so/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index 7b8c0748da091..986b72a0479ec 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Emrat e hosteve, që nuk do të kalojnë në filtër.", + "message": "Emrat e hosteve që nuk do të kalojnë në filtër", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Sjellja", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/sr/messages.json b/platform/mv3/extension/_locales/sr/messages.json index 5680a04dc5823..c33af6db43976 100644 --- a/platform/mv3/extension/_locales/sr/messages.json +++ b/platform/mv3/extension/_locales/sr/messages.json @@ -147,6 +147,10 @@ "message": "Листа имена хостова за које се неће вршити филтрирање", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[само имена хостова]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Понашање", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/sv/messages.json b/platform/mv3/extension/_locales/sv/messages.json index 5dcbfc98a8a3f..4fb9b47a26a57 100644 --- a/platform/mv3/extension/_locales/sv/messages.json +++ b/platform/mv3/extension/_locales/sv/messages.json @@ -147,6 +147,10 @@ "message": "Lista över värdnamn som inte kommer att filtreras", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[endast värdnamn]\nexempel.se\nspel.exempel\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Beteende", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/sw/messages.json b/platform/mv3/extension/_locales/sw/messages.json index 4bbb5e389bf08..30c719d52722d 100644 --- a/platform/mv3/extension/_locales/sw/messages.json +++ b/platform/mv3/extension/_locales/sw/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/ta/messages.json b/platform/mv3/extension/_locales/ta/messages.json index 4bbb5e389bf08..30c719d52722d 100644 --- a/platform/mv3/extension/_locales/ta/messages.json +++ b/platform/mv3/extension/_locales/ta/messages.json @@ -144,9 +144,13 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Behavior", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/te/messages.json b/platform/mv3/extension/_locales/te/messages.json index 00008c2bf2ac7..8437838c64a0c 100644 --- a/platform/mv3/extension/_locales/te/messages.json +++ b/platform/mv3/extension/_locales/te/messages.json @@ -147,6 +147,10 @@ "message": "వడపోత జరగని హోస్ట్ పేర్ల జాబితా", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "ప్రవర్తన", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/th/messages.json b/platform/mv3/extension/_locales/th/messages.json index 8d523ba56d2de..fee5db38e9fc4 100644 --- a/platform/mv3/extension/_locales/th/messages.json +++ b/platform/mv3/extension/_locales/th/messages.json @@ -16,15 +16,15 @@ "description": "English: uBO Lite — Dashboard" }, "settingsPageName": { - "message": "Settings", + "message": "การตั้งค่า", "description": "appears as tab name in dashboard" }, "aboutPageName": { - "message": "About", + "message": "เกี่ยวกับเรา", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "นโยบายความเป็นส่วนตัว", "description": "Link to privacy policy on GitHub (English)" }, "popupFilteringModeLabel": { @@ -72,7 +72,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "aboutChangelog": { - "message": "Changelog", + "message": "บันทึการเปลี่ยนแปลง", "description": "" }, "aboutCode": { @@ -100,15 +100,15 @@ "description": "Shown in the About pane" }, "firstRunSectionLabel": { - "message": "Welcome", + "message": "ยินดีต้อนรับ", "description": "The header text for the welcome message section" }, "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", + "message": "คุณเพิ่งติดตั้ง uBO Lite คุณสามารถเลือกโหมดการกรอง (ค่าเริ่มต้น) ที่จะใช้กับเว็บไซต์ทั้งหมดได้ที่นี่\n\nตามค่าเริ่มต้น โหมด พื้นฐาน จะถูกเลือกเนื่องจากไม่จำเป็นต้องมีสิทธิ์ในการอ่านและแก้ไขข้อมูล หากคุณไว้วางใจ uBO Lite คุณสามารถให้สิทธิ์ในการอ่านและแก้ไขข้อมูลบนเว็บไซต์ทั้งหมดได้ เพื่อเปิดใช้งานคุณสมบัติการกรองข้อมูลขั้นสูงสำหรับเว็บไซต์ทั้งหมดตามค่าเริ่มต้น", "description": "Descriptive text shown at first install time only " }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "โหมดการกรองเริ่มต้น", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { @@ -120,7 +120,7 @@ "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "พื้นฐาน", "description": "Name of blocking mode 1" }, "filteringMode2Name": { @@ -144,19 +144,23 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of hostnames for which no filtering will take place.", + "message": "List of websites for which no filtering will take place.", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "ลักษณะการทำงาน", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "โหลดหน้าเว็บใหม่อัตโนมัติเมื่อเปลี่ยนโหมดการกรอง", "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { - "message": "Show the number of blocked requests on the toolbar icon", + "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 a4bf19312686b..5cf18a7020d51 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -147,6 +147,10 @@ "message": "Filtreleme yapılmayacak alan alarının listesi", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[sadece ana bilgisayar adları]\nörnek.com\noyunlar.site\n…", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Davranış", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index 5bf1a04b50d6e..9a1a054b0f274 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -147,6 +147,10 @@ "message": "Список імен хостів, для яких буде відбуватись фільтрування", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[тільки імена доменів]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Поведінка", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/ur/messages.json b/platform/mv3/extension/_locales/ur/messages.json index bb06300ced6cf..92ba9e9bc7b5f 100644 --- a/platform/mv3/extension/_locales/ur/messages.json +++ b/platform/mv3/extension/_locales/ur/messages.json @@ -147,6 +147,10 @@ "message": "میزبان ناموں کی فہرست جن کے لیے کوئی فلٹرنگ نہیں ہوگی۔", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "رویہ", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/vi/messages.json b/platform/mv3/extension/_locales/vi/messages.json index 9f796fc5d5ffe..0a9042b6f3652 100644 --- a/platform/mv3/extension/_locales/vi/messages.json +++ b/platform/mv3/extension/_locales/vi/messages.json @@ -147,6 +147,10 @@ "message": "Danh sách tên máy chủ sẽ không được lọc", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "Hành vi", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/zh_CN/messages.json b/platform/mv3/extension/_locales/zh_CN/messages.json index 9195970cb1b11..26f88f655f6d5 100644 --- a/platform/mv3/extension/_locales/zh_CN/messages.json +++ b/platform/mv3/extension/_locales/zh_CN/messages.json @@ -147,6 +147,10 @@ "message": "不进行过滤的主机名列表", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[hostnames only]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "操作设置", "description": "The header text for the 'Behavior' section" diff --git a/platform/mv3/extension/_locales/zh_TW/messages.json b/platform/mv3/extension/_locales/zh_TW/messages.json index 99ebc6263ea99..d79f5d0ea4356 100644 --- a/platform/mv3/extension/_locales/zh_TW/messages.json +++ b/platform/mv3/extension/_locales/zh_TW/messages.json @@ -147,6 +147,10 @@ "message": "不進行過濾的主機名稱列表", "description": "A short description for the editable field which lists trusted sites" }, + "noFilteringModePlaceholder": { + "message": "[僅主機名稱]\nexample.com\ngames.example\n...", + "description": "Default text for in edit field" + }, "behaviorSectionLabel": { "message": "行為", "description": "The header text for the 'Behavior' section" diff --git a/src/_locales/ca/messages.json b/src/_locales/ca/messages.json index 97ade2de31ecf..0ba1ccc1e0beb 100644 --- a/src/_locales/ca/messages.json +++ b/src/_locales/ca/messages.json @@ -1264,7 +1264,7 @@ "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, "toggleJavascript": { - "message": "Canviar l'estat de JavaScript", + "message": "Commuta el JavaScript", "description": "Label for keyboard shortcut used to toggle no-scripting switch" }, "relaxBlockingMode": { diff --git a/src/_locales/el/messages.json b/src/_locales/el/messages.json index ea6a4a6662fe9..73b67df631e91 100644 --- a/src/_locales/el/messages.json +++ b/src/_locales/el/messages.json @@ -40,7 +40,7 @@ "description": "appears as tab name in dashboard" }, "whitelistPageName": { - "message": "Έμπιστες τοποθεσίες", + "message": "Αξιόπιστοι ιστότοποι", "description": "appears as tab name in dashboard" }, "shortcutsPageName": { @@ -184,7 +184,7 @@ "description": "Tooltip for the no-scripting per-site switch" }, "popupTipNoScripting2": { - "message": "Κάντε κλικ για να μην απενεργοποιείται πλέον η JavaScript σε αυτή την τοποθεσία", + "message": "Κάντε κλικ για να μην απενεργοποιήσετε πλέον τη JavaScript σε αυτόν τον ιστότοπο", "description": "Tooltip for the no-scripting per-site switch" }, "popupNoPopups_v2": { @@ -196,7 +196,7 @@ "description": "Caption for the no-large-media per-site switch" }, "popupNoCosmeticFiltering_v2": { - "message": "Καλλωπιστικά φίλτρα", + "message": "Κοσμητικά φίλτρα", "description": "Caption for the no-cosmetic-filtering per-site switch" }, "popupNoRemoteFonts_v2": { @@ -224,7 +224,7 @@ "description": "Tooltip when hovering the top-most cell of the local-rules column." }, "popupTipSaveRules": { - "message": "Πατήστε για να κάνετε τις αλλαγές σας μόνιμες.", + "message": "Κάντε κλικ για να μονιμοποιήσετε τις αλλαγές σας.", "description": "Tooltip when hovering over the padlock in the dynamic filtering pane." }, "popupTipRevertRules": { diff --git a/src/_locales/fi/messages.json b/src/_locales/fi/messages.json index da52acf6d3516..1f3677df2940c 100644 --- a/src/_locales/fi/messages.json +++ b/src/_locales/fi/messages.json @@ -540,11 +540,11 @@ "description": "Warning against copy-pasting filters from random sources" }, "1pEnableMyFiltersLabel": { - "message": "Ota omat suodattimet käyttöön", + "message": "Käytä omia suodattimia", "description": "Label for the checkbox use to enable/disable 'My filters' list" }, "1pTrustMyFiltersLabel": { - "message": "Allow custom filters requiring trust", + "message": "Salli omat suodattimet, joihin luotat", "description": "Label for the checkbox use to trust the content of 'My filters' list" }, "1pImport": { @@ -1264,7 +1264,7 @@ "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, "toggleJavascript": { - "message": "Kytke JavaScript", + "message": "Kytke JavaScript käyttöön/pois käytöstä", "description": "Label for keyboard shortcut used to toggle no-scripting switch" }, "relaxBlockingMode": { diff --git a/src/_locales/gl/messages.json b/src/_locales/gl/messages.json index 291dc091324a8..0da46340cd70c 100644 --- a/src/_locales/gl/messages.json +++ b/src/_locales/gl/messages.json @@ -12,7 +12,7 @@ "description": "English: uBlock₀ — Dashboard" }, "dashboardUnsavedWarning": { - "message": "Aviso! ten cambios sen gardar", + "message": "Aviso! Non gardaches os cambios", "description": "A warning in the dashboard when navigating away from unsaved changes" }, "dashboardUnsavedWarningStay": { @@ -40,7 +40,7 @@ "description": "appears as tab name in dashboard" }, "whitelistPageName": { - "message": "Lista branca", + "message": "Sitios de confianza", "description": "appears as tab name in dashboard" }, "shortcutsPageName": { @@ -336,7 +336,7 @@ "description": "English: Color-blind friendly" }, "settingsAppearance": { - "message": "Aspecto", + "message": "Aparencia", "description": "Section for controlling user interface appearance" }, "settingsThemeLabel": { @@ -480,7 +480,7 @@ "description": "Filter lists section name" }, "3pGroupMalware": { - "message": "Dominios de malware", + "message": "Protección contra malware, seguridade", "description": "Filter lists section name" }, "3pGroupSocial": { @@ -596,7 +596,7 @@ "description": "" }, "rulesExport": { - "message": "Exportar a un arquivo…", + "message": "Exportar a un ficheiro…", "description": "Button in the 'My rules' pane" }, "rulesDefaultFileName": { @@ -632,15 +632,15 @@ "description": "A concise description of the 'Trusted sites' pane." }, "whitelistImport": { - "message": "Importar e anexar", + "message": "Importar e engadir…", "description": "Button in the 'Trusted sites' pane" }, "whitelistExport": { - "message": "Exportar", + "message": "Exportar…", "description": "Button in the 'Trusted sites' pane" }, "whitelistExportFilename": { - "message": "o-meu-ublock-lista-branca_{{datetime}}.txt", + "message": "o-meu-ublock-webs-confiables_{{datetime}}.txt", "description": "The default filename to use for import/export purpose" }, "whitelistApply": { diff --git a/src/_locales/hu/messages.json b/src/_locales/hu/messages.json index b41a850395026..39d020f645591 100644 --- a/src/_locales/hu/messages.json +++ b/src/_locales/hu/messages.json @@ -12,7 +12,7 @@ "description": "English: uBlock₀ — Dashboard" }, "dashboardUnsavedWarning": { - "message": "Figyelem! Neked még vannak nem mentett változtatásaid", + "message": "Figyelem! Mentetlen változtatásai vannak.", "description": "A warning in the dashboard when navigating away from unsaved changes" }, "dashboardUnsavedWarningStay": { @@ -108,7 +108,7 @@ "description": "For the new mobile-friendly popup design" }, "popupDomainsConnected_v2": { - "message": "Csatlakoztatott domain-ek", + "message": "Kapcsolódott domainek", "description": "For the new mobile-friendly popup design" }, "popupTipDashboard": { @@ -200,7 +200,7 @@ "description": "Caption for the no-cosmetic-filtering per-site switch" }, "popupNoRemoteFonts_v2": { - "message": "Távoli betűtípusok", + "message": "Távoli betűkészletek", "description": "Caption for the no-remote-fonts per-site switch" }, "popupNoScripting_v2": { @@ -276,7 +276,7 @@ "description": "Example of use: Version 1.26.4" }, "popup3pScriptFilter": { - "message": "szkript", + "message": "parancsfájl", "description": "Appears as an option to filter out firewall rows" }, "popup3pFrameFilter": { @@ -312,7 +312,7 @@ "description": "English: Click, Ctrl-click" }, "pickerContextMenuEntry": { - "message": "Elem blokkolása", + "message": "Elem blokkolása…", "description": "An entry in the browser's contextual menu" }, "settingsCollapseBlockedPrompt": { @@ -344,7 +344,7 @@ "description": "Label for checkbox to enable a custom dark theme" }, "settingsThemeAccent0Label": { - "message": "Egyedi akcentus szín", + "message": "Egyéni kiemelőszín", "description": "Label for checkbox to pick an accent color" }, "settingsCloudStorageEnabledPrompt": { @@ -400,11 +400,11 @@ "description": "background information: https://github.com/uBlockOrigin/uBlock-issues/issues/1513" }, "settingsAdvanced": { - "message": "Haladó", + "message": "Speciális", "description": "Section for controlling advanced-user settings" }, "settingsAdvancedSynopsis": { - "message": "Funkciók csak haladó felhasználóknak ", + "message": "Funkciók csak hozzáértő felhasználóknak", "description": "Description of section controlling advanced-user settings" }, "settingsAdvancedUserSettings": { @@ -444,7 +444,7 @@ "description": "English: Parse and enforce Adblock+ element hiding filters." }, "3pParseAllABPHideFiltersInfo": { - "message": "

Ez a beállítás engedélyezi az Adblock Plus-típusú “elemelrejtő” szűrőket. Ezek kizárólag kozmetikai célokat szolgálnak; elrejtik egy webhely azon elemeit, amelyek vizuálisan zavaróak, de a hálózati lekérések alapján nem szűrhetők ki.

A beállítás engedélyezése megnöveli a uBlock₀ memóriahasználatát.

", + "message": "A kozmetikai célú szűrők elrejtik a webhely azon elemeit, amelyek vizuálisan zavaróak, de a hálózati kérések alapján nem szűrhetők ki.", "description": "Describes the purpose of the 'Parse and enforce cosmetic filters' feature." }, "3pIgnoreGenericCosmeticFilters": { @@ -484,7 +484,7 @@ "description": "Filter lists section name" }, "3pGroupSocial": { - "message": "Közösségi widgetek", + "message": "Közösségi média felületi elemei", "description": "Filter lists section name" }, "3pGroupCookies": { @@ -536,15 +536,15 @@ "description": "used as a tooltip for error icon beside a list" }, "1pTrustWarning": { - "message": "Ne adj hozzá szűrőket megbízhatatlan forrásokból.", + "message": "Ne adjon hozzá megbízhatatlan forrásokból származó szűrőket.", "description": "Warning against copy-pasting filters from random sources" }, "1pEnableMyFiltersLabel": { - "message": "Egyedi szűrőim engedélyezése", + "message": "Egyéni szűrők engedélyezése", "description": "Label for the checkbox use to enable/disable 'My filters' list" }, "1pTrustMyFiltersLabel": { - "message": "Megbízhatóságot igénylő egyéni szűrők engedélyezése", + "message": "Bizalmas egyéni szűrők engedélyezése", "description": "Label for the checkbox use to trust the content of 'My filters' list" }, "1pImport": { @@ -640,7 +640,7 @@ "description": "Button in the 'Trusted sites' pane" }, "whitelistExportFilename": { - "message": "ublock-feherlistam_{{datetime}}.txt", + "message": "ublock-megbizhato-oldalak_{{datetime}}.txt", "description": "The default filename to use for import/export purpose" }, "whitelistApply": { @@ -704,7 +704,7 @@ "description": "Tooltip for the play button in the logger page" }, "loggerRowFiltererButtonTip": { - "message": "Naplózó szűrőjének kapcsolása", + "message": "Naplózó szűrése be/ki", "description": "Tooltip for the row filterer button in the logger page" }, "logFilterPrompt": { @@ -712,7 +712,7 @@ "description": "Placeholder string for logger output filtering input field" }, "loggerRowFiltererBuiltinTip": { - "message": "Naplózó szűrő beállítások", + "message": "Naplózó szűrőbeállításai", "description": "Tooltip for the button to bring up logger output filtering options" }, "loggerRowFiltererBuiltinNot": { @@ -732,7 +732,7 @@ "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltinModified": { - "message": "módosított", + "message": "módosítva", "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltin1p": { @@ -752,7 +752,7 @@ "description": "Label to identify a filter field" }, "loggerEntryDetailsFilterList": { - "message": "Szűrő lista", + "message": "Szűrőlista", "description": "Label to identify a filter list field" }, "loggerEntryDetailsRule": { @@ -760,15 +760,15 @@ "description": "Label to identify a rule field" }, "loggerEntryDetailsContext": { - "message": "Kontextus", + "message": "Környezet", "description": "Label to identify a context field (typically a hostname)" }, "loggerEntryDetailsRootContext": { - "message": "Gyökér kontextus", + "message": "Gyökérkörnyezet", "description": "Label to identify a root context field (typically a hostname)" }, "loggerEntryDetailsPartyness": { - "message": "Partyness", + "message": "Fél", "description": "Label to identify a field providing partyness information" }, "loggerEntryDetailsType": { @@ -780,7 +780,7 @@ "description": "Label to identify the URL of an entry" }, "loggerURLFilteringHeader": { - "message": "Dinamikus URL szűrő", + "message": "Webcímszabály", "description": "Small header to identify the dynamic URL filtering section" }, "loggerURLFilteringContextLabel": { @@ -792,7 +792,7 @@ "description": "Label for the type selector" }, "loggerStaticFilteringHeader": { - "message": "Statikus szűrés", + "message": "Statikus szűrő", "description": "Small header to identify the static filtering section" }, "loggerStaticFilteringSentence": { @@ -840,23 +840,23 @@ "description": "Message to show when a filter cannot be found in any filter lists" }, "loggerSettingDiscardPrompt": { - "message": "A naplózó bejegyzések, amelyek nem felelnek meg az alábbi három feltételnek, automatikusan eldobásra kerülnek:", + "message": "Azok a naplóbejegyzések, amelyek nem felelnek meg az alábbi három feltételnek, automatikusan eldobásra kerülnek:", "description": "Logger setting: A sentence to describe the purpose of the settings below" }, "loggerSettingPerEntryMaxAge": { - "message": "A bejegyzések megőrzése az utolsó {{input}} percből", + "message": "Bejegyzések megőrzése az utolsó {{input}} percből", "description": "A logger setting" }, "loggerSettingPerTabMaxLoads": { - "message": "Tartsa meg a legtöbb {{input}} lapot betöltéskor laponként", + "message": "Laponként legfeljebb {{input}} oldalbetöltés megtartása", "description": "A logger setting" }, "loggerSettingPerTabMaxEntries": { - "message": "Tartsa meg a legtöbb {{input}} bejegyzést laponként", + "message": "Laponként legfeljebb {{input}} bejegyzés megtartása", "description": "A logger setting" }, "loggerSettingPerEntryLineCount": { - "message": "Használja a {{input}} sorokat egy bejegyzésre függőlegesen bővített módban", + "message": "Bejegyzésenként {{input}} sor használata a függőlegesen bővített módban", "description": "A logger setting" }, "loggerSettingHideColumnsPrompt": { @@ -872,11 +872,11 @@ "description": "A label for the filter or rule column" }, "loggerSettingHideColumnContext": { - "message": "{{input}} Kontextus", + "message": "{{input}} Környezet", "description": "A label for the context column" }, "loggerSettingHideColumnPartyness": { - "message": "{{input}} Partyness", + "message": "{{input}} Fél", "description": "A label for the partyness column" }, "loggerExportFormatList": { @@ -888,7 +888,7 @@ "description": "Label for radio-button to pick export format" }, "loggerExportEncodePlain": { - "message": "Sík", + "message": "Egyszerű", "description": "Label for radio-button to pick export text format" }, "loggerExportEncodeMarkdown": { @@ -912,7 +912,7 @@ "description": "Header of 'Documentation' section in Support pane" }, "supportS1P1": { - "message": "Az uBlock Origin további funkcióihoz látogassa meg a dokumentációt itt: uBlock/wiki.", + "message": "A uBlock Origin további funkcióihoz olvassa el a dokumentációt itt: uBlock/wiki.", "description": "First paragraph of 'Documentation' section in Support pane" }, "supportS2H": { @@ -928,15 +928,15 @@ "description": "Header of 'Filter issues' section in Support pane" }, "supportS3P1": { - "message": "Adott weboldalra vonatkozó szűrőhibákat jelentse a uBlockOrigin/uAssets hibakövetőn. GitHub-fiók szükséges.", + "message": "Az adott weboldalra vonatkozó szűrőhibákat jelentse a uBlockOrigin/uAssets hibakövetőben. GitHub-fiók szükséges.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS3P2": { - "message": "Fontos: Ne használjon hasonló célú reklámblokkolókat az uBlock Originnal egyszerre, mert ez szűrőhibákat okozhat bizonyos weboldalakon.", + "message": "Fontos: Ne használjon hasonló célú reklámblokkolókat a uBlock Originnel egyidőben, mert ez szűrőhibákat okozhat bizonyos weboldalakon.", "description": "Second paragraph of 'Filter issues' section in Support pane" }, "supportS3P3": { - "message": "Tippek: Bizonyosodjon meg arról, hogy a legfrissebb szűrőlistákat használja. A napló a legfontosabb eszköz a szűrőkkel kapcsolatos hibák diagnózisában.", + "message": "Tippek: Bizonyosodjon meg arról, hogy a legfrissebb szűrőlistákat használja. A naplózó a legfontosabb eszköz a szűrőkkel kapcsolatos hibák megállapításában.", "description": "Third paragraph of 'Filter issues' section in Support pane" }, "supportS4H": { @@ -944,19 +944,19 @@ "description": "Header of 'Bug report' section in Support pane" }, "supportS4P1": { - "message": "Az uBlock Origin hibáit jelentse a uBlockOrigin/uBlock-issue hibakövetőn. GitHub-fiók szükséges.", + "message": "A uBlock Origin hibáit jelentse a uBlockOrigin/uBlock-issue hibakövetőben. GitHub-fiók szükséges.", "description": "First paragraph of 'Bug report' section in Support pane" }, "supportS5H": { - "message": "Hibakeresési információ", + "message": "Hibakeresési információk", "description": "Header of 'Troubleshooting Information' section in Support pane" }, "supportS5P1": { - "message": "Az alább található technikai információk segíthetnek önkénteseinknek megoldani a problémáját.", + "message": "Az alábbi műszaki információk segíthetnek önkénteseinknek megoldani a problémáját.", "description": "First paragraph of 'Troubleshooting Information' section in Support pane" }, "supportS5P2": { - "message": "Fontos: Az esetlegesen személyes vagy érzékeny adatok alapértelmezésből rejtve vannak. Az elrejtett információk megnehezíthetik a probléma megoldását.", + "message": "Fontos: Az esetleges személyes vagy érzékeny adatok alapértelmezés szerint eltávolításra kerülnek. A hiányzó információk megnehezíthetik a probléma megoldását.", "description": "Second paragraph of 'Troubleshooting Information' section in Support pane" }, "supportS6H": { @@ -968,7 +968,7 @@ "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S1": { - "message": "A szűrőlisták naponta frissülnek. Ügyeljen arra, hogy az Ön problémája ne szerepeljen már a legfrissebb szűrőlistákon.", + "message": "A szűrőlisták naponta frissülnek. Győződjön meg róla, hogy a problémáját nem oldják meg a legfrissebb szűrőlisták.", "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S2": { @@ -976,19 +976,19 @@ "description": "A paragraph in the filter issue reporter section" }, "supportS6URL": { - "message": "A weboldal címe:", + "message": "A weboldal címe:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "A weboldal...", + "message": "A weboldal…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Válasszon egy opciót --", + "message": "-- Válasszon egy bejegyzést --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Hirdetéseket vagy hirdetés maradványokat jelenít meg", + "message": "Hirdetéseket vagy azok maradványait jelenít meg", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { @@ -996,7 +996,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Érzékeli a uBlock Origin-t", + "message": "Észleli a uBlock Origint", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { @@ -1004,7 +1004,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Hibásan működik, amikor az uBlock Origin be van kapcsolva", + "message": "Hibásan működik, amikor a uBlock Origin be van kapcsolva", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { @@ -1024,7 +1024,7 @@ "description": "Text for 'Unredact' button" }, "aboutPrivacyPolicy": { - "message": "Adatvédelmi szabályzat", + "message": "Adatvédelmi irányelvek", "description": "Link to privacy policy on GitHub (English)" }, "aboutChangelog": { @@ -1048,7 +1048,7 @@ "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Szűrő listák", + "message": "Szűrőlisták", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { @@ -1056,15 +1056,15 @@ "description": "Shown in the About pane" }, "aboutCDNs": { - "message": "Az uBO saját szűrőlistáit a következő ingyenes CDN-ek (angol) szolgáltatják:", + "message": "A uBO saját szűrőlistáit a következő ingyenes CDN-ek (angol) szolgáltatják:", "description": "Shown in the About pane" }, "aboutCDNsInfo": { - "message": "A szűrőlisták frissítéséhez egy véletlenszerűen kiválasztott CDN-t használ a bővítmény", + "message": "A szűrőlisták frissítéséhez egy véletlenszerűen kiválasztott CDN használatos.", "description": "Shown in the About pane" }, "aboutBackupDataButton": { - "message": "Biztonsági mentés fájlba", + "message": "Biztonsági mentés fájlba…", "description": "Text for button to create a backup of all settings" }, "aboutBackupFilename": { @@ -1076,7 +1076,7 @@ "description": "English: Restore from file..." }, "aboutResetDataButton": { - "message": "Alapértelmezett beállítások visszaállítása...", + "message": "Alapértelmezett beállítások visszaállítása…", "description": "English: Reset to default settings..." }, "aboutRestoreDataConfirm": { @@ -1096,7 +1096,7 @@ "description": "English: Network error: {{msg}}" }, "subscriberConfirm": { - "message": "uBlock₀: Hozzáadja a következő URL-t a saját szűrő listákhoz?\n\nNév: \"{{title}}\"\nURL: \"{{url}}\"", + "message": "Hozzáadja a következő webcímet a saját szűrőlistáihoz?\n\nNév: „{{title}}”\nWebcím: {{url}}", "description": "No longer used" }, "subscribeButton": { @@ -1228,11 +1228,11 @@ "description": "" }, "contextMenuBlockElementInFrame": { - "message": "Elem blokkolása a keretben", + "message": "Elem blokkolása a keretben…", "description": "An entry in the browser's contextual menu" }, "contextMenuSubscribeToList": { - "message": "Feliratkozás szűrőlistára...", + "message": "Feliratkozás szűrőlistára…", "description": "An entry in the browser's contextual menu" }, "contextMenuTemporarilyAllowLargeMediaElements": { @@ -1248,7 +1248,7 @@ "description": "Placeholder string for input field used to capture a keyboard shortcut" }, "genericMergeViewScrollLock": { - "message": "Zárolt görgetés kapcsolása", + "message": "Zárolt görgetés be/ki", "description": "Tooltip for the button used to lock scrolling between the views in the 'My rules' pane" }, "genericCopyToClipboard": { @@ -1256,7 +1256,7 @@ "description": "Label for buttons used to copy something to the clipboard" }, "genericSelectAll": { - "message": "Mindent kijelöl", + "message": "Összes kijelölése", "description": "Label for buttons used to select all text in editor" }, "toggleCosmeticFiltering": { @@ -1264,19 +1264,19 @@ "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, "toggleJavascript": { - "message": "Javascript ki/bekapcsolása", + "message": "Javascript be/ki", "description": "Label for keyboard shortcut used to toggle no-scripting switch" }, "relaxBlockingMode": { - "message": "Relaxáló blokkolási mód", + "message": "Blokkolási mód lazítása", "description": "Label for keyboard shortcut used to relax blocking mode" }, "storageUsed": { - "message": "Használt tárolás: {{value}} {{unit}}", + "message": "Használt tárhely: {{value}} {{unit}}", "description": " In Setting pane, renders as (example): Storage used: 13.2 MB" }, "KB": { - "message": "KB", + "message": "kB", "description": "short for 'kilobytes'" }, "MB": { @@ -1288,7 +1288,7 @@ "description": "short for 'gigabytes'" }, "clickToLoad": { - "message": "Kattints a betöltéshez", + "message": "Kattintson a betöltéshez", "description": "Message used in frame placeholders" }, "linterMainReport": { diff --git a/src/_locales/pa/messages.json b/src/_locales/pa/messages.json index b58a1203bc44b..584a23d7e7caf 100644 --- a/src/_locales/pa/messages.json +++ b/src/_locales/pa/messages.json @@ -488,7 +488,7 @@ "description": "Filter lists section name" }, "3pGroupCookies": { - "message": "Cookie notices", + "message": "ਕੂਕੀਜ਼ ਨੋਟਿਸ", "description": "Filter lists section name" }, "3pGroupAnnoyances": { @@ -540,7 +540,7 @@ "description": "Warning against copy-pasting filters from random sources" }, "1pEnableMyFiltersLabel": { - "message": "Enable my custom filters", + "message": "ਮੇਰੇ ਕਸਟਮ ਫਿਲਟਰ ਸਮਰੱਥ ਕਰੋ", "description": "Label for the checkbox use to enable/disable 'My filters' list" }, "1pTrustMyFiltersLabel": { @@ -920,7 +920,7 @@ "description": "Header of 'Questions and support' section in Support pane" }, "supportS2P1": { - "message": "Answers to questions and other kinds of help support is provided on the subreddit /r/uBlockOrigin.", + "message": "ਸਵਾਲਾਂ ਦੇ ਜਵਾਬ ਅਤੇ ਹੋਰ ਕਿਸੇ ਵੀ ਕਿਸਮ ਦੀ ਮਦਦ subreddit /r/uBlockOrigin ਉੱਤੇ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ।", "description": "First paragraph of 'Questions and support' section in Support pane" }, "supportS3H": { @@ -1068,7 +1068,7 @@ "description": "Text for button to create a backup of all settings" }, "aboutBackupFilename": { - "message": "my-ublock-backup_{{datetime}}.txt", + "message": "ਮੇਰਾ-ublock-ਬੈਕ-ਅੱਪ_{{datetime}}.txt", "description": "English: my-ublock-backup_{{datetime}}.txt" }, "aboutRestoreDataButton": { diff --git a/src/_locales/sr/messages.json b/src/_locales/sr/messages.json index 35e56fc77a59b..f17e861e0d097 100644 --- a/src/_locales/sr/messages.json +++ b/src/_locales/sr/messages.json @@ -548,11 +548,11 @@ "description": "Label for the checkbox use to trust the content of 'My filters' list" }, "1pImport": { - "message": "Увези и додај", + "message": "Увези и додај…", "description": "Button in the 'My filters' pane" }, "1pExport": { - "message": "Извези", + "message": "Извези…", "description": "Button in the 'My filters' pane" }, "1pExportFilename": { From db3dc69bcc500ca273e70bb8fa000ad29ccfc586 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 12 Aug 2024 13:45:46 -0400 Subject: [PATCH 120/553] Improve `href-sanitizer` sciptlet Tolerate unexpected spaces in extracted URL parameters. Related feedback: https://github.com/uBlockOrigin/uBlock-issues/issues/3297#issuecomment-2283806183 --- assets/resources/scriptlets.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 866b306678d1e..8cbeb386a70e9 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -3551,9 +3551,12 @@ function hrefSanitizer( const end = recursive ? source.indexOf('?', 1) : source.length; try { const url = new URL(href, document.location); - const value = url.searchParams.get(source.slice(1, end)); + let value = url.searchParams.get(source.slice(1, end)); if ( value === null ) { return href } if ( recursive ) { return extractParam(value, source.slice(end)); } + if ( value.includes(' ') ) { + value = value.replace(/ /g, '%20'); + } return value; } catch(x) { } From f919218e275b3a08e07b00ea7e3bdcabb8aa8250 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 12 Aug 2024 14:11:49 -0400 Subject: [PATCH 121/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 24b7c6b9a9d15..7317f4d7f5408 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `href-sanitizer` sciptlet](https://github.com/gorhill/uBlock/commit/db3dc69bcc) - [Improve `remove-attr.js` scriptlet](https://github.com/gorhill/uBlock/commit/fb037e97d0) - [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/4f0d1301ab) From 0ec2c1f54caadf198100fd3c8e745c0960f54e55 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 12 Aug 2024 14:12:55 -0400 Subject: [PATCH 122/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 4c593fac9f49f..8eaa884f833ba 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.1 \ No newline at end of file +1.59.1.2 \ No newline at end of file From 415f9b87434ddaa98f2e9e16340601af3d342ee5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 12 Aug 2024 14:20:54 -0400 Subject: [PATCH 123/553] 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 c3bc0cd6412ed..8553569b3ceb7 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.1", + "version": "1.59.1.2", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b1/uBlock0_1.59.1b1.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b2/uBlock0_1.59.1b2.firefox.signed.xpi" } ] } From 9ced01ebf7f0c4a8961b572f5c14c2c3330f1131 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 12 Aug 2024 14:24:00 -0400 Subject: [PATCH 124/553] Add publish script for stable version on Chromium --- dist/chromium/publish-stable.py | 190 ++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100755 dist/chromium/publish-stable.py diff --git a/dist/chromium/publish-stable.py b/dist/chromium/publish-stable.py new file mode 100755 index 0000000000000..d1adc14740783 --- /dev/null +++ b/dist/chromium/publish-stable.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python3 + +import datetime +import json +import os +import re +import requests +import shutil +import subprocess +import sys +import tempfile +import time +import zipfile + +from string import Template + +# - Download target (raw) uBlock0.chromium.zip from GitHub +# - This is referred to as "raw" package +# - This will fail if not a dev build +# - Upload uBlock0.chromium.zip to Chrome store +# - Publish uBlock0.chromium.zip to Chrome store + +# Find path to project root +projdir = os.path.split(os.path.abspath(__file__))[0] +while not os.path.isdir(os.path.join(projdir, '.git')): + projdir = os.path.normpath(os.path.join(projdir, '..')) + +# We need a version string to work with +if len(sys.argv) >= 2 and sys.argv[1]: + version = sys.argv[1] +else: + version = input('Github release version: ') +version.strip() +if not re.search('^\d+\.\d+\.\d+$', version): + print('Error: Invalid version string.') + exit(1) + +cs_extension_id = 'cjpalhdlnbpafiamejdnhcphjbkeiagm' +tmpdir = tempfile.TemporaryDirectory() +raw_zip_filename = 'uBlock0_' + version + '.chromium.zip' +raw_zip_filepath = os.path.join(tmpdir.name, raw_zip_filename) +github_owner = 'gorhill' +github_repo = 'uBlock' + +# Load/save auth secrets +# The tmp directory is excluded from git +ubo_secrets = dict() +ubo_secrets_filename = os.path.join(projdir, 'tmp', 'ubo_secrets') +if os.path.isfile(ubo_secrets_filename): + with open(ubo_secrets_filename) as f: + ubo_secrets = json.load(f) + +def input_secret(prompt, token): + if token in ubo_secrets: + prompt += ' ✔' + prompt += ': ' + value = input(prompt).strip() + if len(value) == 0: + if token not in ubo_secrets: + print('Token error:', token) + exit(1) + value = ubo_secrets[token] + elif token not in ubo_secrets or value != ubo_secrets[token]: + ubo_secrets[token] = value + exists = os.path.isfile(ubo_secrets_filename) + with open(ubo_secrets_filename, 'w') as f: + json.dump(ubo_secrets, f, indent=2) + if not exists: + os.chmod(ubo_secrets_filename, 0o600) + return value + + +# GitHub API token +github_token = input_secret('Github token', 'github_token') +github_auth = 'token ' + github_token + +# +# Get metadata from GitHub about the release +# + +# https://developer.github.com/v3/repos/releases/#get-a-single-release +print('Downloading release info from GitHub...') +release_info_url = 'https://api.github.com/repos/{0}/{1}/releases/tags/{2}'.format(github_owner, github_repo, version) +headers = { 'Authorization': github_auth, } +response = requests.get(release_info_url, headers=headers) +if response.status_code != 200: + print('Error: Release not found: {0}'.format(response.status_code)) + exit(1) +release_info = response.json() + +# +# Extract URL to raw package from metadata +# + +# Find url for uBlock0.chromium.zip +raw_zip_url = '' +for asset in release_info['assets']: + if asset['name'] == raw_zip_filename: + raw_zip_url = asset['url'] +if len(raw_zip_url) == 0: + print('Error: Release asset URL not found') + exit(1) + +# +# Download raw package from GitHub +# + +# https://developer.github.com/v3/repos/releases/#get-a-single-release-asset +print('Downloading raw zip package from GitHub...') +headers = { + 'Authorization': github_auth, + 'Accept': 'application/octet-stream', +} +response = requests.get(raw_zip_url, headers=headers) +# Redirections are transparently handled: +# http://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history +if response.status_code != 200: + print('Error: Downloading raw package failed -- server error {0}'.format(response.status_code)) + exit(1) +with open(raw_zip_filepath, 'wb') as f: + f.write(response.content) +print('Downloaded raw package saved as {0}'.format(raw_zip_filepath)) + +# +# Upload to Chrome store +# + +# Auth tokens +cs_id = input_secret('Chrome store id', 'cs_id') +cs_secret = input_secret('Chrome store secret', 'cs_secret') +cs_refresh = input_secret('Chrome store refresh token', 'cs_refresh') + +print('Uploading to Chrome store...') +with open(raw_zip_filepath, 'rb') as f: + print('Generating access token...') + auth_url = 'https://accounts.google.com/o/oauth2/token' + auth_payload = { + 'client_id': cs_id, + 'client_secret': cs_secret, + 'grant_type': 'refresh_token', + 'refresh_token': cs_refresh, + } + auth_response = requests.post(auth_url, data=auth_payload) + if auth_response.status_code != 200: + print('Error: Auth failed -- server error {0}'.format(auth_response.status_code)) + print(auth_response.text) + exit(1) + response_dict = auth_response.json() + if 'access_token' not in response_dict: + print('Error: Auth failed -- no access token') + exit(1) + # Prepare access token + cs_auth = 'Bearer ' + response_dict['access_token'] + headers = { + 'Authorization': cs_auth, + 'x-goog-api-version': '2', + } + # Upload + print('Uploading package...') + upload_url = 'https://www.googleapis.com/upload/chromewebstore/v1.1/items/{0}'.format(cs_extension_id) + upload_response = requests.put(upload_url, headers=headers, data=f) + f.close() + if upload_response.status_code != 200: + print('Upload failed -- server error {0}'.format(upload_response.status_code)) + print(upload_response.text) + exit(1) + response_dict = upload_response.json(); + if 'uploadState' not in response_dict or response_dict['uploadState'] != 'SUCCESS': + print('Upload failed -- server error {0}'.format(response_dict['uploadState'])) + exit(1) + print('Upload succeeded.') + # Publish + print('Publishing package...') + publish_url = 'https://www.googleapis.com/chromewebstore/v1.1/items/{0}/publish'.format(cs_extension_id) + headers = { + 'Authorization': cs_auth, + 'x-goog-api-version': '2', + 'Content-Length': '0', + } + publish_response = requests.post(publish_url, headers=headers) + if publish_response.status_code != 200: + print('Error: Chrome store publishing failed -- server error {0}'.format(publish_response.status_code)) + exit(1) + response_dict = publish_response.json(); + if 'status' not in response_dict or response_dict['status'][0] != 'OK': + print('Publishing failed -- server error {0}'.format(response_dict['status'])) + exit(1) + print('Publishing succeeded.') + +print('All done.') From 56dfdd256853c1cab9910843ab48e99406950dad Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 16 Aug 2024 11:49:16 -0400 Subject: [PATCH 125/553] Improve various scriptlets Specifically, improve proxying of native methods. --- assets/resources/scriptlets.js | 268 ++++++++++++++++----------------- 1 file changed, 126 insertions(+), 142 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 8cbeb386a70e9..6b08f72373c85 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -1446,9 +1446,6 @@ function replaceFetchResponseFn( builtinScriptlets.push({ name: 'proxy-apply.fn', fn: proxyApplyFn, - dependencies: [ - 'safe-self.fn', - ], }); function proxyApplyFn( target = '', @@ -1465,12 +1462,28 @@ function proxyApplyFn( } const fn = context[prop]; if ( typeof fn !== 'function' ) { return; } + const fnname = fn.name; + const toString = (function toString() { + return `function ${fnname}() { [native code] }`; + }).bind(null); if ( fn.prototype && fn.prototype.constructor === fn ) { - context[prop] = new Proxy(fn, { construct: handler }); - return (...args) => { return Reflect.construct(...args); }; + context[prop] = new Proxy(fn, { + construct: handler, + get(target, prop, receiver) { + if ( prop === 'toString' ) { return toString; } + return Reflect.get(target, prop, receiver); + }, + }); + return (...args) => Reflect.construct(...args); } - context[prop] = new Proxy(fn, { apply: handler }); - return (...args) => { return Reflect.apply(...args); }; + context[prop] = new Proxy(fn, { + apply: handler, + get(target, prop, receiver) { + if ( prop === 'toString' ) { return toString; } + return Reflect.get(target, prop, receiver); + }, + }); + return (...args) => Reflect.apply(...args); } /******************************************************************************* @@ -1676,6 +1689,7 @@ builtinScriptlets.push({ ], fn: addEventListenerDefuser, dependencies: [ + 'proxy-apply.fn', 'run-at.fn', 'safe-self.fn', 'should-debug.fn', @@ -1732,44 +1746,29 @@ function addEventListenerDefuser( } return matchesBoth; }; - const trapEddEventListeners = ( ) => { - const eventListenerHandler = { - apply: function(target, thisArg, args) { - let t, h; - try { - t = String(args[0]); - if ( typeof args[1] === 'function' ) { - h = String(safe.Function_toString(args[1])); - } else if ( typeof args[1] === 'object' && args[1] !== null ) { - if ( typeof args[1].handleEvent === 'function' ) { - h = String(safe.Function_toString(args[1].handleEvent)); - } - } else { - h = String(args[1]); + runAt(( ) => { + proxyApplyFn('EventTarget.prototype.addEventListener', function(target, thisArg, args) { + let t, h; + try { + t = String(args[0]); + if ( typeof args[1] === 'function' ) { + h = String(safe.Function_toString(args[1])); + } else if ( typeof args[1] === 'object' && args[1] !== null ) { + if ( typeof args[1].handleEvent === 'function' ) { + h = String(safe.Function_toString(args[1].handleEvent)); } - } catch(ex) { - } - if ( type === '' && pattern === '' ) { - safe.uboLog(logPrefix, `Called: ${t}\n${h}\n${elementDetails(thisArg)}`); - } else if ( shouldPrevent(thisArg, t, h) ) { - return safe.uboLog(logPrefix, `Prevented: ${t}\n${h}\n${elementDetails(thisArg)}`); - } - return Reflect.apply(target, thisArg, args); - }, - get(target, prop, receiver) { - if ( prop === 'toString' ) { - return target.toString.bind(target); + } else { + h = String(args[1]); } - return Reflect.get(target, prop, receiver); - }, - }; - self.EventTarget.prototype.addEventListener = new Proxy( - self.EventTarget.prototype.addEventListener, - eventListenerHandler - ); - }; - runAt(( ) => { - trapEddEventListeners(); + } catch(ex) { + } + if ( type === '' && pattern === '' ) { + safe.uboLog(logPrefix, `Called: ${t}\n${h}\n${elementDetails(thisArg)}`); + } else if ( shouldPrevent(thisArg, t, h) ) { + return safe.uboLog(logPrefix, `Prevented: ${t}\n${h}\n${elementDetails(thisArg)}`); + } + return Reflect.apply(target, thisArg, args); + }); }, extraArgs.runAt); } @@ -2475,6 +2474,7 @@ builtinScriptlets.push({ ], fn: noSetIntervalIf, dependencies: [ + 'proxy-apply.fn', 'safe-self.fn', ], }); @@ -2495,35 +2495,27 @@ function noSetIntervalIf( delay = parseInt(delay, 10); } const reNeedle = safe.patternToRegex(needle); - self.setInterval = new Proxy(self.setInterval, { - apply: function(target, thisArg, args) { - const a = args[0] instanceof Function - ? String(safe.Function_toString(args[0])) - : String(args[0]); - const b = args[1]; - if ( needle === '' && delay === undefined ) { - safe.uboLog(logPrefix, `Called:\n${a}\n${b}`); - return Reflect.apply(target, thisArg, args); - } - let defuse; - if ( needle !== '' ) { - defuse = reNeedle.test(a) !== needleNot; - } - if ( defuse !== false && delay !== undefined ) { - defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; - } - if ( defuse ) { - args[0] = function(){}; - safe.uboLog(logPrefix, `Prevented:\n${a}\n${b}`); - } + proxyApplyFn('setInterval', function setInterval(target, thisArg, args) { + const a = args[0] instanceof Function + ? String(safe.Function_toString(args[0])) + : String(args[0]); + const b = args[1]; + if ( needle === '' && delay === undefined ) { + safe.uboLog(logPrefix, `Called:\n${a}\n${b}`); return Reflect.apply(target, thisArg, args); - }, - get(target, prop, receiver) { - if ( prop === 'toString' ) { - return target.toString.bind(target); - } - return Reflect.get(target, prop, receiver); - }, + } + let defuse; + if ( needle !== '' ) { + defuse = reNeedle.test(a) !== needleNot; + } + if ( defuse !== false && delay !== undefined ) { + defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; + } + if ( defuse ) { + args[0] = function(){}; + safe.uboLog(logPrefix, `Prevented:\n${a}\n${b}`); + } + return Reflect.apply(target, thisArg, args); }); } @@ -2538,6 +2530,7 @@ builtinScriptlets.push({ ], fn: noSetTimeoutIf, dependencies: [ + 'proxy-apply.fn', 'safe-self.fn', ], }); @@ -2558,35 +2551,27 @@ function noSetTimeoutIf( delay = parseInt(delay, 10); } const reNeedle = safe.patternToRegex(needle); - self.setTimeout = new Proxy(self.setTimeout, { - apply: function(target, thisArg, args) { - const a = args[0] instanceof Function - ? String(safe.Function_toString(args[0])) - : String(args[0]); - const b = args[1]; - if ( needle === '' && delay === undefined ) { - safe.uboLog(logPrefix, `Called:\n${a}\n${b}`); - return Reflect.apply(target, thisArg, args); - } - let defuse; - if ( needle !== '' ) { - defuse = reNeedle.test(a) !== needleNot; - } - if ( defuse !== false && delay !== undefined ) { - defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; - } - if ( defuse ) { - args[0] = function(){}; - safe.uboLog(logPrefix, `Prevented:\n${a}\n${b}`); - } + proxyApplyFn('setTimeout', function setTimeout(target, thisArg, args) { + const a = args[0] instanceof Function + ? String(safe.Function_toString(args[0])) + : String(args[0]); + const b = args[1]; + if ( needle === '' && delay === undefined ) { + safe.uboLog(logPrefix, `Called:\n${a}\n${b}`); return Reflect.apply(target, thisArg, args); - }, - get(target, prop, receiver) { - if ( prop === 'toString' ) { - return target.toString.bind(target); - } - return Reflect.get(target, prop, receiver); - }, + } + let defuse; + if ( needle !== '' ) { + defuse = reNeedle.test(a) !== needleNot; + } + if ( defuse !== false && delay !== undefined ) { + defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; + } + if ( defuse ) { + args[0] = function(){}; + safe.uboLog(logPrefix, `Prevented:\n${a}\n${b}`); + } + return Reflect.apply(target, thisArg, args); }); } @@ -2815,6 +2800,7 @@ builtinScriptlets.push({ ], fn: noWindowOpenIf, dependencies: [ + 'proxy-apply.fn', 'safe-self.fn', ], }); @@ -2845,51 +2831,49 @@ function noWindowOpenIf( setTimeout(( ) => { decoyElem.remove(); }, autoRemoveAfter * 1000); return decoyElem; }; - window.open = new Proxy(window.open, { - apply: function(target, thisArg, args) { - const haystack = args.join(' '); - if ( rePattern.test(haystack) !== targetMatchResult ) { - if ( safe.logLevel > 1 ) { - safe.uboLog(logPrefix, `Allowed (${args.join(', ')})`); - } - return Reflect.apply(target, thisArg, args); - } - safe.uboLog(logPrefix, `Prevented (${args.join(', ')})`); - if ( autoRemoveAfter < 0 ) { return null; } - const decoyElem = decoy === 'obj' - ? createDecoy('object', 'data', ...args) - : createDecoy('iframe', 'src', ...args); - let popup = decoyElem.contentWindow; - if ( typeof popup === 'object' && popup !== null ) { - Object.defineProperty(popup, 'closed', { value: false }); - } else { - const noopFunc = (function(){}).bind(self); - popup = new Proxy(self, { - get: function(target, prop) { - if ( prop === 'closed' ) { return false; } - const r = Reflect.get(...arguments); - if ( typeof r === 'function' ) { return noopFunc; } - return target[prop]; - }, - set: function() { - return Reflect.set(...arguments); - }, - }); - } - if ( safe.logLevel !== 0 ) { - popup = new Proxy(popup, { - get: function(target, prop) { - safe.uboLog(logPrefix, 'window.open / get', prop, '===', target[prop]); - return Reflect.get(...arguments); - }, - set: function(target, prop, value) { - safe.uboLog(logPrefix, 'window.open / set', prop, '=', value); - return Reflect.set(...arguments); - }, - }); + proxyApplyFn('open', function open(target, thisArg, args) { + const haystack = args.join(' '); + if ( rePattern.test(haystack) !== targetMatchResult ) { + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, `Allowed (${args.join(', ')})`); } - return popup; + return Reflect.apply(target, thisArg, args); + } + safe.uboLog(logPrefix, `Prevented (${args.join(', ')})`); + if ( autoRemoveAfter < 0 ) { return null; } + const decoyElem = decoy === 'obj' + ? createDecoy('object', 'data', ...args) + : createDecoy('iframe', 'src', ...args); + let popup = decoyElem.contentWindow; + if ( typeof popup === 'object' && popup !== null ) { + Object.defineProperty(popup, 'closed', { value: false }); + } else { + const noopFunc = function open(){}; + popup = new Proxy(self, { + get: function(target, prop) { + if ( prop === 'closed' ) { return false; } + const r = Reflect.get(...arguments); + if ( typeof r === 'function' ) { return noopFunc; } + return target[prop]; + }, + set: function() { + return Reflect.set(...arguments); + }, + }); + } + if ( safe.logLevel !== 0 ) { + popup = new Proxy(popup, { + get: function(target, prop) { + safe.uboLog(logPrefix, 'window.open / get', prop, '===', target[prop]); + return Reflect.get(...arguments); + }, + set: function(target, prop, value) { + safe.uboLog(logPrefix, 'window.open / set', prop, '=', value); + return Reflect.set(...arguments); + }, + }); } + return popup; }); } From cf5e781c915f2b08a3bd04cbc82e9b97701f193e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 16 Aug 2024 11:55:53 -0400 Subject: [PATCH 126/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7317f4d7f5408..f8d78c9ab18dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve various scriptlets](https://github.com/gorhill/uBlock/commit/56dfdd2568) - [Improve `href-sanitizer` sciptlet](https://github.com/gorhill/uBlock/commit/db3dc69bcc) - [Improve `remove-attr.js` scriptlet](https://github.com/gorhill/uBlock/commit/fb037e97d0) - [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/4f0d1301ab) From 4520a8e611cf151b10f789994dd2ae4226fe1a20 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 16 Aug 2024 11:56:20 -0400 Subject: [PATCH 127/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 8eaa884f833ba..e95c3036d1206 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.2 \ No newline at end of file +1.59.1.3 \ No newline at end of file From 8de454ccca4e64c1e5486362a56ec0f745faf560 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 16 Aug 2024 12:11:18 -0400 Subject: [PATCH 128/553] 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 8553569b3ceb7..b4f9d0ec4de8a 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.2", + "version": "1.59.1.3", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b2/uBlock0_1.59.1b2.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b3/uBlock0_1.59.1b3.firefox.signed.xpi" } ] } From 1cb660b94e0adb6d4e15e91e3e4011279393efd9 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 17 Aug 2024 10:11:18 -0400 Subject: [PATCH 129/553] Fix plain exceptions not overriding block filters using `header=` option Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3347 --- src/js/static-net-filtering.js | 137 +++++++++++++++------------------ 1 file changed, 64 insertions(+), 73 deletions(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 9a252fdce33cd..96aaff79ef7a7 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -19,28 +19,15 @@ Home: https://github.com/gorhill/uBlock */ -/* globals vAPI */ - -'use strict'; +import * as sfp from './static-filtering-parser.js'; -/******************************************************************************/ +import { domainFromHostname, hostnameFromNetworkURL } from './uri-utils.js'; +import { dropTask, queueTask } from './tasks.js'; -import { queueTask, dropTask } from './tasks.js'; import BidiTrieContainer from './biditrie.js'; -import HNTrieContainer from './hntrie.js'; import { CompiledListReader } from './static-filtering-io.js'; -import * as sfp from './static-filtering-parser.js'; - -import { - domainFromHostname, - hostnameFromNetworkURL, -} from './uri-utils.js'; - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#browser_compatibility -// -// This import would be best done dynamically, but since dynamic imports are -// not supported by older browsers, for now a static import is necessary. import { FilteringContext } from './filtering-context.js'; +import HNTrieContainer from './hntrie.js'; /******************************************************************************/ @@ -3423,63 +3410,63 @@ class FilterCompiler { processOptionWithValue(parser, id) { switch ( id ) { - case sfp.NODE_TYPE_NET_OPTION_NAME_CSP: - if ( this.processCspOption(parser.getNetOptionValue(id)) === false ) { return false; } - break; - case sfp.NODE_TYPE_NET_OPTION_NAME_DENYALLOW: - this.denyallowOpt = this.processHostnameList( - parser.getNetFilterDenyallowOptionIterator(), - ); - if ( this.denyallowOpt === '' ) { return false; } - this.optionUnitBits |= DENYALLOW_BIT; - break; - case sfp.NODE_TYPE_NET_OPTION_NAME_FROM: - this.fromDomainOpt = this.processHostnameList( - parser.getNetFilterFromOptionIterator(), - this.fromDomainOptList - ); - if ( this.fromDomainOpt === '' ) { return false; } - this.optionUnitBits |= FROM_BIT; - break; - case sfp.NODE_TYPE_NET_OPTION_NAME_HEADER: { - this.headerOpt = parser.getNetOptionValue(id) || ''; - this.optionUnitBits |= HEADER_BIT; - break; + case sfp.NODE_TYPE_NET_OPTION_NAME_CSP: + if ( this.processCspOption(parser.getNetOptionValue(id)) === false ) { return false; } + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_DENYALLOW: + this.denyallowOpt = this.processHostnameList( + parser.getNetFilterDenyallowOptionIterator(), + ); + if ( this.denyallowOpt === '' ) { return false; } + this.optionUnitBits |= DENYALLOW_BIT; + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_FROM: + this.fromDomainOpt = this.processHostnameList( + parser.getNetFilterFromOptionIterator(), + this.fromDomainOptList + ); + if ( this.fromDomainOpt === '' ) { return false; } + this.optionUnitBits |= FROM_BIT; + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_HEADER: { + this.headerOpt = parser.getNetOptionValue(id) || ''; + this.optionUnitBits |= HEADER_BIT; + break; + } + case sfp.NODE_TYPE_NET_OPTION_NAME_METHOD: + this.processMethodOption(parser.getNetOptionValue(id)); + this.optionUnitBits |= METHOD_BIT; + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_PERMISSIONS: + case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE: + case sfp.NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM: + case sfp.NODE_TYPE_NET_OPTION_NAME_REPLACE: + case sfp.NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM: + if ( this.processModifierOption(id, parser.getNetOptionValue(id)) === false ) { + return false; } - case sfp.NODE_TYPE_NET_OPTION_NAME_METHOD: - this.processMethodOption(parser.getNetOptionValue(id)); - this.optionUnitBits |= METHOD_BIT; - break; - case sfp.NODE_TYPE_NET_OPTION_NAME_PERMISSIONS: - case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE: - case sfp.NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM: - case sfp.NODE_TYPE_NET_OPTION_NAME_REPLACE: - case sfp.NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM: - if ( this.processModifierOption(id, parser.getNetOptionValue(id)) === false ) { - return false; - } - this.optionUnitBits |= MODIFY_BIT; - break; - case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECT: { - const actualId = this.action === ALLOW_REALM - ? sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE - : id; - if ( this.processModifierOption(actualId, parser.getNetOptionValue(id)) === false ) { - return false; - } - this.optionUnitBits |= MODIFY_BIT; - break; + this.optionUnitBits |= MODIFY_BIT; + break; + case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECT: { + const actualId = this.action === ALLOW_REALM + ? sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE + : id; + if ( this.processModifierOption(actualId, parser.getNetOptionValue(id)) === false ) { + return false; } - case sfp.NODE_TYPE_NET_OPTION_NAME_TO: - this.toDomainOpt = this.processHostnameList( - parser.getNetFilterToOptionIterator(), - this.toDomainOptList - ); - if ( this.toDomainOpt === '' ) { return false; } - this.optionUnitBits |= TO_BIT; - break; - default: - break; + this.optionUnitBits |= MODIFY_BIT; + break; + } + case sfp.NODE_TYPE_NET_OPTION_NAME_TO: + this.toDomainOpt = this.processHostnameList( + parser.getNetFilterToOptionIterator(), + this.toDomainOptList + ); + if ( this.toDomainOpt === '' ) { return false; } + this.optionUnitBits |= TO_BIT; + break; + default: + break; } return true; } @@ -3798,7 +3785,7 @@ class FilterCompiler { isJustOrigin() { if ( this.optionUnitBits !== FROM_BIT ) { return false; } if ( this.isRegex ) { return false; } - if ( /[\/~]/.test(this.fromDomainOpt) ) { return false; } + if ( /[/~]/.test(this.fromDomainOpt) ) { return false; } if ( this.pattern === '*' ) { return true; } if ( this.anchor !== 0b010 ) { return false; } if ( /^(?:http[s*]?:(?:\/\/)?)$/.test(this.pattern) ) { return true; } @@ -5156,6 +5143,10 @@ StaticNetFilteringEngine.prototype.matchHeaders = function(fctxt, headers) { if ( r !== 0 && $isBlockImportant !== true ) { if ( this.realmMatchString(HEADERS_REALM | ALLOW_REALM, typeBits, partyBits) ) { r = 2; + } else if ( this.realmMatchString(ALLOW_REALM, typeBits, partyBits) ) { + r = 2; + } + if ( r === 2 ) { if ( this.realmMatchString(HEADERS_REALM | BLOCKIMPORTANT_REALM, typeBits, partyBits) ) { r = 1; } From e73eb23c9047ec79945a27b7ac3810097485d525 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 17 Aug 2024 10:42:17 -0400 Subject: [PATCH 130/553] [mv3] Don't filter out tabless requests in "logger" --- platform/mv3/extension/js/debug.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/platform/mv3/extension/js/debug.js b/platform/mv3/extension/js/debug.js index 0674cd9446b88..9488260d856c2 100644 --- a/platform/mv3/extension/js/debug.js +++ b/platform/mv3/extension/js/debug.js @@ -112,7 +112,9 @@ export const getMatchedRules = (( ) => { const j = (writePtr + i) % bufferSize; const ruleInfo = matchedRules[j]; if ( ruleInfo === null ) { continue; } - if ( ruleInfo.request.tabId !== tabId ) { continue; } + if ( ruleInfo.request.tabId !== -1 ) { + if ( ruleInfo.request.tabId !== tabId ) { continue; } + } const promise = getRuleDetails(ruleInfo); if ( promise === undefined ) { continue; } promises.unshift(promise); From 6891037758354c809953a549017f654437ed38c7 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 17 Aug 2024 11:00:42 -0400 Subject: [PATCH 131/553] [mv3] Fix exception filters not overriding redirect filters Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/185 --- src/js/static-net-filtering.js | 37 +++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 96aaff79ef7a7..84d04478d3dd9 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -752,7 +752,7 @@ class FilterImportant { } static dnrFromCompiled(args, rule) { - rule.priority = (rule.priority || 1) + 10; + rule.priority = (rule.priority || 1) + 30; } static keyFromArgs() { @@ -4312,14 +4312,22 @@ StaticNetFilteringEngine.prototype.dnrFromCompiled = function(op, context, ...ar } } + // Priority: + // Block: 0 (default priority) + // Redirect: 1-9 + // Excepted redirect: 11-19 + // Allow: 20 + // Block important: 30 + // Redirect important: 31-39 + const realms = new Map([ - [ BLOCK_REALM, 'block' ], - [ ALLOW_REALM, 'allow' ], - [ REDIRECT_REALM, 'redirect' ], - [ REMOVEPARAM_REALM, 'removeparam' ], - [ CSP_REALM, 'csp' ], - [ PERMISSIONS_REALM, 'permissions' ], - [ URLTRANSFORM_REALM, 'uritransform' ], + [ BLOCK_REALM, { type: 'block', priority: 0 } ], + [ ALLOW_REALM, { type: 'allow', priority: 20 } ], + [ REDIRECT_REALM, { type: 'redirect', priority: 1 } ], + [ REMOVEPARAM_REALM, { type: 'removeparam', priority: 0 } ], + [ CSP_REALM, { type: 'csp', priority: 0 } ], + [ PERMISSIONS_REALM, { type: 'permissions', priority: 0 } ], + [ URLTRANSFORM_REALM, { type: 'uritransform', priority: 0 } ], ]); const partyness = new Map([ [ ANYPARTY_REALM, '' ], @@ -4342,7 +4350,7 @@ StaticNetFilteringEngine.prototype.dnrFromCompiled = function(op, context, ...ar 'other', ]); const ruleset = []; - for ( const [ realmBits, realmName ] of realms ) { + for ( const [ realmBits, realmDetails ] of realms ) { for ( const [ partyBits, partyName ] of partyness ) { for ( const typeName in typeNameToTypeValue ) { if ( types.has(typeName) === false ) { continue; } @@ -4353,7 +4361,10 @@ StaticNetFilteringEngine.prototype.dnrFromCompiled = function(op, context, ...ar for ( const rules of bucket.values() ) { for ( const rule of rules ) { rule.action = rule.action || {}; - rule.action.type = realmName; + rule.action.type = realmDetails.type; + if ( realmDetails.priority !== 0 ) { + rule.priority = (rule.priority || 0) + realmDetails.priority; + } if ( partyName !== '' ) { rule.condition = rule.condition || {}; rule.condition.domainType = partyName; @@ -4449,12 +4460,11 @@ StaticNetFilteringEngine.prototype.dnrFromCompiled = function(op, context, ...ar } break; case 'redirect-rule': { - let priority = rule.priority || 1; let token = rule.__modifierValue; if ( token !== '' ) { const match = /:(\d+)$/.exec(token); if ( match !== null ) { - priority += parseInt(match[1], 10); + rule.priority = Math.min(rule.priority + parseInt(match[1], 10), 9); token = token.slice(0, match.index); } } @@ -4466,10 +4476,9 @@ StaticNetFilteringEngine.prototype.dnrFromCompiled = function(op, context, ...ar const extensionPath = resource || token; rule.action.type = 'redirect'; rule.action.redirect = { extensionPath }; - rule.priority = priority + 1; } else { rule.action.type = 'block'; - rule.priority = priority + 2; + rule.priority += 10; } break; } From cb452bc21c79a896fd073afbb83cbcfce867646f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 17 Aug 2024 12:32:31 -0400 Subject: [PATCH 132/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8d78c9ab18dc..2f56598079b86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Fix plain exceptions not overriding block filters using `header=` option](https://github.com/gorhill/uBlock/commit/1cb660b94e) - [Improve various scriptlets](https://github.com/gorhill/uBlock/commit/56dfdd2568) - [Improve `href-sanitizer` sciptlet](https://github.com/gorhill/uBlock/commit/db3dc69bcc) - [Improve `remove-attr.js` scriptlet](https://github.com/gorhill/uBlock/commit/fb037e97d0) From a6cc75109d108106f27b3637af475fc304f86f70 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 17 Aug 2024 12:32:51 -0400 Subject: [PATCH 133/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index e95c3036d1206..a11a4871783ba 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.3 \ No newline at end of file +1.59.1.4 \ No newline at end of file From 2c60b331e39e96114386e568d028240b37cdeefc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 17 Aug 2024 12:50:45 -0400 Subject: [PATCH 134/553] 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 b4f9d0ec4de8a..c193c382f807c 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.3", + "version": "1.59.1.4", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b3/uBlock0_1.59.1b3.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b4/uBlock0_1.59.1b4.firefox.signed.xpi" } ] } From 5287f6e0296f6561307d623e9b0cf2f7f7dccc49 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 18 Aug 2024 09:12:54 -0400 Subject: [PATCH 135/553] Code review of scriptlet helper --- assets/resources/scriptlets.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 6b08f72373c85..96042aba4464c 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -1462,10 +1462,8 @@ function proxyApplyFn( } const fn = context[prop]; if ( typeof fn !== 'function' ) { return; } - const fnname = fn.name; - const toString = (function toString() { - return `function ${fnname}() { [native code] }`; - }).bind(null); + const fnStr = fn.toString(); + const toString = (function toString() { return fnStr; }).bind(null); if ( fn.prototype && fn.prototype.constructor === fn ) { context[prop] = new Proxy(fn, { construct: handler, From 41c2258f9133cdea511a5bcd8d592682f7b17cca Mon Sep 17 00:00:00 2001 From: Fanboynz Date: Mon, 19 Aug 2024 01:14:44 +1200 Subject: [PATCH 136/553] Add allowed/denied to set-local-storage (#3922) --- assets/resources/scriptlets.js | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 96042aba4464c..18ff58d60ae28 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -1102,6 +1102,7 @@ function setLocalStorageItemFn( 'yes', 'no', 'accept', 'reject', 'accepted', 'rejected', + 'allowed', 'denied', '{}', '[]', '""', '$remove$', ]; From 34047daa06e4255b7347f312770b9634d481e09e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 19 Aug 2024 12:02:00 -0400 Subject: [PATCH 137/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.es.txt | 2 +- platform/mv3/extension/_locales/ar/messages.json | 2 +- platform/mv3/extension/_locales/az/messages.json | 2 +- platform/mv3/extension/_locales/es/messages.json | 4 ++-- platform/mv3/extension/_locales/fa/messages.json | 2 +- platform/mv3/extension/_locales/hu/messages.json | 2 +- platform/mv3/extension/_locales/hy/messages.json | 2 +- platform/mv3/extension/_locales/it/messages.json | 4 ++-- platform/mv3/extension/_locales/pt_BR/messages.json | 2 +- platform/mv3/extension/_locales/pt_PT/messages.json | 2 +- platform/mv3/extension/_locales/si/messages.json | 4 ++-- platform/mv3/extension/_locales/sv/messages.json | 2 +- platform/mv3/extension/_locales/tr/messages.json | 2 +- src/_locales/br_FR/messages.json | 10 +++++----- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/platform/mv3/description/webstore.es.txt b/platform/mv3/description/webstore.es.txt index b89c567215bb5..e0cbfb8bd4204 100644 --- a/platform/mv3/description/webstore.es.txt +++ b/platform/mv3/description/webstore.es.txt @@ -7,7 +7,7 @@ Por defecto ya trae configuradas las siguientes listas de filtros: - EasyPrivacy - Peter Lowe’s Ad and tracking server list -Puedes activar más ruletas visitando la página de opciones --pulsa el icono _Cogs_ en la ventana del panel +Puedes habilitar más conjuntos de reglas visitando la página de opciones, haz clic en el icono de _engranaje_ del panel emergente. uBOL es completamente declarativo, lo que significa que no hay necesidad de un proceso uBOL permanente para que se produzca el filtrado, y el filtrado de contenido basado en la inyección de CSS/JS se realiza de forma confiable por el propio navegador en lugar de la extensión. Esto significa que uBOL en sí mismo no consume recursos de CPU/memoria mientras el bloqueo de contenido está en curso, el proceso service worker de uBOL se requiere _solo_ cuando se interactúa con el panel emergente o las páginas de opciones. diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index 7aa0a40b9cce3..a25dfab4de557 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -148,7 +148,7 @@ "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[hostnames only]\nexample.com\ngames.example\n...", + "message": "[أسماء النطاقات الرئيسية فقط]\nexample.com\ngames.example", "description": "Default text for in edit field" }, "behaviorSectionLabel": { diff --git a/platform/mv3/extension/_locales/az/messages.json b/platform/mv3/extension/_locales/az/messages.json index 5f8c5ae1aaf27..3f397e146f9ea 100644 --- a/platform/mv3/extension/_locales/az/messages.json +++ b/platform/mv3/extension/_locales/az/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "İcazəyə ehtiyac duymayan məzmun əngəlləyicisi. Reklamları, izləyiciləri, maynerləri və daha çoxunu quraşdırmadan dərhal sonra əngəlləyir.", + "message": "İcazəyə ehtiyac duymayan məzmun əngəlləyicisi. Reklamları, izləyiciləri, və daha çoxunu quraşdırmadan dərhal sonra əngəlləyir.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 2d3cd2fd6c68d..f4ff120d131d7 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -144,11 +144,11 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Lista de nombres de dominio para los cuales no se realizará ningún filtrado.", + "message": "Lista de sitios web para los cuales no se realizará ningún filtrado.", "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[solo nombres de hospedador]\nejemplo.com\njuegos.ejemplo\n...", + "message": "[solo nombres de dominio]\nejemplo.com\njuegos.ejemplo\n...", "description": "Default text for in edit field" }, "behaviorSectionLabel": { diff --git a/platform/mv3/extension/_locales/fa/messages.json b/platform/mv3/extension/_locales/fa/messages.json index 169540c053e57..ba2d878aa6078 100644 --- a/platform/mv3/extension/_locales/fa/messages.json +++ b/platform/mv3/extension/_locales/fa/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "مسدود کننده محتوا بدون نیاز به مجوز که بلافاصله پس از نصب، تبلیغات، ردیاب ها، ابزار‌های استخراج ارز دیجیتال و موارد دیگر را مسدود می کند.", + "message": "یک مسدود کننده محتوای بدون مجوز که بلافاصله پس از نصب، تبلیغات، ردیاب ها، ابزارهای استخراج و موارد دیگر را مسدود می کند.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index a27467b005740..bb044590e905f 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Kísérleti, engedélyeket nem igénylő nélküli tartalomblokkoló. A telepítés után azonnal blokkolja a hirdetéseket, nyomkövetőket, bányászprogramokat és egyebeket.", + "message": "Engedélyt nem igénylő tartalomblokkoló. A telepítés után azonnal blokkolja a hirdetéseket, nyomkövetőket, bányászokat és egyebeket.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { diff --git a/platform/mv3/extension/_locales/hy/messages.json b/platform/mv3/extension/_locales/hy/messages.json index 36cd1cc8e60ac..5a50db68ace07 100644 --- a/platform/mv3/extension/_locales/hy/messages.json +++ b/platform/mv3/extension/_locales/hy/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Փորձարարական բովանդակության արգելափակիչ, որը չի պահանջում թույլտվություններ։ Արգելափակում է ազդերը, հետագծիչները, մայներները և շատ ավելին։", + "message": "Փբովանդակության արգելափակիչ, որը չի պահանջում թույլտվություններ։ Արգելափակում է ազդերը, հետագծիչները, մայներները և շատ ավելին։", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index e504d5b206d85..dc7fbd930783d 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -16,7 +16,7 @@ "description": "English: uBO Lite — Dashboard" }, "settingsPageName": { - "message": "Opzioni", + "message": "Impostazioni", "description": "appears as tab name in dashboard" }, "aboutPageName": { @@ -148,7 +148,7 @@ "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[hostnames only]\nexample.com\ngames.example\n...", + "message": "[solo nomi di host]\nesempio.com\ngiochi.esempio\n...", "description": "Default text for in edit field" }, "behaviorSectionLabel": { diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index 671006eacf313..e6533c12712ff 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Um bloqueador de conteúdo com menos permissões - Bloqueie anúncios, rastreadores, mineradores e mais imediatamente após a instalação.", + "message": "Um bloqueador de conteúdo com menos permissões - Bloqueie anúncios, rastreadores, mineradores e mais imediatamente após a instalação", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index 2f637e25713e8..52917d37ecb71 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Um bloqueador de conteúdo sem permissões. Bloqueia anúncios, rastreadores, mineradores de criptomoedas e muito mais, imediatamente após a instalação.", + "message": "Um bloqueador de conteúdo sem permissões. Bloqueia anúncios, rastreadores e muito mais, imediatamente após a instalação.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { diff --git a/platform/mv3/extension/_locales/si/messages.json b/platform/mv3/extension/_locales/si/messages.json index 30c719d52722d..bc0e73fc0ddc2 100644 --- a/platform/mv3/extension/_locales/si/messages.json +++ b/platform/mv3/extension/_locales/si/messages.json @@ -16,11 +16,11 @@ "description": "English: uBO Lite — Dashboard" }, "settingsPageName": { - "message": "Settings", + "message": "සැකසුම්", "description": "appears as tab name in dashboard" }, "aboutPageName": { - "message": "About", + "message": "පිළිබඳව", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { diff --git a/platform/mv3/extension/_locales/sv/messages.json b/platform/mv3/extension/_locales/sv/messages.json index 4fb9b47a26a57..c95ce8d24db00 100644 --- a/platform/mv3/extension/_locales/sv/messages.json +++ b/platform/mv3/extension/_locales/sv/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "En behörighetslös innehållsblockerare. Blockerar annonser, spårare, miners och mer omedelbart efter installationen.", + "message": "En behörighetslös innehållsblockerare. Blockerar annonser, spårare, miners och mer omedelbart efter installationen.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { diff --git a/platform/mv3/extension/_locales/tr/messages.json b/platform/mv3/extension/_locales/tr/messages.json index 5cf18a7020d51..06e259997e21f 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "İzin gerektirmeyen içerik engelleyicisi. Kurulumdan hemen sonra reklamları, izleyicileri, kripto madencilerini, ve daha fazlasını engeller.", + "message": "İzin gerektirmeyen içerik engelleyicisi. Kurulumdan hemen sonra reklamları, izleyicileri, ve daha fazlasını engeller.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { diff --git a/src/_locales/br_FR/messages.json b/src/_locales/br_FR/messages.json index 2722eb8de84fc..e0005b74baf74 100644 --- a/src/_locales/br_FR/messages.json +++ b/src/_locales/br_FR/messages.json @@ -156,15 +156,15 @@ "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoCosmeticFiltering": { - "message": "Lazhañ/enaouiñ ar silañ kenedel war al lec'hienn-mañ", + "message": "Lazhañ/enaouiñ ar siloù kenedel war al lec'hienn-mañ", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering1": { - "message": "Lazhañ ar silañ kenedel war al lec'hienn-mañ", + "message": "Lazhañ ar siloù kenedel war al lec'hienn-mañ", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering2": { - "message": "Enaouiñ ar silañ kenedel war al lec'hienn-mañ", + "message": "Enaouiñ ar siloù kenedel war al lec'hienn-mañ", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoRemoteFonts": { @@ -376,7 +376,7 @@ "description": "" }, "settingsNoCosmeticFilteringPrompt": { - "message": "Lazhañ ar silañ kenedel", + "message": "Lazhañ ar siloù kenedel", "description": "" }, "settingsNoLargeMediaPrompt": { @@ -1260,7 +1260,7 @@ "description": "Label for buttons used to select all text in editor" }, "toggleCosmeticFiltering": { - "message": "Enaouiñ ar silañ kenedel", + "message": "Enaouiñ ar siloù kenedel", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, "toggleJavascript": { From 3e2171f550e0582dfa0419d59b563a4f22f952f6 Mon Sep 17 00:00:00 2001 From: Fanboynz Date: Tue, 20 Aug 2024 06:40:33 +1200 Subject: [PATCH 138/553] Add checked/unchecked to set-cookie (#3923) --- assets/resources/scriptlets.js | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 18ff58d60ae28..f59eb8ed387bc 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -3848,6 +3848,7 @@ function setCookie( 'hide', 'hidden', 'essential', 'nonessential', 'dismiss', 'dismissed', + 'checked', 'unchecked', ]; const normalized = value.toLowerCase(); const match = /^("?)(.+)\1$/.exec(normalized); From 79e10323adf3816410915a2583bf3a712a966720 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 19 Aug 2024 14:56:15 -0400 Subject: [PATCH 139/553] Use helper function to lookup safe cookie values This helper function is now used by `set-cookie` and `set-local-storage-item` scriptlets, so changes in the helper function will benefit both scriptlets. --- assets/resources/scriptlets.js | 56 +++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index f59eb8ed387bc..8acbb98940d84 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -954,6 +954,33 @@ function objectFindOwnerFn( /******************************************************************************/ +builtinScriptlets.push({ + name: 'get-safe-cookie-values.fn', + fn: getSafeCookieValuesFn, +}); +function getSafeCookieValuesFn() { + return [ + 'accept', 'reject', + 'accepted', 'rejected', 'notaccepted', + 'allow', 'disallow', 'deny', + 'allowed', 'denied', + 'approved', 'disapproved', + 'checked', 'unchecked', + 'dismiss', 'dismissed', + 'enable', 'disable', + 'enabled', 'disabled', + 'essential', 'nonessential', + 'hide', 'hidden', + 'necessary', 'required', + 'ok', + 'on', 'off', + 'true', 't', 'false', 'f', + 'yes', 'y', 'no', 'n', + ]; +} + +/******************************************************************************/ + builtinScriptlets.push({ name: 'get-all-cookies.fn', fn: getAllCookiesFn, @@ -1076,6 +1103,7 @@ builtinScriptlets.push({ name: 'set-local-storage-item.fn', fn: setLocalStorageItemFn, dependencies: [ + 'get-safe-cookie-values.fn', 'safe-self.fn', ], }); @@ -1097,14 +1125,9 @@ function setLocalStorageItemFn( const trustedValues = [ '', 'undefined', 'null', - 'false', 'true', - 'on', 'off', - 'yes', 'no', - 'accept', 'reject', - 'accepted', 'rejected', - 'allowed', 'denied', '{}', '[]', '""', '$remove$', + ...getSafeCookieValuesFn(), ]; if ( trusted ) { @@ -3819,6 +3842,7 @@ builtinScriptlets.push({ fn: setCookie, world: 'ISOLATED', dependencies: [ + 'get-safe-cookie-values.fn', 'safe-self.fn', 'set-cookie.fn', ], @@ -3831,28 +3855,10 @@ function setCookie( if ( name === '' ) { return; } const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('set-cookie', name, value, path); - - const validValues = [ - 'accept', 'reject', - 'accepted', 'rejected', 'notaccepted', - 'allow', 'deny', - 'allowed', 'disallow', - 'enable', 'disable', - 'enabled', 'disabled', - 'ok', - 'on', 'off', - 'true', 't', 'false', 'f', - 'yes', 'y', 'no', 'n', - 'necessary', 'required', - 'approved', 'disapproved', - 'hide', 'hidden', - 'essential', 'nonessential', - 'dismiss', 'dismissed', - 'checked', 'unchecked', - ]; const normalized = value.toLowerCase(); const match = /^("?)(.+)\1$/.exec(normalized); const unquoted = match && match[2] || normalized; + const validValues = getSafeCookieValuesFn(); if ( validValues.includes(unquoted) === false ) { if ( /^\d+$/.test(unquoted) === false ) { return; } const n = parseInt(value, 10); From 5f14716954b11eadcc1c0aa7829fc79261d8c162 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 19 Aug 2024 15:01:18 -0400 Subject: [PATCH 140/553] Update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f56598079b86..9f8d6367e91d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +- [Use helper function to lookup safe cookie values](https://github.com/gorhill/uBlock/commit/79e10323ad) +- [Add `checked`/`unchecked` to `set-cookie`](https://github.com/gorhill/uBlock/commit/3e2171f550) (by @ryanbr) +- [Add `allowed`/`denied` to `set-local-storage-item`](https://github.com/gorhill/uBlock/commit/41c2258f91) - [Fix plain exceptions not overriding block filters using `header=` option](https://github.com/gorhill/uBlock/commit/1cb660b94e) - [Improve various scriptlets](https://github.com/gorhill/uBlock/commit/56dfdd2568) - [Improve `href-sanitizer` sciptlet](https://github.com/gorhill/uBlock/commit/db3dc69bcc) From 40c3d4bccac4d149a8d1bc3dbf4f2d14d958e981 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 19 Aug 2024 15:01:37 -0400 Subject: [PATCH 141/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index a11a4871783ba..59d28f274b6ef 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.4 \ No newline at end of file +1.59.1.5 \ No newline at end of file From 378be82dec0660e15758b6588f75428d7ea6b07f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 19 Aug 2024 15:15:45 -0400 Subject: [PATCH 142/553] 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 c193c382f807c..a008bf43f72bb 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.4", + "version": "1.59.1.5", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b4/uBlock0_1.59.1b4.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b5/uBlock0_1.59.1b5.firefox.signed.xpi" } ] } From 24756e83402234a8ed9c21dfba93eda98d8fd465 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 19 Aug 2024 17:56:54 -0400 Subject: [PATCH 143/553] Update changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f8d6367e91d3..3508c264035a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,9 @@ - [Use helper function to lookup safe cookie values](https://github.com/gorhill/uBlock/commit/79e10323ad) - [Add `checked`/`unchecked` to `set-cookie`](https://github.com/gorhill/uBlock/commit/3e2171f550) (by @ryanbr) -- [Add `allowed`/`denied` to `set-local-storage-item`](https://github.com/gorhill/uBlock/commit/41c2258f91) +- [Add `allowed`/`denied` to `set-local-storage-item`](https://github.com/gorhill/uBlock/commit/41c2258f91) (by @ryanbr) - [Fix plain exceptions not overriding block filters using `header=` option](https://github.com/gorhill/uBlock/commit/1cb660b94e) - [Improve various scriptlets](https://github.com/gorhill/uBlock/commit/56dfdd2568) -- [Improve `href-sanitizer` sciptlet](https://github.com/gorhill/uBlock/commit/db3dc69bcc) +- [Improve `href-sanitizer` scriptlet](https://github.com/gorhill/uBlock/commit/db3dc69bcc) - [Improve `remove-attr.js` scriptlet](https://github.com/gorhill/uBlock/commit/fb037e97d0) - [Improve `trusted-replace-node-text` scriptlet](https://github.com/gorhill/uBlock/commit/4f0d1301ab) From 520f81fcca77523f7b8ce980a9f523ff4c7b7de0 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 20 Aug 2024 08:18:03 -0400 Subject: [PATCH 144/553] [mv3] Fix injection of scriptlets into embedded contexts --- platform/mv3/chromium/manifest.json | 2 +- .../mv3/extension/js/scripting-manager.js | 1 + platform/mv3/scriptlets/scriptlet.template.js | 20 ++++++++++++++----- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/platform/mv3/chromium/manifest.json b/platform/mv3/chromium/manifest.json index b3e77ccc24ab5..49f1381b2c679 100644 --- a/platform/mv3/chromium/manifest.json +++ b/platform/mv3/chromium/manifest.json @@ -25,7 +25,7 @@ "128": "img/icon_128.png" }, "manifest_version": 3, - "minimum_chrome_version": "118.0", + "minimum_chrome_version": "119.0", "name": "__MSG_extName__", "options_page": "dashboard.html", "optional_host_permissions": [ diff --git a/platform/mv3/extension/js/scripting-manager.js b/platform/mv3/extension/js/scripting-manager.js index 6502cbc0aea1c..814343ebe7500 100644 --- a/platform/mv3/extension/js/scripting-manager.js +++ b/platform/mv3/extension/js/scripting-manager.js @@ -473,6 +473,7 @@ function registerScriptlet(context, scriptletDetails) { // `MAIN` world not yet supported in Firefox if ( isGecko === false ) { directive.world = 'MAIN'; + directive.matchOriginAsFallback = true; } // register diff --git a/platform/mv3/scriptlets/scriptlet.template.js b/platform/mv3/scriptlets/scriptlet.template.js index f5a47483b5ec8..9ce165d094d8e 100644 --- a/platform/mv3/scriptlets/scriptlet.template.js +++ b/platform/mv3/scriptlets/scriptlet.template.js @@ -20,11 +20,9 @@ */ -/* jshint esversion:11 */ +/* eslint-disable indent */ /* global cloneInto */ -'use strict'; - // ruleset: $rulesetId$ /******************************************************************************/ @@ -40,7 +38,7 @@ // Start of code to inject const uBOL_$scriptletName$ = function() { -const scriptletGlobals = {}; // jshint ignore: line +const scriptletGlobals = {}; // eslint-disable-line const argsList = self.$argsList$; @@ -57,7 +55,19 @@ function $scriptletName$(){} /******************************************************************************/ const hnParts = []; -try { hnParts.push(...document.location.hostname.split('.')); } +try { + let origin = document.location.origin; + if ( origin === 'null' ) { + const origins = document.location.ancestorOrigins; + for ( let i = 0; i < origins.length; i++ ) { + origin = origins[i]; + if ( origin !== 'null' ) { break; } + } + } + const pos = origin.lastIndexOf('://'); + if ( pos === -1 ) { return; } + hnParts.push(...origin.slice(pos+3).split('.')); +} catch(ex) { } const hnpartslen = hnParts.length; if ( hnpartslen === 0 ) { return; } From 09fef54959742d6d4da412745c4b1e395399557f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 21 Aug 2024 10:56:18 -0400 Subject: [PATCH 145/553] [mv3] Ensure `redirect` has priority over`block` Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/187#issuecomment-2301450418 --- src/js/static-net-filtering.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 84d04478d3dd9..d7edc01fb35d8 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -752,7 +752,7 @@ class FilterImportant { } static dnrFromCompiled(args, rule) { - rule.priority = (rule.priority || 1) + 30; + rule.priority = (rule.priority || 0) + 30; } static keyFromArgs() { @@ -4313,17 +4313,17 @@ StaticNetFilteringEngine.prototype.dnrFromCompiled = function(op, context, ...ar } // Priority: - // Block: 0 (default priority) - // Redirect: 1-9 - // Excepted redirect: 11-19 + // Block: 1 (default priority) + // Redirect: 2-9 + // Excepted redirect: 12-19 // Allow: 20 // Block important: 30 - // Redirect important: 31-39 + // Redirect important: 32-39 const realms = new Map([ [ BLOCK_REALM, { type: 'block', priority: 0 } ], [ ALLOW_REALM, { type: 'allow', priority: 20 } ], - [ REDIRECT_REALM, { type: 'redirect', priority: 1 } ], + [ REDIRECT_REALM, { type: 'redirect', priority: 2 } ], [ REMOVEPARAM_REALM, { type: 'removeparam', priority: 0 } ], [ CSP_REALM, { type: 'csp', priority: 0 } ], [ PERMISSIONS_REALM, { type: 'permissions', priority: 0 } ], From 3360d3e3e1a248338e5c6b98e4a9de9485b45693 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 21 Aug 2024 11:52:39 -0400 Subject: [PATCH 146/553] [mv3] Remove unused file --- platform/mv3/ubo-version | 1 - 1 file changed, 1 deletion(-) delete mode 100644 platform/mv3/ubo-version diff --git a/platform/mv3/ubo-version b/platform/mv3/ubo-version deleted file mode 100644 index 4437cefd15cb1..0000000000000 --- a/platform/mv3/ubo-version +++ /dev/null @@ -1 +0,0 @@ -https://github.com/gorhill/uBlock/tree/4b83101ab9270a5403d66af4ebe08d251ac372ca From 0a048eb64e706c47f5fd49a5cd971ce29ef8b0f4 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 22 Aug 2024 12:36:31 -0400 Subject: [PATCH 147/553] Address eslint warnings --- platform/mv3/make-rulesets.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index e0ab17135fa16..c85a11a5869f0 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -19,19 +19,17 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; +import * as makeScriptlet from './make-scriptlets.js'; +import * as sfp from './js/static-filtering-parser.js'; -/******************************************************************************/ +import { createHash, randomBytes } from 'crypto'; +import { dnrRulesetFromRawLists } from './js/static-dnr-filtering.js'; import fs from 'fs/promises'; import https from 'https'; import path from 'path'; import process from 'process'; -import { createHash, randomBytes } from 'crypto'; import redirectResourcesMap from './js/redirect-resources.js'; -import { dnrRulesetFromRawLists } from './js/static-dnr-filtering.js'; -import * as sfp from './js/static-filtering-parser.js'; -import * as makeScriptlet from './make-scriptlets.js'; import { safeReplace } from './safe-replace.js'; /******************************************************************************/ @@ -106,8 +104,7 @@ const log = (text, silent = false) => { const urlToFileName = url => { return url .replace(/^https?:\/\//, '') - .replace(/\//g, '_') - ; + .replace(/\//g, '_'); }; const fetchText = (url, cacheDir) => { @@ -365,8 +362,7 @@ async function processNetworkFilters(assetDetails, network) { log(plainGood .filter(rule => Array.isArray(rule._warning)) .map(rule => rule._warning.map(v => `\t\t${v}`)) - .join('\n'), - true + .join('\n'), true ); const regexes = rules.filter(rule => isGood(rule) && isRegex(rule)); From 59a9a43a83202111ef2a786e1d4c3638185f99ec Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 24 Aug 2024 12:11:35 -0400 Subject: [PATCH 148/553] Add noop resources for redirect purpose Related discussion: https://github.com/uBlockOrigin/uAssets/issues/25014#issuecomment-2307982886 --- src/js/redirect-resources.js | 18 ++++++++++++++---- src/web_accessible_resources/noop-vast2.xml | 1 + src/web_accessible_resources/noop-vast3.xml | 1 + src/web_accessible_resources/noop-vast4.xml | 1 + .../{noop-vmap1.0.xml => noop-vmap1.xml} | 0 5 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 src/web_accessible_resources/noop-vast2.xml create mode 100644 src/web_accessible_resources/noop-vast3.xml create mode 100644 src/web_accessible_resources/noop-vast4.xml rename src/web_accessible_resources/{noop-vmap1.0.xml => noop-vmap1.xml} (100%) diff --git a/src/js/redirect-resources.js b/src/js/redirect-resources.js index b8577e3701fcf..b1a24c61f42f4 100644 --- a/src/js/redirect-resources.js +++ b/src/js/redirect-resources.js @@ -19,8 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - /******************************************************************************/ // The resources referenced below are found in ./web_accessible_resources/ @@ -159,8 +157,20 @@ export default new Map([ alias: 'nooptext', data: 'text', } ], - [ 'noop-vmap1.0.xml', { - alias: 'noopvmap-1.0', + [ 'noop-vast2.xml', { + alias: 'noopvast-2.0', + data: 'text', + } ], + [ 'noop-vast3.xml', { + alias: 'noopvast-3.0', + data: 'text', + } ], + [ 'noop-vast4.xml', { + alias: 'noopvast-4.0', + data: 'text', + } ], + [ 'noop-vmap1.xml', { + alias: [ 'noop-vmap1.0.xml', 'noopvmap-1.0' ], data: 'text', } ], [ 'outbrain-widget.js', { diff --git a/src/web_accessible_resources/noop-vast2.xml b/src/web_accessible_resources/noop-vast2.xml new file mode 100644 index 0000000000000..9bbe8d3cacde1 --- /dev/null +++ b/src/web_accessible_resources/noop-vast2.xml @@ -0,0 +1 @@ + diff --git a/src/web_accessible_resources/noop-vast3.xml b/src/web_accessible_resources/noop-vast3.xml new file mode 100644 index 0000000000000..cc1185f288234 --- /dev/null +++ b/src/web_accessible_resources/noop-vast3.xml @@ -0,0 +1 @@ + diff --git a/src/web_accessible_resources/noop-vast4.xml b/src/web_accessible_resources/noop-vast4.xml new file mode 100644 index 0000000000000..bd408f56bb932 --- /dev/null +++ b/src/web_accessible_resources/noop-vast4.xml @@ -0,0 +1 @@ + diff --git a/src/web_accessible_resources/noop-vmap1.0.xml b/src/web_accessible_resources/noop-vmap1.xml similarity index 100% rename from src/web_accessible_resources/noop-vmap1.0.xml rename to src/web_accessible_resources/noop-vmap1.xml From 794e6ca0b5ad1c3a9cbb70cea8756140092144c1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 24 Aug 2024 12:14:07 -0400 Subject: [PATCH 149/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3508c264035a8..5060e90e67fd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add noop resources for redirect purpose](https://github.com/gorhill/uBlock/commit/59a9a43a83) - [Use helper function to lookup safe cookie values](https://github.com/gorhill/uBlock/commit/79e10323ad) - [Add `checked`/`unchecked` to `set-cookie`](https://github.com/gorhill/uBlock/commit/3e2171f550) (by @ryanbr) - [Add `allowed`/`denied` to `set-local-storage-item`](https://github.com/gorhill/uBlock/commit/41c2258f91) (by @ryanbr) From 6991d9fdd7a9b347d305821f0435aa3bd98c6cad Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 24 Aug 2024 12:14:27 -0400 Subject: [PATCH 150/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 59d28f274b6ef..0739b6790ad25 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.5 \ No newline at end of file +1.59.1.6 \ No newline at end of file From 26b2ab8bb5fc572a64e75d58f8d4d6388d9909c5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 24 Aug 2024 12:36:21 -0400 Subject: [PATCH 151/553] 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 a008bf43f72bb..bf1454c9771d2 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.5", + "version": "1.59.1.6", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b5/uBlock0_1.59.1b5.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b6/uBlock0_1.59.1b6.firefox.signed.xpi" } ] } From 3a249f395cc44272d36757829c51a6d6fb863fc0 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 26 Aug 2024 14:28:16 -0400 Subject: [PATCH 152/553] Improve `prevent-xhr` scriptlet As per filter list maintainers feedback. --- assets/resources/scriptlets.js | 81 ++++++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 18 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 8acbb98940d84..0272ecce39b27 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -2695,6 +2695,13 @@ function noXhrIf( 'content-type': '', 'content-length': '', }; + const safeDispatchEvent = (xhr, type) => { + try { + xhr.dispatchEvent(new Event(type)); + } catch(_) { + } + }; + const XHRBefore = XMLHttpRequest.prototype; self.XMLHttpRequest = class extends self.XMLHttpRequest { open(method, url, ...args) { xhrInstances.delete(this); @@ -2721,27 +2728,26 @@ function noXhrIf( let promise = Promise.resolve({ xhr: this, directive, - props: { - readyState: { value: 4 }, + response: { response: { value: '' }, responseText: { value: '' }, responseXML: { value: null }, responseURL: { value: haystack.url }, - status: { value: 200 }, - statusText: { value: 'OK' }, - }, + } }); switch ( this.responseType ) { case 'arraybuffer': promise = promise.then(details => { - details.props.response.value = new ArrayBuffer(0); + const response = details.response; + response.response.value = new ArrayBuffer(0); return details; }); haystack.headers['content-type'] = 'application/octet-stream'; break; case 'blob': promise = promise.then(details => { - details.props.response.value = new Blob([]); + const response = details.response; + response.response.value = new Blob([]); return details; }); haystack.headers['content-type'] = 'application/octet-stream'; @@ -2750,8 +2756,9 @@ function noXhrIf( promise = promise.then(details => { const parser = new DOMParser(); const doc = parser.parseFromString('', 'text/html'); - details.props.response.value = doc; - details.props.responseXML.value = doc; + const response = details.response; + response.response.value = doc; + response.responseXML.value = doc; return details; }); haystack.headers['content-type'] = 'text/html'; @@ -2759,8 +2766,9 @@ function noXhrIf( } case 'json': promise = promise.then(details => { - details.props.response.value = {}; - details.props.responseText.value = '{}'; + const response = details.response; + response.response.value = {}; + response.responseText.value = '{}'; return details; }); haystack.headers['content-type'] = 'application/json'; @@ -2769,8 +2777,9 @@ function noXhrIf( if ( directive === '' ) { break; } promise = promise.then(details => { return generateContentFn(details.directive).then(text => { - details.props.response.value = text; - details.props.responseText.value = text; + const response = details.response; + response.response.value = text; + response.responseText.value = text; return details; }); }); @@ -2778,11 +2787,35 @@ function noXhrIf( break; } promise.then(details => { - haystack.headers['content-length'] = `${details.props.response.value}`.length; - Object.defineProperties(details.xhr, details.props); - details.xhr.dispatchEvent(new Event('readystatechange')); - details.xhr.dispatchEvent(new Event('load')); - details.xhr.dispatchEvent(new Event('loadend')); + Object.defineProperties(details.xhr, { + readyState: { value: 1, configurable: true }, + }); + safeDispatchEvent(details.xhr, 'readystatechange'); + return details; + }).then(details => { + const response = details.response; + haystack.headers['content-length'] = `${response.response.value}`.length; + Object.defineProperties(details.xhr, { + readyState: { value: 2, configurable: true }, + status: { value: 200 }, + statusText: { value: 'OK' }, + }); + safeDispatchEvent(details.xhr, 'readystatechange'); + return details; + }).then(details => { + Object.defineProperties(details.xhr, { + readyState: { value: 3, configurable: true }, + }); + Object.defineProperties(details.xhr, details.response); + safeDispatchEvent(details.xhr, 'readystatechange'); + return details; + }).then(details => { + Object.defineProperties(details.xhr, { + readyState: { value: 4 }, + }); + safeDispatchEvent(details.xhr, 'readystatechange'); + safeDispatchEvent(details.xhr, 'load'); + safeDispatchEvent(details.xhr, 'loadend'); safe.uboLog(logPrefix, `Prevented with response:\n${details.xhr.response}`); }); } @@ -2809,6 +2842,18 @@ function noXhrIf( return out.join('\r\n'); } }; + self.XMLHttpRequest.prototype.open.toString = function() { + return XHRBefore.open.toString(); + }; + self.XMLHttpRequest.prototype.send.toString = function() { + return XHRBefore.send.toString(); + }; + self.XMLHttpRequest.prototype.getResponseHeader.toString = function() { + return XHRBefore.getResponseHeader.toString(); + }; + self.XMLHttpRequest.prototype.getAllResponseHeaders.toString = function() { + return XHRBefore.getAllResponseHeaders.toString(); + }; } /******************************************************************************/ From bada70af83b9e430af911d1f85e6afdf14904d4e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 26 Aug 2024 14:30:27 -0400 Subject: [PATCH 153/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5060e90e67fd3..4cde65fbbe8cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/3a249f395c) - [Add noop resources for redirect purpose](https://github.com/gorhill/uBlock/commit/59a9a43a83) - [Use helper function to lookup safe cookie values](https://github.com/gorhill/uBlock/commit/79e10323ad) - [Add `checked`/`unchecked` to `set-cookie`](https://github.com/gorhill/uBlock/commit/3e2171f550) (by @ryanbr) From f306479f5a8d28832a1804122740fa403154f090 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 26 Aug 2024 14:30:45 -0400 Subject: [PATCH 154/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 0739b6790ad25..054eaa8a4b990 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.6 \ No newline at end of file +1.59.1.7 \ No newline at end of file From f5f042a6f0c39ee92da06775a5ebff9da1be9c5a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 26 Aug 2024 14:50:41 -0400 Subject: [PATCH 155/553] 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 bf1454c9771d2..eb0ddf28e87b4 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.6", + "version": "1.59.1.7", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b6/uBlock0_1.59.1b6.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b7/uBlock0_1.59.1b7.firefox.signed.xpi" } ] } From 0dcb9856013eba719d1b2bbc01b25039696593cf Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 27 Aug 2024 12:49:35 -0400 Subject: [PATCH 156/553] Improve `trusted-replace-outbound-text` scriptlet When the replacement starts with `json:`, it will be first decoded using JSON.parse(). Example: example.com##+js(trusted-replace-outbound-text, somefn, json:"ok") The doublequotes are required since this is what JSON.parse() expects as a valid JSON string. --- assets/resources/scriptlets.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 0272ecce39b27..f450b88a9b903 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -4906,14 +4906,17 @@ builtinScriptlets.push({ }); function trustedReplaceOutboundText( propChain = '', - pattern = '', - replacement = '', + rawPattern = '', + rawReplacement = '', ...args ) { if ( propChain === '' ) { return; } const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('trusted-replace-outbound-text', propChain, pattern, replacement, ...args); - const rePattern = safe.patternToRegex(pattern); + const logPrefix = safe.makeLogPrefix('trusted-replace-outbound-text', propChain, rawPattern, rawReplacement, ...args); + const rePattern = safe.patternToRegex(rawPattern); + const replacement = rawReplacement.startsWith('json:') + ? safe.JSON_parse(rawReplacement.slice(5)) + : rawReplacement; const extraArgs = safe.getExtraArgs(args); const reCondition = safe.patternToRegex(extraArgs.condition || ''); const reflector = proxyApplyFn(propChain, function(...args) { @@ -4923,7 +4926,7 @@ function trustedReplaceOutboundText( try { textBefore = self.atob(encodedTextBefore); } catch(ex) { return encodedTextBefore; } } - if ( pattern === '' ) { + if ( rawPattern === '' ) { safe.uboLog(logPrefix, 'Decoded outbound text:\n', textBefore); return encodedTextBefore; } From 1e14a2176b3d8ecf19ae94bc4b6304522eb7069a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 27 Aug 2024 12:54:19 -0400 Subject: [PATCH 157/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cde65fbbe8cf..29c7b0fd3c08b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `trusted-replace-outbound-text` scriptlet](https://github.com/gorhill/uBlock/commit/0dcb985601) - [Improve `prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/3a249f395c) - [Add noop resources for redirect purpose](https://github.com/gorhill/uBlock/commit/59a9a43a83) - [Use helper function to lookup safe cookie values](https://github.com/gorhill/uBlock/commit/79e10323ad) From d24bf002e26a503ca6dd0eb07f9ea7a6db21adcc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 27 Aug 2024 12:54:35 -0400 Subject: [PATCH 158/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 054eaa8a4b990..ac401f9e36a9d 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.7 \ No newline at end of file +1.59.1.8 \ No newline at end of file From b1f28b4ce06a2c89ba688a63fd296af80ec378e5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 27 Aug 2024 13:01:04 -0400 Subject: [PATCH 159/553] 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 eb0ddf28e87b4..cd8c521d143b6 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.7", + "version": "1.59.1.8", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b7/uBlock0_1.59.1b7.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b8/uBlock0_1.59.1b8.firefox.signed.xpi" } ] } From ae5dc6299e513cb75c601fcebadff3a7235de6a4 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 29 Aug 2024 13:47:48 -0400 Subject: [PATCH 160/553] Improve `validate-constant` scriptlet helper Add support for `json:`-prefixed values. --- assets/resources/scriptlets.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index f450b88a9b903..a3196208d1f5e 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -531,7 +531,9 @@ function validateConstantFn(trusted, raw, extraArgs = {}) { if ( isNaN(raw) ) { return; } if ( Math.abs(raw) > 0x7FFF ) { return; } } else if ( trusted ) { - if ( raw.startsWith('{') && raw.endsWith('}') ) { + if ( raw.startsWith('json:') ) { + try { value = safe.JSON_parse(raw.slice(5)); } catch(ex) { return; } + } else if ( raw.startsWith('{') && raw.endsWith('}') ) { try { value = safe.JSON_parse(raw).value; } catch(ex) { return; } } } else { From 7f11d6216eb866fdbec4c13d9766b76432908f4f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 30 Aug 2024 10:25:39 -0400 Subject: [PATCH 161/553] Improve `prevent-window-open` scriptlet As discussed with filter list maintainers. --- assets/resources/scriptlets.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index a3196208d1f5e..9d703997c9c4c 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -2885,10 +2885,8 @@ function noWindowOpenIf( pattern = pattern.slice(1); } const rePattern = safe.patternToRegex(pattern); - let autoRemoveAfter = parseInt(delay); - if ( isNaN(autoRemoveAfter) ) { - autoRemoveAfter = -1; - } + const autoRemoveAfter = parseInt(delay, 10) || 0; + const setTimeout = self.setTimeout; const createDecoy = function(tag, urlProp, url) { const decoyElem = document.createElement(tag); decoyElem[urlProp] = url; @@ -2909,7 +2907,13 @@ function noWindowOpenIf( return Reflect.apply(target, thisArg, args); } safe.uboLog(logPrefix, `Prevented (${args.join(', ')})`); - if ( autoRemoveAfter < 0 ) { return null; } + if ( delay === '' ) { return null; } + if ( decoy === 'blank' ) { + args[0] = 'about:blank'; + const r = Reflect.apply(target, thisArg, args); + setTimeout(( ) => { r.close(); }, autoRemoveAfter); + return r; + } const decoyElem = decoy === 'obj' ? createDecoy('object', 'data', ...args) : createDecoy('iframe', 'src', ...args); From 63166ca88239d26f92ae586cd53bb5625ce34a84 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 30 Aug 2024 10:28:23 -0400 Subject: [PATCH 162/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29c7b0fd3c08b..b19d6a684b36b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `prevent-window-open` scriptlet](https://github.com/gorhill/uBlock/commit/7f11d6216e) - [Improve `trusted-replace-outbound-text` scriptlet](https://github.com/gorhill/uBlock/commit/0dcb985601) - [Improve `prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/3a249f395c) - [Add noop resources for redirect purpose](https://github.com/gorhill/uBlock/commit/59a9a43a83) From 11e0f08c9a9b298c4c8fb7c47cea98a4154a4b18 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 30 Aug 2024 10:28:59 -0400 Subject: [PATCH 163/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index ac401f9e36a9d..b5b7973072213 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.8 \ No newline at end of file +1.59.1.9 \ No newline at end of file From 66cf6f0a14efd5e1f30ba019b506568844ed26cd Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 30 Aug 2024 10:56:51 -0400 Subject: [PATCH 164/553] 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 cd8c521d143b6..4b3932642a390 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.8", + "version": "1.59.1.9", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b8/uBlock0_1.59.1b8.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b9/uBlock0_1.59.1b9.firefox.signed.xpi" } ] } From f552f655cbdaf89e4f74a47772a4d896f12bb473 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 31 Aug 2024 12:36:20 -0400 Subject: [PATCH 165/553] Fix `prevent-window-open` for when logger is open Related discussion: https://github.com/uBlockOrigin/uBlock-discussions/discussions/906 --- assets/resources/scriptlets.js | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 9d703997c9c4c..836a9ef2c95cc 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -2885,7 +2885,7 @@ function noWindowOpenIf( pattern = pattern.slice(1); } const rePattern = safe.patternToRegex(pattern); - const autoRemoveAfter = parseInt(delay, 10) || 0; + const autoRemoveAfter = (parseFloat(delay) || 0) * 1000; const setTimeout = self.setTimeout; const createDecoy = function(tag, urlProp, url) { const decoyElem = document.createElement(tag); @@ -2895,9 +2895,10 @@ function noWindowOpenIf( decoyElem.style.setProperty('top','-1px', 'important'); decoyElem.style.setProperty('width','1px', 'important'); document.body.appendChild(decoyElem); - setTimeout(( ) => { decoyElem.remove(); }, autoRemoveAfter * 1000); + setTimeout(( ) => { decoyElem.remove(); }, autoRemoveAfter); return decoyElem; }; + const noopFunc = function(){}; proxyApplyFn('open', function open(target, thisArg, args) { const haystack = args.join(' '); if ( rePattern.test(haystack) !== targetMatchResult ) { @@ -2921,28 +2922,31 @@ function noWindowOpenIf( if ( typeof popup === 'object' && popup !== null ) { Object.defineProperty(popup, 'closed', { value: false }); } else { - const noopFunc = function open(){}; popup = new Proxy(self, { - get: function(target, prop) { + get: function(target, prop, ...args) { if ( prop === 'closed' ) { return false; } - const r = Reflect.get(...arguments); + const r = Reflect.get(target, prop, ...args); if ( typeof r === 'function' ) { return noopFunc; } - return target[prop]; + return r; }, - set: function() { - return Reflect.set(...arguments); + set: function(...args) { + return Reflect.set(...args); }, }); } if ( safe.logLevel !== 0 ) { popup = new Proxy(popup, { - get: function(target, prop) { - safe.uboLog(logPrefix, 'window.open / get', prop, '===', target[prop]); - return Reflect.get(...arguments); + get: function(target, prop, ...args) { + const r = Reflect.get(target, prop, ...args); + safe.uboLog(logPrefix, `popup / get ${prop} === ${r}`); + if ( typeof r === 'function' ) { + return (...args) => { return r.call(target, ...args); }; + } + return r; }, - set: function(target, prop, value) { - safe.uboLog(logPrefix, 'window.open / set', prop, '=', value); - return Reflect.set(...arguments); + set: function(target, prop, value, ...args) { + safe.uboLog(logPrefix, `popup / set ${prop} = ${value}`); + return Reflect.set(target, prop, value, ...args); }, }); } From 17183f7de58d554c2b689e85a7347a3f2cd13385 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 31 Aug 2024 12:47:38 -0400 Subject: [PATCH 166/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b19d6a684b36b..edbccb68ad593 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Fix `prevent-window-open` for when logger is open](https://github.com/gorhill/uBlock/commit/f552f655cb) - [Improve `prevent-window-open` scriptlet](https://github.com/gorhill/uBlock/commit/7f11d6216e) - [Improve `trusted-replace-outbound-text` scriptlet](https://github.com/gorhill/uBlock/commit/0dcb985601) - [Improve `prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/3a249f395c) From 73e0cc71631487705a98f26fda98c18b6a1865f4 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 31 Aug 2024 12:48:12 -0400 Subject: [PATCH 167/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index b5b7973072213..55d7f586f3070 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.9 \ No newline at end of file +1.59.1.10 \ No newline at end of file From eef99e9db69bca8eda238309760e7b7d5be2ca2d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 31 Aug 2024 13:11:29 -0400 Subject: [PATCH 168/553] 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 4b3932642a390..d667b8e5585ef 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.9", + "version": "1.59.1.10", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b9/uBlock0_1.59.1b9.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b10/uBlock0_1.59.1b10.firefox.signed.xpi" } ] } From b7ed3b45ed18d28b99a3d162b8794467a671b0a8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 2 Sep 2024 19:32:56 -0400 Subject: [PATCH 169/553] Add ability to directly evaluate static network filtering engine Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3362 There used to be a way to test URL against the network filtering engine, but this was removed in a distant past during refactoring. The ability has been brought back through uBO's own developer tools, accessible through the _More_ button in the _Support_ pane in the dashboard. To query the static network filtering engine, enter the following in the text editor: snfe?url-to-test [type] [url-of-context] `snfe?` is a prompt indicating the intent to query the static network filtering engine. At a minimum there must be a URL to test. Optionally the type of the resource to match, default to `xhr` if none specified. Also optionally, the context from within which the request is made. Example: Enter: snfe?https://www.google-analytics.com/analytics.js Result: url: https://www.google-analytics.com/analytics.js blocked: ||google-analytics.com^ Enter: snfe?https://www.google-analytics.com/analytics.js script Result: url: https://www.google-analytics.com/analytics.js type: script blocked: ||google-analytics.com^ modified: ||google-analytics.com/analytics.js$script,redirect-rule=google-analytics_analytics.js:5 Enter: snfe?https://example.com/ Result: url: https://example.com/ not blocked Enter: snfe?https://example.com/ ping Result: url: https://example.com/ type: ping blocked: *$ping,3p --- .eslintrc.yml | 1 + src/js/benchmarks.js | 50 +++++++++---------- src/js/devtools.js | 43 +++++++++++++++- src/js/messaging.js | 90 ++++++++++++++++++---------------- src/js/static-net-filtering.js | 65 +++++++++++++++++++++--- 5 files changed, 171 insertions(+), 78 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index e9ff21ec0234c..470a195bd90e7 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -12,6 +12,7 @@ rules: - error - 4 - ignoredNodes: + - Program > BlockStatement - Program > IfStatement > BlockStatement - Program > ExpressionStatement > CallExpression > ArrowFunctionExpression > BlockStatement - Program > ExpressionStatement > CallExpression > FunctionExpression > BlockStatement diff --git a/src/js/benchmarks.js b/src/js/benchmarks.js index 9fdc6ec104538..93d099bd448dc 100644 --- a/src/js/benchmarks.js +++ b/src/js/benchmarks.js @@ -19,26 +19,22 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - -/******************************************************************************/ - -import cosmeticFilteringEngine from './cosmetic-filtering.js'; -import io from './assets.js'; -import scriptletFilteringEngine from './scriptlet-filtering.js'; -import staticNetFilteringEngine from './static-net-filtering.js'; -import µb from './background.js'; -import webRequest from './traffic.js'; -import { FilteringContext } from './filtering-context.js'; -import { LineIterator } from './text-utils.js'; -import { sessionFirewall } from './filtering-engines.js'; - import { domainFromHostname, entityFromDomain, hostnameFromURI, } from './uri-utils.js'; +import { FilteringContext } from './filtering-context.js'; +import { LineIterator } from './text-utils.js'; +import cosmeticFilteringEngine from './cosmetic-filtering.js'; +import io from './assets.js'; +import scriptletFilteringEngine from './scriptlet-filtering.js'; +import { sessionFirewall } from './filtering-engines.js'; +import { default as sfne } from './static-net-filtering.js'; +import webRequest from './traffic.js'; +import µb from './background.js'; + /******************************************************************************/ // The requests.json.gz file can be downloaded from: @@ -155,13 +151,13 @@ export async function benchmarkStaticNetFiltering(options = {}) { fctxt.setURL(request.url); fctxt.setDocOriginFromURL(request.frameUrl); fctxt.setType(request.cpt); - const r = staticNetFilteringEngine.matchRequest(fctxt); + const r = sfne.matchRequest(fctxt); console.info(`Result=${r}:`); console.info(`\ttype=${fctxt.type}`); console.info(`\turl=${fctxt.url}`); console.info(`\tdocOrigin=${fctxt.getDocOrigin()}`); if ( r !== 0 ) { - console.info(staticNetFilteringEngine.toLogData()); + console.info(sfne.toLogData()); } return; } @@ -180,34 +176,34 @@ export async function benchmarkStaticNetFiltering(options = {}) { fctxt.setURL(request.url); fctxt.setDocOriginFromURL(request.frameUrl); fctxt.setType(request.cpt); - staticNetFilteringEngine.redirectURL = undefined; - const r = staticNetFilteringEngine.matchRequest(fctxt); + sfne.redirectURL = undefined; + const r = sfne.matchRequest(fctxt); matchCount += 1; if ( r === 1 ) { blockCount += 1; } else if ( r === 2 ) { allowCount += 1; } if ( r !== 1 ) { - if ( staticNetFilteringEngine.transformRequest(fctxt) ) { + if ( sfne.transformRequest(fctxt) ) { redirectCount += 1; } - if ( fctxt.redirectURL !== undefined && staticNetFilteringEngine.hasQuery(fctxt) ) { - if ( staticNetFilteringEngine.filterQuery(fctxt, 'removeparam') ) { + if ( fctxt.redirectURL !== undefined && sfne.hasQuery(fctxt) ) { + if ( sfne.filterQuery(fctxt, 'removeparam') ) { removeparamCount += 1; } } if ( fctxt.type === 'main_frame' || fctxt.type === 'sub_frame' ) { - if ( staticNetFilteringEngine.matchAndFetchModifiers(fctxt, 'csp') ) { + if ( sfne.matchAndFetchModifiers(fctxt, 'csp') ) { cspCount += 1; } - if ( staticNetFilteringEngine.matchAndFetchModifiers(fctxt, 'permissions') ) { + if ( sfne.matchAndFetchModifiers(fctxt, 'permissions') ) { permissionsCount += 1; } } - staticNetFilteringEngine.matchHeaders(fctxt, []); - if ( staticNetFilteringEngine.matchAndFetchModifiers(fctxt, 'replace') ) { + sfne.matchHeaders(fctxt, []); + if ( sfne.matchAndFetchModifiers(fctxt, 'replace') ) { replaceCount += 1; } } else if ( redirectEngine !== undefined ) { - if ( staticNetFilteringEngine.redirectRequest(redirectEngine, fctxt) ) { + if ( sfne.redirectRequest(redirectEngine, fctxt) ) { redirectCount += 1; } } @@ -254,7 +250,7 @@ export async function tokenHistogramsfunction() { fctxt.setURL(request.url); fctxt.setDocOriginFromURL(request.frameUrl); fctxt.setType(request.cpt); - const r = staticNetFilteringEngine.matchRequest(fctxt); + const r = sfne.matchRequest(fctxt); for ( let [ keyword ] of request.url.toLowerCase().matchAll(reTokens) ) { const token = keyword.slice(0, 7); if ( r === 0 ) { diff --git a/src/js/devtools.js b/src/js/devtools.js index 0763b0be83b6c..629cd36b17d10 100644 --- a/src/js/devtools.js +++ b/src/js/devtools.js @@ -21,8 +21,6 @@ /* global CodeMirror, uBlockDashboard */ -'use strict'; - import { dom, qs$ } from './dom.js'; /******************************************************************************/ @@ -212,3 +210,44 @@ vAPI.messaging.send('dashboard', { }); /******************************************************************************/ + +async function snfeQuery(lineNo, query) { + const doc = cmEditor.getDoc(); + const lineHandle = doc.getLineHandle(lineNo) + const result = await vAPI.messaging.send('devTools', { + what: 'snfeQuery', + query + }); + if ( typeof result !== 'string' ) { return; } + cmEditor.startOperation(); + const nextLineNo = doc.getLineNumber(lineHandle) + 1; + doc.replaceRange(`${result}\n`, { line: nextLineNo, ch: 0 }); + cmEditor.endOperation(); +} + +cmEditor.on('beforeChange', (cm, details) => { + if ( details.origin !== '+input' ) { return; } + if ( details.text.length !== 2 ) { return; } + if ( details.text[1] !== '' ) { return; } + const lineNo = details.from.line; + const line = cm.getLine(lineNo); + if ( details.from.ch !== line.length ) { return; } + if ( line.startsWith('snfe?') === false ) { return; } + const fields = line.slice(5).split(/\s+/); + const query = {}; + for ( const field of fields ) { + if ( /[/.]/.test(field) ) { + if ( query.url === undefined ) { + query.url = field; + } else if ( query.from === undefined ) { + query.from = field; + } + } else if ( query.type === undefined ) { + query.type = field; + } + } + if ( query.url === undefined ) { return; } + snfeQuery(lineNo, query); +}); + +/******************************************************************************/ diff --git a/src/js/messaging.js b/src/js/messaging.js index 5f39af4f441dd..ebfc5c7d44fed 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -19,53 +19,50 @@ Home: https://github.com/gorhill/uBlock */ -/* globals browser */ - -'use strict'; +import * as s14e from './s14e-serializer.js'; +import * as sfp from './static-filtering-parser.js'; -/******************************************************************************/ +import { + domainFromHostname, + domainFromURI, + entityFromDomain, + hostnameFromURI, + isNetworkURI, +} from './uri-utils.js'; -import publicSuffixList from '../lib/publicsuffixlist/publicsuffixlist.js'; -import punycode from '../lib/punycode.js'; +import { + permanentFirewall, + permanentSwitches, + permanentURLFiltering, + sessionFirewall, + sessionSwitches, + sessionURLFiltering, +} from './filtering-engines.js'; -import { filteringBehaviorChanged } from './broadcast.js'; import cacheStorage from './cachestorage.js'; import cosmeticFilteringEngine from './cosmetic-filtering.js'; +import { denseBase64 } from './base64-custom.js'; +import { dnrRulesetFromRawLists } from './static-dnr-filtering.js'; +import { filteringBehaviorChanged } from './broadcast.js'; import htmlFilteringEngine from './html-filtering.js'; +import { i18n$ } from './i18n.js'; +import io from './assets.js'; import logger from './logger.js'; import lz4Codec from './lz4.js'; -import io from './assets.js'; +import publicSuffixList from '../lib/publicsuffixlist/publicsuffixlist.js'; +import punycode from '../lib/punycode.js'; +import { redirectEngine } from './redirect-engine.js'; import scriptletFilteringEngine from './scriptlet-filtering.js'; import staticFilteringReverseLookup from './reverselookup.js'; import staticNetFilteringEngine from './static-net-filtering.js'; -import µb from './background.js'; import webRequest from './traffic.js'; -import { denseBase64 } from './base64-custom.js'; -import { dnrRulesetFromRawLists } from './static-dnr-filtering.js'; -import { i18n$ } from './i18n.js'; -import { redirectEngine } from './redirect-engine.js'; -import * as sfp from './static-filtering-parser.js'; -import * as s14e from './s14e-serializer.js'; - -import { - permanentFirewall, - sessionFirewall, - permanentSwitches, - sessionSwitches, - permanentURLFiltering, - sessionURLFiltering, -} from './filtering-engines.js'; - -import { - domainFromHostname, - domainFromURI, - entityFromDomain, - hostnameFromURI, - isNetworkURI, -} from './uri-utils.js'; +import µb from './background.js'; /******************************************************************************/ +const hasOwnProperty = (o, p) => + Object.prototype.hasOwnProperty.call(o, p); + // https://github.com/uBlockOrigin/uBlock-issues/issues/710 // Listeners have a name and a "privileged" status. // The nameless default handler is always deemed "privileged". @@ -807,7 +804,7 @@ const onMessage = function(request, sender, callback) { }); break; - case 'shouldRenderNoscriptTags': + case 'shouldRenderNoscriptTags': { if ( pageStore === null ) { break; } const fctxt = µb.filteringContext.fromTabId(sender.tabId); if ( pageStore.filterScripting(fctxt, undefined) ) { @@ -818,7 +815,7 @@ const onMessage = function(request, sender, callback) { }); } break; - + } case 'retrieveGenericCosmeticSelectors': request.tabId = sender.tabId; request.frameId = sender.frameId; @@ -1098,7 +1095,7 @@ const restoreUserData = async function(request) { // Discard unknown setting or setting with default value. for ( const key in hiddenSettings ) { if ( - µb.hiddenSettingsDefault.hasOwnProperty(key) === false || + hasOwnProperty(µb.hiddenSettingsDefault, key) === false || hiddenSettings[key] === µb.hiddenSettingsDefault[key] ) { delete hiddenSettings[key]; @@ -1128,7 +1125,7 @@ const restoreUserData = async function(request) { }); µb.saveUserFilters(userData.userFilters); if ( Array.isArray(userData.selectedFilterLists) ) { - await µb.saveSelectedFilterLists(userData.selectedFilterLists); + await µb.saveSelectedFilterLists(userData.selectedFilterLists); } vAPI.app.restart(); @@ -1150,7 +1147,7 @@ const resetUserData = async function() { // Filter lists const prepListEntries = function(entries) { for ( const k in entries ) { - if ( entries.hasOwnProperty(k) === false ) { continue; } + if ( hasOwnProperty(entries, k) === false ) { continue; } const entry = entries[k]; if ( typeof entry.supportURL === 'string' && entry.supportURL !== '' ) { entry.supportName = hostnameFromURI(entry.supportURL); @@ -1338,7 +1335,7 @@ const getSupportData = async function() { let addedListset = {}; let removedListset = {}; for ( const listKey in lists ) { - if ( lists.hasOwnProperty(listKey) === false ) { continue; } + if ( hasOwnProperty(lists, listKey) === false ) { continue; } const list = lists[listKey]; if ( list.content !== 'filters' ) { continue; } const used = µb.selectedFilterLists.includes(listKey); @@ -1755,7 +1752,7 @@ const onMessage = (request, sender, callback) => { // Sync let response; switch ( request.what ) { - case 'getInspectorArgs': + case 'getInspectorArgs': { const bc = new globalThis.BroadcastChannel('contentInspectorChannel'); bc.postMessage({ what: 'contentInspectorChannel', @@ -1768,6 +1765,7 @@ const onMessage = (request, sender, callback) => { ), }; break; + } default: return vAPI.messaging.UNHANDLED; } @@ -2004,6 +2002,12 @@ const onMessage = function(request, sender, callback) { response = staticNetFilteringEngine.dump(); break; + case 'snfeQuery': + response = staticNetFilteringEngine.test( + Object.assign({ redirectEngine }, request.query) + ); + break; + case 'cfeDump': response = cosmeticFilteringEngine.dump(); break; @@ -2181,7 +2185,7 @@ const onMessage = function(request, sender, callback) { } break; - case 'subscribeTo': + case 'subscribeTo': { // https://github.com/uBlockOrigin/uBlock-issues/issues/1797 if ( /^(file|https?):\/\//.test(request.location) === false ) { break; } const url = encodeURIComponent(request.location); @@ -2194,8 +2198,8 @@ const onMessage = function(request, sender, callback) { select: true, }); break; - - case 'updateLists': + } + case 'updateLists': { const listkeys = request.listkeys.split(',').filter(s => s !== ''); if ( listkeys.length === 0 ) { return; } if ( listkeys.includes('all') ) { @@ -2211,7 +2215,7 @@ const onMessage = function(request, sender, callback) { }); µb.scheduleAssetUpdater({ now: true, fetchDelay: 100, auto: request.auto }); break; - + } default: return vAPI.messaging.UNHANDLED; } diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index d7edc01fb35d8..f30af31bea003 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5384,17 +5384,70 @@ StaticNetFilteringEngine.prototype.enableWASM = function(wasmModuleFetcher, path /******************************************************************************/ -StaticNetFilteringEngine.prototype.test = async function(docURL, type, url) { +StaticNetFilteringEngine.prototype.test = function(details) { + const { url, type, from, redirectEngine } = details; + if ( url === undefined ) { return; } const fctxt = new FilteringContext(); - fctxt.setDocOriginFromURL(docURL); - fctxt.setType(type); fctxt.setURL(url); + fctxt.setType(type || ''); + fctxt.setDocOriginFromURL(from || ''); const r = this.matchRequest(fctxt); - console.info(`${r}`); + const out = [ `url: ${url}` ]; + if ( type ) { + out.push(`type: ${type}`); + } + if ( from ) { + out.push(`context: ${from}`); + } if ( r !== 0 ) { - console.info(this.toLogData()); + const logdata = this.toLogData(); + if ( r === 1 ) { + out.push(`blocked: ${logdata.raw}`); + } else if ( r === 2 ) { + out.push(`unblocked: ${logdata.raw}`); + } + } else { + out.push('not blocked'); } -}; + if ( r !== 1 ) { + const entries = this.transformRequest(fctxt); + if ( entries ) { + for ( const entry of entries ) { + out.push(`modified: ${entry.logData().raw}`); + } + } + if ( fctxt.redirectURL !== undefined && this.hasQuery(fctxt) ) { + const entries = this.filterQuery(fctxt, 'removeparam'); + if ( entries ) { + for ( const entry of entries ) { + out.push(`modified: ${entry.logData().raw}`); + } + } + } + if ( fctxt.type === 'main_frame' || fctxt.type === 'sub_frame' ) { + const csps = this.matchAndFetchModifiers(fctxt, 'csp'); + if ( csps ) { + for ( const csp of csps ) { + out.push(`modified: ${csp.logData().raw}`); + } + } + const pps = this.matchAndFetchModifiers(fctxt, 'permissions'); + if ( pps ) { + for ( const pp of pps ) { + out.push(`modified: ${pp.logData().raw}`); + } + } + } + } else if ( redirectEngine ) { + const redirects = this.redirectRequest(redirectEngine, fctxt); + if ( redirects ) { + for ( const redirect of redirects ) { + out.push(`modified: ${redirect.logData().raw}`); + } + } + } + return out.join('\n'); +} /******************************************************************************/ From 969d3cb40ba974fc993ede15cfb8d034fc1c3f00 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 2 Sep 2024 19:49:31 -0400 Subject: [PATCH 170/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index edbccb68ad593..2ec4cc5e002eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add ability to directly evaluate static network filtering engine](https://github.com/gorhill/uBlock/commit/b7ed3b45ed) - [Fix `prevent-window-open` for when logger is open](https://github.com/gorhill/uBlock/commit/f552f655cb) - [Improve `prevent-window-open` scriptlet](https://github.com/gorhill/uBlock/commit/7f11d6216e) - [Improve `trusted-replace-outbound-text` scriptlet](https://github.com/gorhill/uBlock/commit/0dcb985601) From 4310732b98f73659a688dbe84bf48520a126a12e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 2 Sep 2024 19:49:49 -0400 Subject: [PATCH 171/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 55d7f586f3070..269e7c5474c30 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.10 \ No newline at end of file +1.59.1.11 \ No newline at end of file From 856dc419b5dc0a827adcd5091bd636ff1b39d728 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 2 Sep 2024 19:55:53 -0400 Subject: [PATCH 172/553] 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 d667b8e5585ef..9a3eaa69d9a00 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.10", + "version": "1.59.1.11", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b10/uBlock0_1.59.1b10.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b11/uBlock0_1.59.1b11.firefox.signed.xpi" } ] } From 91125d29cfa6eab89eb9f2ed19dc535dcf3f8d73 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 3 Sep 2024 10:14:15 -0400 Subject: [PATCH 173/553] Add support for `application/dash+xml` in `replace=` option Related feedback: https://github.com/uBlockOrigin/uAssets/issues/25164#issuecomment-2326358453 --- src/js/traffic.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/js/traffic.js b/src/js/traffic.js index 4777a847004e0..38ba7264b85d8 100644 --- a/src/js/traffic.js +++ b/src/js/traffic.js @@ -680,6 +680,7 @@ const bodyFilterer = (( ) => { const sessions = new Map(); const reContentTypeCharset = /charset=['"]?([^'" ]+)/i; const otherValidMimes = new Set([ + 'application/dash+xml', 'application/javascript', 'application/json', 'application/mpegurl', From c8307f58a3c0cc29ad0bfb4263cadea4ebf0ee1b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 3 Sep 2024 11:15:16 -0400 Subject: [PATCH 174/553] Improve `xml-prune` scriptlet Related feedback: https://github.com/uBlockOrigin/uAssets/issues/25164#issuecomment-2326358453 --- assets/resources/scriptlets.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 836a9ef2c95cc..07260358c37e3 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -3347,6 +3347,9 @@ function xmlPrune( 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 ( From 6e426aeac3c9e8cdaa3ec604532b510e0e8838af Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 3 Sep 2024 11:18:52 -0400 Subject: [PATCH 175/553] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ec4cc5e002eb..f84bb4f63fdd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- [Improve `xml-prune` scriptlet](https://github.com/gorhill/uBlock/commit/c8307f58a3) +- [Add support for `application/dash+xml` in `replace=` option](https://github.com/gorhill/uBlock/commit/91125d29cf) - [Add ability to directly evaluate static network filtering engine](https://github.com/gorhill/uBlock/commit/b7ed3b45ed) - [Fix `prevent-window-open` for when logger is open](https://github.com/gorhill/uBlock/commit/f552f655cb) - [Improve `prevent-window-open` scriptlet](https://github.com/gorhill/uBlock/commit/7f11d6216e) From 08ed4b4ed81485fcceadb490f44044701310c0fe Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 3 Sep 2024 11:19:13 -0400 Subject: [PATCH 176/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 269e7c5474c30..9f041eba635fd 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.11 \ No newline at end of file +1.59.1.12 \ No newline at end of file From 22fb9c4d63f1198551c03376e13202aacbab1894 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 3 Sep 2024 12:01:04 -0400 Subject: [PATCH 177/553] 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 9a3eaa69d9a00..040211953b0ac 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.11", + "version": "1.59.1.12", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b11/uBlock0_1.59.1b11.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b12/uBlock0_1.59.1b12.firefox.signed.xpi" } ] } From 89f02098fd5b3564077c8e95ed9e5c95ff10f4d3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 4 Sep 2024 11:28:45 -0400 Subject: [PATCH 178/553] Apply CSP/PP injections to `object` resources Related feedback: https://old.reddit.com/r/uBlockOrigin/comments/1f84tc5/ --- src/js/background.js | 2 +- src/js/filtering-context.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/background.js b/src/js/background.js index edeac08935de9..4cd10eeff4a1b 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -346,7 +346,7 @@ const µBlock = { // jshint ignore:line this.setDocOrigin(origin).setTabOrigin(origin); return this; } - const origin = (this.itype & this.FRAME_ANY) !== 0 + const origin = this.isDocument() ? originFromURI(this.url) : this.tabOrigin; this.setDocOrigin(origin).setTabOrigin(origin); diff --git a/src/js/filtering-context.js b/src/js/filtering-context.js index 6642050712904..3da9d158f0a4c 100644 --- a/src/js/filtering-context.js +++ b/src/js/filtering-context.js @@ -56,7 +56,7 @@ export const XMLHTTPREQUEST = 1 << 13; export const INLINE_FONT = 1 << 14; export const INLINE_SCRIPT = 1 << 15; export const OTHER = 1 << 16; -export const FRAME_ANY = MAIN_FRAME | SUB_FRAME; +export const FRAME_ANY = MAIN_FRAME | SUB_FRAME | OBJECT; export const FONT_ANY = FONT | INLINE_FONT; export const INLINE_ANY = INLINE_FONT | INLINE_SCRIPT; export const PING_ANY = BEACON | CSP_REPORT | PING; From e8202af11d0d3b6b5c1b345679eaae47f7d030c1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 4 Sep 2024 11:32:26 -0400 Subject: [PATCH 179/553] Improve `prevent-fetch` scriptlet - Add support for negated matches - Log caller's arguments when verbose logging is enabled --- assets/resources/scriptlets.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 07260358c37e3..5a27d810b63d1 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -97,7 +97,7 @@ function safeSelf() { }, initPattern(pattern, options = {}) { if ( pattern === '' ) { - return { matchAll: true }; + return { matchAll: true, expect: true }; } const expect = (options.canNegate !== true || pattern.startsWith('!') === false); if ( expect === false ) { @@ -2151,7 +2151,7 @@ function noFetchIf( key = 'url'; value = condition; } - needles.push({ key, re: safe.patternToRegex(value) }); + needles.push({ key, pattern: safe.initPattern(value, { canNegate: true }) }); } const validResponseProps = { ok: [ false, true ], @@ -2180,6 +2180,9 @@ function noFetchIf( const details = args[0] instanceof self.Request ? args[0] : Object.assign({ url: args[0] }, args[1]); + if ( safe.logLevel > 1 ) { + safe.uboLog(logPrefix, `apply:\n\t${Object.entries(details).map(a => `${a[0]}: ${a[1]}`).join('\n\t')}`); + } let proceed = true; try { const props = new Map(); @@ -2198,10 +2201,10 @@ function noFetchIf( return Reflect.apply(target, thisArg, args); } proceed = needles.length === 0; - for ( const { key, re } of needles ) { + for ( const { key, pattern } of needles ) { if ( - props.has(key) === false || - re.test(props.get(key)) === false + pattern.expect && props.has(key) === false || + safe.testPattern(pattern, props.get(key)) === false ) { proceed = true; break; From f4a75ccd80e0193674e0504a7de15fbf26b5b82c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 4 Sep 2024 11:37:14 -0400 Subject: [PATCH 180/553] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f84bb4f63fdd5..572ee92009721 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- [Improve `prevent-fetch` scriptlet](https://github.com/gorhill/uBlock/commit/e8202af11d) +- [Apply CSP/PP injections to `object` resources](https://github.com/gorhill/uBlock/commit/89f02098fd) - [Improve `xml-prune` scriptlet](https://github.com/gorhill/uBlock/commit/c8307f58a3) - [Add support for `application/dash+xml` in `replace=` option](https://github.com/gorhill/uBlock/commit/91125d29cf) - [Add ability to directly evaluate static network filtering engine](https://github.com/gorhill/uBlock/commit/b7ed3b45ed) From ae9acbf521fd44114a90aef76565b863682a228e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 4 Sep 2024 11:37:35 -0400 Subject: [PATCH 181/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 9f041eba635fd..3f55aac89412a 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.12 \ No newline at end of file +1.59.1.13 \ No newline at end of file From 1dc09b6217ec979fa982c12cef28c175e3133dbf Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 4 Sep 2024 11:56:02 -0400 Subject: [PATCH 182/553] 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 040211953b0ac..e772fa745fc9b 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.12", + "version": "1.59.1.13", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b12/uBlock0_1.59.1b12.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b13/uBlock0_1.59.1b13.firefox.signed.xpi" } ] } From 60a009c530424a0bced0cd77e60f69706df01f29 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 5 Sep 2024 11:17:36 -0400 Subject: [PATCH 183/553] Further improve `prevent-fetch` scriptlet --- assets/resources/scriptlets.js | 98 +++++++++++++++++----------------- 1 file changed, 48 insertions(+), 50 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 5a27d810b63d1..3ccb1b0215280 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -2129,6 +2129,7 @@ builtinScriptlets.push({ fn: noFetchIf, dependencies: [ 'generate-content.fn', + 'proxy-apply.fn', 'safe-self.fn', ], }); @@ -2175,61 +2176,58 @@ function noFetchIf( responseProps.type = { value: responseType }; } } - self.fetch = new Proxy(self.fetch, { - apply: function(target, thisArg, args) { - const details = args[0] instanceof self.Request - ? args[0] - : Object.assign({ url: args[0] }, args[1]); - if ( safe.logLevel > 1 ) { - safe.uboLog(logPrefix, `apply:\n\t${Object.entries(details).map(a => `${a[0]}: ${a[1]}`).join('\n\t')}`); - } - let proceed = true; - try { - const props = new Map(); - for ( const prop in details ) { - let v = details[prop]; - if ( typeof v !== 'string' ) { - try { v = safe.JSON_stringify(v); } - catch(ex) { } - } - if ( typeof v !== 'string' ) { continue; } - props.set(prop, v); - } - if ( propsToMatch === '' && responseBody === '' ) { - const out = Array.from(props).map(a => `${a[0]}:${a[1]}`); - safe.uboLog(logPrefix, `Called: ${out.join('\n')}`); - return Reflect.apply(target, thisArg, args); - } - proceed = needles.length === 0; - for ( const { key, pattern } of needles ) { - if ( - pattern.expect && props.has(key) === false || - safe.testPattern(pattern, props.get(key)) === false - ) { - proceed = true; - break; - } + proxyApplyFn('fetch', function fetch(target, thisArg, args) { + const details = args[0] instanceof self.Request + ? args[0] + : Object.assign({ url: args[0] }, args[1]); + let proceed = true; + try { + const props = new Map(); + for ( const prop in details ) { + let v = details[prop]; + if ( typeof v !== 'string' ) { + try { v = safe.JSON_stringify(v); } + catch(ex) { } } - } catch(ex) { + if ( typeof v !== 'string' ) { continue; } + props.set(prop, v); } - if ( proceed ) { + if ( safe.logLevel > 1 || propsToMatch === '' && responseBody === '' ) { + const out = Array.from(props).map(a => `${a[0]}:${a[1]}`); + safe.uboLog(logPrefix, `Called: ${out.join('\n')}`); + } + if ( propsToMatch === '' && responseBody === '' ) { return Reflect.apply(target, thisArg, args); } - return generateContentFn(responseBody).then(text => { - safe.uboLog(logPrefix, `Prevented with response "${text}"`); - const response = new Response(text, { - headers: { - 'Content-Length': text.length, - } - }); - const props = Object.assign( - { url: { value: details.url } }, - responseProps - ); - safe.Object_defineProperties(response, props); - return response; - }); + proceed = needles.length === 0; + for ( const { key, pattern } of needles ) { + if ( + pattern.expect && props.has(key) === false || + safe.testPattern(pattern, props.get(key)) === false + ) { + proceed = true; + break; + } + } + } catch(ex) { } + if ( proceed ) { + return Reflect.apply(target, thisArg, args); + } + return generateContentFn(responseBody).then(text => { + safe.uboLog(logPrefix, `Prevented with response "${text}"`); + const response = new Response(text, { + headers: { + 'Content-Length': text.length, + } + }); + const props = Object.assign( + { url: { value: details.url } }, + responseProps + ); + safe.Object_defineProperties(response, props); + return response; + }); }); } From 8631b955bfb419e744af4ca89f87f169c682dc58 Mon Sep 17 00:00:00 2001 From: Imre Eilertsen Date: Thu, 5 Sep 2024 20:49:32 +0200 Subject: [PATCH 184/553] Maintenance for the Serbo-Croatian Filters section (#3924) * Maintenance for the Serbo-Croatian Filters section * Implemented the request to move to contentURLs I sure I hope I understood the request correctly, or things would get slightly awkward for me. --- assets/assets.json | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/assets/assets.json b/assets/assets.json index 454c954bb7439..8665c36e8a2bc 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -622,9 +622,13 @@ "group": "regions", "off": true, "title": "🇭🇷hr 🇷🇸rs: Dandelion Sprout's Serbo-Croatian filters", - "tags": "ads croatian serbian", - "lang": "hr sr", - "contentURL": "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/SerboCroatianList.txt", + "tags": "ads croatian serbian bosnian", + "lang": "bs hr sr", + "contentURL": [ + "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/SerboCroatianList.txt", + "https://cdn.jsdelivr.net/gh/DandelionSprout/adfilt@master/SerboCroatianList.txt", + "https://cdn.statically.io/gl/DandelionSprout/adfilt/master/SerboCroatianList.txt" + ], "supportURL": "https://github.com/DandelionSprout/adfilt#readme" }, "HUN-0": { @@ -778,9 +782,7 @@ "tags": "ads norwegian danish icelandic", "lang": "nb nn no da is", "contentURL": [ - "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianList.txt" - ], - "cdnURLs": [ + "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianList.txt", "https://cdn.jsdelivr.net/gh/DandelionSprout/adfilt@master/NorwegianList.txt", "https://cdn.statically.io/gl/DandelionSprout/adfilt/master/NorwegianList.txt" ], From 901b4ad061ba23867c75e35ed9c284a6aacc817b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 5 Sep 2024 14:51:47 -0400 Subject: [PATCH 185/553] Import changes from https://github.com/gorhill/uBlock/pull/3924 --- assets/assets.dev.json | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/assets/assets.dev.json b/assets/assets.dev.json index a78998bf2b8a5..aa54da8290962 100644 --- a/assets/assets.dev.json +++ b/assets/assets.dev.json @@ -622,9 +622,13 @@ "group": "regions", "off": true, "title": "🇭🇷hr 🇷🇸rs: Dandelion Sprout's Serbo-Croatian filters", - "tags": "ads croatian serbian", - "lang": "hr sr", - "contentURL": "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/SerboCroatianList.txt", + "tags": "ads croatian serbian bosnian", + "lang": "bs hr sr", + "contentURL": [ + "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/SerboCroatianList.txt", + "https://cdn.jsdelivr.net/gh/DandelionSprout/adfilt@master/SerboCroatianList.txt", + "https://cdn.statically.io/gl/DandelionSprout/adfilt/master/SerboCroatianList.txt" + ], "supportURL": "https://github.com/DandelionSprout/adfilt#readme" }, "HUN-0": { @@ -778,9 +782,7 @@ "tags": "ads norwegian danish icelandic", "lang": "nb nn no da is", "contentURL": [ - "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianList.txt" - ], - "cdnURLs": [ + "https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianList.txt", "https://cdn.jsdelivr.net/gh/DandelionSprout/adfilt@master/NorwegianList.txt", "https://cdn.statically.io/gl/DandelionSprout/adfilt/master/NorwegianList.txt" ], From 8981d3e7fe3c05fe2431a06cef0d71dd23210eff Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 5 Sep 2024 14:52:19 -0400 Subject: [PATCH 186/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 3f55aac89412a..4a1a7010ab022 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.13 \ No newline at end of file +1.59.1.14 \ No newline at end of file From 08e5bffc764c21b1b37e043a165599f96459953f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 5 Sep 2024 15:01:24 -0400 Subject: [PATCH 187/553] 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 e772fa745fc9b..89e8f3d91f137 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.13", + "version": "1.59.1.14", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b13/uBlock0_1.59.1b13.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b14/uBlock0_1.59.1b14.firefox.signed.xpi" } ] } From bec5d53ce0fc68440e657cdf78a39e2fc74d9ea0 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 6 Sep 2024 09:31:17 -0400 Subject: [PATCH 188/553] [mv3] Attempt at mitigation for when "internal error" occurs Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/199 --- platform/mv3/extension/js/background.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index 17601b114995a..f0f6cb6cdfd69 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -386,8 +386,17 @@ async function start() { } } +// https://github.com/uBlockOrigin/uBOL-home/issues/199 +// Force a restart of the extension once when an "internal error" occurs try { start(); + localWrite({ goodStart: true }); } catch(reason) { console.trace(reason); + localRead.get('goodStart').then((bin = {}) => { + if ( bin.goodStart !== true ) { return; } + localWrite({ goodStart: false }).then(( ) => { + runtime.reload(); + }); + }); } From 1b464f75cc6b036d520c04944c5c522b5671b72d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 7 Sep 2024 16:47:43 -0400 Subject: [PATCH 189/553] Fix spurious browser error at the console --- platform/common/vapi-background.js | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/common/vapi-background.js b/platform/common/vapi-background.js index 283ffe6efd275..26507982a51e9 100644 --- a/platform/common/vapi-background.js +++ b/platform/common/vapi-background.js @@ -958,6 +958,7 @@ vAPI.messaging = { onPortDisconnect: function(port) { this.ports.delete(port.name); + void browser.runtime.lastError; }, // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port From 20115697e5e7265b6045b11055ef45d0470e157e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 8 Sep 2024 10:01:13 -0400 Subject: [PATCH 190/553] Add ability to quote static network option values For the sake of convenience for filter list maintainers, this commit add ability to quote static network option values, so as to avoid the need to escape commas when parser ambiguity arises. The quotes can be `"`, `'`, or backticks. Example, the following filter requires escaping commas: example.com$xhr,replace=/"loremIpsum.*?([A-Z]"\}|"\}{2\,4})\}\]\,//,1p Can be now rewritten with no need to escape when using quotes: example.com$xhr,replace='/"loremIpsum.*?([A-Z]"\}|"\}{2,4})\}\],//',1p --- src/js/codemirror/ubo-static-filtering.js | 1 + src/js/static-filtering-parser.js | 105 ++++++++++++++-------- src/js/static-net-filtering.js | 12 ++- 3 files changed, 81 insertions(+), 37 deletions(-) diff --git a/src/js/codemirror/ubo-static-filtering.js b/src/js/codemirror/ubo-static-filtering.js index 2aaf85b3df6ea..386ed52f3aa93 100644 --- a/src/js/codemirror/ubo-static-filtering.js +++ b/src/js/codemirror/ubo-static-filtering.js @@ -189,6 +189,7 @@ const uBOStaticFilteringMode = (( ) => { mode.lastNetOptionType = nodeType; return 'def'; case sfp.NODE_TYPE_NET_OPTION_ASSIGN: + case sfp.NODE_TYPE_NET_OPTION_QUOTE: return 'def'; case sfp.NODE_TYPE_NET_OPTION_VALUE: if ( mode.astWalker.canGoDown() ) { break; } diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index e89f7b3a30ce5..b0a4a15d1a87b 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -195,6 +195,7 @@ export const NODE_TYPE_NET_OPTION_NAME_XHR = iota++; export const NODE_TYPE_NET_OPTION_NAME_WEBRTC = iota++; export const NODE_TYPE_NET_OPTION_NAME_WEBSOCKET = iota++; export const NODE_TYPE_NET_OPTION_ASSIGN = iota++; +export const NODE_TYPE_NET_OPTION_QUOTE = iota++; export const NODE_TYPE_NET_OPTION_VALUE = iota++; export const NODE_TYPE_OPTION_VALUE_DOMAIN_LIST = iota++; export const NODE_TYPE_OPTION_VALUE_DOMAIN_RAW = iota++; @@ -896,7 +897,9 @@ export class AstFilterParser { this.reGoodRegexToken = /[^\x01%0-9A-Za-z][%0-9A-Za-z]{7,}|[^\x01%0-9A-Za-z][%0-9A-Za-z]{1,6}[^\x01%0-9A-Za-z]/; this.reBadCSP = /(?:^|[;,])\s*report-(?:to|uri)\b/i; this.reBadPP = /(?:^|[;,])\s*report-to\b/i; + this.reNetOption = /^(~?)([13a-z_-]+)(=?)/; this.reNoopOption = /^_+$/; + this.netOptionValueParser = new ArgListParser(','); this.scriptletArgListParser = new ArgListParser(','); } @@ -1959,16 +1962,17 @@ export class AstFilterParser { const head = this.allocHeadNode(); let prev = head, next = 0; let optionBeg = 0, optionEnd = 0; - let emptyOption = false, badComma = false; while ( optionBeg !== optionsEnd ) { - optionEnd = this.endOfNetOption(s, optionBeg); next = this.allocTypedNode( NODE_TYPE_NET_OPTION_RAW, parentBeg + optionBeg, - parentBeg + optionEnd + parentBeg + optionsEnd // open ended ); - emptyOption = optionEnd === optionBeg; - this.linkDown(next, this.parseNetOption(next)); + const { node: down, len: optionLen } = this.parseNetOption(next); + // set next's end to down's end + optionEnd += optionLen; + this.nodes[next+NODE_END_INDEX] = parentBeg + optionEnd; + this.linkDown(next, down); prev = this.linkRight(prev, next); if ( optionEnd === optionsEnd ) { break; } optionBeg = optionEnd + 1; @@ -1977,12 +1981,12 @@ export class AstFilterParser { parentBeg + optionEnd, parentBeg + optionBeg ); - badComma = optionBeg === optionsEnd; - prev = this.linkRight(prev, next); - if ( emptyOption || badComma ) { + if ( optionLen === 0 || optionBeg === optionsEnd ) { this.addNodeFlags(next, NODE_FLAG_ERROR); this.addFlags(AST_FLAG_HAS_ERROR); } + prev = this.linkRight(prev, next); + optionEnd = optionBeg; } this.linkRight(prev, this.allocSentinelNode(NODE_TYPE_NET_OPTION_SENTINEL, parentEnd) @@ -1990,19 +1994,21 @@ export class AstFilterParser { return this.throwHeadNode(head); } - endOfNetOption(s, beg) { - const match = this.reNetOptionComma.exec(s.slice(beg)); - return match !== null ? beg + match.index : s.length; - } - parseNetOption(parent) { const parentBeg = this.nodes[parent+NODE_BEG_INDEX]; const s = this.getNodeString(parent); - const optionEnd = s.length; + const match = this.reNetOption.exec(s) || []; + if ( match.length === 0 ) { + this.addNodeFlags(parent, NODE_FLAG_ERROR); + this.addFlags(AST_FLAG_HAS_ERROR); + this.astError = AST_ERROR_OPTION_UNKNOWN; + return { node: 0, len: s.length }; + } const head = this.allocHeadNode(); let prev = head, next = 0; - let nameBeg = 0; - if ( s.charCodeAt(0) === 0x7E ) { + const matchEnd = match && match[0].length || 0; + const negated = match[1] === '~'; + if ( negated ) { this.addNodeFlags(parent, NODE_FLAG_IS_NEGATED); next = this.allocTypedNode( NODE_TYPE_NET_OPTION_NAME_NOT, @@ -2010,11 +2016,11 @@ export class AstFilterParser { parentBeg+1 ); prev = this.linkRight(prev, next); - nameBeg += 1; } - const equalPos = s.indexOf('='); - const nameEnd = equalPos !== -1 ? equalPos : s.length; - const name = s.slice(nameBeg, nameEnd); + const nameBeg = negated ? 1 : 0; + const assigned = match[3] === '='; + const nameEnd = matchEnd - (assigned ? 1 : 0); + const name = match[2] || ''; let nodeOptionType = nodeTypeFromOptionName.get(name); if ( nodeOptionType === undefined ) { nodeOptionType = this.reNoopOption.test(name) @@ -2037,27 +2043,43 @@ export class AstFilterParser { this.addNodeToRegister(nodeOptionType, parent); } prev = this.linkRight(prev, next); - if ( equalPos === -1 ) { - return this.throwHeadNode(head); + if ( assigned === false ) { + return { node: this.throwHeadNode(head), len: matchEnd }; } - const valueBeg = equalPos + 1; next = this.allocTypedNode( NODE_TYPE_NET_OPTION_ASSIGN, - parentBeg + equalPos, - parentBeg + valueBeg + parentBeg + matchEnd - 1, + parentBeg + matchEnd ); prev = this.linkRight(prev, next); - if ( (equalPos+1) === optionEnd ) { - this.addNodeFlags(parent, NODE_FLAG_ERROR); - this.addFlags(AST_FLAG_HAS_ERROR); - return this.throwHeadNode(head); - } this.addNodeFlags(parent, NODE_FLAG_OPTION_HAS_VALUE); + const details = this.netOptionValueParser.nextArg(s, matchEnd); + if ( details.quoteBeg !== details.argBeg ) { + next = this.allocTypedNode( + NODE_TYPE_NET_OPTION_QUOTE, + parentBeg + details.quoteBeg, + parentBeg + details.argBeg + ); + prev = this.linkRight(prev, next); + } else { + const argEnd = this.endOfNetOption(s, matchEnd); + if ( argEnd !== details.argEnd ) { + details.argEnd = details.quoteEnd = argEnd; + } + } next = this.allocTypedNode( NODE_TYPE_NET_OPTION_VALUE, - parentBeg + valueBeg, - parentBeg + optionEnd + parentBeg + details.argBeg, + parentBeg + details.argEnd ); + if ( details.argBeg === details.argEnd ) { + this.addNodeFlags(parent, NODE_FLAG_ERROR); + this.addFlags(AST_FLAG_HAS_ERROR); + this.astError = AST_ERROR_OPTION_BADVALUE; + } else if ( details.transform ) { + const arg = s.slice(details.argBeg, details.argEnd); + this.setNodeTransform(next, this.netOptionValueParser.normalizeArg(arg)); + } switch ( nodeOptionType ) { case NODE_TYPE_NET_OPTION_NAME_DENYALLOW: this.linkDown(next, this.parseDomainList(next, '|'), 0b00000); @@ -2069,8 +2091,21 @@ export class AstFilterParser { default: break; } - this.linkRight(prev, next); - return this.throwHeadNode(head); + prev = this.linkRight(prev, next); + if ( details.quoteEnd !== details.argEnd ) { + next = this.allocTypedNode( + NODE_TYPE_NET_OPTION_QUOTE, + parentBeg + details.argEnd, + parentBeg + details.quoteEnd + ); + this.linkRight(prev, next); + } + return { node: this.throwHeadNode(head), len: details.quoteEnd }; + } + + endOfNetOption(s, beg) { + const match = this.reNetOptionComma.exec(s.slice(beg)); + return match !== null ? beg + match.index : s.length; } getNetOptionValue(type) { @@ -3086,8 +3121,8 @@ export const netOptionTokenDescriptors = new Map([ /* synonym */ [ 'rewrite', { mustAssign: true } ], [ 'redirect-rule', { mustAssign: true } ], [ 'removeparam', { } ], - [ 'replace', { mustAssign: true } ], /* synonym */ [ 'queryprune', { } ], + [ 'replace', { mustAssign: true } ], [ 'script', { canNegate: true } ], [ 'shide', { } ], /* synonym */ [ 'specifichide', { } ], diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index f30af31bea003..eaa2c7131bede 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -409,6 +409,14 @@ class LogData { isPureHostname() { return this.tokenHash === DOT_TOKEN_HASH; } + + static requote(s) { + if ( /^(["'`]).+\1$|,/.test(s) === false ) { return s; } + if ( s.includes("'") === false ) { return `'${s}'`; } + if ( s.includes('"') === false ) { return `"${s}"`; } + if ( s.includes('`') === false ) { return `\`${s}\``; } + return `'${s.replace(/'/g, "\\'")}'`; + } } /******************************************************************************/ @@ -2128,7 +2136,7 @@ class FilterModifier { let opt = modifierNameFromType.get(filterData[idata+2]); const refs = filterRefs[filterData[idata+3]]; if ( refs.value !== '' ) { - opt += `=${refs.value}`; + opt += `=${LogData.requote(refs.value)}`; } details.options.push(opt); } @@ -2947,7 +2955,7 @@ class FilterOnHeaders { const headerOpt = filterRefs[irefs].headerOpt; let opt = 'header'; if ( headerOpt !== '' ) { - opt += `=${headerOpt}`; + opt += `=${LogData.requote(headerOpt)}`; } details.options.push(opt); } From c6dedd253ffbf649729a38998033c75993489859 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Sep 2024 09:35:23 -0400 Subject: [PATCH 191/553] New static network filter option `ipaddress=` The purpose is to block according to the ip address of a network request. In the current implementation, the filter option can only be enforced at onHeadersReceived time. The new filter option cannot be enforced in Chromium-based browsers since the ip address of network requests is available only at onResponseStarted time, which is not blocking. The value assigned to `ipaddress` can either be a plain string which must match exactly a given ip address, or a regex which will be matched against the ip address. The `ipaddress` option can only be enforced when the extension framework does provide a valid ip address in a onHeadersReceived listener. For instance, cached resources do not have a valid ip address and thus can't be a match to `ipaddress` option. Example: *$script,ipaddress=93.184.215.14 --- src/js/background.js | 1 + src/js/filtering-context.js | 109 ++++++++++++-------- src/js/static-filtering-parser.js | 19 +++- src/js/static-net-filtering.js | 165 +++++++++++++++++++----------- 4 files changed, 194 insertions(+), 100 deletions(-) diff --git a/src/js/background.js b/src/js/background.js index 4cd10eeff4a1b..2a5c2366e2982 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -307,6 +307,7 @@ const µBlock = { // jshint ignore:line this.setMethod(details.method); this.setURL(details.url); this.aliasURL = details.aliasURL || undefined; + this.ipaddress = details.ip || undefined; this.redirectURL = undefined; this.filter = undefined; if ( this.itype !== this.SUB_FRAME ) { diff --git a/src/js/filtering-context.js b/src/js/filtering-context.js index 3da9d158f0a4c..b1d7d7033dac5 100644 --- a/src/js/filtering-context.js +++ b/src/js/filtering-context.js @@ -19,13 +19,9 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - -/******************************************************************************/ - import { - hostnameFromURI, domainFromHostname, + hostnameFromURI, originFromURI, } from './uri-utils.js'; @@ -140,6 +136,7 @@ export const FilteringContext = class { this.stype = undefined; this.url = undefined; this.aliasURL = undefined; + this.ipaddress = undefined; this.hostname = undefined; this.domain = undefined; this.docId = -1; @@ -418,42 +415,72 @@ export const FilteringContext = class { static getMethodName(a) { return methodBitToStrMap.get(a) || ''; } -}; - -/******************************************************************************/ -FilteringContext.prototype.BEACON = FilteringContext.BEACON = BEACON; -FilteringContext.prototype.CSP_REPORT = FilteringContext.CSP_REPORT = CSP_REPORT; -FilteringContext.prototype.FONT = FilteringContext.FONT = FONT; -FilteringContext.prototype.IMAGE = FilteringContext.IMAGE = IMAGE; -FilteringContext.prototype.IMAGESET = FilteringContext.IMAGESET = IMAGESET; -FilteringContext.prototype.MAIN_FRAME = FilteringContext.MAIN_FRAME = MAIN_FRAME; -FilteringContext.prototype.MEDIA = FilteringContext.MEDIA = MEDIA; -FilteringContext.prototype.OBJECT = FilteringContext.OBJECT = OBJECT; -FilteringContext.prototype.OBJECT_SUBREQUEST = FilteringContext.OBJECT_SUBREQUEST = OBJECT_SUBREQUEST; -FilteringContext.prototype.PING = FilteringContext.PING = PING; -FilteringContext.prototype.SCRIPT = FilteringContext.SCRIPT = SCRIPT; -FilteringContext.prototype.STYLESHEET = FilteringContext.STYLESHEET = STYLESHEET; -FilteringContext.prototype.SUB_FRAME = FilteringContext.SUB_FRAME = SUB_FRAME; -FilteringContext.prototype.WEBSOCKET = FilteringContext.WEBSOCKET = WEBSOCKET; -FilteringContext.prototype.XMLHTTPREQUEST = FilteringContext.XMLHTTPREQUEST = XMLHTTPREQUEST; -FilteringContext.prototype.INLINE_FONT = FilteringContext.INLINE_FONT = INLINE_FONT; -FilteringContext.prototype.INLINE_SCRIPT = FilteringContext.INLINE_SCRIPT = INLINE_SCRIPT; -FilteringContext.prototype.OTHER = FilteringContext.OTHER = OTHER; -FilteringContext.prototype.FRAME_ANY = FilteringContext.FRAME_ANY = FRAME_ANY; -FilteringContext.prototype.FONT_ANY = FilteringContext.FONT_ANY = FONT_ANY; -FilteringContext.prototype.INLINE_ANY = FilteringContext.INLINE_ANY = INLINE_ANY; -FilteringContext.prototype.PING_ANY = FilteringContext.PING_ANY = PING_ANY; -FilteringContext.prototype.SCRIPT_ANY = FilteringContext.SCRIPT_ANY = SCRIPT_ANY; - -FilteringContext.prototype.METHOD_NONE = FilteringContext.METHOD_NONE = METHOD_NONE; -FilteringContext.prototype.METHOD_CONNECT = FilteringContext.METHOD_CONNECT = METHOD_CONNECT; -FilteringContext.prototype.METHOD_DELETE = FilteringContext.METHOD_DELETE = METHOD_DELETE; -FilteringContext.prototype.METHOD_GET = FilteringContext.METHOD_GET = METHOD_GET; -FilteringContext.prototype.METHOD_HEAD = FilteringContext.METHOD_HEAD = METHOD_HEAD; -FilteringContext.prototype.METHOD_OPTIONS = FilteringContext.METHOD_OPTIONS = METHOD_OPTIONS; -FilteringContext.prototype.METHOD_PATCH = FilteringContext.METHOD_PATCH = METHOD_PATCH; -FilteringContext.prototype.METHOD_POST = FilteringContext.METHOD_POST = METHOD_POST; -FilteringContext.prototype.METHOD_PUT = FilteringContext.METHOD_PUT = METHOD_PUT; + BEACON = BEACON; + CSP_REPORT = CSP_REPORT; + FONT = FONT; + IMAGE = IMAGE; + IMAGESET = IMAGESET; + MAIN_FRAME = MAIN_FRAME; + MEDIA = MEDIA; + OBJECT = OBJECT; + OBJECT_SUBREQUEST = OBJECT_SUBREQUEST; + PING = PING; + SCRIPT = SCRIPT; + STYLESHEET = STYLESHEET; + SUB_FRAME = SUB_FRAME; + WEBSOCKET = WEBSOCKET; + XMLHTTPREQUEST = XMLHTTPREQUEST; + INLINE_FONT = INLINE_FONT; + INLINE_SCRIPT = INLINE_SCRIPT; + OTHER = OTHER; + FRAME_ANY = FRAME_ANY; + FONT_ANY = FONT_ANY; + INLINE_ANY = INLINE_ANY; + PING_ANY = PING_ANY; + SCRIPT_ANY = SCRIPT_ANY; + METHOD_NONE = METHOD_NONE; + METHOD_CONNECT = METHOD_CONNECT; + METHOD_DELETE = METHOD_DELETE; + METHOD_GET = METHOD_GET; + METHOD_HEAD = METHOD_HEAD; + METHOD_OPTIONS = METHOD_OPTIONS; + METHOD_PATCH = METHOD_PATCH; + METHOD_POST = METHOD_POST; + METHOD_PUT = METHOD_PUT; + + static BEACON = BEACON; + static CSP_REPORT = CSP_REPORT; + static FONT = FONT; + static IMAGE = IMAGE; + static IMAGESET = IMAGESET; + static MAIN_FRAME = MAIN_FRAME; + static MEDIA = MEDIA; + static OBJECT = OBJECT; + static OBJECT_SUBREQUEST = OBJECT_SUBREQUEST; + static PING = PING; + static SCRIPT = SCRIPT; + static STYLESHEET = STYLESHEET; + static SUB_FRAME = SUB_FRAME; + static WEBSOCKET = WEBSOCKET; + static XMLHTTPREQUEST = XMLHTTPREQUEST; + static INLINE_FONT = INLINE_FONT; + static INLINE_SCRIPT = INLINE_SCRIPT; + static OTHER = OTHER; + static FRAME_ANY = FRAME_ANY; + static FONT_ANY = FONT_ANY; + static INLINE_ANY = INLINE_ANY; + static PING_ANY = PING_ANY; + static SCRIPT_ANY = SCRIPT_ANY; + static METHOD_NONE = METHOD_NONE; + static METHOD_CONNECT = METHOD_CONNECT; + static METHOD_DELETE = METHOD_DELETE; + static METHOD_GET = METHOD_GET; + static METHOD_HEAD = METHOD_HEAD; + static METHOD_OPTIONS = METHOD_OPTIONS; + static METHOD_PATCH = METHOD_PATCH; + static METHOD_POST = METHOD_POST; + static METHOD_PUT = METHOD_PUT; +}; /******************************************************************************/ diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index b0a4a15d1a87b..d3520b6e555c3 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -172,6 +172,7 @@ export const NODE_TYPE_NET_OPTION_NAME_IMAGE = iota++; export const NODE_TYPE_NET_OPTION_NAME_IMPORTANT = iota++; export const NODE_TYPE_NET_OPTION_NAME_INLINEFONT = iota++; export const NODE_TYPE_NET_OPTION_NAME_INLINESCRIPT = iota++; +export const NODE_TYPE_NET_OPTION_NAME_IPADDRESS = iota++; export const NODE_TYPE_NET_OPTION_NAME_MATCHCASE = iota++; export const NODE_TYPE_NET_OPTION_NAME_MEDIA = iota++; export const NODE_TYPE_NET_OPTION_NAME_METHOD = iota++; @@ -249,6 +250,7 @@ export const nodeTypeFromOptionName = new Map([ [ 'important', NODE_TYPE_NET_OPTION_NAME_IMPORTANT ], [ 'inline-font', NODE_TYPE_NET_OPTION_NAME_INLINEFONT ], [ 'inline-script', NODE_TYPE_NET_OPTION_NAME_INLINESCRIPT ], + [ 'ipaddress', NODE_TYPE_NET_OPTION_NAME_IPADDRESS ], [ 'match-case', NODE_TYPE_NET_OPTION_NAME_MATCHCASE ], [ 'media', NODE_TYPE_NET_OPTION_NAME_MEDIA ], [ 'method', NODE_TYPE_NET_OPTION_NAME_METHOD ], @@ -1401,6 +1403,14 @@ export class AstFilterParser { modifierType = type; unredirectableTypeCount += 1; break; + case NODE_TYPE_NET_OPTION_NAME_IPADDRESS: { + const value = this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_IPADDRESS); + if ( /^\/.+\/$/.test(value) ) { + try { void new RegExp(value); } + catch(_) { realBad = true; } + } + break; + } case NODE_TYPE_NET_OPTION_NAME_MATCHCASE: realBad = this.isRegexPattern() === false; break; @@ -3104,6 +3114,7 @@ export const netOptionTokenDescriptors = new Map([ [ 'important', { blockOnly: true } ], [ 'inline-font', { canNegate: true } ], [ 'inline-script', { canNegate: true } ], + [ 'ipaddress', { mustAssign: true } ], [ 'match-case', { } ], [ 'media', { canNegate: true } ], [ 'method', { mustAssign: true } ], @@ -4324,6 +4335,7 @@ export const utils = (( ) => { [ '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 // help non-ABP content blockers better deal with filters benefiting @@ -4358,8 +4370,11 @@ export const utils = (( ) => { static evaluateExprToken(token, env = []) { const not = token.charCodeAt(0) === 0x21 /* ! */; if ( not ) { token = token.slice(1); } - const state = preparserTokens.get(token); - if ( state === undefined ) { return; } + let state = preparserTokens.get(token); + if ( state === undefined ) { + if ( token.startsWith('cap_') === false ) { return; } + state = 'false'; + } return state === 'false' && not || env.includes(state) !== not; } diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index eaa2c7131bede..e8f6de911dd6d 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -242,6 +242,7 @@ let $requestTypeValue = 0; let $requestURL = ''; let $requestURLRaw = ''; let $requestHostname = ''; +let $requestAddress = ''; let $docHostname = ''; let $docDomain = ''; let $tokenBeg = 0; @@ -702,6 +703,8 @@ const dnrAddRuleWarning = (rule, msg) => { FilterNotType FilterStrictParty FilterModifier + FilterOnHeaders + FilterIPAddress Collection: FilterCollection @@ -1234,7 +1237,7 @@ class FilterRegex { return [ FilterRegex.fid, details.pattern, - details.patternMatchCase ? 1 : 0 + details.optionValues.has('match-case') ? 1 : 0, ]; } @@ -2075,7 +2078,7 @@ const compileToDomainOpt = (...args) => { class FilterDenyAllow extends FilterToDomainMissSet { static compile(details) { - return super.compile(details.denyallowOpt, 0b01); + return super.compile(details.optionValues.get('denyallow'), 0b01); } static logData(idata, details) { @@ -2937,12 +2940,12 @@ class FilterOnHeaders { } static compile(details) { - return [ FilterOnHeaders.fid, details.headerOpt ]; + return [ FilterOnHeaders.fid, details.optionValues.get('header') ]; } static fromCompiled(args) { return filterDataAlloc( - args[0], // fid + args[0], // fid filterRefAdd({ headerOpt: args[1], $parsed: null, @@ -2963,6 +2966,41 @@ class FilterOnHeaders { registerFilterClass(FilterOnHeaders); +/******************************************************************************/ + +class FilterIPAddress { + static match(idata) { + const details = filterRefs[filterData[idata+1]]; + if ( details.isRegex === false ) { + return $requestAddress === details.pattern; + } + if ( details.$re === undefined ) { + details.$re = new RegExp(details.pattern.slice(1, -1)); + } + return details.$re.test($requestAddress); + } + + static compile(details) { + return [ FilterIPAddress.fid, details.optionValues.get('ipaddress') ]; + } + + static fromCompiled(args) { + const pattern = args[1]; + const details = { + pattern, + isRegex: pattern.startsWith('/') && pattern.endsWith('/'), + }; + return filterDataAlloc(args[0], filterRefAdd(details)); + } + + static logData(idata, details) { + const irefs = filterData[idata+1]; + details.options.push(`ipaddress=${LogData.requote(filterRefs[irefs].pattern)}`); + } +} + +registerFilterClass(FilterIPAddress); + /******************************************************************************/ /******************************************************************************/ @@ -3146,8 +3184,7 @@ class FilterCompiler { return Object.assign(this, other); } this.reToken = /[%0-9A-Za-z]+/g; - this.fromDomainOptList = []; - this.toDomainOptList = []; + this.optionValues = new Map(); this.tokenIdToNormalizedType = new Map([ [ sfp.NODE_TYPE_NET_OPTION_NAME_CNAME, bitFromType('cname') ], [ sfp.NODE_TYPE_NET_OPTION_NAME_CSS, bitFromType('stylesheet') ], @@ -3304,13 +3341,9 @@ class FilterCompiler { this.modifyType = undefined; this.modifyValue = undefined; this.pattern = ''; - this.patternMatchCase = false; this.party = ANYPARTY_REALM; this.optionUnitBits = 0; - this.fromDomainOpt = ''; - this.toDomainOpt = ''; - this.denyallowOpt = ''; - this.headerOpt = undefined; + this.optionValues.clear(); this.isPureHostname = false; this.isGeneric = false; this.isRegex = false; @@ -3322,8 +3355,7 @@ class FilterCompiler { this.notTypeBits = 0; this.methodBits = 0; this.notMethodBits = 0; - this.wildcardPos = -1; - this.caretPos = -1; + this.responseHeadersRealm = false; return this; } @@ -3421,26 +3453,36 @@ class FilterCompiler { case sfp.NODE_TYPE_NET_OPTION_NAME_CSP: if ( this.processCspOption(parser.getNetOptionValue(id)) === false ) { return false; } break; - case sfp.NODE_TYPE_NET_OPTION_NAME_DENYALLOW: - this.denyallowOpt = this.processHostnameList( - parser.getNetFilterDenyallowOptionIterator(), + case sfp.NODE_TYPE_NET_OPTION_NAME_DENYALLOW: { + const value = this.processHostnameList( + parser.getNetFilterDenyallowOptionIterator() ); - if ( this.denyallowOpt === '' ) { return false; } + if ( value === '' ) { return false; } + this.optionValues.set('denyallow', value); this.optionUnitBits |= DENYALLOW_BIT; break; - case sfp.NODE_TYPE_NET_OPTION_NAME_FROM: - this.fromDomainOpt = this.processHostnameList( - parser.getNetFilterFromOptionIterator(), - this.fromDomainOptList - ); - if ( this.fromDomainOpt === '' ) { return false; } + } + case sfp.NODE_TYPE_NET_OPTION_NAME_FROM: { + const iter = parser.getNetFilterFromOptionIterator(); + const list = []; + const value = this.processHostnameList(iter, list); + if ( value === '' ) { return false; } + this.optionValues.set('from', value); + this.optionValues.set('fromList', list); this.optionUnitBits |= FROM_BIT; break; + } case sfp.NODE_TYPE_NET_OPTION_NAME_HEADER: { - this.headerOpt = parser.getNetOptionValue(id) || ''; + this.optionValues.set('header', parser.getNetOptionValue(id) || ''); this.optionUnitBits |= HEADER_BIT; + this.responseHeadersRealm = true; break; } + case sfp.NODE_TYPE_NET_OPTION_NAME_IPADDRESS: + this.optionValues.set('ipaddress', parser.getNetOptionValue(id) || ''); + this.optionUnitBits |= IPADDRESS_BIT; + this.responseHeadersRealm = true; + break; case sfp.NODE_TYPE_NET_OPTION_NAME_METHOD: this.processMethodOption(parser.getNetOptionValue(id)); this.optionUnitBits |= METHOD_BIT; @@ -3465,14 +3507,16 @@ class FilterCompiler { this.optionUnitBits |= MODIFY_BIT; break; } - case sfp.NODE_TYPE_NET_OPTION_NAME_TO: - this.toDomainOpt = this.processHostnameList( - parser.getNetFilterToOptionIterator(), - this.toDomainOptList - ); - if ( this.toDomainOpt === '' ) { return false; } + case sfp.NODE_TYPE_NET_OPTION_NAME_TO: { + const iter = parser.getNetFilterToOptionIterator(); + const list = []; + const value = this.processHostnameList(iter, list); + if ( value === '' ) { return false; } + this.optionValues.set('to', value); + this.optionValues.set('toList', list); this.optionUnitBits |= TO_BIT; break; + } default: break; } @@ -3558,6 +3602,7 @@ class FilterCompiler { case sfp.NODE_TYPE_NET_OPTION_NAME_DENYALLOW: case sfp.NODE_TYPE_NET_OPTION_NAME_FROM: case sfp.NODE_TYPE_NET_OPTION_NAME_HEADER: + case sfp.NODE_TYPE_NET_OPTION_NAME_IPADDRESS: case sfp.NODE_TYPE_NET_OPTION_NAME_METHOD: case sfp.NODE_TYPE_NET_OPTION_NAME_PERMISSIONS: case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECT: @@ -3591,7 +3636,7 @@ class FilterCompiler { this.action = BLOCKIMPORTANT_REALM; break; case sfp.NODE_TYPE_NET_OPTION_NAME_MATCHCASE: - this.patternMatchCase = true; + this.optionValues.set('match-case', true); break; case sfp.NODE_TYPE_NET_OPTION_NAME_MP4: { const id = this.action === ALLOW_REALM @@ -3661,11 +3706,6 @@ class FilterCompiler { return this.FILTER_OK; } - if ( this.isGeneric ) { - this.wildcardPos = this.pattern.indexOf('*'); - this.caretPos = this.pattern.indexOf('^'); - } - if ( this.pattern.length > 1024 ) { return this.FILTER_UNSUPPORTED; } @@ -3793,7 +3833,7 @@ class FilterCompiler { isJustOrigin() { if ( this.optionUnitBits !== FROM_BIT ) { return false; } if ( this.isRegex ) { return false; } - if ( /[/~]/.test(this.fromDomainOpt) ) { return false; } + if ( /[/~]/.test(this.optionValues.get('from')) ) { return false; } if ( this.pattern === '*' ) { return true; } if ( this.anchor !== 0b010 ) { return false; } if ( /^(?:http[s*]?:(?:\/\/)?)$/.test(this.pattern) ) { return true; } @@ -3870,7 +3910,7 @@ class FilterCompiler { } else /* 'http:' */ { this.tokenHash = ANY_HTTP_TOKEN_HASH; } - for ( const hn of this.fromDomainOptList ) { + for ( const hn of this.optionValues.get('fromList') ) { this.compileToAtomicFilter(hn, writer); } return; @@ -3911,31 +3951,36 @@ class FilterCompiler { } // Origin - if ( this.fromDomainOpt !== '' ) { + if ( this.optionValues.has('from') ) { compileFromDomainOpt( - this.fromDomainOptList, + this.optionValues.get('fromList'), units.length !== 0 && patternClass.isSlow === true, units ); } // Destination - if ( this.toDomainOpt !== '' ) { + if ( this.optionValues.has('to') ) { compileToDomainOpt( - this.toDomainOptList, + this.optionValues.get('toList'), units.length !== 0 && patternClass.isSlow === true, units ); } // Deny-allow - if ( this.denyallowOpt !== '' ) { + if ( this.optionValues.has('denyallow') ) { units.push(FilterDenyAllow.compile(this)); } // Header - if ( this.headerOpt !== undefined ) { - units.push(FilterOnHeaders.compile(this)); + if ( this.responseHeadersRealm ) { + if ( this.optionValues.has('ipaddress') ) { + units.push(FilterIPAddress.compile(this)); + } + if ( this.optionValues.has('header') ) { + units.push(FilterOnHeaders.compile(this)); + } this.action |= HEADERS_REALM; } @@ -3977,12 +4022,13 @@ class FilterCompiler { units.push(FilterPatternGeneric.compile(this)); return FilterPatternGeneric; } - if ( this.wildcardPos === -1 ) { - if ( this.caretPos === -1 ) { + if ( this.pattern.includes('*') === false ) { + const caretPos = this.pattern.indexOf('^'); + if ( caretPos === -1 ) { units.push(FilterPatternPlain.compile(this)); return FilterPatternPlain; } - if ( this.caretPos === (this.pattern.length - 1) ) { + if ( caretPos === (this.pattern.length - 1) ) { this.pattern = this.pattern.slice(0, -1); units.push(FilterPatternPlain.compile(this)); units.push(FilterTrailingSeparator.compile()); @@ -4027,15 +4073,16 @@ class FilterCompiler { } // These are to quickly test whether a filter is composite -const FROM_BIT = 0b000000001; -const TO_BIT = 0b000000010; -const DENYALLOW_BIT = 0b000000100; -const HEADER_BIT = 0b000001000; -const STRICT_PARTY_BIT = 0b000010000; -const MODIFY_BIT = 0b000100000; -const NOT_TYPE_BIT = 0b001000000; -const IMPORTANT_BIT = 0b010000000; -const METHOD_BIT = 0b100000000; +const FROM_BIT = 0b0000000001; +const TO_BIT = 0b0000000010; +const DENYALLOW_BIT = 0b0000000100; +const HEADER_BIT = 0b0000001000; +const STRICT_PARTY_BIT = 0b0000010000; +const MODIFY_BIT = 0b0000100000; +const NOT_TYPE_BIT = 0b0001000000; +const IMPORTANT_BIT = 0b0010000000; +const METHOD_BIT = 0b0100000000; +const IPADDRESS_BIT = 0b1000000000; FilterCompiler.prototype.FILTER_OK = 0; FilterCompiler.prototype.FILTER_INVALID = 1; @@ -4751,6 +4798,7 @@ StaticNetFilteringEngine.prototype.matchAndFetchModifiers = function( $requestHostname = fctxt.getHostname(); $requestMethodBit = fctxt.method || 0; $requestTypeValue = (typeBits & TypeBitsMask) >>> TypeBitsOffset; + $requestAddress = fctxt.ipaddress || ''; const modifierType = modifierTypeFromName.get(modifierName); const modifierBits = modifierBitsFromType.get(modifierType); @@ -5048,6 +5096,7 @@ StaticNetFilteringEngine.prototype.matchRequestReverse = function(type, url) { $requestURLRaw = url; $requestMethodBit = 0; $requestTypeValue = (typeBits & TypeBitsMask) >>> TypeBitsOffset; + $requestAddress = ''; $isBlockImportant = false; this.$filterUnit = 0; @@ -5116,6 +5165,7 @@ StaticNetFilteringEngine.prototype.matchRequest = function(fctxt, modifiers = 0) $requestHostname = fctxt.getHostname(); $requestMethodBit = fctxt.method || 0; $requestTypeValue = (typeBits & TypeBitsMask) >>> TypeBitsOffset; + $requestAddress = fctxt.ipaddress || ''; $isBlockImportant = false; // Evaluate block realm before allow realm, and allow realm before @@ -5151,6 +5201,7 @@ StaticNetFilteringEngine.prototype.matchHeaders = function(fctxt, headers) { $requestHostname = fctxt.getHostname(); $requestMethodBit = fctxt.method || 0; $requestTypeValue = (typeBits & TypeBitsMask) >>> TypeBitsOffset; + $requestAddress = fctxt.ipaddress || ''; $httpHeaders.init(headers); let r = 0; From 2cb2ee84469febffc61256910ffdf64410bd53a4 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Sep 2024 09:51:24 -0400 Subject: [PATCH 192/553] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 572ee92009721..66d42b2fa9124 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- [New static network filter option `ipaddress=`](https://github.com/gorhill/uBlock/commit/c6dedd253f) +- [Add ability to quote static network option values](https://github.com/gorhill/uBlock/commit/20115697e5) - [Improve `prevent-fetch` scriptlet](https://github.com/gorhill/uBlock/commit/e8202af11d) - [Apply CSP/PP injections to `object` resources](https://github.com/gorhill/uBlock/commit/89f02098fd) - [Improve `xml-prune` scriptlet](https://github.com/gorhill/uBlock/commit/c8307f58a3) From 7732df1dbda4a65bb330763f4679ffb45d0298f9 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Sep 2024 09:51:45 -0400 Subject: [PATCH 193/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 4a1a7010ab022..b283f756e5297 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.14 \ No newline at end of file +1.59.1.15 \ No newline at end of file From 41c96690a5168dcbe4bbb637626a6555f2c32be8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Sep 2024 10:06:34 -0400 Subject: [PATCH 194/553] 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 89e8f3d91f137..04ab41e136b83 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.14", + "version": "1.59.1.15", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b14/uBlock0_1.59.1b14.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b15/uBlock0_1.59.1b15.firefox.signed.xpi" } ] } From 52dee3532525fe6ec6b8d773ae10023f681c9cd2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Sep 2024 10:54:47 -0400 Subject: [PATCH 195/553] Properly reflect whether `ipaddress=` is supported --- platform/common/vapi-common.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/common/vapi-common.js b/platform/common/vapi-common.js index b2b047bc05a8b..367def90a7b7f 100644 --- a/platform/common/vapi-common.js +++ b/platform/common/vapi-common.js @@ -181,7 +181,8 @@ vAPI.webextFlavor = { if ( browser.runtime.getURL('').startsWith('moz-extension://') ) { soup.add('firefox') .add('user_stylesheet') - .add('html_filtering'); + .add('html_filtering') + .add('ipaddress'); const match = /Firefox\/(\d+)/.exec(ua); flavor.major = match && parseInt(match[1], 10) || 115; } else { From faf1b15f8d3d7bf20d65b85b410ce64f1b21d1ad Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Sep 2024 10:55:57 -0400 Subject: [PATCH 196/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index b283f756e5297..0e42031b3d95e 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.15 \ No newline at end of file +1.59.1.16 \ No newline at end of file From 839857dd4b92620f56e5ca2da4deacf8b31e812e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Sep 2024 11:15:41 -0400 Subject: [PATCH 197/553] 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 04ab41e136b83..7603b4da35ca4 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.15", + "version": "1.59.1.16", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b15/uBlock0_1.59.1b15.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b16/uBlock0_1.59.1b16.firefox.signed.xpi" } ] } From 030d7334e4ad832441178ecc5161e8caa58666a6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 10 Sep 2024 11:11:11 -0400 Subject: [PATCH 198/553] Add support for `lan`/`loopback` values to `ipaddress=` option Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/1070 --- src/js/static-net-filtering.js | 59 +++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index e8f6de911dd6d..967e8768756b0 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -2970,14 +2970,63 @@ registerFilterClass(FilterOnHeaders); class FilterIPAddress { static match(idata) { + const ipaddr = $requestAddress; const details = filterRefs[filterData[idata+1]]; - if ( details.isRegex === false ) { - return $requestAddress === details.pattern; + if ( details.isRegex ) { + if ( details.$re === undefined ) { + details.$re = new RegExp(details.pattern.slice(1, -1)); + } + return details.$re.test(ipaddr); + } + if ( ipaddr === '' ) { return false; } + if ( details.pattern === 'lan' ) { + return this.isLAN(ipaddr); + } + if ( details.pattern === 'loopback' ) { + return this.isLoopback(ipaddr); + } + return ipaddr.startsWith(details.pattern); + } + + // https://github.com/uBlockOrigin/uAssets/blob/master/filters/lan-block.txt + // https://en.wikipedia.org/wiki/Reserved_IP_addresses + // `ipaddr` is assumed well-formed + static isLAN(ipaddr) { + const c0 = ipaddr.charCodeAt(0); + // ipv4 + if ( c0 === 0x30 /* 0 */ ) { + return ipaddr.startsWith('0.'); + } + if ( c0 === 0x31 /* 1 */ ) { + if ( ipaddr.startsWith('10.') ) { return true; } + if ( ipaddr.startsWith('127.') ) { return true; } + if ( ipaddr.startsWith('169.254.') ) { return true; } + if ( ipaddr.startsWith('172.') ) { + const v = parseInt(ipaddr.slice(4), 10); + return v >= 16 && v <= 31; + } + return ipaddr.startsWith('192.168.'); + } + if ( c0 !== 0x5B /* [ */ ) { return false; } + // ipv6 + const c1 = ipaddr.charCodeAt(1); + if ( c1 === 0x3A /* : */ ) { + if ( ipaddr.startsWith('[::') === false ) { return false; } + if ( ipaddr === '[::]' || ipaddr === '[::1]' ) { return true; } + if ( ipaddr.startsWith('[::ffff:') === false ) { return false; } + return /^\[::ffff:(7f\w{2}|a\w{2}|a9fe|c0a8):\w+\]$/.test(ipaddr); + } + if ( c1 === 0x36 /* 6 */ ) { + return ipaddr.startsWith('[64:ff9b:'); } - if ( details.$re === undefined ) { - details.$re = new RegExp(details.pattern.slice(1, -1)); + if ( c1 === 0x66 /* f */ ) { + return /^\[f[cd]\w{2}:/.test(ipaddr); } - return details.$re.test($requestAddress); + return false; + } + + static isLoopback(ipaddr) { + return ipaddr === '127.0.0.1' || ipaddr === '[::1]'; } static compile(details) { From 401d2e8ea9f31720a1ea05943be37e4275182a17 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 10 Sep 2024 11:50:09 -0400 Subject: [PATCH 199/553] [mv3] Mind unsupported `header=`/`ipaddress` options in DNR API Properly report unsupported `header=` and `ipaddress=` option in log file. `header=` support may become possible soon with Chromium 128 introducing blocking according to response headers content. --- src/js/static-net-filtering.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 967e8768756b0..0523217773114 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -2905,7 +2905,7 @@ class FilterStrictParty { static dnrFromCompiled(args, rule) { const partyness = args[1] === 0 ? 1 : 3; - dnrAddRuleError(rule, `FilterStrictParty: Strict partyness strict${partyness}p not supported`); + dnrAddRuleError(rule, `strict${partyness}p not supported`); } static keyFromArgs(args) { @@ -2953,6 +2953,10 @@ class FilterOnHeaders { ); } + static dnrFromCompiled(args, rule) { + dnrAddRuleError(rule, `header="${args[1]}" not supported`); + } + static logData(idata, details) { const irefs = filterData[idata+1]; const headerOpt = filterRefs[irefs].headerOpt; @@ -3042,6 +3046,10 @@ class FilterIPAddress { return filterDataAlloc(args[0], filterRefAdd(details)); } + static dnrFromCompiled(args, rule) { + dnrAddRuleError(rule, `"ipaddress=${args[1]}" not supported`); + } + static logData(idata, details) { const irefs = filterData[idata+1]; details.options.push(`ipaddress=${LogData.requote(filterRefs[irefs].pattern)}`); @@ -4432,6 +4440,7 @@ StaticNetFilteringEngine.prototype.dnrFromCompiled = function(op, context, ...ar [ CSP_REALM, { type: 'csp', priority: 0 } ], [ PERMISSIONS_REALM, { type: 'permissions', priority: 0 } ], [ URLTRANSFORM_REALM, { type: 'uritransform', priority: 0 } ], + [ HEADERS_REALM, { type: 'block', priority: 0 } ], ]); const partyness = new Map([ [ ANYPARTY_REALM, '' ], From 185580d23f24ecf3aded75b06ce919fa95960b25 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 10 Sep 2024 11:55:53 -0400 Subject: [PATCH 200/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66d42b2fa9124..6a061ab35e6e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add support for `lan`/`loopback` values to `ipaddress=` option](https://github.com/gorhill/uBlock/commit/030d7334e4) - [New static network filter option `ipaddress=`](https://github.com/gorhill/uBlock/commit/c6dedd253f) - [Add ability to quote static network option values](https://github.com/gorhill/uBlock/commit/20115697e5) - [Improve `prevent-fetch` scriptlet](https://github.com/gorhill/uBlock/commit/e8202af11d) From 0ae02788b20d22cac0ad7623862c9f54c667e8ff Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 10 Sep 2024 11:56:13 -0400 Subject: [PATCH 201/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 0e42031b3d95e..31b41e046d12c 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.16 \ No newline at end of file +1.59.1.17 \ No newline at end of file From 09ccfc8cfb29cc84c4a26d2e1b39f017f36e46eb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 10 Sep 2024 12:11:03 -0400 Subject: [PATCH 202/553] 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 7603b4da35ca4..31eb215b13f42 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.16", + "version": "1.59.1.17", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b16/uBlock0_1.59.1b16.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b17/uBlock0_1.59.1b17.firefox.signed.xpi" } ] } From d5f14ffa32a3b0ae3662bd8067dc937dc116d2cc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 10 Sep 2024 14:58:40 -0400 Subject: [PATCH 203/553] Avoid using dns.resolve() for proxied DNS resolution Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/1743 --- platform/firefox/vapi-background-ext.js | 47 ++----------------------- src/js/background.js | 1 - src/js/storage.js | 1 - 3 files changed, 2 insertions(+), 47 deletions(-) diff --git a/platform/firefox/vapi-background-ext.js b/platform/firefox/vapi-background-ext.js index 8ecefc9a8e197..1bb15d38b30e2 100644 --- a/platform/firefox/vapi-background-ext.js +++ b/platform/firefox/vapi-background-ext.js @@ -19,12 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -/* globals browser */ - -'use strict'; - -/******************************************************************************/ - import { domainFromHostname, hostnameFromNetworkURL, @@ -34,24 +28,6 @@ import { // Canonical name-uncloaking feature. let cnameUncloakEnabled = browser.dns instanceof Object; -let cnameUncloakProxied = false; - -// https://github.com/uBlockOrigin/uBlock-issues/issues/911 -// We detect here whether network requests are proxied, and if so, -// de-aliasing of hostnames will be disabled to avoid possible -// DNS leaks. -const proxyDetector = function(details) { - if ( details.proxyInfo instanceof Object ) { - cnameUncloakEnabled = false; - proxyDetectorTryCount = 0; - } - if ( proxyDetectorTryCount === 0 ) { - browser.webRequest.onHeadersReceived.removeListener(proxyDetector); - return; - } - proxyDetectorTryCount -= 1; -}; -let proxyDetectorTryCount = 0; // Related issues: // - https://github.com/gorhill/uBlock/issues/1327 @@ -81,9 +57,6 @@ vAPI.Net = class extends vAPI.Net { this.canUncloakCnames && options.cnameUncloakEnabled !== false; } - if ( 'cnameUncloakProxied' in options ) { - cnameUncloakProxied = options.cnameUncloakProxied === true; - } if ( 'cnameIgnoreList' in options ) { this.cnameIgnoreList = this.regexFromStrList(options.cnameIgnoreList); @@ -108,23 +81,6 @@ vAPI.Net = class extends vAPI.Net { } this.cnames.clear(); this.cnames.set('', null); this.cnameFlushTime = Date.now() + this.cnameMaxTTL * 60000; - // https://github.com/uBlockOrigin/uBlock-issues/issues/911 - // Install/remove proxy detector. - if ( vAPI.webextFlavor.major < 80 ) { - const wrohr = browser.webRequest.onHeadersReceived; - if ( cnameUncloakEnabled === false || cnameUncloakProxied ) { - if ( wrohr.hasListener(proxyDetector) ) { - wrohr.removeListener(proxyDetector); - } - } else if ( wrohr.hasListener(proxyDetector) === false ) { - wrohr.addListener( - proxyDetector, - { urls: [ '*://*/*' ] }, - [ 'blocking' ] - ); - } - proxyDetectorTryCount = 32; - } } normalizeDetails(details) { const type = details.type; @@ -236,7 +192,7 @@ vAPI.Net = class extends vAPI.Net { return /^./; } return new RegExp( - '(?:^|\.)(?:' + + '(?:^|\\.)(?:' + list.trim() .split(/\s+/) .map(a => a.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')) @@ -261,6 +217,7 @@ vAPI.Net = class extends vAPI.Net { if ( cnRecord !== undefined ) { return this.processCanonicalName(hn, cnRecord, details); } + if ( details.proxyInfo && details.proxyInfo.proxyDNS ) { return; } const documentUrl = details.documentUrl || details.url; const isRootDocument = this.cnameIgnoreRootDocument && hn === hostnameFromNetworkURL(documentUrl); diff --git a/src/js/background.js b/src/js/background.js index 2a5c2366e2982..a596710914fe9 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -61,7 +61,6 @@ const hiddenSettingsDefault = { cnameIgnoreRootDocument: true, cnameMaxTTL: 120, cnameReplayFullURL: false, - cnameUncloakProxied: false, consoleLogLevel: 'unset', debugAssetsJson: false, debugScriptlets: false, diff --git a/src/js/storage.js b/src/js/storage.js index 1163483220996..77ec90b7ddfdc 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -319,7 +319,6 @@ onBroadcast(msg => { cnameIgnoreRootDocument: µbhs.cnameIgnoreRootDocument, cnameMaxTTL: µbhs.cnameMaxTTL, cnameReplayFullURL: µbhs.cnameReplayFullURL, - cnameUncloakProxied: µbhs.cnameUncloakProxied, }); }); From c19497db3315fd1766e113b1205ea37e05753d0f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 10 Sep 2024 15:13:28 -0400 Subject: [PATCH 204/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a061ab35e6e5..ac7e1ddc34ad6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Avoid using dns.resolve() for proxied DNS resolution](https://github.com/gorhill/uBlock/commit/d5f14ffa32) - [Add support for `lan`/`loopback` values to `ipaddress=` option](https://github.com/gorhill/uBlock/commit/030d7334e4) - [New static network filter option `ipaddress=`](https://github.com/gorhill/uBlock/commit/c6dedd253f) - [Add ability to quote static network option values](https://github.com/gorhill/uBlock/commit/20115697e5) From 099b9852cd1630c7536800a5f25b8b6be0636e7b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 11 Sep 2024 09:56:44 -0400 Subject: [PATCH 205/553] Code review for `ipaddress=` filter option If an IP address can be extracted from the hostname portion of a URL, the IP address matching will be performed at onBeforeRequest() time. Regardless, IP address matching will subsequently always be performed at onHeadersReceived() time as the request details at that point contain a reliable IP address value on supported platforms (Firefox- only as of now). The `cap_ipaddress` now evaluates to `true` in Chromium-based browsers. Even though these browsers are unable to provide reliable IP address value at onHeadersReceived() time, they can still perform IP address matching for IP address extracted from hostname portion of a URL. --- platform/common/vapi-common.js | 4 +- src/js/background.js | 2 +- src/js/filtering-context.js | 29 +++++++++++- src/js/static-filtering-parser.js | 1 + src/js/static-net-filtering.js | 77 ++++++++++++++++--------------- 5 files changed, 72 insertions(+), 41 deletions(-) diff --git a/platform/common/vapi-common.js b/platform/common/vapi-common.js index 367def90a7b7f..1cf98242f3449 100644 --- a/platform/common/vapi-common.js +++ b/platform/common/vapi-common.js @@ -163,6 +163,7 @@ vAPI.webextFlavor = { // This is always true. soup.add('ublock').add('webext'); + soup.add('ipaddress'); // Whether this is a dev build. if ( /^\d+\.\d+\.\d+\D/.test(browser.runtime.getManifest().version) ) { @@ -181,8 +182,7 @@ vAPI.webextFlavor = { if ( browser.runtime.getURL('').startsWith('moz-extension://') ) { soup.add('firefox') .add('user_stylesheet') - .add('html_filtering') - .add('ipaddress'); + .add('html_filtering'); const match = /Firefox\/(\d+)/.exec(ua); flavor.major = match && parseInt(match[1], 10) || 115; } else { diff --git a/src/js/background.js b/src/js/background.js index a596710914fe9..a68487f6c6a72 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -305,8 +305,8 @@ const µBlock = { // jshint ignore:line this.realm = ''; this.setMethod(details.method); this.setURL(details.url); + this.setIPAddress(details.ip); this.aliasURL = details.aliasURL || undefined; - this.ipaddress = details.ip || undefined; this.redirectURL = undefined; this.filter = undefined; if ( this.itype !== this.SUB_FRAME ) { diff --git a/src/js/filtering-context.js b/src/js/filtering-context.js index b1d7d7033dac5..0bbd7decfb3f1 100644 --- a/src/js/filtering-context.js +++ b/src/js/filtering-context.js @@ -122,6 +122,8 @@ const methodBitToStrMap = new Map([ [ METHOD_PUT, 'put' ], ]); +const reIPv4 = /^\d+\.\d+\.\d+\.\d+$/; + /******************************************************************************/ export const FilteringContext = class { @@ -136,9 +138,9 @@ export const FilteringContext = class { this.stype = undefined; this.url = undefined; this.aliasURL = undefined; - this.ipaddress = undefined; this.hostname = undefined; this.domain = undefined; + this.ipaddress = undefined; this.docId = -1; this.frameId = -1; this.docOrigin = undefined; @@ -176,6 +178,7 @@ export const FilteringContext = class { this.url = other.url; this.hostname = other.hostname; this.domain = other.domain; + this.ipaddress = other.ipaddress; this.docId = other.docId; this.frameId = other.frameId; this.docOrigin = other.docOrigin; @@ -213,7 +216,7 @@ export const FilteringContext = class { setURL(a) { if ( a !== this.url ) { - this.hostname = this.domain = undefined; + this.hostname = this.domain = this.ipaddress = undefined; this.url = a; } return this; @@ -246,6 +249,28 @@ export const FilteringContext = class { return this; } + getIPAddress() { + if ( this.ipaddress !== undefined ) { + return this.ipaddress; + } + const ipaddr = this.getHostname(); + const c0 = ipaddr.charCodeAt(0); + if ( c0 === 0x5B /* [ */ ) { + return (this.ipaddress = ipaddr.slice(1, -1)); + } else if ( c0 >= 0x30 && c0 <= 0x39 ) { + if ( reIPv4.test(ipaddr) ) { + return (this.ipaddress = ipaddr); + } + } + return (this.ipaddress = ''); + } + + // Must always be called *after* setURL() + setIPAddress(ipaddr) { + this.ipaddress = ipaddr || undefined; + return this; + } + getDocOrigin() { if ( this.docOrigin === undefined ) { this.docOrigin = this.tabOrigin; diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index d3520b6e555c3..3d8e82fd64271 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -578,6 +578,7 @@ export const preparserIfTokens = new Set([ 'env_mv3', 'env_safari', 'cap_html_filtering', + 'cap_ipaddress', 'cap_user_stylesheet', 'false', 'ext_abp', diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 0523217773114..780015209f68b 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -2973,6 +2973,9 @@ registerFilterClass(FilterOnHeaders); /******************************************************************************/ class FilterIPAddress { + static reIPv6IPv4lan = /^::ffff:(7f\w{2}|a\w{2}|a9fe|c0a8):\w+$/; + static reIPv6local = /^f[cd]\w{2}:/; + static match(idata) { const ipaddr = $requestAddress; const details = filterRefs[filterData[idata+1]]; @@ -3011,26 +3014,26 @@ class FilterIPAddress { } return ipaddr.startsWith('192.168.'); } - if ( c0 !== 0x5B /* [ */ ) { return false; } // ipv6 - const c1 = ipaddr.charCodeAt(1); - if ( c1 === 0x3A /* : */ ) { - if ( ipaddr.startsWith('[::') === false ) { return false; } - if ( ipaddr === '[::]' || ipaddr === '[::1]' ) { return true; } - if ( ipaddr.startsWith('[::ffff:') === false ) { return false; } - return /^\[::ffff:(7f\w{2}|a\w{2}|a9fe|c0a8):\w+\]$/.test(ipaddr); - } - if ( c1 === 0x36 /* 6 */ ) { - return ipaddr.startsWith('[64:ff9b:'); - } - if ( c1 === 0x66 /* f */ ) { - return /^\[f[cd]\w{2}:/.test(ipaddr); + if ( c0 === 0x3A /* : */ ) { + if ( ipaddr.startsWith('::') === false ) { return false; } + if ( ipaddr === '::' || ipaddr === '::1' ) { return true; } + if ( ipaddr.startsWith('::ffff:') === false ) { return false; } + return this.reIPv6IPv4lan.test(ipaddr); + } + if ( ipaddr.includes(':') ) { + if ( c0 === 0x36 /* 6 */ ) { + return ipaddr.startsWith('64:ff9b:'); + } + if ( c0 === 0x66 /* f */ ) { + return this.reIPv6local.test(ipaddr); + } } return false; } static isLoopback(ipaddr) { - return ipaddr === '127.0.0.1' || ipaddr === '[::1]'; + return ipaddr === '127.0.0.1' || ipaddr === '::1'; } static compile(details) { @@ -3412,7 +3415,6 @@ class FilterCompiler { this.notTypeBits = 0; this.methodBits = 0; this.notMethodBits = 0; - this.responseHeadersRealm = false; return this; } @@ -3532,13 +3534,11 @@ class FilterCompiler { case sfp.NODE_TYPE_NET_OPTION_NAME_HEADER: { this.optionValues.set('header', parser.getNetOptionValue(id) || ''); this.optionUnitBits |= HEADER_BIT; - this.responseHeadersRealm = true; break; } case sfp.NODE_TYPE_NET_OPTION_NAME_IPADDRESS: this.optionValues.set('ipaddress', parser.getNetOptionValue(id) || ''); this.optionUnitBits |= IPADDRESS_BIT; - this.responseHeadersRealm = true; break; case sfp.NODE_TYPE_NET_OPTION_NAME_METHOD: this.processMethodOption(parser.getNetOptionValue(id)); @@ -4008,7 +4008,7 @@ class FilterCompiler { } // Origin - if ( this.optionValues.has('from') ) { + if ( (this.optionUnitBits & FROM_BIT) !== 0 ) { compileFromDomainOpt( this.optionValues.get('fromList'), units.length !== 0 && patternClass.isSlow === true, @@ -4017,7 +4017,7 @@ class FilterCompiler { } // Destination - if ( this.optionValues.has('to') ) { + if ( (this.optionUnitBits & TO_BIT) !== 0 ) { compileToDomainOpt( this.optionValues.get('toList'), units.length !== 0 && patternClass.isSlow === true, @@ -4026,18 +4026,18 @@ class FilterCompiler { } // Deny-allow - if ( this.optionValues.has('denyallow') ) { + if ( (this.optionUnitBits & DENYALLOW_BIT) !== 0 ) { units.push(FilterDenyAllow.compile(this)); } + // IP address + if ( (this.optionUnitBits & IPADDRESS_BIT) !== 0 ) { + units.push(FilterIPAddress.compile(this)); + } + // Header - if ( this.responseHeadersRealm ) { - if ( this.optionValues.has('ipaddress') ) { - units.push(FilterIPAddress.compile(this)); - } - if ( this.optionValues.has('header') ) { - units.push(FilterOnHeaders.compile(this)); - } + if ( (this.optionUnitBits & HEADER_BIT) !== 0 ) { + units.push(FilterOnHeaders.compile(this)); this.action |= HEADERS_REALM; } @@ -4058,12 +4058,17 @@ class FilterCompiler { modifierBitsFromType.get(this.modifyType); } - this.compileToAtomicFilter( - units.length === 1 - ? units[0] - : FilterCompositeAll.compile(units), - writer - ); + const fdata = units.length === 1 + ? units[0] + : FilterCompositeAll.compile(units); + + this.compileToAtomicFilter(fdata, writer); + + if ( (this.optionUnitBits & IPADDRESS_BIT) !== 0 ) { + if ( (this.action & HEADERS_REALM) !== 0 ) { return; } + this.action |= HEADERS_REALM; + this.compileToAtomicFilter(fdata, writer); + } } compilePattern(units) { @@ -4856,7 +4861,7 @@ StaticNetFilteringEngine.prototype.matchAndFetchModifiers = function( $requestHostname = fctxt.getHostname(); $requestMethodBit = fctxt.method || 0; $requestTypeValue = (typeBits & TypeBitsMask) >>> TypeBitsOffset; - $requestAddress = fctxt.ipaddress || ''; + $requestAddress = fctxt.getIPAddress(); const modifierType = modifierTypeFromName.get(modifierName); const modifierBits = modifierBitsFromType.get(modifierType); @@ -5223,7 +5228,7 @@ StaticNetFilteringEngine.prototype.matchRequest = function(fctxt, modifiers = 0) $requestHostname = fctxt.getHostname(); $requestMethodBit = fctxt.method || 0; $requestTypeValue = (typeBits & TypeBitsMask) >>> TypeBitsOffset; - $requestAddress = fctxt.ipaddress || ''; + $requestAddress = fctxt.getIPAddress(); $isBlockImportant = false; // Evaluate block realm before allow realm, and allow realm before @@ -5259,7 +5264,7 @@ StaticNetFilteringEngine.prototype.matchHeaders = function(fctxt, headers) { $requestHostname = fctxt.getHostname(); $requestMethodBit = fctxt.method || 0; $requestTypeValue = (typeBits & TypeBitsMask) >>> TypeBitsOffset; - $requestAddress = fctxt.ipaddress || ''; + $requestAddress = fctxt.getIPAddress(); $httpHeaders.init(headers); let r = 0; From 0e2f04eb2bc61ae2fbc417bfd129975091cbc31b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 11 Sep 2024 10:21:50 -0400 Subject: [PATCH 206/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 31b41e046d12c..b3939ab3af9cf 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.17 \ No newline at end of file +1.59.1.18 \ No newline at end of file From 44b6519db1c335caa7c272296a986feeab329377 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 11 Sep 2024 10:41:19 -0400 Subject: [PATCH 207/553] 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 31eb215b13f42..c1705781c285b 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.17", + "version": "1.59.1.18", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b17/uBlock0_1.59.1b17.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b18/uBlock0_1.59.1b18.firefox.signed.xpi" } ] } From 6acf97bf5143543c036c38a82160e5f8efe8b3f1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 12 Sep 2024 11:19:57 -0400 Subject: [PATCH 208/553] Rewrite cname uncloaking code to account for new `ipaddress=` option This commit makes the DNS resolution code better suited for both filtering on cname and ip address. The change allows early availability of ip address so that `ipaddress=` option can be matched at onBeforeRequest time. As a result, it is now possible to block root document using `ipaddress=` option -- so long as an ip address can be extracted before first onBeforeRequest() call. Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/2792 Caveat ------ the ip address used is the first one among the list of ip addresses returned by dns.resolve() method. There is no way for uBO to know which exact ip address will be used by the browser when sending the request, so this is at most a best guess. The exact IP address used by the browser is available at onHeadersReceived time, and uBO will also filter according to this value, but by then the network request has already been sent to the remote server. Possibly a future improvement would make available the whole list of ip addresses to the filtering engine, but even then it's impossible to know with certainty which ip address will ultimately be used by the browser -- it is entirely possible that the ip address used by the browser might not be in the list received through dns.resolve(). --- platform/chromium/manifest.json | 2 +- platform/firefox/vapi-background-ext.js | 244 +++++++++++++++--------- platform/opera/manifest.json | 2 +- src/js/background.js | 1 - 4 files changed, 153 insertions(+), 96 deletions(-) diff --git a/platform/chromium/manifest.json b/platform/chromium/manifest.json index 637b26764bcdc..ba860b6e36bd7 100644 --- a/platform/chromium/manifest.json +++ b/platform/chromium/manifest.json @@ -89,7 +89,7 @@ }, "incognito": "split", "manifest_version": 2, - "minimum_chrome_version": "73.0", + "minimum_chrome_version": "80.0", "name": "uBlock Origin", "options_ui": { "page": "dashboard.html", diff --git a/platform/firefox/vapi-background-ext.js b/platform/firefox/vapi-background-ext.js index 1bb15d38b30e2..d3abf2749586b 100644 --- a/platform/firefox/vapi-background-ext.js +++ b/platform/firefox/vapi-background-ext.js @@ -26,8 +26,10 @@ import { /******************************************************************************/ -// Canonical name-uncloaking feature. -let cnameUncloakEnabled = browser.dns instanceof Object; +const dnsAPI = browser.dns; + +const isPromise = o => o instanceof Promise; +const reIPv4 = /^\d+\.\d+\.\d+\.\d+$/ // Related issues: // - https://github.com/gorhill/uBlock/issues/1327 @@ -40,21 +42,24 @@ vAPI.Net = class extends vAPI.Net { constructor() { super(); this.pendingRequests = []; - this.canUncloakCnames = browser.dns instanceof Object; - this.cnames = new Map([ [ '', null ] ]); + this.dnsList = []; // ring buffer + this.dnsWritePtr = 0; // next write pointer in ring buffer + this.dnsMaxCount = 256; // max size of ring buffer + this.dnsDict = new Map(); // hn to index in ring buffer + this.dnsEntryTTL = 60000; // delay after which an entry is obsolete + this.canUncloakCnames = true; + this.cnameUncloakEnabled = true; this.cnameIgnoreList = null; this.cnameIgnore1stParty = true; this.cnameIgnoreExceptions = true; this.cnameIgnoreRootDocument = true; - this.cnameMaxTTL = 120; this.cnameReplayFullURL = false; - this.cnameFlushTime = Date.now() + this.cnameMaxTTL * 60000; } + setOptions(options) { super.setOptions(options); if ( 'cnameUncloakEnabled' in options ) { - cnameUncloakEnabled = - this.canUncloakCnames && + this.cnameUncloakEnabled = options.cnameUncloakEnabled !== false; } if ( 'cnameIgnoreList' in options ) { @@ -73,15 +78,13 @@ vAPI.Net = class extends vAPI.Net { this.cnameIgnoreRootDocument = options.cnameIgnoreRootDocument !== false; } - if ( 'cnameMaxTTL' in options ) { - this.cnameMaxTTL = options.cnameMaxTTL || 120; - } if ( 'cnameReplayFullURL' in options ) { this.cnameReplayFullURL = options.cnameReplayFullURL === true; } - this.cnames.clear(); this.cnames.set('', null); - this.cnameFlushTime = Date.now() + this.cnameMaxTTL * 60000; + this.dnsList.fill(null); + this.dnsDict.clear(); } + normalizeDetails(details) { const type = details.type; @@ -104,6 +107,7 @@ vAPI.Net = class extends vAPI.Net { } } } + denormalizeTypes(types) { if ( types.length === 0 ) { return Array.from(this.validTypes); @@ -122,75 +126,19 @@ vAPI.Net = class extends vAPI.Net { } return Array.from(out); } + canonicalNameFromHostname(hn) { - const cnRecord = this.cnames.get(hn); - if ( cnRecord !== undefined && cnRecord !== null ) { - return cnRecord.cname; - } - } - processCanonicalName(hn, cnRecord, details) { - if ( cnRecord === null ) { return; } - if ( cnRecord.isRootDocument ) { return; } - const hnBeg = details.url.indexOf(hn); - if ( hnBeg === -1 ) { return; } - const oldURL = details.url; - let newURL = oldURL.slice(0, hnBeg) + cnRecord.cname; - const hnEnd = hnBeg + hn.length; - if ( this.cnameReplayFullURL ) { - newURL += oldURL.slice(hnEnd); - } else { - const pathBeg = oldURL.indexOf('/', hnEnd); - if ( pathBeg !== -1 ) { - newURL += oldURL.slice(hnEnd, pathBeg + 1); - } - } - details.url = newURL; - details.aliasURL = oldURL; - return super.onBeforeSuspendableRequest(details); - } - recordCanonicalName(hn, record, isRootDocument) { - if ( (this.cnames.size & 0b111111) === 0 ) { - const now = Date.now(); - if ( now >= this.cnameFlushTime ) { - this.cnames.clear(); this.cnames.set('', null); - this.cnameFlushTime = now + this.cnameMaxTTL * 60000; - } - } - let cname = - typeof record.canonicalName === 'string' && - record.canonicalName !== hn - ? record.canonicalName - : ''; - if ( - cname !== '' && - this.cnameIgnore1stParty && - domainFromHostname(cname) === domainFromHostname(hn) - ) { - cname = ''; - } - if ( - cname !== '' && - this.cnameIgnoreList !== null && - this.cnameIgnoreList.test(cname) - ) { - cname = ''; - } - const cnRecord = cname !== '' ? { cname, isRootDocument } : null; - this.cnames.set(hn, cnRecord); - return cnRecord; + if ( hn === '' ) { return; } + const dnsEntry = this.dnsFromCache(hn); + if ( isPromise(dnsEntry) ) { return; } + return dnsEntry?.cname; } + regexFromStrList(list) { - if ( - typeof list !== 'string' || - list.length === 0 || - list === 'unset' || - browser.dns instanceof Object === false - ) { + if ( typeof list !== 'string' || list.length === 0 || list === 'unset' ) { return null; } - if ( list === '*' ) { - return /^./; - } + if ( list === '*' ) { return /^./; } return new RegExp( '(?:^|\\.)(?:' + list.trim() @@ -200,9 +148,14 @@ vAPI.Net = class extends vAPI.Net { ')$' ); } + onBeforeSuspendableRequest(details) { + const hn = hostnameFromNetworkURL(details.url); + const dnsEntry = this.dnsFromCache(hn); + if ( dnsEntry?.ip ) { + details.ip = dnsEntry.ip; + } const r = super.onBeforeSuspendableRequest(details); - if ( cnameUncloakEnabled === false ) { return r; } if ( r !== undefined ) { if ( r.cancel === true || @@ -212,25 +165,128 @@ vAPI.Net = class extends vAPI.Net { return r; } } - const hn = hostnameFromNetworkURL(details.url); - const cnRecord = this.cnames.get(hn); - if ( cnRecord !== undefined ) { - return this.processCanonicalName(hn, cnRecord, details); + if ( dnsEntry !== undefined ) { + if ( isPromise(dnsEntry) === false ) { + return this.onAfterDNSResolution(hn, details, dnsEntry); + } } - if ( details.proxyInfo && details.proxyInfo.proxyDNS ) { return; } - const documentUrl = details.documentUrl || details.url; - const isRootDocument = this.cnameIgnoreRootDocument && - hn === hostnameFromNetworkURL(documentUrl); - return browser.dns.resolve(hn, [ 'canonical_name' ]).then( - rec => { - const cnRecord = this.recordCanonicalName(hn, rec, isRootDocument); - return this.processCanonicalName(hn, cnRecord, details); - }, - ( ) => { - this.cnames.set(hn, null); + if ( this.dnsShouldResolve(hn) === false ) { return; } + if ( details.proxyInfo?.proxyDNS ) { return; } + const promise = dnsEntry || this.dnsResolve(hn, details); + return promise.then(( ) => this.onAfterDNSResolution(hn, details)); + } + + onAfterDNSResolution(hn, details, dnsEntry) { + if ( dnsEntry === undefined ) { + dnsEntry = this.dnsFromCache(hn); + if ( dnsEntry === undefined || isPromise(dnsEntry) ) { return; } + } + let proceed = false; + if ( dnsEntry.cname && this.cnameUncloakEnabled ) { + const newURL = this.uncloakURL(hn, dnsEntry, details); + if ( newURL ) { + details.aliasURL = details.url; + details.url = newURL; + proceed = true; } + } + if ( dnsEntry.ip && details.ip !== dnsEntry.ip ) { + details.ip = dnsEntry.ip + proceed = true; + } + if ( proceed === false ) { return; } + // Must call method on base class + return super.onBeforeSuspendableRequest(details); + } + + dnsToCache(hn, record, details) { + const i = this.dnsDict.get(hn); + if ( i === undefined ) { return; } + const dnsEntry = { + hn, + until: Date.now() + this.dnsEntryTTL, + }; + if ( record ) { + const cname = this.cnameFromRecord(hn, record, details); + if ( cname ) { dnsEntry.cname = cname; } + const ip = this.ipFromRecord(record); + if ( ip ) { dnsEntry.ip = ip; } + } + this.dnsList[i] = dnsEntry; + return dnsEntry; + } + + dnsFromCache(hn) { + const i = this.dnsDict.get(hn); + if ( i === undefined ) { return; } + const dnsEntry = this.dnsList[i]; + if ( dnsEntry === null ) { return; } + if ( isPromise(dnsEntry) ) { return dnsEntry; } + if ( dnsEntry.hn !== hn ) { return; } + if ( dnsEntry.until >= Date.now() ) { return dnsEntry; } + this.dnsList[i] = null; + this.dnsDict.delete(hn) + } + + dnsShouldResolve(hn) { + if ( hn === '' ) { return false; } + const c0 = hn.charCodeAt(0); + if ( c0 === 0x5B /* [ */ ) { return false; } + if ( c0 > 0x39 /* 9 */ ) { return true; } + return reIPv4.test(hn) === false; + } + + dnsResolve(hn, details) { + const i = this.dnsWritePtr++; + this.dnsWritePtr %= this.dnsMaxCount; + this.dnsDict.set(hn, i); + const promise = dnsAPI.resolve(hn, [ 'canonical_name' ]).then( + rec => this.dnsToCache(hn, rec, details), + ( ) => this.dnsToCache(hn) ); + return (this.dnsList[i] = promise); } + + cnameFromRecord(hn, record, details) { + const cn = record.canonicalName; + if ( cn === undefined ) { return; } + if ( cn === hn ) { return; } + if ( this.cnameIgnore1stParty ) { + if ( domainFromHostname(cn) === domainFromHostname(hn) ) { return; } + } + if ( this.cnameIgnoreList !== null ) { + if ( this.cnameIgnoreList.test(cn) === false ) { return; } + } + if ( this.cnameIgnoreRootDocument ) { + const origin = hostnameFromNetworkURL(details.documentUrl || details.url); + if ( hn === origin ) { return; } + } + return cn; + } + + uncloakURL(hn, dnsEntry, details) { + const hnBeg = details.url.indexOf(hn); + if ( hnBeg === -1 ) { return; } + const oldURL = details.url; + const newURL = oldURL.slice(0, hnBeg) + dnsEntry.cname; + const hnEnd = hnBeg + hn.length; + if ( this.cnameReplayFullURL ) { + return newURL + oldURL.slice(hnEnd); + } + const pathBeg = oldURL.indexOf('/', hnEnd); + if ( pathBeg !== -1 ) { + return newURL + oldURL.slice(hnEnd, pathBeg + 1); + } + return newURL; + } + + ipFromRecord(record) { + const { addresses } = record; + if ( Array.isArray(addresses) === false ) { return; } + if ( addresses.length === 0 ) { return; } + return addresses[0]; + } + suspendOneRequest(details) { const pending = { details: Object.assign({}, details), @@ -243,6 +299,7 @@ vAPI.Net = class extends vAPI.Net { this.pendingRequests.push(pending); return pending.promise; } + unsuspendAllRequests(discard = false) { const pendingRequests = this.pendingRequests; this.pendingRequests = []; @@ -254,6 +311,7 @@ vAPI.Net = class extends vAPI.Net { ); } } + static canSuspend() { return true; } diff --git a/platform/opera/manifest.json b/platform/opera/manifest.json index 196c171726670..38015c3959979 100644 --- a/platform/opera/manifest.json +++ b/platform/opera/manifest.json @@ -88,7 +88,7 @@ }, "incognito": "split", "manifest_version": 2, - "minimum_opera_version": "60.0", + "minimum_opera_version": "67.0", "name": "uBlock Origin", "options_page": "dashboard.html", "permissions": [ diff --git a/src/js/background.js b/src/js/background.js index a68487f6c6a72..939c559c32167 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -59,7 +59,6 @@ const hiddenSettingsDefault = { cnameIgnore1stParty: true, cnameIgnoreExceptions: true, cnameIgnoreRootDocument: true, - cnameMaxTTL: 120, cnameReplayFullURL: false, consoleLogLevel: 'unset', debugAssetsJson: false, From 71f07b18aebabcb985f15c3789c4a1b851dca1fd Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 12 Sep 2024 11:41:26 -0400 Subject: [PATCH 209/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac7e1ddc34ad6..5cb5d42cbc4ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Rewrite cname uncloaking code to account for new `ipaddress=` option](https://github.com/gorhill/uBlock/commit/6acf97bf51) - [Avoid using dns.resolve() for proxied DNS resolution](https://github.com/gorhill/uBlock/commit/d5f14ffa32) - [Add support for `lan`/`loopback` values to `ipaddress=` option](https://github.com/gorhill/uBlock/commit/030d7334e4) - [New static network filter option `ipaddress=`](https://github.com/gorhill/uBlock/commit/c6dedd253f) From 9b967eccc84cb938fffc9b602c566cb028f6c4de Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 12 Sep 2024 11:42:03 -0400 Subject: [PATCH 210/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index b3939ab3af9cf..d9155e0cf75ab 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.18 \ No newline at end of file +1.59.1.19 \ No newline at end of file From 671b0c540ca75866792697bb0555df44b03da945 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 12 Sep 2024 12:06:26 -0400 Subject: [PATCH 211/553] 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 c1705781c285b..5a4347f7cc7d3 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.18", + "version": "1.59.1.19", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b18/uBlock0_1.59.1b18.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b19/uBlock0_1.59.1b19.firefox.signed.xpi" } ] } From 8fadfb2c5eab528e22a134c552fc2eb07c3da9de Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 12 Sep 2024 15:40:24 -0400 Subject: [PATCH 212/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.id.txt | 2 +- platform/mv3/description/webstore.ja.txt | 2 +- platform/mv3/extension/_locales/bg/messages.json | 2 +- platform/mv3/extension/_locales/eu/messages.json | 2 +- platform/mv3/extension/_locales/id/messages.json | 2 +- platform/mv3/extension/_locales/pt_PT/messages.json | 4 ++-- platform/mv3/extension/_locales/ro/messages.json | 2 +- platform/mv3/extension/_locales/sq/messages.json | 4 ++-- platform/mv3/extension/_locales/vi/messages.json | 2 +- src/_locales/fi/messages.json | 4 ++-- 10 files changed, 13 insertions(+), 13 deletions(-) diff --git a/platform/mv3/description/webstore.id.txt b/platform/mv3/description/webstore.id.txt index b9ba140a727ec..92e0b9852bd34 100644 --- a/platform/mv3/description/webstore.id.txt +++ b/platform/mv3/description/webstore.id.txt @@ -7,7 +7,7 @@ Kumpulan aturan bawaan sesuai dengan kumpulan penyaringan bawaan uBlock Origin: - EasyPrivacy - Daftar server iklan dan pelacak Peter Lowe -You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Anda dapat mengaktifkan lebih banyak kumpulan pengaturan dengan mengunjungi halaman opsi - klik ikon _Cogs_ pada panel popup. uBOL sepenuhnya deklaratif, yang mana tidak membutuhkan proses permanen uBOL agar penyaringan dapat terjadi, dan penyaringan konten berbasis injeksi CSS/JS dilakukan sepenuhnya oleh peramban itu sendiri ketimbang oleh ekstensi. Ini berarti bahwa uBOL sendiri tidak mengkonsumsi sumber daya CPU/memori selama melakukan pemblokiran konten -- proses pekerja layanan uBOL dibutuhkan _hanya_ ketika Anda berinteraksi dengan panel popup atau opsi halaman. diff --git a/platform/mv3/description/webstore.ja.txt b/platform/mv3/description/webstore.ja.txt index c6ef50e37d00b..4271d4a7d3562 100644 --- a/platform/mv3/description/webstore.ja.txt +++ b/platform/mv3/description/webstore.ja.txt @@ -19,7 +19,7 @@ uBOL はインストール時に広範な「データの読み取りと変更」 ブラウザは、現在のサイトで拡張機能によってリクエストされた追加の権限を付与することによってもたらされる影響について警告します。承認または拒否することができます。 -閲覧中のサイトに対するuBOLの追加的な権限要求リクエストを承認すると、そのサイトへのコンテンツフィルタリングの品質をあげることができます。 +現在のサイトでの uBOL のリクエストを承認すると、現在のサイトにより良いフィルターを適用できるようになります。 uBOL の設定ページで既定のフィルタリングモードを設定できます。 「最適」または「完全」を規定のフィルタリング モードに設定した場合、すべてのWebサイトで「データの読み取りと変更」権限を付与する必要があります。 diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index 6ac57860653fc..0d35e5ec11f44 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -148,7 +148,7 @@ "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[само имена на хостове]\nprimer.com\nigri.primer\n...", + "message": "[само имена на хостове]\nexample.com\ngames.example\n...", "description": "Default text for in edit field" }, "behaviorSectionLabel": { diff --git a/platform/mv3/extension/_locales/eu/messages.json b/platform/mv3/extension/_locales/eu/messages.json index ac5c05b345274..204ddba5bc649 100644 --- a/platform/mv3/extension/_locales/eu/messages.json +++ b/platform/mv3/extension/_locales/eu/messages.json @@ -148,7 +148,7 @@ "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[hostnames only]\nexample.com\ngames.example\n...", + "message": "[zerbitzari izenak bakarrik]\nadibidea.eus\nexample.com\ngames.example", "description": "Default text for in edit field" }, "behaviorSectionLabel": { diff --git a/platform/mv3/extension/_locales/id/messages.json b/platform/mv3/extension/_locales/id/messages.json index 8041d111ad497..7907760e09ecd 100644 --- a/platform/mv3/extension/_locales/id/messages.json +++ b/platform/mv3/extension/_locales/id/messages.json @@ -148,7 +148,7 @@ "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[hostnames only]\nexample.com\ngames.example\n...", + "message": "[hanya nama host]\ncontoh.com\npermainan.contoh\n...", "description": "Default text for in edit field" }, "behaviorSectionLabel": { diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index 52917d37ecb71..e7f1ac7a71a37 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -144,11 +144,11 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Lista de nomes de anfitriões para os quais não será efetuada qualquer filtragem.", + "message": "Lista de sítios ‘web’ para os quais não será efetuada qualquer filtragem.", "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[hostnames only]\nexemplo.com\njogos.exemplo\n...", + "message": "[apenas nomes de anfitriões]\nexemplo.com\njogos.exemplo\n...", "description": "Default text for in edit field" }, "behaviorSectionLabel": { diff --git a/platform/mv3/extension/_locales/ro/messages.json b/platform/mv3/extension/_locales/ro/messages.json index c953b4626e9e1..4502d6086b52a 100644 --- a/platform/mv3/extension/_locales/ro/messages.json +++ b/platform/mv3/extension/_locales/ro/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Lista numelor mașinilor pentru care nu se va face filtrare", + "message": "Lista numelor site-urilor pentru care nu se va face filtrare", "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index 986b72a0479ec..d7ec67c9dfe6d 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -144,11 +144,11 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Emrat e hosteve që nuk do të kalojnë në filtër", + "message": "Lista e uebsajteve që nuk do të kalojnë në filtër.", "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[hostnames only]\nexample.com\ngames.example\n...", + "message": "[vetëm emrat e hosteve]\nshembull.com\nlojera.shembull\n...", "description": "Default text for in edit field" }, "behaviorSectionLabel": { diff --git a/platform/mv3/extension/_locales/vi/messages.json b/platform/mv3/extension/_locales/vi/messages.json index 0a9042b6f3652..9a612c32deee0 100644 --- a/platform/mv3/extension/_locales/vi/messages.json +++ b/platform/mv3/extension/_locales/vi/messages.json @@ -148,7 +148,7 @@ "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[hostnames only]\nexample.com\ngames.example\n...", + "message": "[hostnames only]\nexample.com\ngames.example", "description": "Default text for in edit field" }, "behaviorSectionLabel": { diff --git a/src/_locales/fi/messages.json b/src/_locales/fi/messages.json index 1f3677df2940c..881e7f6e1e637 100644 --- a/src/_locales/fi/messages.json +++ b/src/_locales/fi/messages.json @@ -544,7 +544,7 @@ "description": "Label for the checkbox use to enable/disable 'My filters' list" }, "1pTrustMyFiltersLabel": { - "message": "Salli omat suodattimet, joihin luotat", + "message": "Salli luottamusta edellyttävät omat suodattimet", "description": "Label for the checkbox use to trust the content of 'My filters' list" }, "1pImport": { @@ -1264,7 +1264,7 @@ "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, "toggleJavascript": { - "message": "Kytke JavaScript käyttöön/pois käytöstä", + "message": "Kytke JavaScript", "description": "Label for keyboard shortcut used to toggle no-scripting switch" }, "relaxBlockingMode": { From 73ee3ffe9259f23f97006ef01c588584f90875f9 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 13 Sep 2024 10:00:41 -0400 Subject: [PATCH 213/553] Code review of DNS-related code Related commit: https://github.com/gorhill/uBlock/commit/6acf97bf5143543c036c38a82160e5f8efe8b3f1 --- platform/firefox/vapi-background-ext.js | 72 +++++++++++++++---------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/platform/firefox/vapi-background-ext.js b/platform/firefox/vapi-background-ext.js index d3abf2749586b..acc65da325930 100644 --- a/platform/firefox/vapi-background-ext.js +++ b/platform/firefox/vapi-background-ext.js @@ -27,10 +27,13 @@ import { /******************************************************************************/ const dnsAPI = browser.dns; - const isPromise = o => o instanceof Promise; +const isResolvedObject = o => o instanceof Object && + o instanceof Promise === false; const reIPv4 = /^\d+\.\d+\.\d+\.\d+$/ +/******************************************************************************/ + // Related issues: // - https://github.com/gorhill/uBlock/issues/1327 // - https://github.com/uBlockOrigin/uBlock-issues/issues/128 @@ -87,12 +90,10 @@ vAPI.Net = class extends vAPI.Net { normalizeDetails(details) { const type = details.type; - if ( type === 'imageset' ) { details.type = 'image'; return; } - // https://github.com/uBlockOrigin/uBlock-issues/issues/345 // Re-categorize an embedded object as a `sub_frame` if its // content type is that of a HTML document. @@ -130,8 +131,8 @@ vAPI.Net = class extends vAPI.Net { canonicalNameFromHostname(hn) { if ( hn === '' ) { return; } const dnsEntry = this.dnsFromCache(hn); - if ( isPromise(dnsEntry) ) { return; } - return dnsEntry?.cname; + if ( isResolvedObject(dnsEntry) === false ) { return; } + return dnsEntry.cname; } regexFromStrList(list) { @@ -152,7 +153,7 @@ vAPI.Net = class extends vAPI.Net { onBeforeSuspendableRequest(details) { const hn = hostnameFromNetworkURL(details.url); const dnsEntry = this.dnsFromCache(hn); - if ( dnsEntry?.ip ) { + if ( isResolvedObject(dnsEntry) && dnsEntry.ip ) { details.ip = dnsEntry.ip; } const r = super.onBeforeSuspendableRequest(details); @@ -165,10 +166,8 @@ vAPI.Net = class extends vAPI.Net { return r; } } - if ( dnsEntry !== undefined ) { - if ( isPromise(dnsEntry) === false ) { - return this.onAfterDNSResolution(hn, details, dnsEntry); - } + if ( isResolvedObject(dnsEntry) ) { + return this.onAfterDNSResolution(hn, details, dnsEntry); } if ( this.dnsShouldResolve(hn) === false ) { return; } if ( details.proxyInfo?.proxyDNS ) { return; } @@ -179,7 +178,7 @@ vAPI.Net = class extends vAPI.Net { onAfterDNSResolution(hn, details, dnsEntry) { if ( dnsEntry === undefined ) { dnsEntry = this.dnsFromCache(hn); - if ( dnsEntry === undefined || isPromise(dnsEntry) ) { return; } + if ( isResolvedObject(dnsEntry) === false ) { return; } } let proceed = false; if ( dnsEntry.cname && this.cnameUncloakEnabled ) { @@ -200,32 +199,51 @@ vAPI.Net = class extends vAPI.Net { } dnsToCache(hn, record, details) { - const i = this.dnsDict.get(hn); - if ( i === undefined ) { return; } - const dnsEntry = { - hn, - until: Date.now() + this.dnsEntryTTL, - }; + const dnsEntry = { hn, until: Date.now() + this.dnsEntryTTL }; if ( record ) { const cname = this.cnameFromRecord(hn, record, details); if ( cname ) { dnsEntry.cname = cname; } const ip = this.ipFromRecord(record); if ( ip ) { dnsEntry.ip = ip; } } - this.dnsList[i] = dnsEntry; + this.dnsSetCache(-1, hn, dnsEntry); return dnsEntry; } dnsFromCache(hn) { const i = this.dnsDict.get(hn); if ( i === undefined ) { return; } + if ( isPromise(i) ) { return i; } const dnsEntry = this.dnsList[i]; - if ( dnsEntry === null ) { return; } - if ( isPromise(dnsEntry) ) { return dnsEntry; } - if ( dnsEntry.hn !== hn ) { return; } - if ( dnsEntry.until >= Date.now() ) { return dnsEntry; } - this.dnsList[i] = null; - this.dnsDict.delete(hn) + if ( dnsEntry !== null && dnsEntry.hn === hn ) { + if ( dnsEntry.until >= Date.now() ) { + return dnsEntry; + } + } + this.dnsSetCache(i); + } + + dnsSetCache(i, hn, after) { + if ( i < 0 ) { + const j = this.dnsDict.get(hn); + if ( typeof j === 'number' ) { + this.dnsList[j] = after; + return; + } + i = this.dnsWritePtr++; + this.dnsWritePtr %= this.dnsMaxCount; + } + const before = this.dnsList[i]; + if ( before ) { + this.dnsDict.delete(before.hn); + } + if ( after ) { + this.dnsDict.set(hn, i); + this.dnsList[i] = after; + } else { + if ( hn ) { this.dnsDict.delete(hn); } + this.dnsList[i] = null; + } } dnsShouldResolve(hn) { @@ -237,14 +255,12 @@ vAPI.Net = class extends vAPI.Net { } dnsResolve(hn, details) { - const i = this.dnsWritePtr++; - this.dnsWritePtr %= this.dnsMaxCount; - this.dnsDict.set(hn, i); const promise = dnsAPI.resolve(hn, [ 'canonical_name' ]).then( rec => this.dnsToCache(hn, rec, details), ( ) => this.dnsToCache(hn) ); - return (this.dnsList[i] = promise); + this.dnsDict.set(hn, promise); + return promise; } cnameFromRecord(hn, record, details) { From 63e5611877e2cefb92e2300a2e027ff4506f6fea Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 13 Sep 2024 10:04:13 -0400 Subject: [PATCH 214/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index d9155e0cf75ab..4058c0b4b7223 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.19 \ No newline at end of file +1.59.1.20 \ No newline at end of file From d1db02b04c9eabc05f5a5f56f99fa882f10bc6ce Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 13 Sep 2024 10:11:27 -0400 Subject: [PATCH 215/553] 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 5a4347f7cc7d3..3d1492ec3e0b6 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.19", + "version": "1.59.1.20", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b19/uBlock0_1.59.1b19.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b20/uBlock0_1.59.1b20.firefox.signed.xpi" } ] } From 93042eced4e4fabc18d76d92f6a16362965593cf Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 13 Sep 2024 11:20:37 -0400 Subject: [PATCH 216/553] Use dummy dns API when it's not present --- platform/firefox/vapi-background-ext.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/firefox/vapi-background-ext.js b/platform/firefox/vapi-background-ext.js index acc65da325930..5d3ff8c5dfbdd 100644 --- a/platform/firefox/vapi-background-ext.js +++ b/platform/firefox/vapi-background-ext.js @@ -26,7 +26,12 @@ import { /******************************************************************************/ -const dnsAPI = browser.dns; +const dnsAPI = browser.dns || { + resolve() { + return Promise.resolve(); + } +}; + const isPromise = o => o instanceof Promise; const isResolvedObject = o => o instanceof Object && o instanceof Promise === false; From 5e6f78a902be689f675fd462817c43e0381970be Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 14 Sep 2024 00:10:34 -0400 Subject: [PATCH 217/553] Fix regression re. `mp4` filter option Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3375 --- src/js/static-filtering-parser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index 3d8e82fd64271..ee3318240dd41 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -900,7 +900,7 @@ export class AstFilterParser { this.reGoodRegexToken = /[^\x01%0-9A-Za-z][%0-9A-Za-z]{7,}|[^\x01%0-9A-Za-z][%0-9A-Za-z]{1,6}[^\x01%0-9A-Za-z]/; this.reBadCSP = /(?:^|[;,])\s*report-(?:to|uri)\b/i; this.reBadPP = /(?:^|[;,])\s*report-to\b/i; - this.reNetOption = /^(~?)([13a-z_-]+)(=?)/; + this.reNetOption = /^(~?)([134a-z_-]+)(=?)/; this.reNoopOption = /^_+$/; this.netOptionValueParser = new ArgListParser(','); this.scriptletArgListParser = new ArgListParser(','); From 42700a6f76737cf006ae88f19a3e870a279801fb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 14 Sep 2024 00:12:00 -0400 Subject: [PATCH 218/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 4058c0b4b7223..1a627ff03ae93 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.20 \ No newline at end of file +1.59.1.21 \ No newline at end of file From f9ab4b75041815e6e5690d80851189ae3dc660d0 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 14 Sep 2024 00:15:41 -0400 Subject: [PATCH 219/553] 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 3d1492ec3e0b6..72ea093e8c640 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.20", + "version": "1.59.1.21", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b20/uBlock0_1.59.1b20.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b21/uBlock0_1.59.1b21.firefox.signed.xpi" } ] } From 41d49921c8a9061ced09ac84ef3a4bc4162f5c01 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 14 Sep 2024 09:20:54 -0400 Subject: [PATCH 220/553] Minor code review --- src/js/filtering-context.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/filtering-context.js b/src/js/filtering-context.js index 0bbd7decfb3f1..933785f55114a 100644 --- a/src/js/filtering-context.js +++ b/src/js/filtering-context.js @@ -257,7 +257,7 @@ export const FilteringContext = class { const c0 = ipaddr.charCodeAt(0); if ( c0 === 0x5B /* [ */ ) { return (this.ipaddress = ipaddr.slice(1, -1)); - } else if ( c0 >= 0x30 && c0 <= 0x39 ) { + } else if ( c0 <= 0x39 && c0 >= 0x30 ) { if ( reIPv4.test(ipaddr) ) { return (this.ipaddress = ipaddr); } From f936dfa6486a19899d414d725e94c21a14a5cbfb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 14 Sep 2024 09:31:22 -0400 Subject: [PATCH 221/553] Fix potential failure to unregister scriptlet In Firefox-specific contentScripts API used to register scriptlets. This could potentially occurs when there are registrations pending during a reload of filter lists. --- src/js/scriptlet-filtering.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/js/scriptlet-filtering.js b/src/js/scriptlet-filtering.js index 98f2a64a39a5d..e221a4197c0d0 100644 --- a/src/js/scriptlet-filtering.js +++ b/src/js/scriptlet-filtering.js @@ -61,6 +61,7 @@ const contentScriptRegisterer = new (class { runAt: 'document_start', }).then(handle => { this.hostnameToDetails.set(hostname, { handle, code }); + return handle; }).catch(( ) => { this.hostnameToDetails.delete(hostname); }); @@ -94,7 +95,9 @@ const contentScriptRegisterer = new (class { } unregisterHandle(handle) { if ( handle instanceof Promise ) { - handle.then(handle => { handle.unregister(); }); + handle.then(handle => { + if ( handle ) { handle.unregister(); } + }); } else { handle.unregister(); } From c265e849e070edf49a73f14007bf35f2a8a34656 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 14 Sep 2024 11:50:10 -0400 Subject: [PATCH 222/553] Fetch and cache cname of collated hostnames in page store Related feedback: https://github.com/uBlockOrigin/uBlock-issues/discussions/3376 --- src/js/messaging.js | 5 ++--- src/js/pagestore.js | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/js/messaging.js b/src/js/messaging.js index ebfc5c7d44fed..0142a1261ea44 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -288,9 +288,8 @@ const getHostnameDict = function(hostnameDetailsMap, out) { const cnMap = []; const createDictEntry = (domain, hostname, details) => { - const cname = vAPI.net.canonicalNameFromHostname(hostname); - if ( cname !== undefined ) { - cnMap.push([ cname, hostname ]); + if ( details.cname ) { + cnMap.push([ details.cname, hostname ]); } hnDict[hostname] = { domain, counts: details.counts }; }; diff --git a/src/js/pagestore.js b/src/js/pagestore.js index 227352d5d97e6..d6f52b8cd12ea 100644 --- a/src/js/pagestore.js +++ b/src/js/pagestore.js @@ -312,6 +312,7 @@ const HostnameDetails = class { } init(hostname) { this.hostname = hostname; + this.cname = vAPI.net.canonicalNameFromHostname(hostname); this.counts.reset(); } dispose() { From 4b285c059329fe2dc4e13a5473d813bb3f159649 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 14 Sep 2024 12:13:47 -0400 Subject: [PATCH 223/553] Dynamically load DNR conversion module on-demand DNR conversion module is a dev tool, no point loading it by default. This was done this way because in a distant past uBO had to be compatible with browsers not supporting dynamically loaded modules. Currently all supported browser versions support dynamically loaded modules. --- src/js/devtools.js | 97 +++++++++++++++++++++++++++++++++++++++++++- src/js/messaging.js | 99 +++++---------------------------------------- 2 files changed, 105 insertions(+), 91 deletions(-) diff --git a/src/js/devtools.js b/src/js/devtools.js index 629cd36b17d10..92cd078940f80 100644 --- a/src/js/devtools.js +++ b/src/js/devtools.js @@ -21,6 +21,7 @@ /* global CodeMirror, uBlockDashboard */ +import * as s14e from './s14e-serializer.js'; import { dom, qs$ } from './dom.js'; /******************************************************************************/ @@ -79,6 +80,100 @@ function log(text) { cmEditor.replaceRange(text.trim() + '\n\n', { line: 0, ch: 0 }); } +/******************************************************************************/ + +function toDNRText(raw) { + const result = s14e.deserialize(raw); + if ( typeof result === 'string' ) { return result; } + const { network } = result; + const replacer = (k, v) => { + if ( k.startsWith('__') ) { return; } + if ( Array.isArray(v) ) { + return v.sort(); + } + if ( v instanceof Object ) { + const sorted = {}; + for ( const kk of Object.keys(v).sort() ) { + sorted[kk] = v[kk]; + } + return sorted; + } + return v; + }; + const isUnsupported = rule => + rule._error !== undefined; + const isRegex = rule => + rule.condition !== undefined && + rule.condition.regexFilter !== undefined; + const isRedirect = rule => + rule.action !== undefined && + rule.action.type === 'redirect' && + rule.action.redirect.extensionPath !== undefined; + const isCsp = rule => + rule.action !== undefined && + rule.action.type === 'modifyHeaders'; + const isRemoveparam = rule => + rule.action !== undefined && + rule.action.type === 'redirect' && + rule.action.redirect.transform !== undefined; + const { ruleset } = network; + const good = ruleset.filter(rule => + isUnsupported(rule) === false && + isRegex(rule) === false && + isRedirect(rule) === false && + isCsp(rule) === false && + isRemoveparam(rule) === false + ); + const unsupported = ruleset.filter(rule => + isUnsupported(rule) + ); + const regexes = ruleset.filter(rule => + isUnsupported(rule) === false && + isRegex(rule) && + isRedirect(rule) === false && + isCsp(rule) === false && + isRemoveparam(rule) === false + ); + const redirects = ruleset.filter(rule => + isUnsupported(rule) === false && + isRedirect(rule) + ); + const headers = ruleset.filter(rule => + isUnsupported(rule) === false && + isCsp(rule) + ); + const removeparams = ruleset.filter(rule => + isUnsupported(rule) === false && + isRemoveparam(rule) + ); + const out = [ + `dnrRulesetFromRawLists(${JSON.stringify(result.listNames, null, 2)})`, + `Run time: ${result.runtime} ms`, + `Filters count: ${network.filterCount}`, + `Accepted filter count: ${network.acceptedFilterCount}`, + `Rejected filter count: ${network.rejectedFilterCount}`, + `Un-DNR-able filter count: ${unsupported.length}`, + `Resulting DNR rule count: ${ruleset.length}`, + ]; + out.push(`+ Good filters (${good.length}): ${JSON.stringify(good, replacer, 2)}`); + out.push(`+ Regex-based filters (${regexes.length}): ${JSON.stringify(regexes, replacer, 2)}`); + out.push(`+ 'redirect=' filters (${redirects.length}): ${JSON.stringify(redirects, replacer, 2)}`); + out.push(`+ 'csp=' filters (${headers.length}): ${JSON.stringify(headers, replacer, 2)}`); + out.push(`+ 'removeparam=' filters (${removeparams.length}): ${JSON.stringify(removeparams, replacer, 2)}`); + out.push(`+ Unsupported filters (${unsupported.length}): ${JSON.stringify(unsupported, replacer, 2)}`); + out.push(`+ generichide exclusions (${network.generichideExclusions.length}): ${JSON.stringify(network.generichideExclusions, replacer, 2)}`); + if ( result.specificCosmetic ) { + out.push(`+ Cosmetic filters: ${result.specificCosmetic.size}`); + for ( const details of result.specificCosmetic ) { + out.push(` ${JSON.stringify(details)}`); + } + } else { + out.push(' Cosmetic filters: 0'); + } + return out.join('\n'); +} + + /******************************************************************************/ dom.on('#console-clear', 'click', ( ) => { @@ -146,7 +241,7 @@ dom.on('#snfe-todnr', 'click', ev => { vAPI.messaging.send('devTools', { what: 'snfeToDNR', }).then(result => { - log(result); + log(toDNRText(result)); dom.attr(button, 'disabled', null); }); }); diff --git a/src/js/messaging.js b/src/js/messaging.js index 0142a1261ea44..d35a1347e782e 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -42,7 +42,6 @@ import { import cacheStorage from './cachestorage.js'; import cosmeticFilteringEngine from './cosmetic-filtering.js'; import { denseBase64 } from './base64-custom.js'; -import { dnrRulesetFromRawLists } from './static-dnr-filtering.js'; import { filteringBehaviorChanged } from './broadcast.js'; import htmlFilteringEngine from './html-filtering.js'; import { i18n$ } from './i18n.js'; @@ -1897,95 +1896,15 @@ const onMessage = function(request, sender, callback) { ), env: vAPI.webextFlavor.env, }; - const t0 = Date.now(); - dnrRulesetFromRawLists(listPromises, options).then(result => { - const { network } = result; - const replacer = (k, v) => { - if ( k.startsWith('__') ) { return; } - if ( Array.isArray(v) ) { - return v.sort(); - } - if ( v instanceof Object ) { - const sorted = {}; - for ( const kk of Object.keys(v).sort() ) { - sorted[kk] = v[kk]; - } - return sorted; - } - return v; - }; - const isUnsupported = rule => - rule._error !== undefined; - const isRegex = rule => - rule.condition !== undefined && - rule.condition.regexFilter !== undefined; - const isRedirect = rule => - rule.action !== undefined && - rule.action.type === 'redirect' && - rule.action.redirect.extensionPath !== undefined; - const isCsp = rule => - rule.action !== undefined && - rule.action.type === 'modifyHeaders'; - const isRemoveparam = rule => - rule.action !== undefined && - rule.action.type === 'redirect' && - rule.action.redirect.transform !== undefined; - const runtime = Date.now() - t0; - const { ruleset } = network; - const good = ruleset.filter(rule => - isUnsupported(rule) === false && - isRegex(rule) === false && - isRedirect(rule) === false && - isCsp(rule) === false && - isRemoveparam(rule) === false - ); - const unsupported = ruleset.filter(rule => - isUnsupported(rule) - ); - const regexes = ruleset.filter(rule => - isUnsupported(rule) === false && - isRegex(rule) && - isRedirect(rule) === false && - isCsp(rule) === false && - isRemoveparam(rule) === false - ); - const redirects = ruleset.filter(rule => - isUnsupported(rule) === false && - isRedirect(rule) - ); - const headers = ruleset.filter(rule => - isUnsupported(rule) === false && - isCsp(rule) - ); - const removeparams = ruleset.filter(rule => - isUnsupported(rule) === false && - isRemoveparam(rule) - ); - const out = [ - `dnrRulesetFromRawLists(${JSON.stringify(listNames, null, 2)})`, - `Run time: ${runtime} ms`, - `Filters count: ${network.filterCount}`, - `Accepted filter count: ${network.acceptedFilterCount}`, - `Rejected filter count: ${network.rejectedFilterCount}`, - `Un-DNR-able filter count: ${unsupported.length}`, - `Resulting DNR rule count: ${ruleset.length}`, - ]; - out.push(`+ Good filters (${good.length}): ${JSON.stringify(good, replacer, 2)}`); - out.push(`+ Regex-based filters (${regexes.length}): ${JSON.stringify(regexes, replacer, 2)}`); - out.push(`+ 'redirect=' filters (${redirects.length}): ${JSON.stringify(redirects, replacer, 2)}`); - out.push(`+ 'csp=' filters (${headers.length}): ${JSON.stringify(headers, replacer, 2)}`); - out.push(`+ 'removeparam=' filters (${removeparams.length}): ${JSON.stringify(removeparams, replacer, 2)}`); - out.push(`+ Unsupported filters (${unsupported.length}): ${JSON.stringify(unsupported, replacer, 2)}`); - out.push(`+ generichide exclusions (${network.generichideExclusions.length}): ${JSON.stringify(network.generichideExclusions, replacer, 2)}`); - if ( result.specificCosmetic ) { - out.push(`+ Cosmetic filters: ${result.specificCosmetic.size}`); - for ( const details of result.specificCosmetic ) { - out.push(` ${JSON.stringify(details)}`); - } - } else { - out.push(' Cosmetic filters: 0'); - } - callback(out.join('\n')); + import('./static-dnr-filtering.js').then(module => { + const t0 = Date.now(); + module.dnrRulesetFromRawLists(listPromises, options).then(dnrdata => { + dnrdata.listNames = listNames; + dnrdata.runtime = Date.now() - t0; + callback(s14e.serialize(dnrdata)); + }) + }).catch(reason => { + callback(reason); }); return; } From 266ec4894b09e3686225f044daa29fe94b0b14cf Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 15 Sep 2024 09:17:19 -0400 Subject: [PATCH 224/553] New static network filter option `urlskip=` Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3206 The main purpose is to bypass URLs designed to track whether a user visited a specific URL, typically used in click-tracking links. The `urlskip=` option ... - ... is valid only when used in a trusted filter list - ... is enforced only on top documents - ... is enforced on both blocked and non-blocked documents - ... is a modifier, i.e. it cannot be used along with other modifier options in a single filter The syntax is `urlskip=[steps]`, where steps is a space-separated list of extraction directives detailing what action to perform on the current URL. The only supported directive in this first commit is `?name`, which purpose is to extract the value of a named URL parameter and use the result as the new URL. Example: ||example.com/path/to/tracker$urlskip=?url The above filter will cause navigation to https://example.com/path/to/tracker?url=https://example.org/ to automatically bypass navigation to `example.com` and navigate directly to https://example.org/ It is possible to recursively extract URL parameters by using more than one directive, example: ||example.com/path/to/tracker$urlskip=?url ?to More extraction capabilities may be added in the future. --- src/js/filtering-context.js | 3 + src/js/logger-ui.js | 2 +- src/js/pagestore.js | 32 ++-- src/js/static-filtering-parser.js | 19 +++ src/js/static-net-filtering.js | 275 ++++++++++++++++++------------ src/js/traffic.js | 11 +- 6 files changed, 215 insertions(+), 127 deletions(-) diff --git a/src/js/filtering-context.js b/src/js/filtering-context.js index 933785f55114a..a24cdabc5da0b 100644 --- a/src/js/filtering-context.js +++ b/src/js/filtering-context.js @@ -163,6 +163,9 @@ export const FilteringContext = class { this.stype = a; } + isRootDocument() { + return (this.itype & MAIN_FRAME) !== 0; + } isDocument() { return (this.itype & FRAME_ANY) !== 0; } diff --git a/src/js/logger-ui.js b/src/js/logger-ui.js index db95f2e114aba..e76586a50f854 100644 --- a/src/js/logger-ui.js +++ b/src/js/logger-ui.js @@ -331,7 +331,7 @@ const processLoggerEntries = function(response) { parsed.type === 'main_frame' && parsed.aliased === false && ( parsed.filter === undefined || - parsed.filter.modifier !== true + parsed.filter.modifier !== true && parsed.filter.source !== 'redirect' ) ) { const separator = createLogSeparator(parsed, unboxed.url); diff --git a/src/js/pagestore.js b/src/js/pagestore.js index d6f52b8cd12ea..e201496366e3f 100644 --- a/src/js/pagestore.js +++ b/src/js/pagestore.js @@ -933,19 +933,14 @@ const PageStore = class { } redirectNonBlockedRequest(fctxt) { - const transformDirectives = staticNetFilteringEngine.transformRequest(fctxt); - const pruneDirectives = fctxt.redirectURL === undefined && - staticNetFilteringEngine.hasQuery(fctxt) && - staticNetFilteringEngine.filterQuery(fctxt) || - undefined; - if ( transformDirectives === undefined && pruneDirectives === undefined ) { return; } - if ( logger.enabled !== true ) { return; } - if ( transformDirectives !== undefined ) { - fctxt.pushFilters(transformDirectives.map(a => a.logData())); - } - if ( pruneDirectives !== undefined ) { - fctxt.pushFilters(pruneDirectives.map(a => a.logData())); + const directives = []; + staticNetFilteringEngine.transformRequest(fctxt, directives); + if ( staticNetFilteringEngine.hasQuery(fctxt) ) { + staticNetFilteringEngine.filterQuery(fctxt, directives); } + if ( directives.length === 0 ) { return; } + if ( logger.enabled !== true ) { return; } + fctxt.pushFilters(directives.map(a => a.logData())); if ( fctxt.redirectURL === undefined ) { return; } fctxt.pushFilter({ source: 'redirect', @@ -953,6 +948,19 @@ const PageStore = class { }); } + skipMainDocument(fctxt) { + const directives = staticNetFilteringEngine.urlSkip(fctxt); + if ( directives === undefined ) { return; } + if ( logger.enabled !== true ) { return; } + fctxt.pushFilters(directives.map(a => a.logData())); + if ( fctxt.redirectURL !== undefined ) { + fctxt.pushFilter({ + source: 'redirect', + raw: fctxt.redirectURL + }); + } + } + filterCSPReport(fctxt) { if ( sessionSwitches.evaluateZ( diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index ee3318240dd41..db5b2bd132e03 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -191,6 +191,7 @@ export const NODE_TYPE_NET_OPTION_NAME_REPLACE = iota++; export const NODE_TYPE_NET_OPTION_NAME_SCRIPT = iota++; export const NODE_TYPE_NET_OPTION_NAME_SHIDE = iota++; export const NODE_TYPE_NET_OPTION_NAME_TO = iota++; +export const NODE_TYPE_NET_OPTION_NAME_URLSKIP = iota++; export const NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM = iota++; export const NODE_TYPE_NET_OPTION_NAME_XHR = iota++; export const NODE_TYPE_NET_OPTION_NAME_WEBRTC = iota++; @@ -274,6 +275,7 @@ export const nodeTypeFromOptionName = new Map([ [ 'shide', NODE_TYPE_NET_OPTION_NAME_SHIDE ], /* synonym */ [ 'specifichide', NODE_TYPE_NET_OPTION_NAME_SHIDE ], [ 'to', NODE_TYPE_NET_OPTION_NAME_TO ], + [ 'urlskip', NODE_TYPE_NET_OPTION_NAME_URLSKIP ], [ 'uritransform', NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM ], [ 'xhr', NODE_TYPE_NET_OPTION_NAME_XHR ], /* synonym */ [ 'xmlhttprequest', NODE_TYPE_NET_OPTION_NAME_XHR ], @@ -1441,6 +1443,7 @@ export class AstFilterParser { case NODE_TYPE_NET_OPTION_NAME_REDIRECT: case NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE: case NODE_TYPE_NET_OPTION_NAME_REPLACE: + case NODE_TYPE_NET_OPTION_NAME_URLSKIP: case NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM: realBad = isNegated || (isException || hasValue) === false || modifierType !== 0; @@ -1519,6 +1522,21 @@ export class AstFilterParser { } break; } + case NODE_TYPE_NET_OPTION_NAME_URLSKIP: { + realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount; + if ( realBad ) { break; } + if ( requiresTrustedSource() ) { + this.astError = AST_ERROR_UNTRUSTED_SOURCE; + realBad = true; + break; + } + const value = this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_URLSKIP); + if ( value.startsWith('?') === false || value.length < 2 ) { + this.astError = AST_ERROR_OPTION_BADVALUE; + realBad = true; + } + break; + } case NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM: { realBad = abstractTypeCount || behaviorTypeCount || unredirectableTypeCount; if ( realBad ) { break; } @@ -3139,6 +3157,7 @@ export const netOptionTokenDescriptors = new Map([ [ 'shide', { } ], /* synonym */ [ 'specifichide', { } ], [ 'to', { mustAssign: true } ], + [ 'urlskip', { mustAssign: true } ], [ 'uritransform', { mustAssign: true } ], [ 'xhr', { canNegate: true } ], /* synonym */ [ 'xmlhttprequest', { canNegate: true } ], diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 780015209f68b..87216156f7018 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -43,97 +43,99 @@ const keyvalStore = typeof vAPI !== 'undefined' /******************************************************************************/ -// 0fedcba9876543210 -// ||||||| | || | -// ||||||| | || | -// ||||||| | || | -// ||||||| | || | -// ||||||| | || +---- bit 0- 1: block=0, allow=1, block important=2 -// ||||||| | |+------ bit 2: unused -// ||||||| | +------- bit 3- 4: party [0-3] -// ||||||| +--------- bit 5- 9: type [0-31] -// ||||||+-------------- bit 10: headers-based filters -// |||||+--------------- bit 11: redirect filters -// ||||+---------------- bit 12: removeparam filters -// |||+----------------- bit 13: csp filters -// ||+------------------ bit 14: permissions filters -// |+------------------- bit 15: uritransform filters -// +-------------------- bit 16: replace filters -// TODO: bit 11-16 can be converted into 3-bit value, as these options are not +// 10fedcba9876543210 +// |||||||| | || | +// |||||||| | || | +// |||||||| | || | +// |||||||| | || | +// |||||||| | || +---- bit 0- 1: block=0, allow=1, block important=2 +// |||||||| | |+------ bit 2: unused +// |||||||| | +------- bit 3- 4: party [0-3] +// |||||||| +--------- bit 5- 9: type [0-31] +// |||||||+-------------- bit 10: headers-based filters +// ||||||+--------------- bit 11: redirect filters +// |||||+---------------- bit 12: removeparam filters +// ||||+----------------- bit 13: csp filters +// |||+------------------ bit 14: permissions filters +// ||+------------------- bit 15: uritransform filters +// |+-------------------- bit 16: replace filters +// +--------------------- bit 17: urlskip filters +// TODO: bit 11-17 could be converted into 3-bit value, as these options are not // meant to be combined. -const RealmBitsMask = 0b00000000111; -const ActionBitsMask = 0b00000000011; -const TypeBitsMask = 0b01111100000; -const TypeBitsOffset = 5; - -const BLOCK_REALM = 0b00000000000000000; -const ALLOW_REALM = 0b00000000000000001; -const IMPORTANT_REALM = 0b00000000000000010; +const BLOCK_REALM = 0b0000_0000_0000_0000_0000; +const ALLOW_REALM = 0b0000_0000_0000_0000_0001; +const IMPORTANT_REALM = 0b0000_0000_0000_0000_0010; +const BLOCKALLOW_REALM = BLOCK_REALM | ALLOW_REALM | IMPORTANT_REALM; const BLOCKIMPORTANT_REALM = BLOCK_REALM | IMPORTANT_REALM; -const ANYPARTY_REALM = 0b00000000000000000; -const FIRSTPARTY_REALM = 0b00000000000001000; -const THIRDPARTY_REALM = 0b00000000000010000; +const ANYPARTY_REALM = 0b0000_0000_0000_0000_0000; +const FIRSTPARTY_REALM = 0b0000_0000_0000_0000_1000; +const THIRDPARTY_REALM = 0b0000_0000_0000_0001_0000; const ALLPARTIES_REALM = FIRSTPARTY_REALM | THIRDPARTY_REALM; -const HEADERS_REALM = 0b00000010000000000; -const REDIRECT_REALM = 0b00000100000000000; -const REMOVEPARAM_REALM = 0b00001000000000000; -const CSP_REALM = 0b00010000000000000; -const PERMISSIONS_REALM = 0b00100000000000000; -const URLTRANSFORM_REALM = 0b01000000000000000; -const REPLACE_REALM = 0b10000000000000000; +const TYPE_REALM = 0b0000_0000_0011_1110_0000; +const HEADERS_REALM = 0b0000_0000_0100_0000_0000; +const REDIRECT_REALM = 0b0000_0000_1000_0000_0000; +const REMOVEPARAM_REALM = 0b0000_0001_0000_0000_0000; +const CSP_REALM = 0b0000_0010_0000_0000_0000; +const PERMISSIONS_REALM = 0b0000_0100_0000_0000_0000; +const URLTRANSFORM_REALM = 0b0000_1000_0000_0000_0000; +const REPLACE_REALM = 0b0001_0000_0000_0000_0000; +const URLSKIP_REALM = 0b0010_0000_0000_0000_0000; const MODIFY_REALMS = REDIRECT_REALM | CSP_REALM | REMOVEPARAM_REALM | PERMISSIONS_REALM | - URLTRANSFORM_REALM | REPLACE_REALM; + URLTRANSFORM_REALM | REPLACE_REALM | + URLSKIP_REALM; + +const TYPE_REALM_OFFSET = 5; const typeNameToTypeValue = { - 'no_type': 0 << TypeBitsOffset, - 'stylesheet': 1 << TypeBitsOffset, - 'image': 2 << TypeBitsOffset, - 'object': 3 << TypeBitsOffset, - 'object_subrequest': 3 << TypeBitsOffset, - 'script': 4 << TypeBitsOffset, - 'fetch': 5 << TypeBitsOffset, - 'xmlhttprequest': 5 << TypeBitsOffset, - 'sub_frame': 6 << TypeBitsOffset, - 'font': 7 << TypeBitsOffset, - 'media': 8 << TypeBitsOffset, - 'websocket': 9 << TypeBitsOffset, - 'beacon': 10 << TypeBitsOffset, - 'ping': 10 << TypeBitsOffset, - 'other': 11 << TypeBitsOffset, - 'popup': 12 << TypeBitsOffset, // start of behavioral filtering - 'popunder': 13 << TypeBitsOffset, - 'main_frame': 14 << TypeBitsOffset, // start of 1p behavioral filtering - 'generichide': 15 << TypeBitsOffset, - 'specifichide': 16 << TypeBitsOffset, - 'inline-font': 17 << TypeBitsOffset, - 'inline-script': 18 << TypeBitsOffset, - 'cname': 19 << TypeBitsOffset, - 'webrtc': 20 << TypeBitsOffset, - 'unsupported': 21 << TypeBitsOffset, + 'no_type': 0 << TYPE_REALM_OFFSET, + 'stylesheet': 1 << TYPE_REALM_OFFSET, + 'image': 2 << TYPE_REALM_OFFSET, + 'object': 3 << TYPE_REALM_OFFSET, + 'object_subrequest': 3 << TYPE_REALM_OFFSET, + 'script': 4 << TYPE_REALM_OFFSET, + 'fetch': 5 << TYPE_REALM_OFFSET, + 'xmlhttprequest': 5 << TYPE_REALM_OFFSET, + 'sub_frame': 6 << TYPE_REALM_OFFSET, + 'font': 7 << TYPE_REALM_OFFSET, + 'media': 8 << TYPE_REALM_OFFSET, + 'websocket': 9 << TYPE_REALM_OFFSET, + 'beacon': 10 << TYPE_REALM_OFFSET, + 'ping': 10 << TYPE_REALM_OFFSET, + 'other': 11 << TYPE_REALM_OFFSET, + 'popup': 12 << TYPE_REALM_OFFSET, // start of behavioral filtering + 'popunder': 13 << TYPE_REALM_OFFSET, + 'main_frame': 14 << TYPE_REALM_OFFSET, // start of 1p behavioral filtering + 'generichide': 15 << TYPE_REALM_OFFSET, + 'specifichide': 16 << TYPE_REALM_OFFSET, + 'inline-font': 17 << TYPE_REALM_OFFSET, + 'inline-script': 18 << TYPE_REALM_OFFSET, + 'cname': 19 << TYPE_REALM_OFFSET, + 'webrtc': 20 << TYPE_REALM_OFFSET, + 'unsupported': 21 << TYPE_REALM_OFFSET, }; const otherTypeBitValue = typeNameToTypeValue.other; const bitFromType = type => - 1 << ((typeNameToTypeValue[type] >>> TypeBitsOffset) - 1); + 1 << ((typeNameToTypeValue[type] >>> TYPE_REALM_OFFSET) - 1); // All network request types to bitmap -// bring origin to 0 (from TypeBitsOffset -- see typeNameToTypeValue) +// bring origin to 0 (from TYPE_REALM_OFFSET -- see typeNameToTypeValue) // left-shift 1 by the above-calculated value // subtract 1 to set all type bits const allNetworkTypesBits = - (1 << (otherTypeBitValue >>> TypeBitsOffset)) - 1; + (1 << (otherTypeBitValue >>> TYPE_REALM_OFFSET)) - 1; const allTypesBits = allNetworkTypesBits | - 1 << (typeNameToTypeValue['popup'] >>> TypeBitsOffset) - 1 | - 1 << (typeNameToTypeValue['main_frame'] >>> TypeBitsOffset) - 1 | - 1 << (typeNameToTypeValue['inline-font'] >>> TypeBitsOffset) - 1 | - 1 << (typeNameToTypeValue['inline-script'] >>> TypeBitsOffset) - 1; + 1 << (typeNameToTypeValue['popup'] >>> TYPE_REALM_OFFSET) - 1 | + 1 << (typeNameToTypeValue['main_frame'] >>> TYPE_REALM_OFFSET) - 1 | + 1 << (typeNameToTypeValue['inline-font'] >>> TYPE_REALM_OFFSET) - 1 | + 1 << (typeNameToTypeValue['inline-script'] >>> TYPE_REALM_OFFSET) - 1; const unsupportedTypeBit = - 1 << (typeNameToTypeValue['unsupported'] >>> TypeBitsOffset) - 1; + 1 << (typeNameToTypeValue['unsupported'] >>> TYPE_REALM_OFFSET) - 1; const typeValueToTypeName = [ '', @@ -186,6 +188,7 @@ const MODIFIER_TYPE_CSP = 4; const MODIFIER_TYPE_PERMISSIONS = 5; const MODIFIER_TYPE_URLTRANSFORM = 6; const MODIFIER_TYPE_REPLACE = 7; +const MODIFIER_TYPE_URLSKIP = 8; const modifierBitsFromType = new Map([ [ MODIFIER_TYPE_REDIRECT, REDIRECT_REALM ], @@ -195,6 +198,7 @@ const modifierBitsFromType = new Map([ [ MODIFIER_TYPE_PERMISSIONS, PERMISSIONS_REALM ], [ MODIFIER_TYPE_URLTRANSFORM, URLTRANSFORM_REALM ], [ MODIFIER_TYPE_REPLACE, REPLACE_REALM ], + [ MODIFIER_TYPE_URLSKIP, URLSKIP_REALM ], ]); const modifierTypeFromName = new Map([ @@ -205,6 +209,7 @@ const modifierTypeFromName = new Map([ [ 'permissions', MODIFIER_TYPE_PERMISSIONS ], [ 'uritransform', MODIFIER_TYPE_URLTRANSFORM ], [ 'replace', MODIFIER_TYPE_REPLACE ], + [ 'urlskip', MODIFIER_TYPE_URLSKIP ], ]); const modifierNameFromType = new Map([ @@ -215,22 +220,23 @@ const modifierNameFromType = new Map([ [ MODIFIER_TYPE_PERMISSIONS, 'permissions' ], [ MODIFIER_TYPE_URLTRANSFORM, 'uritransform' ], [ MODIFIER_TYPE_REPLACE, 'replace' ], + [ MODIFIER_TYPE_URLSKIP, 'urlskip' ], ]); -//const typeValueFromCatBits = catBits => (catBits >>> TypeBitsOffset) & 0b11111; +//const typeValueFromCatBits = catBits => (catBits >>> TYPE_REALM_OFFSET) & 0b11111; const MAX_TOKEN_LENGTH = 7; // Four upper bits of token hash are reserved for built-in predefined // token hashes, which should never end up being used when tokenizing // any arbitrary string. -const NO_TOKEN_HASH = 0x50000000; -const DOT_TOKEN_HASH = 0x10000000; -const ANY_TOKEN_HASH = 0x20000000; -const ANY_HTTPS_TOKEN_HASH = 0x30000000; -const ANY_HTTP_TOKEN_HASH = 0x40000000; -const EMPTY_TOKEN_HASH = 0xF0000000; -const INVALID_TOKEN_HASH = 0xFFFFFFFF; +const NO_TOKEN_HASH = 0x5000_0000; +const DOT_TOKEN_HASH = 0x1000_0000; +const ANY_TOKEN_HASH = 0x2000_0000; +const ANY_HTTPS_TOKEN_HASH = 0x3000_0000; +const ANY_HTTP_TOKEN_HASH = 0x4000_0000; +const EMPTY_TOKEN_HASH = 0xF000_0000; +const INVALID_TOKEN_HASH = 0xFFFF_FFFF; /******************************************************************************/ @@ -374,9 +380,9 @@ class LogData { } else if ( (categoryBits & FIRSTPARTY_REALM) !== 0 ) { logData.options.unshift('1p'); } - const type = categoryBits & TypeBitsMask; + const type = categoryBits & TYPE_REALM; if ( type !== 0 ) { - logData.options.unshift(typeValueToTypeName[type >>> TypeBitsOffset]); + logData.options.unshift(typeValueToTypeName[type >>> TYPE_REALM_OFFSET]); } let raw = logData.pattern.join(''); if ( @@ -2163,7 +2169,7 @@ class FilterModifierResult { this.refs = filterRefs[filterData[imodifierunit+3]]; this.ireportedunit = env.iunit; this.th = env.th; - this.bits = (env.bits & ~RealmBitsMask) | filterData[imodifierunit+1]; + this.bits = (env.bits & ~BLOCKALLOW_REALM) | filterData[imodifierunit+1]; } get result() { @@ -3276,6 +3282,7 @@ class FilterCompiler { [ sfp.NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM, MODIFIER_TYPE_REMOVEPARAM ], [ sfp.NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM, MODIFIER_TYPE_URLTRANSFORM ], [ sfp.NODE_TYPE_NET_OPTION_NAME_REPLACE, MODIFIER_TYPE_REPLACE ], + [ sfp.NODE_TYPE_NET_OPTION_NAME_URLSKIP, MODIFIER_TYPE_URLSKIP ], ]); // These top 100 "bad tokens" are collated using the "miss" histogram // from tokenHistograms(). The "score" is their occurrence among the @@ -3548,6 +3555,7 @@ class FilterCompiler { case sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE: case sfp.NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM: case sfp.NODE_TYPE_NET_OPTION_NAME_REPLACE: + case sfp.NODE_TYPE_NET_OPTION_NAME_URLSKIP: case sfp.NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM: if ( this.processModifierOption(id, parser.getNetOptionValue(id)) === false ) { return false; @@ -3667,6 +3675,7 @@ class FilterCompiler { case sfp.NODE_TYPE_NET_OPTION_NAME_REMOVEPARAM: case sfp.NODE_TYPE_NET_OPTION_NAME_REPLACE: case sfp.NODE_TYPE_NET_OPTION_NAME_TO: + case sfp.NODE_TYPE_NET_OPTION_NAME_URLSKIP: case sfp.NODE_TYPE_NET_OPTION_NAME_URLTRANSFORM: if ( this.processOptionWithValue(parser, type) === false ) { return this.FILTER_INVALID; @@ -4054,7 +4063,7 @@ class FilterCompiler { // IMPORTANT: the modifier unit MUST always appear first in a sequence if ( this.modifyType !== undefined ) { units.unshift(FilterModifier.compile(this)); - this.action = (this.action & ~ActionBitsMask) | + this.action = (this.action & ~BLOCKALLOW_REALM) | modifierBitsFromType.get(this.modifyType); } @@ -4123,7 +4132,7 @@ class FilterCompiler { do { if ( typeBits & 1 ) { writer.push([ - catBits | (bitOffset << TypeBitsOffset), + catBits | (bitOffset << TYPE_REALM_OFFSET), this.tokenHash, fdata ]); @@ -4286,7 +4295,7 @@ StaticNetFilteringEngine.prototype.freeze = function() { // the block-important realm should be checked when and only when // there is a matched exception filter, which important filters are // meant to override. - if ( (bits & ActionBitsMask) === BLOCKIMPORTANT_REALM ) { + if ( (bits & BLOCKALLOW_REALM) === BLOCKIMPORTANT_REALM ) { this.addFilterUnit( bits & ~IMPORTANT_REALM, tokenHash, @@ -4446,6 +4455,7 @@ StaticNetFilteringEngine.prototype.dnrFromCompiled = function(op, context, ...ar [ PERMISSIONS_REALM, { type: 'permissions', priority: 0 } ], [ URLTRANSFORM_REALM, { type: 'uritransform', priority: 0 } ], [ HEADERS_REALM, { type: 'block', priority: 0 } ], + [ URLSKIP_REALM, { type: 'urlskip', priority: 0 } ], ]); const partyness = new Map([ [ ANYPARTY_REALM, '' ], @@ -4860,7 +4870,7 @@ StaticNetFilteringEngine.prototype.matchAndFetchModifiers = function( $docDomain = fctxt.getDocDomain(); $requestHostname = fctxt.getHostname(); $requestMethodBit = fctxt.method || 0; - $requestTypeValue = (typeBits & TypeBitsMask) >>> TypeBitsOffset; + $requestTypeValue = (typeBits & TYPE_REALM) >>> TYPE_REALM_OFFSET; $requestAddress = fctxt.getIPAddress(); const modifierType = modifierTypeFromName.get(modifierName); @@ -4955,7 +4965,7 @@ StaticNetFilteringEngine.prototype.matchAndFetchModifiers = function( const toRemove = new Map(); for ( const result of results ) { - const actionBits = result.bits & ActionBitsMask; + const actionBits = result.bits & BLOCKALLOW_REALM; const modifyValue = result.value; if ( actionBits === BLOCKIMPORTANT_REALM ) { toAddImportant.set(modifyValue, result); @@ -5158,7 +5168,7 @@ StaticNetFilteringEngine.prototype.matchRequestReverse = function(type, url) { $requestURL = urlTokenizer.setURL(url); $requestURLRaw = url; $requestMethodBit = 0; - $requestTypeValue = (typeBits & TypeBitsMask) >>> TypeBitsOffset; + $requestTypeValue = (typeBits & TYPE_REALM) >>> TYPE_REALM_OFFSET; $requestAddress = ''; $isBlockImportant = false; this.$filterUnit = 0; @@ -5227,7 +5237,7 @@ StaticNetFilteringEngine.prototype.matchRequest = function(fctxt, modifiers = 0) $docDomain = fctxt.getDocDomain(); $requestHostname = fctxt.getHostname(); $requestMethodBit = fctxt.method || 0; - $requestTypeValue = (typeBits & TypeBitsMask) >>> TypeBitsOffset; + $requestTypeValue = (typeBits & TYPE_REALM) >>> TYPE_REALM_OFFSET; $requestAddress = fctxt.getIPAddress(); $isBlockImportant = false; @@ -5263,7 +5273,7 @@ StaticNetFilteringEngine.prototype.matchHeaders = function(fctxt, headers) { $docDomain = fctxt.getDocDomain(); $requestHostname = fctxt.getHostname(); $requestMethodBit = fctxt.method || 0; - $requestTypeValue = (typeBits & TypeBitsMask) >>> TypeBitsOffset; + $requestTypeValue = (typeBits & TYPE_REALM) >>> TYPE_REALM_OFFSET; $requestAddress = fctxt.getIPAddress(); $httpHeaders.init(headers); @@ -5309,11 +5319,35 @@ StaticNetFilteringEngine.prototype.redirectRequest = function(redirectEngine, fc return directives; }; -StaticNetFilteringEngine.prototype.transformRequest = function(fctxt) { +function parseRedirectRequestValue(directive) { + if ( directive.cache === null ) { + directive.cache = sfp.parseRedirectValue(directive.value); + } + return directive.cache; +} + +function compareRedirectRequests(redirectEngine, a, b) { + const { token: atok, priority: aint, bits: abits } = + parseRedirectRequestValue(a); + if ( redirectEngine.hasToken(atok) === false ) { return -1; } + const { token: btok, priority: bint, bits: bbits } = + parseRedirectRequestValue(b); + if ( redirectEngine.hasToken(btok) === false ) { return 1; } + if ( abits !== bbits ) { + if ( (abits & IMPORTANT_REALM) !== 0 ) { return 1; } + if ( (bbits & IMPORTANT_REALM) !== 0 ) { return -1; } + if ( (abits & ALLOW_REALM) !== 0 ) { return -1; } + if ( (bbits & ALLOW_REALM) !== 0 ) { return 1; } + } + return aint - bint; +} + +/******************************************************************************/ + +StaticNetFilteringEngine.prototype.transformRequest = function(fctxt, out = []) { const directives = this.matchAndFetchModifiers(fctxt, 'uritransform'); if ( directives === undefined ) { return; } const redirectURL = new URL(fctxt.url); - const out = []; for ( const directive of directives ) { if ( (directive.bits & ALLOW_REALM) !== 0 ) { out.push(directive); @@ -5345,27 +5379,47 @@ StaticNetFilteringEngine.prototype.transformRequest = function(fctxt) { return out; }; -function parseRedirectRequestValue(directive) { - if ( directive.cache === null ) { - directive.cache = sfp.parseRedirectValue(directive.value); +/******************************************************************************/ + +StaticNetFilteringEngine.prototype.urlSkip = function(fctxt, out = []) { + if ( fctxt.redirectURL !== undefined ) { return; } + const directives = this.matchAndFetchModifiers(fctxt, 'urlskip'); + if ( directives === undefined ) { return; } + for ( const directive of directives ) { + if ( (directive.bits & ALLOW_REALM) !== 0 ) { + out.push(directive); + continue; + } + const urlin = fctxt.url; + const value = directive.value; + const steps = value.includes(' ') && value.split(/ +/) || [ value ]; + const urlout = urlSkip(urlin, steps); + if ( urlout === undefined ) { continue; } + if ( urlout === urlin ) { continue; } + fctxt.redirectURL = urlout; + out.push(directive); + break; } - return directive.cache; -} + if ( out.length === 0 ) { return; } + return out; +}; -function compareRedirectRequests(redirectEngine, a, b) { - const { token: atok, priority: aint, bits: abits } = - parseRedirectRequestValue(a); - if ( redirectEngine.hasToken(atok) === false ) { return -1; } - const { token: btok, priority: bint, bits: bbits } = - parseRedirectRequestValue(b); - if ( redirectEngine.hasToken(btok) === false ) { return 1; } - if ( abits !== bbits ) { - if ( (abits & IMPORTANT_REALM) !== 0 ) { return 1; } - if ( (bbits & IMPORTANT_REALM) !== 0 ) { return -1; } - if ( (abits & ALLOW_REALM) !== 0 ) { return -1; } - if ( (bbits & ALLOW_REALM) !== 0 ) { return 1; } +function urlSkip(urlin, steps) { + try { + let urlout; + for ( const step of steps ) { + if ( step.startsWith('?') === false ) { return; } + urlout = (new URL(urlin)).searchParams.get(step.slice(1)); + if ( urlout === null ) { return; } + if ( urlout.includes(' ') ) { + urlout = urlout.replace(/ /g, '%20'); + } + urlin = urlout; + } + void new URL(urlout); + return urlout; + } catch(x) { } - return aint - bint; } /******************************************************************************/ @@ -5373,7 +5427,8 @@ function compareRedirectRequests(redirectEngine, a, b) { // https://github.com/uBlockOrigin/uBlock-issues/issues/1626 // Do not redirect when the number of query parameters does not change. -StaticNetFilteringEngine.prototype.filterQuery = function(fctxt) { +StaticNetFilteringEngine.prototype.filterQuery = function(fctxt, out = []) { + if ( fctxt.redirectURL !== undefined ) { return; } const directives = this.matchAndFetchModifiers(fctxt, 'removeparam'); if ( directives === undefined ) { return; } const url = fctxt.url; @@ -5396,7 +5451,6 @@ StaticNetFilteringEngine.prototype.filterQuery = function(fctxt) { } } const inParamCount = params.size; - const out = []; for ( const directive of directives ) { if ( params.size === 0 ) { break; } const isException = (directive.bits & ALLOW_REALM) !== 0; @@ -5664,6 +5718,7 @@ StaticNetFilteringEngine.prototype.dump = function() { [ PERMISSIONS_REALM, 'permissions' ], [ URLTRANSFORM_REALM, 'uritransform' ], [ REPLACE_REALM, 'replace' ], + [ URLSKIP_REALM, 'urlskip' ], ]); const partyness = new Map([ [ ANYPARTY_REALM, 'any-party' ], diff --git a/src/js/traffic.js b/src/js/traffic.js index 38ba7264b85d8..55538fa7e425e 100644 --- a/src/js/traffic.js +++ b/src/js/traffic.js @@ -188,17 +188,20 @@ const onBeforeRootFrameRequest = function(fctxt) { } if ( logger.enabled ) { - fctxt.setFilter(logData); + fctxt.setRealm('network').setFilter(logData); } // https://github.com/uBlockOrigin/uBlock-issues/issues/760 // Redirect non-blocked request? - if ( result !== 1 && trusted === false && pageStore !== null ) { - pageStore.redirectNonBlockedRequest(fctxt); + if ( trusted === false && pageStore !== null ) { + if ( result !== 1 ) { + pageStore.redirectNonBlockedRequest(fctxt); + } + pageStore.skipMainDocument(fctxt); } if ( logger.enabled ) { - fctxt.setRealm('network').toLogger(); + fctxt.toLogger(); } // Redirected From b79fe942e19752d14b0ae84cd83a359a749c67ea Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 15 Sep 2024 09:45:33 -0400 Subject: [PATCH 225/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cb5d42cbc4ba..5dacef83f2562 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [New static network filter option `urlskip=`](https://github.com/gorhill/uBlock/commit/266ec4894b) - [Rewrite cname uncloaking code to account for new `ipaddress=` option](https://github.com/gorhill/uBlock/commit/6acf97bf51) - [Avoid using dns.resolve() for proxied DNS resolution](https://github.com/gorhill/uBlock/commit/d5f14ffa32) - [Add support for `lan`/`loopback` values to `ipaddress=` option](https://github.com/gorhill/uBlock/commit/030d7334e4) From 096b4d9e81fe41dd1c553ac9c5d23819f8f884ab Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 15 Sep 2024 09:46:06 -0400 Subject: [PATCH 226/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 1a627ff03ae93..a56296cd32544 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.21 \ No newline at end of file +1.59.1.22 \ No newline at end of file From 5fda425059021603a17f610543bb43b5adfb992b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 15 Sep 2024 09:51:42 -0400 Subject: [PATCH 227/553] 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 72ea093e8c640..d52f231b67443 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.21", + "version": "1.59.1.22", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b21/uBlock0_1.59.1b21.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b22/uBlock0_1.59.1b22.firefox.signed.xpi" } ] } From a9d8e9667569b94b7c734650e146dece711126e2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 15 Sep 2024 10:38:52 -0400 Subject: [PATCH 228/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dacef83f2562..6a79906df5df0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - [Add ability to directly evaluate static network filtering engine](https://github.com/gorhill/uBlock/commit/b7ed3b45ed) - [Fix `prevent-window-open` for when logger is open](https://github.com/gorhill/uBlock/commit/f552f655cb) - [Improve `prevent-window-open` scriptlet](https://github.com/gorhill/uBlock/commit/7f11d6216e) +- [Improve `validate-constant` scriptlet helper](https://github.com/gorhill/uBlock/commit/ae5dc6299e) - [Improve `trusted-replace-outbound-text` scriptlet](https://github.com/gorhill/uBlock/commit/0dcb985601) - [Improve `prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/3a249f395c) - [Add noop resources for redirect purpose](https://github.com/gorhill/uBlock/commit/59a9a43a83) From e18a3707c71ad5694dd67fc73b30515c5f2bd0b5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 15 Sep 2024 13:20:47 -0400 Subject: [PATCH 229/553] Add an entry in _Report_ page for badware/phishing category Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3151 Entry: "Add an entry in the reporting tool for badware issues" --- src/_locales/en/messages.json | 4 ++++ src/support.html | 1 + 2 files changed, 5 insertions(+) diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 92fb26065ab9d..433ff60772a69 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -1012,6 +1012,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/support.html b/src/support.html index 12329423fecf2..fedb42ef2f470 100644 --- a/src/support.html +++ b/src/support.html @@ -93,6 +93,7 @@

+

From b62aabda8530f42c479089ed325be233991ffee5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 15 Sep 2024 13:25:58 -0400 Subject: [PATCH 230/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/extension/_locales/ar/messages.json | 2 +- src/_locales/ar/messages.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index a25dfab4de557..404066efaa0a9 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "أداة لحظر المحتوى بدون إذن. يحظر الإعلانات وأدوات التتبع وأدوات التعدين وغيرها فور التثبيت.", + "message": "أداة لحظر المحتوى دون إذن. يحظر الإعلانات وأدوات التتبع وأدوات التعدين وغيرها فور التثبيت.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { diff --git a/src/_locales/ar/messages.json b/src/_locales/ar/messages.json index b2c204d3abefd..b7ea3ee6fab5e 100644 --- a/src/_locales/ar/messages.json +++ b/src/_locales/ar/messages.json @@ -312,7 +312,7 @@ "description": "English: Click, Ctrl-click" }, "pickerContextMenuEntry": { - "message": "إحجب العنصر...", + "message": "حجب العنصر...", "description": "An entry in the browser's contextual menu" }, "settingsCollapseBlockedPrompt": { From ef1e134460e8ae871c245a08aa77fe0fa959afed Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 15 Sep 2024 13:27:32 -0400 Subject: [PATCH 231/553] Import translation work from https://crowdin.com/project/ublock --- src/_locales/ar/messages.json | 4 ++++ src/_locales/az/messages.json | 4 ++++ src/_locales/be/messages.json | 4 ++++ src/_locales/bg/messages.json | 4 ++++ src/_locales/bn/messages.json | 4 ++++ src/_locales/br_FR/messages.json | 4 ++++ src/_locales/bs/messages.json | 4 ++++ src/_locales/ca/messages.json | 4 ++++ src/_locales/cs/messages.json | 4 ++++ src/_locales/cv/messages.json | 4 ++++ src/_locales/cy/messages.json | 4 ++++ src/_locales/da/messages.json | 4 ++++ src/_locales/de/messages.json | 4 ++++ src/_locales/el/messages.json | 4 ++++ src/_locales/en_GB/messages.json | 4 ++++ src/_locales/eo/messages.json | 4 ++++ src/_locales/es/messages.json | 4 ++++ src/_locales/et/messages.json | 4 ++++ src/_locales/eu/messages.json | 4 ++++ src/_locales/fa/messages.json | 4 ++++ src/_locales/fi/messages.json | 4 ++++ src/_locales/fil/messages.json | 4 ++++ src/_locales/fr/messages.json | 4 ++++ src/_locales/fy/messages.json | 4 ++++ src/_locales/gl/messages.json | 4 ++++ src/_locales/gu/messages.json | 4 ++++ src/_locales/he/messages.json | 4 ++++ src/_locales/hi/messages.json | 4 ++++ src/_locales/hr/messages.json | 4 ++++ src/_locales/hu/messages.json | 4 ++++ src/_locales/hy/messages.json | 4 ++++ src/_locales/id/messages.json | 4 ++++ src/_locales/it/messages.json | 4 ++++ src/_locales/ja/messages.json | 4 ++++ src/_locales/ka/messages.json | 4 ++++ src/_locales/kk/messages.json | 4 ++++ src/_locales/kn/messages.json | 4 ++++ src/_locales/ko/messages.json | 4 ++++ src/_locales/lt/messages.json | 4 ++++ src/_locales/lv/messages.json | 4 ++++ src/_locales/mk/messages.json | 4 ++++ src/_locales/ml/messages.json | 4 ++++ src/_locales/mr/messages.json | 4 ++++ src/_locales/ms/messages.json | 4 ++++ src/_locales/nb/messages.json | 4 ++++ src/_locales/nl/messages.json | 4 ++++ src/_locales/oc/messages.json | 4 ++++ src/_locales/pa/messages.json | 4 ++++ src/_locales/pl/messages.json | 4 ++++ src/_locales/pt_BR/messages.json | 4 ++++ src/_locales/pt_PT/messages.json | 4 ++++ src/_locales/ro/messages.json | 4 ++++ src/_locales/ru/messages.json | 4 ++++ src/_locales/si/messages.json | 4 ++++ src/_locales/sk/messages.json | 4 ++++ src/_locales/sl/messages.json | 4 ++++ src/_locales/so/messages.json | 4 ++++ src/_locales/sq/messages.json | 4 ++++ src/_locales/sr/messages.json | 4 ++++ src/_locales/sv/messages.json | 4 ++++ src/_locales/sw/messages.json | 4 ++++ src/_locales/ta/messages.json | 4 ++++ src/_locales/te/messages.json | 4 ++++ src/_locales/th/messages.json | 4 ++++ src/_locales/tr/messages.json | 4 ++++ src/_locales/uk/messages.json | 4 ++++ src/_locales/ur/messages.json | 4 ++++ src/_locales/vi/messages.json | 4 ++++ src/_locales/zh_CN/messages.json | 4 ++++ src/_locales/zh_TW/messages.json | 4 ++++ 70 files changed, 280 insertions(+) diff --git a/src/_locales/ar/messages.json b/src/_locales/ar/messages.json index b7ea3ee6fab5e..17bd55c0f86c1 100644 --- a/src/_locales/ar/messages.json +++ b/src/_locales/ar/messages.json @@ -1011,6 +1011,10 @@ "message": "افتح التبويبات أو النوافذ التي ليس مرغوبًا بها", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "تسمية صفحة الويب باسم \"NSFW\" (\"ليس آمن للعمل\"\n", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/az/messages.json b/src/_locales/az/messages.json index 1708ea47e5954..38540ecc79e74 100644 --- a/src/_locales/az/messages.json +++ b/src/_locales/az/messages.json @@ -1011,6 +1011,10 @@ "message": "Arzuolunmaz tab-vərəqələr və ya pəncərələr açır", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Veb-səhifəni uyğun olmayan (“NSFW”) olaraq işarələ (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/be/messages.json b/src/_locales/be/messages.json index ca1ee35bc364d..6ae12101583fe 100644 --- a/src/_locales/be/messages.json +++ b/src/_locales/be/messages.json @@ -1011,6 +1011,10 @@ "message": "Адкрывае непажаданыя карткі або вокны", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Пазначыць вэб-старонку як “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/bg/messages.json b/src/_locales/bg/messages.json index aaff8db583deb..98e3bd4a61606 100644 --- a/src/_locales/bg/messages.json +++ b/src/_locales/bg/messages.json @@ -1011,6 +1011,10 @@ "message": "Отваря нежелани раздели или прозорци", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Маркиране на уеб страницата като “NSFW” (“не е безопасна за работа”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/bn/messages.json b/src/_locales/bn/messages.json index de82ca4dee471..0c3b776afa454 100644 --- a/src/_locales/bn/messages.json +++ b/src/_locales/bn/messages.json @@ -1011,6 +1011,10 @@ "message": "অবাঞ্ছিত ট্যাব বা উইন্ডো খোলে", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "ওয়েব পৃষ্ঠাটিকে “NSFW” হিসাবে লেবেল করুন (“কাজের জন্য নিরাপদ নয়”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/br_FR/messages.json b/src/_locales/br_FR/messages.json index e0005b74baf74..92c0b73ca0d75 100644 --- a/src/_locales/br_FR/messages.json +++ b/src/_locales/br_FR/messages.json @@ -1011,6 +1011,10 @@ "message": "Digeriñ a ra ivinelloù pe prenestroù noazus", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Merkañ ar bejenn evel \"NSFW\" (“Not Safe For Work”) hag a dalv ez eus danvez noazus pe kizidik enni", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/bs/messages.json b/src/_locales/bs/messages.json index bd0810a6c6ab0..d5e299aab9bf6 100644 --- a/src/_locales/bs/messages.json +++ b/src/_locales/bs/messages.json @@ -1011,6 +1011,10 @@ "message": "Otvara neželjene kartice ili prozore", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Označite web stranicu kao “NSZP” (“Ne-Sigurna-Za-Posao”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/ca/messages.json b/src/_locales/ca/messages.json index 0ba1ccc1e0beb..9ec5bda0cba6e 100644 --- a/src/_locales/ca/messages.json +++ b/src/_locales/ca/messages.json @@ -1011,6 +1011,10 @@ "message": "Obre pestanyes o finestres no desitjades", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Marca aquesta pàgina com a “NSFW” (“No segur per al treball”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/cs/messages.json b/src/_locales/cs/messages.json index 025f0b59a868c..8fc18fd9623c4 100644 --- a/src/_locales/cs/messages.json +++ b/src/_locales/cs/messages.json @@ -1011,6 +1011,10 @@ "message": "Otevírá nechtěné karty nebo okna", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Označit webovou stránku jako “NSFW” (Není bezpečné pro práci”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/cv/messages.json b/src/_locales/cv/messages.json index aec33ebe8dfc8..70ee6f7e21e16 100644 --- a/src/_locales/cv/messages.json +++ b/src/_locales/cv/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/cy/messages.json b/src/_locales/cy/messages.json index 7152ef93ed9dd..813c625b3140b 100644 --- a/src/_locales/cy/messages.json +++ b/src/_locales/cy/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/da/messages.json b/src/_locales/da/messages.json index 061e781a95026..ca5ee9491d69b 100644 --- a/src/_locales/da/messages.json +++ b/src/_locales/da/messages.json @@ -1011,6 +1011,10 @@ "message": "Åbner uønskede faner eller vinduer", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Markér websiden som “NSFW” (“Ikke sikker til arbejdsbrug”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index 473673525f79d..748653846b451 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -1011,6 +1011,10 @@ "message": "Öffnet unerwünschte Tabs oder Fenster", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Webseite als »NSFW« kennzeichnen (»Unpassend für den Arbeitsplatz«)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/el/messages.json b/src/_locales/el/messages.json index 73b67df631e91..1ef763e3b1e58 100644 --- a/src/_locales/el/messages.json +++ b/src/_locales/el/messages.json @@ -1011,6 +1011,10 @@ "message": "Ανοίγει ανεπιθύμητες καρτέλες ή παράθυρα", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Επισημάνετε την ιστοσελίδα ως “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/en_GB/messages.json b/src/_locales/en_GB/messages.json index 8fd9b46001abc..69334adb0d506 100644 --- a/src/_locales/en_GB/messages.json +++ b/src/_locales/en_GB/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/eo/messages.json b/src/_locales/eo/messages.json index 1d69a1fda396f..084841e499d9f 100644 --- a/src/_locales/eo/messages.json +++ b/src/_locales/eo/messages.json @@ -1011,6 +1011,10 @@ "message": "Malfermas nedeziratajn langetojn aŭ fenestrojn", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Marki la paĝon kiel «nelabortaŭgan»", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/es/messages.json b/src/_locales/es/messages.json index 55bd2e95821f5..c88cc62193f60 100644 --- a/src/_locales/es/messages.json +++ b/src/_locales/es/messages.json @@ -1011,6 +1011,10 @@ "message": "Abre pestañas o ventanas no deseadas", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Etiquetar la página web como “NSFW” (“no es seguro/apropiado para el trabajo”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/et/messages.json b/src/_locales/et/messages.json index 5ab8cc917fa23..63ac039bb19b2 100644 --- a/src/_locales/et/messages.json +++ b/src/_locales/et/messages.json @@ -1011,6 +1011,10 @@ "message": "Avab soovimatuid kaarte või aknaid", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Sildista veebileht kui „NSFW“ (“tööks sobimatu”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/eu/messages.json b/src/_locales/eu/messages.json index 5cf4565fbe69f..302800d723aef 100644 --- a/src/_locales/eu/messages.json +++ b/src/_locales/eu/messages.json @@ -1011,6 +1011,10 @@ "message": "Ireki nahi ez diren erlaitzak edo leihoak", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Web orria «NSFW» moduan jarri (“Not Safe For Work” )", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/fa/messages.json b/src/_locales/fa/messages.json index ef05c734625d9..23838c8ff4412 100644 --- a/src/_locales/fa/messages.json +++ b/src/_locales/fa/messages.json @@ -1011,6 +1011,10 @@ "message": "تب یا پنجره‌ی ناخواسته باز می‌کند", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "علامت زدن صفحه به عنوان \"NSFW\" (\"نامناسب برای کار\")", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/fi/messages.json b/src/_locales/fi/messages.json index 881e7f6e1e637..4d274bc102a57 100644 --- a/src/_locales/fi/messages.json +++ b/src/_locales/fi/messages.json @@ -1011,6 +1011,10 @@ "message": "Avaa ei-toivottuja välilehtiä tai ikkunoita", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Luokittele verkkosivu ns. työpaikalle sopimattomaksi, \"NSFW\" (\"Not Safe For Work\")", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/fil/messages.json b/src/_locales/fil/messages.json index d38e062021d63..58305b46858be 100644 --- a/src/_locales/fil/messages.json +++ b/src/_locales/fil/messages.json @@ -1011,6 +1011,10 @@ "message": "Kung anu-anong mga tab o window ang binubuksan", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Markahan bilang hindi dapat tinitignan sa pook-trabahuan (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/fr/messages.json b/src/_locales/fr/messages.json index fda258990d51f..3cf16c76e2e7a 100644 --- a/src/_locales/fr/messages.json +++ b/src/_locales/fr/messages.json @@ -1011,6 +1011,10 @@ "message": "ouvre des onglets ou fenêtres indésirables", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Marquer le site Web en tant que \"NSFW\" (\"Not Safe For Work\", c'est-à-dire pour public averti/inapproprié au travail)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/fy/messages.json b/src/_locales/fy/messages.json index ef97ec15d4891..729a7d126d440 100644 --- a/src/_locales/fy/messages.json +++ b/src/_locales/fy/messages.json @@ -1011,6 +1011,10 @@ "message": "Iepenet net-winske ljepblêden of finsters", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "De webside labelje as ‘NSFW’ (‘Not Safe For Work’)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/gl/messages.json b/src/_locales/gl/messages.json index 0da46340cd70c..358fe4043b989 100644 --- a/src/_locales/gl/messages.json +++ b/src/_locales/gl/messages.json @@ -1011,6 +1011,10 @@ "message": "Abre ventás ou páxinas non desexadas", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Etiqueta a páxina como \"NSFW\" (\"Non é Segura No Traballo\")", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/gu/messages.json b/src/_locales/gu/messages.json index 9db2f73145056..b2c8b432116e8 100644 --- a/src/_locales/gu/messages.json +++ b/src/_locales/gu/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/he/messages.json b/src/_locales/he/messages.json index b036e932ece77..eb55156173ab1 100644 --- a/src/_locales/he/messages.json +++ b/src/_locales/he/messages.json @@ -1011,6 +1011,10 @@ "message": "נפתחים לשוניות או חלונות לא רצויים", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "תיוג דף האינטרנט כ- לב\"ל ('לא בטוח לעבודה')", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/hi/messages.json b/src/_locales/hi/messages.json index 4e2cf86c5182b..0380515188a5c 100644 --- a/src/_locales/hi/messages.json +++ b/src/_locales/hi/messages.json @@ -1011,6 +1011,10 @@ "message": "अवांछित टैब या विंडो खोलता है", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "वेब पेज को इस रूप में लेबल करें “NSFW” (“काम करने के लिए सुरक्षित नहीं”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/hr/messages.json b/src/_locales/hr/messages.json index bb5ed413611fd..59d07378a8bbe 100644 --- a/src/_locales/hr/messages.json +++ b/src/_locales/hr/messages.json @@ -1011,6 +1011,10 @@ "message": "Otvara neželjene kartice ili prozore", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Označite web stranicu kao “NSFW” (“nije sigurno za pregledavanje na poslu“)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/hu/messages.json b/src/_locales/hu/messages.json index 39d020f645591..98c4d065e5cdc 100644 --- a/src/_locales/hu/messages.json +++ b/src/_locales/hu/messages.json @@ -1011,6 +1011,10 @@ "message": "Kéretlen lapokat vagy ablakokat nyit meg", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "A weboldal megjelölése felnőtt tartalomként", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/hy/messages.json b/src/_locales/hy/messages.json index bc6d4c20a1472..7956bce8736f7 100644 --- a/src/_locales/hy/messages.json +++ b/src/_locales/hy/messages.json @@ -1011,6 +1011,10 @@ "message": "Բացում է անցանկալի ներդիրները կամ լուսամուտները", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Նշել վեբ էջը որպես «NSFW» («Աշխատանքի համար անվտանգ չէ»)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/id/messages.json b/src/_locales/id/messages.json index 2ac75d90f607f..1e3b55b7accc0 100644 --- a/src/_locales/id/messages.json +++ b/src/_locales/id/messages.json @@ -1011,6 +1011,10 @@ "message": "Membuka tab atau jendela yang tidak diinginkan", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Beri label halaman web sebagai “TAUSB” (“Tidak Aman Untuk Saat Bekerja”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/it/messages.json b/src/_locales/it/messages.json index 726c6085ae0d1..cafc1e0e94458 100644 --- a/src/_locales/it/messages.json +++ b/src/_locales/it/messages.json @@ -1011,6 +1011,10 @@ "message": "Apre schede o finestre indesiderate", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Etichetta la pagina web come “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/ja/messages.json b/src/_locales/ja/messages.json index add025fe64505..1a720ceb13d83 100644 --- a/src/_locales/ja/messages.json +++ b/src/_locales/ja/messages.json @@ -1011,6 +1011,10 @@ "message": "勝手にタブやウィンドウを開きます", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "ウェブページに“NSFW” (閲覧注意、“Not Safe For Work”) とラベルをつける", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/ka/messages.json b/src/_locales/ka/messages.json index da9ea635b7a7d..08b504bf58fce 100644 --- a/src/_locales/ka/messages.json +++ b/src/_locales/ka/messages.json @@ -1011,6 +1011,10 @@ "message": "ხსნის არასასურველ ჩანართებს ან ფანჯრებს", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "გვერდი მოინიშნოს, როგორც „NSFW“ („შეუსაბამო“)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/kk/messages.json b/src/_locales/kk/messages.json index bd037e0a72ff5..55f5653a015ae 100644 --- a/src/_locales/kk/messages.json +++ b/src/_locales/kk/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/kn/messages.json b/src/_locales/kn/messages.json index eed3253f2c98b..27374f2fca4e5 100644 --- a/src/_locales/kn/messages.json +++ b/src/_locales/kn/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/ko/messages.json b/src/_locales/ko/messages.json index 486e54fc5ed76..1907260429fd3 100644 --- a/src/_locales/ko/messages.json +++ b/src/_locales/ko/messages.json @@ -1011,6 +1011,10 @@ "message": "원치 않는 탭이나 창을 엽니다", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "웹페이지를 \"NSFW\" (“Not Safe For Work”)로 분류", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/lt/messages.json b/src/_locales/lt/messages.json index b7431aceaa93c..5769d17566d35 100644 --- a/src/_locales/lt/messages.json +++ b/src/_locales/lt/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/lv/messages.json b/src/_locales/lv/messages.json index c529a68246d4d..fc24c5e2bb0c0 100644 --- a/src/_locales/lv/messages.json +++ b/src/_locales/lv/messages.json @@ -1011,6 +1011,10 @@ "message": "Atver nevēlamas cilnes vai logus", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Iezīmēt tīmekļa lapu kā \"NSFW\" (\"Not Safe for Work (nav droša darbam))", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/mk/messages.json b/src/_locales/mk/messages.json index 0a7777f9b04aa..2eedde6695197 100644 --- a/src/_locales/mk/messages.json +++ b/src/_locales/mk/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/ml/messages.json b/src/_locales/ml/messages.json index b4c1b3a162a36..584f165d68b16 100644 --- a/src/_locales/ml/messages.json +++ b/src/_locales/ml/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/mr/messages.json b/src/_locales/mr/messages.json index 6530b322480be..e0bc26d1ec638 100644 --- a/src/_locales/mr/messages.json +++ b/src/_locales/mr/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/ms/messages.json b/src/_locales/ms/messages.json index 5247e837f1f1c..88e52805548bd 100644 --- a/src/_locales/ms/messages.json +++ b/src/_locales/ms/messages.json @@ -1011,6 +1011,10 @@ "message": "Membuka tab atau tetingkap yang tidak diingini", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Labelkan laman web itu sebagai \"NSFW\" (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/nb/messages.json b/src/_locales/nb/messages.json index 5baaf48f039c0..634fcca615fe2 100644 --- a/src/_locales/nb/messages.json +++ b/src/_locales/nb/messages.json @@ -1011,6 +1011,10 @@ "message": "Åpner uønskede faner eller vinduer", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Merk nettsiden som “NSFW” (“Not Safe For Work”) (advarsel mot sider med upassende innhold)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/nl/messages.json b/src/_locales/nl/messages.json index 554544ccb5437..49b94078774c2 100644 --- a/src/_locales/nl/messages.json +++ b/src/_locales/nl/messages.json @@ -1011,6 +1011,10 @@ "message": "Opent ongewenste tabbladen of vensters", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "De webpagina labelen als ‘NSFW’ (‘Not Safe For Work’)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/oc/messages.json b/src/_locales/oc/messages.json index 6d141a65722d6..8dd23f9833000 100644 --- a/src/_locales/oc/messages.json +++ b/src/_locales/oc/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/pa/messages.json b/src/_locales/pa/messages.json index 584a23d7e7caf..e295df49b7e2e 100644 --- a/src/_locales/pa/messages.json +++ b/src/_locales/pa/messages.json @@ -1011,6 +1011,10 @@ "message": "ਬੇਲੋੜੀਆਂ ਟੈਬਾਂ ਜਾਂ ਵਿੰਡੋ ਖੋਲ੍ਹਦਾ ਹੈ", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/pl/messages.json b/src/_locales/pl/messages.json index a4ce6344d7508..b63a8a218b48f 100644 --- a/src/_locales/pl/messages.json +++ b/src/_locales/pl/messages.json @@ -1011,6 +1011,10 @@ "message": "Otwiera niepożądane karty lub okna", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Oznacz stronę internetową jako „NSFW” („Not Safe For Work (nieodpowiednią w pracy)”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/pt_BR/messages.json b/src/_locales/pt_BR/messages.json index 1704ab211707c..9b4d7c6f7ca38 100644 --- a/src/_locales/pt_BR/messages.json +++ b/src/_locales/pt_BR/messages.json @@ -1011,6 +1011,10 @@ "message": "Abre abas ou janelas indesejadas", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Rotula a página da web como \"NSFW\" (\"Não é Seguro no Trabalho\")", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/pt_PT/messages.json b/src/_locales/pt_PT/messages.json index 743b8770b1c0d..882b2c278ea13 100644 --- a/src/_locales/pt_PT/messages.json +++ b/src/_locales/pt_PT/messages.json @@ -1011,6 +1011,10 @@ "message": "Abre separadores ou janelas indesejáveis", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Rotular a página web como “NSFW” (“Não seguro para o trabalho”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/ro/messages.json b/src/_locales/ro/messages.json index 3881e7821a45a..ce4595d71c440 100644 --- a/src/_locales/ro/messages.json +++ b/src/_locales/ro/messages.json @@ -1011,6 +1011,10 @@ "message": "Deschide file sau ferestre nedorite", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Etichetează pagina ca fiind „NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json index 2d535dd32f159..fd4d542cb1e8d 100644 --- a/src/_locales/ru/messages.json +++ b/src/_locales/ru/messages.json @@ -1011,6 +1011,10 @@ "message": "Открываются нежелательные вкладки или окна", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Пометить веб-страницу как “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/si/messages.json b/src/_locales/si/messages.json index afd9c19d6f97f..5b1819838b86a 100644 --- a/src/_locales/si/messages.json +++ b/src/_locales/si/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/sk/messages.json b/src/_locales/sk/messages.json index ab778d9d25cf9..e1adf45e0fe9c 100644 --- a/src/_locales/sk/messages.json +++ b/src/_locales/sk/messages.json @@ -1011,6 +1011,10 @@ "message": "Otvára nechcené karty alebo okná", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Označiť webstránku ako “NSFW” (Nie je bezpečné pre prácu”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/sl/messages.json b/src/_locales/sl/messages.json index bb2cfa2e156d5..703ce9f8732db 100644 --- a/src/_locales/sl/messages.json +++ b/src/_locales/sl/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/so/messages.json b/src/_locales/so/messages.json index b8c9c13bcef31..4276bf8c7ac68 100644 --- a/src/_locales/so/messages.json +++ b/src/_locales/so/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/sq/messages.json b/src/_locales/sq/messages.json index 3fc972c4b03cb..6cdf1664316fd 100644 --- a/src/_locales/sq/messages.json +++ b/src/_locales/sq/messages.json @@ -1011,6 +1011,10 @@ "message": "Hap skeda ose dritare të panevojshme", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Etiketoj faqen si “NSFW” (“E papërshtatshme për punë”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/sr/messages.json b/src/_locales/sr/messages.json index f17e861e0d097..734925be9e56d 100644 --- a/src/_locales/sr/messages.json +++ b/src/_locales/sr/messages.json @@ -1011,6 +1011,10 @@ "message": "\nОтвара нежељене картице или прозоре", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Изначите веб страницу као „NSFW“ (“Није безбедна за рад”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/sv/messages.json b/src/_locales/sv/messages.json index 3abea889d2536..c6b46530ee7ac 100644 --- a/src/_locales/sv/messages.json +++ b/src/_locales/sv/messages.json @@ -1011,6 +1011,10 @@ "message": "Öppnar oönskade flikar eller fönster", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Märk webbsidan som \"NSFW\" (“Inte lämplig på jobbet”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/sw/messages.json b/src/_locales/sw/messages.json index ad3e42820fc88..ecb8214e3e0d6 100644 --- a/src/_locales/sw/messages.json +++ b/src/_locales/sw/messages.json @@ -1011,6 +1011,10 @@ "message": "Hufungua vichupo au vidirisha visivyotakikana", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Ipe tovuti lebo ya \"NSFW\" (\"Haifai Kazini\")", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/ta/messages.json b/src/_locales/ta/messages.json index c76293554b4ca..fe1be27a9ef3c 100644 --- a/src/_locales/ta/messages.json +++ b/src/_locales/ta/messages.json @@ -1011,6 +1011,10 @@ "message": "தேவையற்ற தாவல்கள் அ சாளரங்களைத் திறக்கிறது", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/te/messages.json b/src/_locales/te/messages.json index 0f4e085e0c91a..e4d15b99375c1 100644 --- a/src/_locales/te/messages.json +++ b/src/_locales/te/messages.json @@ -1011,6 +1011,10 @@ "message": "అనవసరమైన ట్యాబ్‌లు లేదా విండోలను తెరుస్తుంది", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "వెబ్ పేజీని “NSFW”గా లేబుల్ చేయండి (“పని కోసం సురక్షితం కాదు”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/th/messages.json b/src/_locales/th/messages.json index 268cd4da0366d..8bcdce36b5c7f 100644 --- a/src/_locales/th/messages.json +++ b/src/_locales/th/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/tr/messages.json b/src/_locales/tr/messages.json index 41ac3b3d47b5a..a3c4ad513c734 100644 --- a/src/_locales/tr/messages.json +++ b/src/_locales/tr/messages.json @@ -1011,6 +1011,10 @@ "message": "İstenmeyen sekme veya pencereler açıyor", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Web sayfasını uygunsuz (“NSFW”) olarak etiketle (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/uk/messages.json b/src/_locales/uk/messages.json index c78caea505588..0bb5e53cb8182 100644 --- a/src/_locales/uk/messages.json +++ b/src/_locales/uk/messages.json @@ -1011,6 +1011,10 @@ "message": "Відкриває небажані вкладки або вікна", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Позначити цю сторінку «NSFW» («Небезпечно для роботи»)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/ur/messages.json b/src/_locales/ur/messages.json index 6fbc6fcc824a5..4a608998bc2d0 100644 --- a/src/_locales/ur/messages.json +++ b/src/_locales/ur/messages.json @@ -1011,6 +1011,10 @@ "message": "Opens unwanted tabs or windows", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "Label the web page as “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/vi/messages.json b/src/_locales/vi/messages.json index 9c50188234059..db6393db4db32 100644 --- a/src/_locales/vi/messages.json +++ b/src/_locales/vi/messages.json @@ -1011,6 +1011,10 @@ "message": "Xuất hiện các tab và cửa sổ ngoài mong muốn", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "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\"", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json index 8e1acd8f3efd4..7004d01ff35ca 100644 --- a/src/_locales/zh_CN/messages.json +++ b/src/_locales/zh_CN/messages.json @@ -1011,6 +1011,10 @@ "message": "打开不需要的标签页或窗口", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "将该网页标记为 “NSFW”(“工作场所不宜”)", "description": "A checkbox to use for NSFW sites" diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json index 7c3bc17a10ce8..8fb32f4e43d9c 100644 --- a/src/_locales/zh_TW/messages.json +++ b/src/_locales/zh_TW/messages.json @@ -1011,6 +1011,10 @@ "message": "會開啟不需要的分頁或視窗", "description": "An entry in the widget used to select the type of issue" }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, "supportS6Checkbox1": { "message": "將網頁標記為「NSFW」(工作場所不宜)", "description": "A checkbox to use for NSFW sites" From 547fae484274df79da5fbb32a29fe6f165303f9a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 09:09:19 -0400 Subject: [PATCH 232/553] Improve scriptlet helper `proxy-apply` Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3378 --- assets/resources/scriptlets.js | 191 ++++++++++++++++++--------------- 1 file changed, 106 insertions(+), 85 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 3ccb1b0215280..b12580db40d78 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -1488,26 +1488,44 @@ function proxyApplyFn( } const fn = context[prop]; if ( typeof fn !== 'function' ) { return; } + if ( proxyApplyFn.CtorContext === undefined ) { + proxyApplyFn.CtorContext = class { + constructor(callFn, callArgs) { + this.callFn = callFn; + this.callArgs = callArgs; + } + reflect() { + return Reflect.construct(this.callFn, this.callArgs); + } + }; + proxyApplyFn.ApplyContext = class { + constructor(callFn, thisArg, callArgs) { + this.callFn = callFn; + this.thisArg = thisArg; + this.callArgs = callArgs; + } + reflect() { + return Reflect.apply(this.callFn, this.thisArg, this.callArgs); + } + }; + } const fnStr = fn.toString(); const toString = (function toString() { return fnStr; }).bind(null); - if ( fn.prototype && fn.prototype.constructor === fn ) { - context[prop] = new Proxy(fn, { - construct: handler, - get(target, prop, receiver) { - if ( prop === 'toString' ) { return toString; } - return Reflect.get(target, prop, receiver); - }, - }); - return (...args) => Reflect.construct(...args); - } - context[prop] = new Proxy(fn, { - apply: handler, + const proxyDetails = { + apply(target, thisArg, args) { + return handler(new proxyApplyFn.ApplyContext(target, thisArg, args)); + }, get(target, prop, receiver) { if ( prop === 'toString' ) { return toString; } return Reflect.get(target, prop, receiver); }, - }); - return (...args) => Reflect.apply(...args); + }; + if ( fn.prototype?.constructor === fn ) { + proxyDetails.construct = function(target, args) { + return handler(new proxyApplyFn.CtorContext(target, args)); + }; + } + context[prop] = new Proxy(fn, proxyDetails); } /******************************************************************************* @@ -1771,18 +1789,19 @@ function addEventListenerDefuser( return matchesBoth; }; runAt(( ) => { - proxyApplyFn('EventTarget.prototype.addEventListener', function(target, thisArg, args) { + proxyApplyFn('EventTarget.prototype.addEventListener', function(context) { + const { callArgs, thisArg } = context; let t, h; try { - t = String(args[0]); - if ( typeof args[1] === 'function' ) { - h = String(safe.Function_toString(args[1])); - } else if ( typeof args[1] === 'object' && args[1] !== null ) { - if ( typeof args[1].handleEvent === 'function' ) { - h = String(safe.Function_toString(args[1].handleEvent)); + t = String(callArgs[0]); + if ( typeof callArgs[1] === 'function' ) { + h = String(safe.Function_toString(callArgs[1])); + } else if ( typeof callArgs[1] === 'object' && callArgs[1] !== null ) { + if ( typeof callArgs[1].handleEvent === 'function' ) { + h = String(safe.Function_toString(callArgs[1].handleEvent)); } } else { - h = String(args[1]); + h = String(callArgs[1]); } } catch(ex) { } @@ -1791,7 +1810,7 @@ function addEventListenerDefuser( } else if ( shouldPrevent(thisArg, t, h) ) { return safe.uboLog(logPrefix, `Prevented: ${t}\n${h}\n${elementDetails(thisArg)}`); } - return Reflect.apply(target, thisArg, args); + return context.reflect(); }); }, extraArgs.runAt); } @@ -2176,10 +2195,11 @@ function noFetchIf( responseProps.type = { value: responseType }; } } - proxyApplyFn('fetch', function fetch(target, thisArg, args) { - const details = args[0] instanceof self.Request - ? args[0] - : Object.assign({ url: args[0] }, args[1]); + proxyApplyFn('fetch', function fetch(context) { + const { callArgs } = context; + const details = callArgs[0] instanceof self.Request + ? callArgs[0] + : Object.assign({ url: callArgs[0] }, callArgs[1]); let proceed = true; try { const props = new Map(); @@ -2197,7 +2217,7 @@ function noFetchIf( safe.uboLog(logPrefix, `Called: ${out.join('\n')}`); } if ( propsToMatch === '' && responseBody === '' ) { - return Reflect.apply(target, thisArg, args); + return context.reflect(); } proceed = needles.length === 0; for ( const { key, pattern } of needles ) { @@ -2212,7 +2232,7 @@ function noFetchIf( } catch(ex) { } if ( proceed ) { - return Reflect.apply(target, thisArg, args); + return context.reflect(); } return generateContentFn(responseBody).then(text => { safe.uboLog(logPrefix, `Prevented with response "${text}"`); @@ -2520,14 +2540,15 @@ function noSetIntervalIf( delay = parseInt(delay, 10); } const reNeedle = safe.patternToRegex(needle); - proxyApplyFn('setInterval', function setInterval(target, thisArg, args) { - const a = args[0] instanceof Function - ? String(safe.Function_toString(args[0])) - : String(args[0]); - const b = args[1]; + proxyApplyFn('setInterval', function setInterval(context) { + const { callArgs } = context; + const a = callArgs[0] instanceof Function + ? String(safe.Function_toString(callArgs[0])) + : String(callArgs[0]); + const b = callArgs[1]; if ( needle === '' && delay === undefined ) { safe.uboLog(logPrefix, `Called:\n${a}\n${b}`); - return Reflect.apply(target, thisArg, args); + return context.reflect(); } let defuse; if ( needle !== '' ) { @@ -2537,10 +2558,10 @@ function noSetIntervalIf( defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; } if ( defuse ) { - args[0] = function(){}; + callArgs[0] = function(){}; safe.uboLog(logPrefix, `Prevented:\n${a}\n${b}`); } - return Reflect.apply(target, thisArg, args); + return context.reflect(); }); } @@ -2576,14 +2597,15 @@ function noSetTimeoutIf( delay = parseInt(delay, 10); } const reNeedle = safe.patternToRegex(needle); - proxyApplyFn('setTimeout', function setTimeout(target, thisArg, args) { - const a = args[0] instanceof Function - ? String(safe.Function_toString(args[0])) - : String(args[0]); - const b = args[1]; + proxyApplyFn('setTimeout', function setTimeout(context) { + const { callArgs } = context; + const a = callArgs[0] instanceof Function + ? String(safe.Function_toString(callArgs[0])) + : String(callArgs[0]); + const b = callArgs[1]; if ( needle === '' && delay === undefined ) { safe.uboLog(logPrefix, `Called:\n${a}\n${b}`); - return Reflect.apply(target, thisArg, args); + return context.reflect(); } let defuse; if ( needle !== '' ) { @@ -2593,10 +2615,10 @@ function noSetTimeoutIf( defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; } if ( defuse ) { - args[0] = function(){}; + callArgs[0] = function(){}; safe.uboLog(logPrefix, `Prevented:\n${a}\n${b}`); } - return Reflect.apply(target, thisArg, args); + return context.reflect(); }); } @@ -2900,25 +2922,26 @@ function noWindowOpenIf( return decoyElem; }; const noopFunc = function(){}; - proxyApplyFn('open', function open(target, thisArg, args) { - const haystack = args.join(' '); + proxyApplyFn('open', function open(context) { + const { callArgs } = context; + const haystack = callArgs.join(' '); if ( rePattern.test(haystack) !== targetMatchResult ) { if ( safe.logLevel > 1 ) { - safe.uboLog(logPrefix, `Allowed (${args.join(', ')})`); + safe.uboLog(logPrefix, `Allowed (${callArgs.join(', ')})`); } - return Reflect.apply(target, thisArg, args); + return context.reflect(); } - safe.uboLog(logPrefix, `Prevented (${args.join(', ')})`); + safe.uboLog(logPrefix, `Prevented (${callArgs.join(', ')})`); if ( delay === '' ) { return null; } if ( decoy === 'blank' ) { - args[0] = 'about:blank'; - const r = Reflect.apply(target, thisArg, args); + callArgs[0] = 'about:blank'; + const r = context.reflect(); setTimeout(( ) => { r.close(); }, autoRemoveAfter); return r; } const decoyElem = decoy === 'obj' - ? createDecoy('object', 'data', ...args) - : createDecoy('iframe', 'src', ...args); + ? createDecoy('object', 'data', ...callArgs) + : createDecoy('iframe', 'src', ...callArgs); let popup = decoyElem.contentWindow; if ( typeof popup === 'object' && popup !== null ) { Object.defineProperty(popup, 'closed', { value: false }); @@ -4850,8 +4873,8 @@ function trustedPruneOutboundObject( if ( propChain === '' ) { return; } const safe = safeSelf(); const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); - const reflector = proxyApplyFn(propChain, function(...args) { - const objBefore = reflector(...args); + proxyApplyFn(propChain, function(context) { + const objBefore = context.reflect(); if ( objBefore instanceof Object === false ) { return objBefore; } const objAfter = objectPruneFn( objBefore, @@ -4884,26 +4907,27 @@ function trustedReplaceArgument( if ( propChain === '' ) { return; } const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('trusted-replace-argument', propChain, argposRaw, argraw); - const argpos = parseInt(argposRaw, 10) || 0; + const argoffset = parseInt(argposRaw, 10) || 0; const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); const normalValue = validateConstantFn(true, argraw, extraArgs); const reCondition = extraArgs.condition ? safe.patternToRegex(extraArgs.condition) : /^/; - const reflector = proxyApplyFn(propChain, function(...args) { + proxyApplyFn(propChain, function(context) { + const { callArgs } = context; if ( argposRaw === '' ) { - safe.uboLog(logPrefix, `Arguments:\n${args.join('\n')}`); - return reflector(...args); - } - const arglist = args[args.length-1]; - if ( Array.isArray(arglist) === false ) { return reflector(...args); } - const argBefore = arglist[argpos]; - if ( safe.RegExp_test.call(reCondition, argBefore) === false ) { - return reflector(...args); - } - arglist[argpos] = normalValue; - safe.uboLog(logPrefix, `Replaced argument:\nBefore: ${JSON.stringify(argBefore)}\nAfter: ${normalValue}`); - return reflector(...args); + safe.uboLog(logPrefix, `Arguments:\n${callArgs.join('\n')}`); + return context.reflect(); + } + const argpos = argoffset >= 0 ? argoffset : callArgs.length - argoffset; + if ( argpos >= 0 && argpos < callArgs.length ) { + const argBefore = callArgs[argpos]; + if ( safe.RegExp_test.call(reCondition, argBefore) ) { + callArgs[argpos] = normalValue; + safe.uboLog(logPrefix, `Replaced argument:\nBefore: ${JSON.stringify(argBefore)}\nAfter: ${normalValue}`); + } + } + return context.reflect(); }); } @@ -4933,8 +4957,8 @@ function trustedReplaceOutboundText( : rawReplacement; const extraArgs = safe.getExtraArgs(args); const reCondition = safe.patternToRegex(extraArgs.condition || ''); - const reflector = proxyApplyFn(propChain, function(...args) { - const encodedTextBefore = reflector(...args); + proxyApplyFn(propChain, function(context) { + const encodedTextBefore = context.reflect(); let textBefore = encodedTextBefore; if ( extraArgs.encoding === 'base64' ) { try { textBefore = self.atob(encodedTextBefore); } @@ -5011,34 +5035,31 @@ function trustedSuppressNativeMethod( return { type: 'exact', value: undefined }; } }); - const reflector = proxyApplyFn(methodPath, function(...args) { + proxyApplyFn(methodPath, function(context) { + const { callArgs } = context; if ( signature === '' ) { - safe.uboLog(logPrefix, `Arguments:\n${args.join('\n')}`); - return reflector(...args); - } - const arglist = args[args.length-1]; - if ( Array.isArray(arglist) === false ) { - return reflector(...args); + safe.uboLog(logPrefix, `Arguments:\n${callArgs.join('\n')}`); + return context.reflect(); } - if ( arglist.length < signatureArgs.length ) { - return reflector(...args); + if ( callArgs.length < signatureArgs.length ) { + return context.reflect(); } for ( let i = 0; i < signatureArgs.length; i++ ) { const signatureArg = signatureArgs[i]; if ( signatureArg === undefined ) { continue; } - const targetArg = arglist[i]; + const targetArg = callArgs[i]; if ( signatureArg.type === 'exact' ) { if ( targetArg !== signatureArg.value ) { - return reflector(...args); + return context.reflect(); } } if ( signatureArg.type === 'pattern' ) { if ( safe.RegExp_test.call(signatureArg.re, targetArg) === false ) { - return reflector(...args); + return context.reflect(); } } } - safe.uboLog(logPrefix, `Suppressed:\n${args.join('\n')}`); + safe.uboLog(logPrefix, `Suppressed:\n${callArgs.join('\n')}`); if ( how === 'abort' ) { throw new ReferenceError(); } From 9155a89c08c4d2dffdd1db9c82a9b861f2360cbe Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 09:28:02 -0400 Subject: [PATCH 233/553] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a79906df5df0..f70b74100377e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- [Improve scriptlet helper `proxy-apply`](https://github.com/gorhill/uBlock/commit/547fae4842) +- [Add an entry in _Report_ page for badware/phishing category](https://github.com/gorhill/uBlock/commit/e18a3707c7) - [New static network filter option `urlskip=`](https://github.com/gorhill/uBlock/commit/266ec4894b) - [Rewrite cname uncloaking code to account for new `ipaddress=` option](https://github.com/gorhill/uBlock/commit/6acf97bf51) - [Avoid using dns.resolve() for proxied DNS resolution](https://github.com/gorhill/uBlock/commit/d5f14ffa32) From 7fb626850e96ce8f300df13708a852bf63dea0f8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 09:28:31 -0400 Subject: [PATCH 234/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index a56296cd32544..1d97901e59c18 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.22 \ No newline at end of file +1.59.1.100 \ No newline at end of file From d238baa374d82f17661cc07bd5302cfa761261f5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 09:35:36 -0400 Subject: [PATCH 235/553] 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 d52f231b67443..7d6cce4f17513 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.22", + "version": "1.59.1.100", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1b22/uBlock0_1.59.1b22.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc0/uBlock0_1.59.1rc0.firefox.signed.xpi" } ] } From 6a042f152b513bbf5b3c8623ea3fbe2574ac0e24 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 10:26:40 -0400 Subject: [PATCH 236/553] Ignore browser-provided 0.0.0.0 ip address when DNS is proxied Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3379 --- platform/firefox/vapi-background-ext.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platform/firefox/vapi-background-ext.js b/platform/firefox/vapi-background-ext.js index 5d3ff8c5dfbdd..7fdc3dd5505f6 100644 --- a/platform/firefox/vapi-background-ext.js +++ b/platform/firefox/vapi-background-ext.js @@ -94,6 +94,10 @@ vAPI.Net = class extends vAPI.Net { } normalizeDetails(details) { + // https://github.com/uBlockOrigin/uBlock-issues/issues/3379 + if ( details.proxyInfo?.proxyDNS && details.ip === '0.0.0.0' ) { + details.ip = null; + } const type = details.type; if ( type === 'imageset' ) { details.type = 'image'; From 58c13bacb783366919b4e2079306b4bad1905db0 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 10:28:54 -0400 Subject: [PATCH 237/553] new revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 1d97901e59c18..91e99c278d4a1 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.100 \ No newline at end of file +1.59.1.101 \ No newline at end of file From acffae6a21b35294c8d6f2c451441ada904190cd Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 10:36:08 -0400 Subject: [PATCH 238/553] 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 7d6cce4f17513..0a9608e02693a 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.100", + "version": "1.59.1.101", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc0/uBlock0_1.59.1rc0.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc1/uBlock0_1.59.1rc1.firefox.signed.xpi" } ] } From e8f6f3ddffd14887120bfe552b823816945aeda6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 17:33:06 -0400 Subject: [PATCH 239/553] Throttle down repeated scriptlet logging information Related feedback https://github.com/uBlockOrigin/uBlock-issues/issues/3378#issuecomment-2356422784 --- assets/resources/scriptlets.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index b12580db40d78..dbdab81024586 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -176,9 +176,18 @@ function safeSelf() { const bc = new self.BroadcastChannel(scriptletGlobals.bcSecret); let bcBuffer = []; safe.logLevel = scriptletGlobals.logLevel || 1; + let lastLogType = ''; + let lastLogText = ''; + let lastLogTime = 0; safe.sendToLogger = (type, ...args) => { if ( args.length === 0 ) { return; } const text = `[${document.location.hostname || document.location.href}]${args.join(' ')}`; + if ( text === lastLogText && type === lastLogType ) { + if ( (Date.now() - lastLogTime) < 300000 ) { return; } + } + lastLogType = type; + lastLogText = text; + lastLogTime = Date.now(); if ( bcBuffer === undefined ) { return bc.postMessage({ what: 'messageToLogger', type, text }); } From 00d4262c0df668b996cda8c620d7e032e9f6a265 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 17:35:22 -0400 Subject: [PATCH 240/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 91e99c278d4a1..c19925015fc90 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.101 \ No newline at end of file +1.59.1.102 \ No newline at end of file From 2375ca3ca0b0c1ca2eafba49cc007077f3279275 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 17:36:12 -0400 Subject: [PATCH 241/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f70b74100377e..8d6eb1b08b6a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Throttle down repeated scriptlet logging information](https://github.com/gorhill/uBlock/commit/e8f6f3ddff) - [Improve scriptlet helper `proxy-apply`](https://github.com/gorhill/uBlock/commit/547fae4842) - [Add an entry in _Report_ page for badware/phishing category](https://github.com/gorhill/uBlock/commit/e18a3707c7) - [New static network filter option `urlskip=`](https://github.com/gorhill/uBlock/commit/266ec4894b) From 3238fe48dbe89535814811628c751f2129e71de8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 17:48:45 -0400 Subject: [PATCH 242/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.vi.txt | 2 +- platform/mv3/extension/_locales/hu/messages.json | 4 ++-- src/_locales/ar/messages.json | 2 +- src/_locales/bg/messages.json | 2 +- src/_locales/ca/messages.json | 2 +- src/_locales/cs/messages.json | 2 +- src/_locales/da/messages.json | 2 +- src/_locales/de/messages.json | 2 +- src/_locales/eo/messages.json | 10 +++++----- src/_locales/es/messages.json | 2 +- src/_locales/et/messages.json | 2 +- src/_locales/fr/messages.json | 2 +- src/_locales/fy/messages.json | 2 +- src/_locales/gl/messages.json | 2 +- src/_locales/he/messages.json | 2 +- src/_locales/hi/messages.json | 2 +- src/_locales/hr/messages.json | 2 +- src/_locales/hu/messages.json | 6 +++--- src/_locales/it/messages.json | 2 +- src/_locales/ja/messages.json | 2 +- src/_locales/lv/messages.json | 2 +- src/_locales/nl/messages.json | 2 +- src/_locales/pl/messages.json | 2 +- src/_locales/pt_BR/messages.json | 2 +- src/_locales/pt_PT/messages.json | 2 +- src/_locales/ru/messages.json | 2 +- src/_locales/sk/messages.json | 2 +- src/_locales/sv/messages.json | 2 +- src/_locales/tr/messages.json | 2 +- src/_locales/uk/messages.json | 2 +- src/_locales/vi/messages.json | 2 +- src/_locales/zh_CN/messages.json | 2 +- src/_locales/zh_TW/messages.json | 4 ++-- 33 files changed, 41 insertions(+), 41 deletions(-) diff --git a/platform/mv3/description/webstore.vi.txt b/platform/mv3/description/webstore.vi.txt index 249df6a5e8e37..1ea12d09442c1 100644 --- a/platform/mv3/description/webstore.vi.txt +++ b/platform/mv3/description/webstore.vi.txt @@ -7,7 +7,7 @@ Bộ quy tắc mặc định tương tự bộ lọc của uBlock Origin: - EasyPrivacy - Danh sách máy chủ chạy quảng cáo và trình theo dõi của Pete Lowe -You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Bạn có thể tự thêm quy tắc mới ở trang cài đặt -- click vào biểu tượng _Bánh răng_ ở trong cửa sổ popup. uBOL mang tính khai báo hoàn toàn, vì vậy uBOL sẽ không cần phải liên tục chạy để chặn nội dung. Thay vào đó, chính trình duyệt sẽ thực hiện lọc nội dung bằng cách sử dụng công cụ chèn CSS/JS hiệu quả hơn có sẵn của nó. Điều này cũng đồng thời có nghĩa là uBOL sẽ không tiêu tốn tài nguyên CPU/bộ nhớ của bạn để chặn nội dung. uBOL sẽ chỉ chạy _khi và chỉ khi_ bạn đang xem cửa sổ popup của uBOL, hoặc bạn đang cấu hình uBOL ở trang cài đặt. diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index bb044590e905f..483b2eef56a22 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -128,7 +128,7 @@ "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "elkészült", + "message": "teljes", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { @@ -148,7 +148,7 @@ "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[hostnames only]\nexample.com\ngames.example\n...", + "message": "[csak kiszolgálónevek]\nexample.com\ngames.example\n...", "description": "Default text for in edit field" }, "behaviorSectionLabel": { diff --git a/src/_locales/ar/messages.json b/src/_locales/ar/messages.json index 17bd55c0f86c1..ca454de959e84 100644 --- a/src/_locales/ar/messages.json +++ b/src/_locales/ar/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "يؤدي إلى البرامج الضارة والإحتيال", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/bg/messages.json b/src/_locales/bg/messages.json index 98e3bd4a61606..086e813398ab2 100644 --- a/src/_locales/bg/messages.json +++ b/src/_locales/bg/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Води до зловреден софтуер, фишинг", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/ca/messages.json b/src/_locales/ca/messages.json index 9ec5bda0cba6e..27963d45c2ccb 100644 --- a/src/_locales/ca/messages.json +++ b/src/_locales/ca/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Condueix a programari maliciós, pesca electrònica", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/cs/messages.json b/src/_locales/cs/messages.json index 8fc18fd9623c4..9e28071c50cd1 100644 --- a/src/_locales/cs/messages.json +++ b/src/_locales/cs/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Vede k badwaru, phishingu", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/da/messages.json b/src/_locales/da/messages.json index ca5ee9491d69b..20557ad5cae5e 100644 --- a/src/_locales/da/messages.json +++ b/src/_locales/da/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Fører til badware, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index 748653846b451..af7d997b6412e 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Führt zu Schadsoftware, Phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/eo/messages.json b/src/_locales/eo/messages.json index 084841e499d9f..448de1a33596f 100644 --- a/src/_locales/eo/messages.json +++ b/src/_locales/eo/messages.json @@ -484,11 +484,11 @@ "description": "Filter lists section name" }, "3pGroupSocial": { - "message": "Social widgets", + "message": "Socialaj fenestraĵoj", "description": "Filter lists section name" }, "3pGroupCookies": { - "message": "Cookie notices", + "message": "Avizoj de kuketoj", "description": "Filter lists section name" }, "3pGroupAnnoyances": { @@ -540,11 +540,11 @@ "description": "Warning against copy-pasting filters from random sources" }, "1pEnableMyFiltersLabel": { - "message": "Enable my custom filters", + "message": "Ŝalti miajn proprajn filtrilojn", "description": "Label for the checkbox use to enable/disable 'My filters' list" }, "1pTrustMyFiltersLabel": { - "message": "Allow custom filters requiring trust", + "message": "Permesi proprajn filtrilojn, kiuj postulas fidon", "description": "Label for the checkbox use to trust the content of 'My filters' list" }, "1pImport": { @@ -844,7 +844,7 @@ "description": "Logger setting: A sentence to describe the purpose of the settings below" }, "loggerSettingPerEntryMaxAge": { - "message": "Preserve entries from the last {{input}} minutes", + "message": "Konservi enigojn ekde la lastaj {{input}} minutoj", "description": "A logger setting" }, "loggerSettingPerTabMaxLoads": { diff --git a/src/_locales/es/messages.json b/src/_locales/es/messages.json index c88cc62193f60..76604d8fb9f90 100644 --- a/src/_locales/es/messages.json +++ b/src/_locales/es/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Conduce a malware y phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/et/messages.json b/src/_locales/et/messages.json index 63ac039bb19b2..178950aef80b9 100644 --- a/src/_locales/et/messages.json +++ b/src/_locales/et/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Põhjustab pahavara, õngitsuskirju", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/fr/messages.json b/src/_locales/fr/messages.json index 3cf16c76e2e7a..3e6731330100d 100644 --- a/src/_locales/fr/messages.json +++ b/src/_locales/fr/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Conduit à/Redirige vers des logiciels malveillants, du hameçonnage...", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/fy/messages.json b/src/_locales/fy/messages.json index 729a7d126d440..863d058ee3762 100644 --- a/src/_locales/fy/messages.json +++ b/src/_locales/fy/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Liedt ta badware, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/gl/messages.json b/src/_locales/gl/messages.json index 358fe4043b989..f09c526ef8dee 100644 --- a/src/_locales/gl/messages.json +++ b/src/_locales/gl/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Leva a software malicioso, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/he/messages.json b/src/_locales/he/messages.json index eb55156173ab1..a9bf5714bc254 100644 --- a/src/_locales/he/messages.json +++ b/src/_locales/he/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "מוביל לנוזקה, פישינג", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/hi/messages.json b/src/_locales/hi/messages.json index 0380515188a5c..1a26f87293c52 100644 --- a/src/_locales/hi/messages.json +++ b/src/_locales/hi/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "बैडवेयर, फ़िशिंग की ओर ले जाता है", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/hr/messages.json b/src/_locales/hr/messages.json index 59d07378a8bbe..e7a831de98333 100644 --- a/src/_locales/hr/messages.json +++ b/src/_locales/hr/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Vodi do zloćudnog softvera, krađe identiteta", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/hu/messages.json b/src/_locales/hu/messages.json index 98c4d065e5cdc..e80959222fc59 100644 --- a/src/_locales/hu/messages.json +++ b/src/_locales/hu/messages.json @@ -76,7 +76,7 @@ "description": "Message to be read by screen readers" }, "popupPowerSwitchInfo2": { - "message": "Kattints az uBlock₀ engedélyezéséhez ezen a webhelyen.", + "message": "Kattintson a uBlock₀ engedélyezéséhez ezen a webhelyen.", "description": "Message to be read by screen readers" }, "popupBlockedRequestPrompt": { @@ -136,7 +136,7 @@ "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups1": { - "message": "Kattints az összes előugró ablak letiltásához ezen a webhelyen", + "message": "Kattintson az összes felugró ablak letiltásához ezen a webhelyen", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups2": { @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Kártékony programokhoz, adathalászathoz vezet", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/it/messages.json b/src/_locales/it/messages.json index cafc1e0e94458..242d997e1fadd 100644 --- a/src/_locales/it/messages.json +++ b/src/_locales/it/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Porta a badware, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/ja/messages.json b/src/_locales/ja/messages.json index 1a720ceb13d83..0b8c6d014a6ea 100644 --- a/src/_locales/ja/messages.json +++ b/src/_locales/ja/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "悪質ソフトやフィッシングへの誘導", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/lv/messages.json b/src/_locales/lv/messages.json index fc24c5e2bb0c0..f0359c580da59 100644 --- a/src/_locales/lv/messages.json +++ b/src/_locales/lv/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Noved pie slitkas programmatūras, pikšķerēšanas", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/nl/messages.json b/src/_locales/nl/messages.json index 49b94078774c2..49a3af00b2fe9 100644 --- a/src/_locales/nl/messages.json +++ b/src/_locales/nl/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Leidt tot badware, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/pl/messages.json b/src/_locales/pl/messages.json index b63a8a218b48f..b95ccce576959 100644 --- a/src/_locales/pl/messages.json +++ b/src/_locales/pl/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Prowadzi do szkodliwego oprogramowania, phishingu", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/pt_BR/messages.json b/src/_locales/pt_BR/messages.json index 9b4d7c6f7ca38..f1a1e3666d399 100644 --- a/src/_locales/pt_BR/messages.json +++ b/src/_locales/pt_BR/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Leva a badware, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/pt_PT/messages.json b/src/_locales/pt_PT/messages.json index 882b2c278ea13..54b86dc7d0072 100644 --- a/src/_locales/pt_PT/messages.json +++ b/src/_locales/pt_PT/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Leva a badware, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json index fd4d542cb1e8d..c0bfd156f5427 100644 --- a/src/_locales/ru/messages.json +++ b/src/_locales/ru/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Вредоносное ПО, фишинг", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/sk/messages.json b/src/_locales/sk/messages.json index e1adf45e0fe9c..c263032e10a41 100644 --- a/src/_locales/sk/messages.json +++ b/src/_locales/sk/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Smeruje k badvéru a phishingu", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/sv/messages.json b/src/_locales/sv/messages.json index c6b46530ee7ac..da30a923a1ff7 100644 --- a/src/_locales/sv/messages.json +++ b/src/_locales/sv/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Leder till skadlig programvara, nätfiske", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/tr/messages.json b/src/_locales/tr/messages.json index a3c4ad513c734..5d6544a7eb862 100644 --- a/src/_locales/tr/messages.json +++ b/src/_locales/tr/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Kötü niyetli yazılıma yönlendiriyor, oltalama", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/uk/messages.json b/src/_locales/uk/messages.json index 0bb5e53cb8182..bf8dafa5f8476 100644 --- a/src/_locales/uk/messages.json +++ b/src/_locales/uk/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Веде до шкідливого ПЗ, фішингу", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/vi/messages.json b/src/_locales/vi/messages.json index db6393db4db32..6c828ba4388c5 100644 --- a/src/_locales/vi/messages.json +++ b/src/_locales/vi/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Dẫn đến phần mềm độc hại, lừa đảo", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json index 7004d01ff35ca..bd8c5513ce7a8 100644 --- a/src/_locales/zh_CN/messages.json +++ b/src/_locales/zh_CN/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "指向恶意软件、钓鱼网站", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json index 8fb32f4e43d9c..bdd82a0cb187d 100644 --- a/src/_locales/zh_TW/messages.json +++ b/src/_locales/zh_TW/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "終於,有款僅使用少量 CPU 及記憶體的高效率阻擋器。", + "message": "終於有一款高效能的封鎖工具。對 CPU 和記憶體的佔用極低。", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "導致惡意軟體、網路釣魚", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { From 11f43d4a3d4867e5446b5c8046eb562d9f367b53 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 18:00:42 -0400 Subject: [PATCH 243/553] 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 0a9608e02693a..d3598101729c9 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.101", + "version": "1.59.1.102", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc1/uBlock0_1.59.1rc1.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc2/uBlock0_1.59.1rc2.firefox.signed.xpi" } ] } From fe3846b72fea0ee5a1fa5f57000858cb4875db44 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 18:10:09 -0400 Subject: [PATCH 244/553] Oops meant to be 5s, not 300s... --- assets/resources/scriptlets.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index dbdab81024586..dc613c46f5cbf 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -183,7 +183,7 @@ function safeSelf() { if ( args.length === 0 ) { return; } const text = `[${document.location.hostname || document.location.href}]${args.join(' ')}`; if ( text === lastLogText && type === lastLogType ) { - if ( (Date.now() - lastLogTime) < 300000 ) { return; } + if ( (Date.now() - lastLogTime) < 5000 ) { return; } } lastLogType = type; lastLogText = text; From 4094f43daf4eda3fe0a08f1a4e38e8545228b36f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 18:10:32 -0400 Subject: [PATCH 245/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index c19925015fc90..ca5335ac542aa 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.102 \ No newline at end of file +1.59.1.103 \ No newline at end of file From f0f859c685e93f80393835fff0ca3c0eaae80912 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 17 Sep 2024 18:16:11 -0400 Subject: [PATCH 246/553] 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 d3598101729c9..32ac2fd6ec0c5 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.102", + "version": "1.59.1.103", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc2/uBlock0_1.59.1rc2.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc3/uBlock0_1.59.1rc3.firefox.signed.xpi" } ] } From 62d74d4f1d44589cdf9cc1a52c2bcb5b28cd1598 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 18 Sep 2024 09:56:46 -0400 Subject: [PATCH 247/553] Add trailing wildcard syntax to `ipaddress=` option Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3381 --- src/js/static-net-filtering.js | 49 +++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 87216156f7018..afbd9f01e072e 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -2979,26 +2979,48 @@ registerFilterClass(FilterOnHeaders); /******************************************************************************/ class FilterIPAddress { + static TYPE_UNKNOWN = 0; + static TYPE_EQUAL = 1; + static TYPE_STARTSWITH = 2; + static TYPE_LAN = 3; + static TYPE_LOOPBACK = 4; + static TYPE_RE = 5; static reIPv6IPv4lan = /^::ffff:(7f\w{2}|a\w{2}|a9fe|c0a8):\w+$/; static reIPv6local = /^f[cd]\w{2}:/; static match(idata) { const ipaddr = $requestAddress; - const details = filterRefs[filterData[idata+1]]; - if ( details.isRegex ) { - if ( details.$re === undefined ) { - details.$re = new RegExp(details.pattern.slice(1, -1)); - } - return details.$re.test(ipaddr); - } if ( ipaddr === '' ) { return false; } - if ( details.pattern === 'lan' ) { + const details = filterRefs[filterData[idata+1]]; + switch ( details.$type || this.TYPE_UNKNOWN ) { + case this.TYPE_EQUAL: + return ipaddr === details.pattern; + case this.TYPE_LAN: return this.isLAN(ipaddr); - } - if ( details.pattern === 'loopback' ) { + case this.TYPE_LOOPBACK: return this.isLoopback(ipaddr); + case this.TYPE_STARTSWITH: + return ipaddr.startsWith(details.$pattern); + case this.TYPE_RE: + return details.$pattern.test(ipaddr) + default: + break; + } + const { pattern } = details; + if ( pattern === 'lan' ) { + details.$type = this.TYPE_LAN; + } else if ( pattern === 'loopback' ) { + details.$type = this.TYPE_LOOPBACK; + } else if ( pattern.startsWith('/') && pattern.endsWith('/') ) { + details.$type = this.TYPE_RE; + details.$pattern = new RegExp(pattern.slice(1, -1)); + } else if ( pattern.endsWith('*') ) { + details.$type = this.TYPE_STARTSWITH; + details.$pattern = pattern.slice(0, -1); + } else { + details.$type = this.TYPE_EQUAL; } - return ipaddr.startsWith(details.pattern); + return this.match(idata); } // https://github.com/uBlockOrigin/uAssets/blob/master/filters/lan-block.txt @@ -3048,10 +3070,7 @@ class FilterIPAddress { static fromCompiled(args) { const pattern = args[1]; - const details = { - pattern, - isRegex: pattern.startsWith('/') && pattern.endsWith('/'), - }; + const details = { pattern }; return filterDataAlloc(args[0], filterRefAdd(details)); } From 11c3a160363034f2673be10f963a2c52cfe80904 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 18 Sep 2024 10:34:18 -0400 Subject: [PATCH 248/553] Fix exception thrown in `spoof-css` in Firefox Related feedback: https://github.com/uBlockOrigin/uAssets/issues/25358#issuecomment-2358278979 --- assets/resources/scriptlets.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index dc613c46f5cbf..c5cf6cca87211 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -1524,9 +1524,9 @@ function proxyApplyFn( apply(target, thisArg, args) { return handler(new proxyApplyFn.ApplyContext(target, thisArg, args)); }, - get(target, prop, receiver) { + get(target, prop) { if ( prop === 'toString' ) { return toString; } - return Reflect.get(target, prop, receiver); + return Reflect.get(target, prop); }, }; if ( fn.prototype?.constructor === fn ) { @@ -3109,11 +3109,11 @@ function alertBuster() { apply: function(a) { console.info(a); }, - get(target, prop, receiver) { + get(target, prop) { if ( prop === 'toString' ) { return target.toString.bind(target); } - return Reflect.get(target, prop, receiver); + return Reflect.get(target, prop); }, }); } @@ -3836,7 +3836,7 @@ function spoofCSS( const targetElements = new WeakSet(document.querySelectorAll(selector)); if ( targetElements.has(args[0]) === false ) { return style; } const proxiedStyle = new Proxy(style, { - get(target, prop, receiver) { + get(target, prop) { if ( typeof target[prop] === 'function' ) { if ( prop === 'getPropertyValue' ) { return cloackFunc(function getPropertyValue(prop) { @@ -3848,7 +3848,7 @@ function spoofCSS( if ( instanceProperties.includes(prop) ) { return Reflect.get(target, prop); } - return spoofStyle(prop, Reflect.get(target, prop, receiver)); + return spoofStyle(prop, Reflect.get(target, prop)); }, getOwnPropertyDescriptor(target, prop) { if ( propToValueMap.has(prop) ) { @@ -3864,11 +3864,11 @@ function spoofCSS( }); return proxiedStyle; }, - get(target, prop, receiver) { + get(target, prop) { if ( prop === 'toString' ) { return target.toString.bind(target); } - return Reflect.get(target, prop, receiver); + return Reflect.get(target, prop); }, }); Element.prototype.getBoundingClientRect = new Proxy(Element.prototype.getBoundingClientRect, { @@ -3887,11 +3887,11 @@ function spoofCSS( } return new self.DOMRect(rect.x, rect.y, width, height); }, - get(target, prop, receiver) { + get(target, prop) { if ( prop === 'toString' ) { return target.toString.bind(target); } - return Reflect.get(target, prop, receiver); + return Reflect.get(target, prop); }, }); } From b3ffba723857334b9bb3a77f7b643dc9b6507a25 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 18 Sep 2024 11:32:16 -0400 Subject: [PATCH 249/553] Fine tune indent rules --- .eslintrc.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index 470a195bd90e7..d7db6e4e4f8bc 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -13,9 +13,10 @@ rules: - 4 - ignoredNodes: - Program > BlockStatement - - Program > IfStatement > BlockStatement - Program > ExpressionStatement > CallExpression > ArrowFunctionExpression > BlockStatement - Program > ExpressionStatement > CallExpression > FunctionExpression > BlockStatement + - Program > IfStatement > BlockStatement + - Program > VariableDeclaration > VariableDeclarator > CallExpression > ArrowFunctionExpression > BlockStatement - CallExpression > MemberExpression - ArrayExpression > * - ObjectExpression > * From 0a6dc47a729f7c2906350534b2f16d04e54d3750 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 18 Sep 2024 11:33:31 -0400 Subject: [PATCH 250/553] Fix contextual menu quirks Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3382 --- src/js/contextmenu.js | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/js/contextmenu.js b/src/js/contextmenu.js index 788b62bb35687..a2b01e9a1f9c3 100644 --- a/src/js/contextmenu.js +++ b/src/js/contextmenu.js @@ -19,12 +19,8 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - -/******************************************************************************/ - -import µb from './background.js'; import { i18n$ } from './i18n.js'; +import µb from './background.js'; /******************************************************************************/ @@ -55,18 +51,23 @@ const onBlockElement = function(details, tab) { let src = details.frameUrl || details.srcUrl || details.linkUrl || ''; if ( !tagName ) { - if ( typeof details.frameUrl === 'string' ) { + if ( typeof details.frameUrl === 'string' && details.frameId !== 0 ) { tagName = 'iframe'; + src = details.srcUrl; } else if ( typeof details.srcUrl === 'string' ) { if ( details.mediaType === 'image' ) { tagName = 'img'; + src = details.srcUrl; } else if ( details.mediaType === 'video' ) { tagName = 'video'; + src = details.srcUrl; } else if ( details.mediaType === 'audio' ) { tagName = 'audio'; + src = details.srcUrl; } } else if ( typeof details.linkUrl === 'string' ) { tagName = 'a'; + src = details.linkUrl; } } @@ -200,27 +201,25 @@ let currentBits = 0; const update = function(tabId = undefined) { let newBits = 0; - if ( - µb.userSettings.contextMenuEnabled && - µb.userFiltersAreEnabled() && - tabId !== undefined - ) { - const pageStore = µb.pageStoreFromTabId(tabId); - if ( pageStore && pageStore.getNetFilteringSwitch() ) { - if ( pageStore.shouldApplySpecificCosmeticFilters(0) ) { - newBits |= BLOCK_ELEMENT_BIT; - } else { - newBits |= BLOCK_RESOURCE_BIT; + if ( µb.userSettings.contextMenuEnabled ) { + const pageStore = tabId && µb.pageStoreFromTabId(tabId) || null; + if ( pageStore?.getNetFilteringSwitch() ) { + if ( µb.userFiltersAreEnabled() ) { + if ( pageStore.shouldApplySpecificCosmeticFilters(0) ) { + newBits |= BLOCK_ELEMENT_BIT; + } else { + newBits |= BLOCK_RESOURCE_BIT; + } } if ( pageStore.largeMediaCount !== 0 ) { newBits |= TEMP_ALLOW_LARGE_MEDIA_BIT; } } - newBits |= SUBSCRIBE_TO_LIST_BIT; - } - if ( µb.hiddenSettings.filterAuthorMode ) { - newBits |= VIEW_SOURCE_BIT; + if ( µb.hiddenSettings.filterAuthorMode ) { + newBits |= VIEW_SOURCE_BIT; + } } + newBits |= SUBSCRIBE_TO_LIST_BIT; if ( newBits === currentBits ) { return; } currentBits = newBits; const usedEntries = []; From b06c5337ec098bbfabbbedabdb0f1e765a70ebde Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 18 Sep 2024 11:36:39 -0400 Subject: [PATCH 251/553] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d6eb1b08b6a9..fe56efbe49ebb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- [Fix contextual menu quirks](https://github.com/gorhill/uBlock/commit/0a6dc47a72) +- [Fix exception thrown in `spoof-css` in Firefox](https://github.com/gorhill/uBlock/commit/11c3a16036) - [Throttle down repeated scriptlet logging information](https://github.com/gorhill/uBlock/commit/e8f6f3ddff) - [Improve scriptlet helper `proxy-apply`](https://github.com/gorhill/uBlock/commit/547fae4842) - [Add an entry in _Report_ page for badware/phishing category](https://github.com/gorhill/uBlock/commit/e18a3707c7) From 60039ab1336071f8be550ec65d034fe735d4ea67 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 18 Sep 2024 11:37:06 -0400 Subject: [PATCH 252/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index ca5335ac542aa..7e65fd9b6f136 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.103 \ No newline at end of file +1.59.1.104 \ No newline at end of file From 7843a214287230bdb4431bd0e8f23859e9dfce41 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 18 Sep 2024 11:56:22 -0400 Subject: [PATCH 253/553] 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 32ac2fd6ec0c5..28e558265f8f9 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.103", + "version": "1.59.1.104", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc3/uBlock0_1.59.1rc3.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc4/uBlock0_1.59.1rc4.firefox.signed.xpi" } ] } From e98fdeb0a5b4367e602256263e2127c216274bfe Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 18 Sep 2024 12:24:04 -0400 Subject: [PATCH 254/553] Mind `urlskip=` in built-in benchmark --- src/js/benchmarks.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/js/benchmarks.js b/src/js/benchmarks.js index 93d099bd448dc..e97490e60bd24 100644 --- a/src/js/benchmarks.js +++ b/src/js/benchmarks.js @@ -207,6 +207,9 @@ export async function benchmarkStaticNetFiltering(options = {}) { redirectCount += 1; } } + if ( fctxt.type === 'main_frame' ) { + sfne.matchAndFetchModifiers(fctxt, 'urlskip'); + } } const t1 = performance.now(); const dur = t1 - t0; From 4ccc0d0fda461b49cfa04cd246d9a39c38c97d51 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 19 Sep 2024 07:49:54 -0400 Subject: [PATCH 255/553] Minimize memory allocation in scriptlet helper `proxy-apply-fn` Probably beneficial in cases of proxied method called in a tight loop. Additionally, added `throwFunc` as valid constant in script helper `validate-constant.fn`. Does what the name implies. --- assets/resources/scriptlets.js | 40 +++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index c5cf6cca87211..74e873974d739 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -535,6 +535,8 @@ function validateConstantFn(trusted, raw, extraArgs = {}) { value = function(){ return true; }; } else if ( raw === 'falseFunc' ) { value = function(){ return false; }; + } else if ( raw === 'throwFunc' ) { + value = function(){ throw ''; }; } else if ( /^-?\d+$/.test(raw) ) { value = parseInt(raw); if ( isNaN(raw) ) { return; } @@ -1498,23 +1500,49 @@ function proxyApplyFn( const fn = context[prop]; if ( typeof fn !== 'function' ) { return; } if ( proxyApplyFn.CtorContext === undefined ) { + proxyApplyFn.ctorContexts = []; proxyApplyFn.CtorContext = class { - constructor(callFn, callArgs) { + constructor(...args) { + this.init(...args); + } + init(callFn, callArgs) { this.callFn = callFn; this.callArgs = callArgs; + return this; } reflect() { - return Reflect.construct(this.callFn, this.callArgs); + const r = Reflect.construct(this.callFn, this.callArgs); + this.callFn = this.callArgs = undefined; + proxyApplyFn.ctorContexts.push(this); + return r; + } + static factory(...args) { + return proxyApplyFn.ctorContexts.length !== 0 + ? proxyApplyFn.ctorContexts.pop().init(...args) + : new proxyApplyFn.CtorContext(...args); } }; + proxyApplyFn.applyContexts = []; proxyApplyFn.ApplyContext = class { - constructor(callFn, thisArg, callArgs) { + constructor(...args) { + this.init(...args); + } + init(callFn, thisArg, callArgs) { this.callFn = callFn; this.thisArg = thisArg; this.callArgs = callArgs; + return this; } reflect() { - return Reflect.apply(this.callFn, this.thisArg, this.callArgs); + const r = Reflect.apply(this.callFn, this.thisArg, this.callArgs); + this.callFn = this.thisArg = this.callArgs = undefined; + proxyApplyFn.applyContexts.push(this); + return r; + } + static factory(...args) { + return proxyApplyFn.applyContexts.length !== 0 + ? proxyApplyFn.applyContexts.pop().init(...args) + : new proxyApplyFn.ApplyContext(...args); } }; } @@ -1522,7 +1550,7 @@ function proxyApplyFn( const toString = (function toString() { return fnStr; }).bind(null); const proxyDetails = { apply(target, thisArg, args) { - return handler(new proxyApplyFn.ApplyContext(target, thisArg, args)); + return handler(proxyApplyFn.ApplyContext.factory(target, thisArg, args)); }, get(target, prop) { if ( prop === 'toString' ) { return toString; } @@ -1531,7 +1559,7 @@ function proxyApplyFn( }; if ( fn.prototype?.constructor === fn ) { proxyDetails.construct = function(target, args) { - return handler(new proxyApplyFn.CtorContext(target, args)); + return handler(proxyApplyFn.CtorContext.factory(target, args)); }; } context[prop] = new Proxy(fn, proxyDetails); From b01a418073d3941cdd2b2129a05542eb8be26321 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 19 Sep 2024 08:08:49 -0400 Subject: [PATCH 256/553] Add filtering output expressions`replace`/`urlskip` to logger Additioanlly, removed `uritransform` as it is currently barely used, if at all. --- src/logger-ui.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/logger-ui.html b/src/logger-ui.html index 9517968fde049..8836bd373de45 100644 --- a/src/logger-ui.html +++ b/src/logger-ui.html @@ -61,7 +61,7 @@ angle-up

-
+
css/fontimagemediascript
@@ -72,8 +72,7 @@
getheadpost
-
csppermissionsredirect
-
removeparamuritransform
+ csppermissionsredirectremoveparamreplaceurlskip
From 760b2ffce6afe6f428d75482accf09bbd5b28a41 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 19 Sep 2024 08:43:54 -0400 Subject: [PATCH 257/553] Add advanced setting `dnsResolveEnabled` Default to `true`. Set to `false` to wholly disable calls to `dns.resolve()` (Firefox- only). Disabling calls to `dns.resolve()` will prevent cname-uncloaking and will limit ability to enforce `ipaddress` filter option. --- platform/firefox/vapi-background-ext.js | 5 +++++ src/js/background.js | 1 + src/js/storage.js | 1 + 3 files changed, 7 insertions(+) diff --git a/platform/firefox/vapi-background-ext.js b/platform/firefox/vapi-background-ext.js index 7fdc3dd5505f6..79787cc9967c4 100644 --- a/platform/firefox/vapi-background-ext.js +++ b/platform/firefox/vapi-background-ext.js @@ -62,6 +62,7 @@ vAPI.Net = class extends vAPI.Net { this.cnameIgnoreExceptions = true; this.cnameIgnoreRootDocument = true; this.cnameReplayFullURL = false; + this.dnsResolveEnabled = true; } setOptions(options) { @@ -89,6 +90,9 @@ vAPI.Net = class extends vAPI.Net { if ( 'cnameReplayFullURL' in options ) { this.cnameReplayFullURL = options.cnameReplayFullURL === true; } + if ( 'dnsResolveEnabled' in options ) { + this.dnsResolveEnabled = options.dnsResolveEnabled === true; + } this.dnsList.fill(null); this.dnsDict.clear(); } @@ -256,6 +260,7 @@ vAPI.Net = class extends vAPI.Net { } dnsShouldResolve(hn) { + if ( this.dnsResolveEnabled === false ) { return false; } if ( hn === '' ) { return false; } const c0 = hn.charCodeAt(0); if ( c0 === 0x5B /* [ */ ) { return false; } diff --git a/src/js/background.js b/src/js/background.js index 939c559c32167..8ea668ee96a0a 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -66,6 +66,7 @@ const hiddenSettingsDefault = { debugScriptletInjector: false, differentialUpdate: true, disableWebAssembly: false, + dnsResolveEnabled: true, extensionUpdateForceReload: false, filterAuthorMode: false, loggerPopupType: 'popup', diff --git a/src/js/storage.js b/src/js/storage.js index 77ec90b7ddfdc..c04e85c87e0c6 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -319,6 +319,7 @@ onBroadcast(msg => { cnameIgnoreRootDocument: µbhs.cnameIgnoreRootDocument, cnameMaxTTL: µbhs.cnameMaxTTL, cnameReplayFullURL: µbhs.cnameReplayFullURL, + dnsResolveEnabled: µbhs.dnsResolveEnabled, }); }); From 1139085ca5cd4825105593ff805b58bd7b52b28e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 19 Sep 2024 08:56:08 -0400 Subject: [PATCH 258/553] Update changelog --- CHANGELOG.md | 1 + dist/version | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe56efbe49ebb..019acfd46cb8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add advanced setting `dnsResolveEnabled`](https://github.com/gorhill/uBlock/commit/760b2ffce6) - [Fix contextual menu quirks](https://github.com/gorhill/uBlock/commit/0a6dc47a72) - [Fix exception thrown in `spoof-css` in Firefox](https://github.com/gorhill/uBlock/commit/11c3a16036) - [Throttle down repeated scriptlet logging information](https://github.com/gorhill/uBlock/commit/e8f6f3ddff) diff --git a/dist/version b/dist/version index 7e65fd9b6f136..45585148a2abc 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.104 \ No newline at end of file +1.59.1.105 \ No newline at end of file From 55ab6d6875035b2351aa62281631231432fa2a3f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 19 Sep 2024 09:06:24 -0400 Subject: [PATCH 259/553] 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 28e558265f8f9..854a5f439404f 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.104", + "version": "1.59.1.105", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc4/uBlock0_1.59.1rc4.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc5/uBlock0_1.59.1rc5.firefox.signed.xpi" } ] } From 4f181b0bc5a0f8377f6eeec8b4f27eaf289eafba Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 20 Sep 2024 07:20:55 -0400 Subject: [PATCH 260/553] Support matching against list of IP addresses Related commit: https://github.com/gorhill/uBlock/commit/6acf97bf5143543c036c38a82160e5f8efe8b3f1 --- platform/firefox/vapi-background-ext.js | 2 +- src/js/benchmarks.js | 1 + src/js/static-net-filtering.js | 29 ++++++++++++++----------- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/platform/firefox/vapi-background-ext.js b/platform/firefox/vapi-background-ext.js index 79787cc9967c4..92c2d95c92e61 100644 --- a/platform/firefox/vapi-background-ext.js +++ b/platform/firefox/vapi-background-ext.js @@ -314,7 +314,7 @@ vAPI.Net = class extends vAPI.Net { const { addresses } = record; if ( Array.isArray(addresses) === false ) { return; } if ( addresses.length === 0 ) { return; } - return addresses[0]; + return addresses.join('\n'); } suspendOneRequest(details) { diff --git a/src/js/benchmarks.js b/src/js/benchmarks.js index e97490e60bd24..79cc899225b96 100644 --- a/src/js/benchmarks.js +++ b/src/js/benchmarks.js @@ -174,6 +174,7 @@ export async function benchmarkStaticNetFiltering(options = {}) { for ( let i = 0; i < requests.length; i++ ) { const request = requests[i]; fctxt.setURL(request.url); + fctxt.setIPAddress('93.184.215.14\n2606:2800:21f:cb07:6820:80da:af6b:8b2c'); fctxt.setDocOriginFromURL(request.frameUrl); fctxt.setType(request.cpt); sfne.redirectURL = undefined; diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index afbd9f01e072e..5ae59f062ca74 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -2993,16 +2993,14 @@ class FilterIPAddress { if ( ipaddr === '' ) { return false; } const details = filterRefs[filterData[idata+1]]; switch ( details.$type || this.TYPE_UNKNOWN ) { - case this.TYPE_EQUAL: - return ipaddr === details.pattern; case this.TYPE_LAN: return this.isLAN(ipaddr); case this.TYPE_LOOPBACK: return this.isLoopback(ipaddr); + case this.TYPE_EQUAL: case this.TYPE_STARTSWITH: - return ipaddr.startsWith(details.$pattern); case this.TYPE_RE: - return details.$pattern.test(ipaddr) + return details.$pattern.test(ipaddr); default: break; } @@ -3013,12 +3011,13 @@ class FilterIPAddress { details.$type = this.TYPE_LOOPBACK; } else if ( pattern.startsWith('/') && pattern.endsWith('/') ) { details.$type = this.TYPE_RE; - details.$pattern = new RegExp(pattern.slice(1, -1)); + details.$pattern = new RegExp(pattern.slice(1, -1), 'm'); } else if ( pattern.endsWith('*') ) { details.$type = this.TYPE_STARTSWITH; - details.$pattern = pattern.slice(0, -1); + details.$pattern = new RegExp(`^${restrFromPlainPattern(pattern.slice(0, -1))}`, 'm'); } else { details.$type = this.TYPE_EQUAL; + details.$pattern = new RegExp(`^${restrFromPlainPattern(pattern)}$`, 'm'); } return this.match(idata); } @@ -3049,13 +3048,11 @@ class FilterIPAddress { if ( ipaddr.startsWith('::ffff:') === false ) { return false; } return this.reIPv6IPv4lan.test(ipaddr); } - if ( ipaddr.includes(':') ) { - if ( c0 === 0x36 /* 6 */ ) { - return ipaddr.startsWith('64:ff9b:'); - } - if ( c0 === 0x66 /* f */ ) { - return this.reIPv6local.test(ipaddr); - } + if ( c0 === 0x36 /* 6 */ ) { + return ipaddr.startsWith('64:ff9b:'); + } + if ( c0 === 0x66 /* f */ ) { + return this.reIPv6local.test(ipaddr); } return false; } @@ -5641,6 +5638,12 @@ StaticNetFilteringEngine.prototype.test = function(details) { } } } + const urlskips = this.matchAndFetchModifiers(fctxt, 'urlskip'); + if ( urlskips ) { + for ( const urlskip of urlskips ) { + out.push(`modified: ${urlskip.logData().raw}`); + } + } return out.join('\n'); } From 59487b189cc65d9b0f030268eaeb3c3fc28c7c67 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 20 Sep 2024 08:15:31 -0400 Subject: [PATCH 261/553] Add `+https` directive to `urlskip=` option When present, the `+https` directive will force the protocol of the resulting URL to be `https:`. Related feedback: https://github.com/uBlockOrigin/uBlock-issues/issues/3206#issuecomment-2363392357 --- src/js/static-net-filtering.js | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 5ae59f062ca74..e5e9017d26b1a 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5424,13 +5424,25 @@ function urlSkip(urlin, steps) { try { let urlout; for ( const step of steps ) { - if ( step.startsWith('?') === false ) { return; } - urlout = (new URL(urlin)).searchParams.get(step.slice(1)); - if ( urlout === null ) { return; } - if ( urlout.includes(' ') ) { - urlout = urlout.replace(/ /g, '%20'); + // Extract from URL parameter + if ( step.startsWith('?') ) { + urlout = (new URL(urlin)).searchParams.get(step.slice(1)); + if ( urlout === null ) { return; } + if ( urlout.includes(' ') ) { + urlout = urlout.replace(/ /g, '%20'); + } + urlin = urlout; + continue; } - urlin = urlout; + // Enforce https + if ( step === '+https' ) { + const s = urlin.replace(/^https?:\/\//, ''); + if ( /^[\w-]:\/\//.test(s) ) { return; } + urlin = urlout = `https://${s}`; + continue; + } + // Unknown directive + return; } void new URL(urlout); return urlout; From 055973cc3f77532e1be9c5e8430c75453f34e9d3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 20 Sep 2024 09:16:32 -0400 Subject: [PATCH 262/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/extension/_locales/pt_BR/messages.json | 2 +- src/_locales/sq/messages.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index e6533c12712ff..f42f4b5a6ff3b 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Um bloqueador de conteúdo com menos permissões - Bloqueie anúncios, rastreadores, mineradores e mais imediatamente após a instalação", + "message": "Um bloqueador de conteúdo com menos permissões — Bloqueie anúncios, rastreadores, mineradores e mais imediatamente após a instalação", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { diff --git a/src/_locales/sq/messages.json b/src/_locales/sq/messages.json index 6cdf1664316fd..cfcff08c0e3c4 100644 --- a/src/_locales/sq/messages.json +++ b/src/_locales/sq/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Çon në instalimin e programeve keqdashëse, mashtruese", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { From 63f0a2b91229512b521d824019d43e35d1ab129c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 20 Sep 2024 09:17:10 -0400 Subject: [PATCH 263/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 45585148a2abc..69636e88d0374 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.105 \ No newline at end of file +1.59.1.106 \ No newline at end of file From 37da838255546fe2a5139de3f3a6418ccbe72061 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 20 Sep 2024 09:26:10 -0400 Subject: [PATCH 264/553] 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 854a5f439404f..2fa2f97f1daac 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.105", + "version": "1.59.1.106", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc5/uBlock0_1.59.1rc5.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc6/uBlock0_1.59.1rc6.firefox.signed.xpi" } ] } From 76e035989fff4b16306a2ff7efe6f97a66c03d49 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 20 Sep 2024 11:40:03 -0400 Subject: [PATCH 265/553] Minor code review --- platform/firefox/vapi-background-ext.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/firefox/vapi-background-ext.js b/platform/firefox/vapi-background-ext.js index 92c2d95c92e61..895ddeb54df3b 100644 --- a/platform/firefox/vapi-background-ext.js +++ b/platform/firefox/vapi-background-ext.js @@ -99,7 +99,7 @@ vAPI.Net = class extends vAPI.Net { normalizeDetails(details) { // https://github.com/uBlockOrigin/uBlock-issues/issues/3379 - if ( details.proxyInfo?.proxyDNS && details.ip === '0.0.0.0' ) { + if ( details.ip === '0.0.0.0' && details.proxyInfo?.proxyDNS ) { details.ip = null; } const type = details.type; From f84b3e4ce9ab1ae50dae753c5c841d81777ba0c5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 20 Sep 2024 17:52:31 -0400 Subject: [PATCH 266/553] Revert "Minor code review" This reverts commit 76e035989fff4b16306a2ff7efe6f97a66c03d49. --- platform/firefox/vapi-background-ext.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/firefox/vapi-background-ext.js b/platform/firefox/vapi-background-ext.js index 895ddeb54df3b..92c2d95c92e61 100644 --- a/platform/firefox/vapi-background-ext.js +++ b/platform/firefox/vapi-background-ext.js @@ -99,7 +99,7 @@ vAPI.Net = class extends vAPI.Net { normalizeDetails(details) { // https://github.com/uBlockOrigin/uBlock-issues/issues/3379 - if ( details.ip === '0.0.0.0' && details.proxyInfo?.proxyDNS ) { + if ( details.proxyInfo?.proxyDNS && details.ip === '0.0.0.0' ) { details.ip = null; } const type = details.type; From 1c97ca10fc8ed113dfce276c46f3cfc8b17db3df Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 21 Sep 2024 12:41:57 -0400 Subject: [PATCH 267/553] Minor code review Use class fields to declare/initialize instance and static properties. --- src/js/pagestore.js | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/js/pagestore.js b/src/js/pagestore.js index e201496366e3f..319367fe51b0d 100644 --- a/src/js/pagestore.js +++ b/src/js/pagestore.js @@ -53,6 +53,9 @@ To create a log of net requests /******************************************************************************/ const NetFilteringResultCache = class { + shelfLife = 15000; + extensionOriginURL = vAPI.getURL('/'); + constructor() { this.pruneTimer = vAPI.defer.create(( ) => { this.prune(); @@ -172,9 +175,6 @@ const NetFilteringResultCache = class { } }; -NetFilteringResultCache.prototype.shelfLife = 15000; -NetFilteringResultCache.prototype.extensionOriginURL = vAPI.getURL('/'); - /******************************************************************************/ // Frame stores are used solely to associate a URL with a frame id. @@ -274,18 +274,16 @@ const FrameStore = class { } static factory(frameURL, parentId = -1) { - const entry = FrameStore.junkyard.pop(); - if ( entry === undefined ) { - return new FrameStore(frameURL, parentId); + const FS = FrameStore; + if ( FS.junkyard.length !== 0 ) { + return FS.junkyard.pop().init(frameURL, parentId); } - return entry.init(frameURL, parentId); + return new FS(frameURL, parentId); } + static junkyard = []; + static junkyardMax = 50; }; -// To mitigate memory churning -FrameStore.junkyard = []; -FrameStore.junkyardMax = 50; - /******************************************************************************/ const CountDetails = class { @@ -314,18 +312,24 @@ const HostnameDetails = class { this.hostname = hostname; this.cname = vAPI.net.canonicalNameFromHostname(hostname); this.counts.reset(); + return this; } dispose() { - this.hostname = ''; - if ( HostnameDetails.junkyard.length < HostnameDetails.junkyardMax ) { - HostnameDetails.junkyard.push(this); + const HD = HostnameDetails; + if ( HD.junkyard.length >= HD.junkyardMax ) { return; } + HD.junkyard.push(this); + } + static factory(hostname) { + const HD = HostnameDetails; + if ( HD.junkyard.length !== 0 ) { + return HD.junkyard.pop().init(hostname); } + return new HD(hostname); } + static junkyard = []; + static junkyardMax = 100; }; -HostnameDetails.junkyard = []; -HostnameDetails.junkyardMax = 100; - const HostnameDetailsMap = class extends Map { reset() { this.clear(); @@ -623,7 +627,7 @@ const PageStore = class { ) { this.hostnameDetailsMap.set( this.tabHostname, - new HostnameDetails(this.tabHostname) + HostnameDetails.factory(this.tabHostname) ); } return this.hostnameDetailsMap; @@ -701,7 +705,7 @@ const PageStore = class { const hostname = journal[i+0]; let hnDetails = this.hostnameDetailsMap.get(hostname); if ( hnDetails === undefined ) { - hnDetails = new HostnameDetails(hostname); + hnDetails = HostnameDetails.factory(hostname); this.hostnameDetailsMap.set(hostname, hnDetails); this.contentLastModified = now; } From e7c783cefaea69e709281b02dd1efb970da9e412 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 22 Sep 2024 10:02:45 -0400 Subject: [PATCH 268/553] Code review for new DNS cache code Prevent discarding DNS cache entries looked up during a passive read. Related feedback: https://github.com/uBlockOrigin/uBlock-issues/discussions/3376#discussioncomment-10711948 Add advanced setting `dnsCacheTTL` to control the TLL (in seconds) of DNS cache entries. Default to 600 (10 minutes). --- platform/firefox/vapi-background-ext.js | 15 +++++++++------ src/js/background.js | 1 + src/js/storage.js | 1 + 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/platform/firefox/vapi-background-ext.js b/platform/firefox/vapi-background-ext.js index 92c2d95c92e61..73a914d0ce650 100644 --- a/platform/firefox/vapi-background-ext.js +++ b/platform/firefox/vapi-background-ext.js @@ -52,9 +52,9 @@ vAPI.Net = class extends vAPI.Net { this.pendingRequests = []; this.dnsList = []; // ring buffer this.dnsWritePtr = 0; // next write pointer in ring buffer - this.dnsMaxCount = 256; // max size of ring buffer + this.dnsMaxCount = 512; // max size of ring buffer this.dnsDict = new Map(); // hn to index in ring buffer - this.dnsEntryTTL = 60000; // delay after which an entry is obsolete + this.dnsCacheTTL = 600; // TTL in seconds this.canUncloakCnames = true; this.cnameUncloakEnabled = true; this.cnameIgnoreList = null; @@ -90,6 +90,9 @@ vAPI.Net = class extends vAPI.Net { if ( 'cnameReplayFullURL' in options ) { this.cnameReplayFullURL = options.cnameReplayFullURL === true; } + if ( 'dnsCacheTTL' in options ) { + this.dnsCacheTTL = options.dnsCacheTTL; + } if ( 'dnsResolveEnabled' in options ) { this.dnsResolveEnabled = options.dnsResolveEnabled === true; } @@ -143,7 +146,7 @@ vAPI.Net = class extends vAPI.Net { canonicalNameFromHostname(hn) { if ( hn === '' ) { return; } - const dnsEntry = this.dnsFromCache(hn); + const dnsEntry = this.dnsFromCache(hn, true); if ( isResolvedObject(dnsEntry) === false ) { return; } return dnsEntry.cname; } @@ -212,7 +215,7 @@ vAPI.Net = class extends vAPI.Net { } dnsToCache(hn, record, details) { - const dnsEntry = { hn, until: Date.now() + this.dnsEntryTTL }; + const dnsEntry = { hn, until: Date.now() + this.dnsCacheTTL * 1000 }; if ( record ) { const cname = this.cnameFromRecord(hn, record, details); if ( cname ) { dnsEntry.cname = cname; } @@ -223,13 +226,13 @@ vAPI.Net = class extends vAPI.Net { return dnsEntry; } - dnsFromCache(hn) { + dnsFromCache(hn, passive = false) { const i = this.dnsDict.get(hn); if ( i === undefined ) { return; } if ( isPromise(i) ) { return i; } const dnsEntry = this.dnsList[i]; if ( dnsEntry !== null && dnsEntry.hn === hn ) { - if ( dnsEntry.until >= Date.now() ) { + if ( passive || dnsEntry.until >= Date.now() ) { return dnsEntry; } } diff --git a/src/js/background.js b/src/js/background.js index 8ea668ee96a0a..fa7e3f2e72bd4 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -66,6 +66,7 @@ const hiddenSettingsDefault = { debugScriptletInjector: false, differentialUpdate: true, disableWebAssembly: false, + dnsCacheTTL: 600, dnsResolveEnabled: true, extensionUpdateForceReload: false, filterAuthorMode: false, diff --git a/src/js/storage.js b/src/js/storage.js index c04e85c87e0c6..c3b541bd3c159 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -319,6 +319,7 @@ onBroadcast(msg => { cnameIgnoreRootDocument: µbhs.cnameIgnoreRootDocument, cnameMaxTTL: µbhs.cnameMaxTTL, cnameReplayFullURL: µbhs.cnameReplayFullURL, + dnsCacheTTL: µbhs.dnsCacheTTL, dnsResolveEnabled: µbhs.dnsResolveEnabled, }); }); From bd6d9c3296173b9bc7b03fd2efec475db3964b90 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 22 Sep 2024 11:16:57 -0400 Subject: [PATCH 269/553] Fix benchmark quirk related to new `ipaddress` option --- src/js/benchmarks.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/js/benchmarks.js b/src/js/benchmarks.js index 79cc899225b96..83cd97c955a7f 100644 --- a/src/js/benchmarks.js +++ b/src/js/benchmarks.js @@ -130,8 +130,6 @@ const loadBenchmarkDataset = (( ) => { /******************************************************************************/ -// action: 1=test - export async function benchmarkStaticNetFiltering(options = {}) { const { target, redirectEngine } = options; @@ -174,7 +172,9 @@ export async function benchmarkStaticNetFiltering(options = {}) { for ( let i = 0; i < requests.length; i++ ) { const request = requests[i]; fctxt.setURL(request.url); - fctxt.setIPAddress('93.184.215.14\n2606:2800:21f:cb07:6820:80da:af6b:8b2c'); + if ( fctxt.getIPAddress() === '' ) { + fctxt.setIPAddress('93.184.215.14\n2606:2800:21f:cb07:6820:80da:af6b:8b2c'); + } fctxt.setDocOriginFromURL(request.frameUrl); fctxt.setType(request.cpt); sfne.redirectURL = undefined; From 4c5a9353b0bf868587b660e7cf48853264cc5b4e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 22 Sep 2024 11:50:20 -0400 Subject: [PATCH 270/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.el.txt | 4 ++-- platform/mv3/extension/_locales/el/messages.json | 2 +- platform/mv3/extension/_locales/pt_PT/messages.json | 2 +- src/_locales/el/messages.json | 2 +- src/_locales/id/messages.json | 6 +++--- src/_locales/pt_PT/messages.json | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/platform/mv3/description/webstore.el.txt b/platform/mv3/description/webstore.el.txt index ae5aed364399c..73922f351e7e0 100644 --- a/platform/mv3/description/webstore.el.txt +++ b/platform/mv3/description/webstore.el.txt @@ -1,4 +1,4 @@ -Το uBO Lite (uBOL) είναι ένας blocker περιεχομένου *χωρίς άδειες* που βασίζεται σε MV3. +Το uBO Lite (uBOL) είναι ένα πρόσθετο φραγής περιεχομένου που *δεν απαιτεί δικαιώματα* και βασίζεται στο MV3. Το προεπιλεγμένο σύνολο κανόνων αντιστοιχεί στο προεπιλεγμένο σύνολο φίλτρων του uBlock Origin: @@ -7,7 +7,7 @@ - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Μπορείτε να προσθέσετε περισσότερα σύνολα κανόνων από τη σελίδα επιλογών -- κάντε κλικ στο εικονίδιο _γρανάζι_ στον αναδυόμενο πίνακα. Το uBOL είναι εξ'ολοκλήρου δηλωτικό, πράγμα που σημαίνει ότι δεν υπάρχει ανάγκη για μόνιμη διαδικασία uBOL για να πραγματοποιηθεί το φιλτράρισμα, και το φιλτράρισμα περιεχομένου που βασίζεται σε έγχυση CSS/JS εκτελείται αξιόπιστα από το ίδιο το πρόγραμμα περιήγησης και όχι από την επέκταση. Αυτό σημαίνει ότι το ίδιο το uBOL δεν καταναλώνει πόρους CPU/μνήμης ενώ ο αποκλεισμός περιεχομένου είναι σε εξέλιξη -- η διαδικασία του service worker του uBOL απαιτείται _μόνο_ όταν αλληλεπιδράτε με τον αναδυόμενο πίνακα ή τις σελίδες επιλογών. diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index 484b2f4ae268b..9fab54e52f482 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -148,7 +148,7 @@ "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[hostnames only]\nexample.com\ngames.example\n...", + "message": "[μόνο ονόματα κεντρικών υπολογιστών]\nexample.com\ngames.example\n...", "description": "Default text for in edit field" }, "behaviorSectionLabel": { diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index e7f1ac7a71a37..a0cd625bda185 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -144,7 +144,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Lista de sítios ‘web’ para os quais não será efetuada qualquer filtragem.", + "message": "Lista de nomes de websites para os quais não será efetuada qualquer filtragem.", "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { diff --git a/src/_locales/el/messages.json b/src/_locales/el/messages.json index 1ef763e3b1e58..a382c2476a58d 100644 --- a/src/_locales/el/messages.json +++ b/src/_locales/el/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Οδηγεί σε κακόβουλο λογισμικό, ηλεκτρονικό «ψάρεμα»", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/id/messages.json b/src/_locales/id/messages.json index 1e3b55b7accc0..955931f6adbc2 100644 --- a/src/_locales/id/messages.json +++ b/src/_locales/id/messages.json @@ -128,7 +128,7 @@ "description": "Tooltip used for the logger icon in the panel" }, "popupTipReport": { - "message": "Laporkan masalah situs web ini", + "message": "Laporkan masalah di situs web ini", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipNoPopups": { @@ -536,7 +536,7 @@ "description": "used as a tooltip for error icon beside a list" }, "1pTrustWarning": { - "message": "Jangan tambah filter dari sumber yang tidak tepercaya.", + "message": "Jangan tambah filter dari sumber yang tidak terpercaya.", "description": "Warning against copy-pasting filters from random sources" }, "1pEnableMyFiltersLabel": { @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Mengarah ke perangkat lunak jahat, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/pt_PT/messages.json b/src/_locales/pt_PT/messages.json index 54b86dc7d0072..7c4df74bc522c 100644 --- a/src/_locales/pt_PT/messages.json +++ b/src/_locales/pt_PT/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leva a badware, phishing", + "message": "Leva a badware e phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { From 854c1ee4ccf0ecf93c7552bb7962a78058e91f7d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 22 Sep 2024 11:53:54 -0400 Subject: [PATCH 271/553] New revision for release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 69636e88d0374..3ab456d740e06 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.106 \ No newline at end of file +1.59.1.107 \ No newline at end of file From 687475ebf28f82ff217f1c04aa6e5421e2a1e958 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 22 Sep 2024 12:01:33 -0400 Subject: [PATCH 272/553] 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 2fa2f97f1daac..4cceaabffbdef 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.106", + "version": "1.59.1.107", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc6/uBlock0_1.59.1rc6.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc7/uBlock0_1.59.1rc7.firefox.signed.xpi" } ] } From ff57f01026f1b98ca9d9a8bb36386ae9dfd3eae3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 22 Sep 2024 12:14:52 -0400 Subject: [PATCH 273/553] Code review of fix re "internal error" Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/199 --- platform/mv3/extension/js/background.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index f0f6cb6cdfd69..17cfff4bc516b 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -388,15 +388,14 @@ async function start() { // https://github.com/uBlockOrigin/uBOL-home/issues/199 // Force a restart of the extension once when an "internal error" occurs -try { - start(); +start().then(( ) => { localWrite({ goodStart: true }); -} catch(reason) { +}).catch(reason => { console.trace(reason); - localRead.get('goodStart').then((bin = {}) => { - if ( bin.goodStart !== true ) { return; } + localRead('goodStart').then((bin = {}) => { + if ( bin.goodStart === false ) { return; } localWrite({ goodStart: false }).then(( ) => { runtime.reload(); }); }); -} +}); From 03df1a40d834bd7ff3d8af3492bcbd4b6352da97 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 26 Sep 2024 10:13:24 -0400 Subject: [PATCH 274/553] New version for stable release --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 3ab456d740e06..f8e1eccd91c86 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.59.1.107 \ No newline at end of file +1.60.0 \ No newline at end of file From aec0bd39e3a7dc924885c79ccef80f177345c405 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 26 Sep 2024 13:27:06 -0400 Subject: [PATCH 275/553] Fix images not properly downloading on click Related feedback: https://github.com/uBlockOrigin/uBlock-issues/issues/1670#issuecomment-2372048056 The issue affected images supporting `srcset` attribute without the presence of `src` attribute. This commit takes add fallback onto `srcset` attribute when the `src` attribute is not present. --- .../load-large-media-interactive.js | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/js/scriptlets/load-large-media-interactive.js b/src/js/scriptlets/load-large-media-interactive.js index 57198e4b2dfec..4887616d9b0f9 100644 --- a/src/js/scriptlets/load-large-media-interactive.js +++ b/src/js/scriptlets/load-large-media-interactive.js @@ -19,10 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - -/******************************************************************************/ - (( ) => { /******************************************************************************/ @@ -132,15 +128,12 @@ if ( vAPI.largeMediaElementStyleSheet === undefined ) { const loadMedia = async function(elem) { const src = elem.getAttribute('src') || ''; + if ( src === '' ) { return; } elem.removeAttribute('src'); - await vAPI.messaging.send('scriptlets', { what: 'temporarilyAllowLargeMediaElement', }); - - if ( src !== '' ) { - elem.setAttribute('src', src); - } + elem.setAttribute('src', src); elem.load(); }; @@ -148,14 +141,21 @@ const loadMedia = async function(elem) { const loadImage = async function(elem) { const src = elem.getAttribute('src') || ''; - elem.removeAttribute('src'); - + const srcset = src === '' && elem.getAttribute('srcset') || ''; + if ( src === '' && srcset === '' ) { return; } + if ( src !== '' ) { + elem.removeAttribute('src'); + } + if ( srcset !== '' ) { + elem.removeAttribute('srcset'); + } await vAPI.messaging.send('scriptlets', { what: 'temporarilyAllowLargeMediaElement', }); - if ( src !== '' ) { elem.setAttribute('src', src); + } else if ( srcset !== '' ) { + elem.setAttribute('srcset', srcset); } }; From 82ab15f856a5531252a80ba95a8e27991eba2b4b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 26 Sep 2024 13:32:24 -0400 Subject: [PATCH 276/553] Update changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 019acfd46cb8f..48a39d7b1859c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +- [Fix images not properly downloading on click](https://github.com/gorhill/uBlock/commit/aec0bd39e3) + +---------- + +# 1.60.0 + +## Fixes / changes + - [Add advanced setting `dnsResolveEnabled`](https://github.com/gorhill/uBlock/commit/760b2ffce6) - [Fix contextual menu quirks](https://github.com/gorhill/uBlock/commit/0a6dc47a72) - [Fix exception thrown in `spoof-css` in Firefox](https://github.com/gorhill/uBlock/commit/11c3a16036) From 7b585a733a91d97aa52afc2071756ed5e7c1cd62 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 26 Sep 2024 13:32:50 -0400 Subject: [PATCH 277/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index f8e1eccd91c86..9fb35ca861864 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.0 \ No newline at end of file +1.60.1.0 \ No newline at end of file From 5425ac23750519f9636235b2e2fa665ff51be628 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 26 Sep 2024 13:40:44 -0400 Subject: [PATCH 278/553] 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 4cceaabffbdef..69eb03cba6fdd 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.59.1.107", + "version": "1.60.1.0", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.59.1rc7/uBlock0_1.59.1rc7.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b0/uBlock0_1.60.1b0.firefox.signed.xpi" } ] } From dcb86e36675d683c2a10d56894fbc26cb5dfc873 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 27 Sep 2024 11:04:42 -0400 Subject: [PATCH 279/553] Update README.md --- platform/mv3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mv3/README.md b/platform/mv3/README.md index 2400bfe71cffa..28f0bdab2a395 100644 --- a/platform/mv3/README.md +++ b/platform/mv3/README.md @@ -15,7 +15,7 @@ Upon completion of the script, the resulting extension package will become prese - Chromium: `dist/build/uBOLite.chromium` - Firefox: `dist/build/uBOLite.firefox` -The folder `dist/build/mv3-data` will cache data fetched from remote server, so as to avoid fetching repeatedly from remote server with repeated build commands. Remove `dist/build/mv3-data` if you want to build with latest versions of filter lists. +The folder `dist/build/mv3-data` will cache data fetched from remote servers, so as to avoid fetching repeatedly from remote servers with repeated build commands. Use `make cleanassets` to remove all locally cached filter lists if you want to build with latest versions of filter lists. The file `dist/build/mv3-data/log.txt` will contain information about what happened during the build process. From 560def639fdfd9bf99096fcf81a664bc2e01f4d8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 28 Sep 2024 14:08:42 -0400 Subject: [PATCH 280/553] [mv3] Add a _chat_ icon in popup panel to report filter issues Just the same as with uBO, but for uBOL. --- .../mv3/extension/_locales/en/messages.json | 68 ++++++++ .../mv3/extension/css/dashboard-common.css | 13 ++ platform/mv3/extension/css/dashboard.css | 9 - platform/mv3/extension/css/settings.css | 4 - platform/mv3/extension/js/background.js | 41 +++++ platform/mv3/extension/js/popup.js | 37 ++++- platform/mv3/extension/js/report.js | 155 ++++++++++++++++++ platform/mv3/extension/matched-rules.html | 1 - platform/mv3/extension/popup.html | 2 + platform/mv3/extension/report.html | 61 +++++++ 10 files changed, 371 insertions(+), 20 deletions(-) create mode 100644 platform/mv3/extension/js/report.js create mode 100644 platform/mv3/extension/report.html diff --git a/platform/mv3/extension/_locales/en/messages.json b/platform/mv3/extension/_locales/en/messages.json index 9f281de19554b..f8c4b376c59a3 100644 --- a/platform/mv3/extension/_locales/en/messages.json +++ b/platform/mv3/extension/_locales/en/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/css/dashboard-common.css b/platform/mv3/extension/css/dashboard-common.css index 41d641621e125..8621d08704053 100644 --- a/platform/mv3/extension/css/dashboard-common.css +++ b/platform/mv3/extension/css/dashboard-common.css @@ -1,3 +1,14 @@ +body { + align-items: center; + box-sizing: border-box; + display: flex; + flex-direction: column; + padding: 0 var(--default-gap-xxsmall); + } +body > * { + width: min(640px, 100%); + } + h2, h3 { margin: 1em 0; } @@ -7,9 +18,11 @@ h2 { h3 { font-size: 16px; } + a { text-decoration: none; } + .fa-icon.info { color: var(--info0-ink); fill: var(--info0-ink); diff --git a/platform/mv3/extension/css/dashboard.css b/platform/mv3/extension/css/dashboard.css index e98bcc9a40497..6506c22722aca 100644 --- a/platform/mv3/extension/css/dashboard.css +++ b/platform/mv3/extension/css/dashboard.css @@ -1,12 +1,3 @@ -body { - align-items: center; - box-sizing: border-box; - display: flex; - flex-direction: column; - } -body > * { - width: min(640px, 100%); - } #dashboard-nav { background-color: var(--surface-1); border: 0; diff --git a/platform/mv3/extension/css/settings.css b/platform/mv3/extension/css/settings.css index 2e727fc0e33ab..b81e79a5256e2 100644 --- a/platform/mv3/extension/css/settings.css +++ b/platform/mv3/extension/css/settings.css @@ -22,10 +22,6 @@ p { white-space: pre-line; } -section > div { - padding: 0 var(--default-gap-xxsmall); - } - #showBlockedCount:has(input[type="checkbox"][disabled]) { opacity: 0.5; } diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index 17cfff4bc516b..c8183e9251895 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -145,6 +145,36 @@ async function onPermissionsRemoved() { /******************************************************************************/ +async function gotoURL(url, type) { + const pageURL = new URL(url, runtime.getURL('/')); + const tabs = await browser.tabs.query({ + url: pageURL.href, + windowType: type !== 'popup' ? 'normal' : 'popup' + }); + + if ( Array.isArray(tabs) && tabs.length !== 0 ) { + const { windowId, id } = tabs[0]; + return Promise.all([ + browser.windows.update(windowId, { focused: true }), + browser.tabs.update(id, { active: true }), + ]); + } + + if ( type === 'popup' ) { + return windows.create({ + type: 'popup', + url: pageURL.href, + }); + } + + return browser.tabs.create({ + active: true, + url: pageURL.href, + }); +} + +/******************************************************************************/ + function onMessage(request, sender, callback) { // Does not require trusted origin. @@ -265,6 +295,10 @@ function onMessage(request, sender, callback) { return true; } + case 'gotoURL': + gotoURL(request.url, request.type); + break; + case 'setFilteringMode': { getFilteringMode(request.hostname).then(actualLevel => { if ( request.level === actualLevel ) { return actualLevel; } @@ -276,6 +310,13 @@ function onMessage(request, sender, callback) { return true; } + case 'getDefaultFilteringMode': { + getDefaultFilteringMode().then(level => { + callback(level); + }); + return true; + } + case 'setDefaultFilteringMode': { getDefaultFilteringMode().then(beforeLevel => setDefaultFilteringMode(request.level).then(afterLevel => diff --git a/platform/mv3/extension/js/popup.js b/platform/mv3/extension/js/popup.js index 123c20bc73fa1..4242e5bacf332 100644 --- a/platform/mv3/extension/js/popup.js +++ b/platform/mv3/extension/js/popup.js @@ -261,12 +261,6 @@ dom.on('#lessButton', 'click', ( ) => { /******************************************************************************/ -dom.on('[data-i18n-title="popupTipDashboard"]', 'click', ev => { - if ( ev.isTrusted !== true ) { return; } - if ( ev.button !== 0 ) { return; } - runtime.openOptionsPage(); -}); - dom.on('#showMatchedRules', 'click', ev => { if ( ev.isTrusted !== true ) { return; } if ( ev.button !== 0 ) { return; } @@ -278,6 +272,33 @@ dom.on('#showMatchedRules', 'click', ev => { /******************************************************************************/ +dom.on('[data-i18n-title="popupTipReport"]', 'click', ev => { + if ( ev.isTrusted !== true ) { return; } + let url; + try { + url = new URL(currentTab.url); + } catch(_) { + } + if ( url === undefined ) { return; } + const reportURL = new URL(runtime.getURL('/report.html')); + reportURL.searchParams.set('url', url.href); + reportURL.searchParams.set('mode', popupPanelData.level); + sendMessage({ + what: 'gotoURL', + url: `${reportURL.pathname}${reportURL.search}`, + }); +}); + +/******************************************************************************/ + +dom.on('[data-i18n-title="popupTipDashboard"]', 'click', ev => { + if ( ev.isTrusted !== true ) { return; } + if ( ev.button !== 0 ) { return; } + runtime.openOptionsPage(); +}); + +/******************************************************************************/ + async function init() { const [ tab ] = await browser.tabs.query({ active: true, @@ -314,6 +335,10 @@ async function init() { isNaN(currentTab.id) === false ); + dom.cl.toggle('#reportFilterIssue', 'enabled', + /^https?:\/\//.test(url?.href) + ); + const parent = qs$('#rulesetStats'); for ( const details of popupPanelData.rulesetDetails || [] ) { const div = dom.clone('#templates .rulesetDetails'); diff --git a/platform/mv3/extension/js/report.js b/platform/mv3/extension/js/report.js new file mode 100644 index 0000000000000..676342b9e0ac3 --- /dev/null +++ b/platform/mv3/extension/js/report.js @@ -0,0 +1,155 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2024-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 { dnr, runtime } from './ext.js'; +import { dom, qs$ } from './dom.js'; +import { sendMessage } from './ext.js'; + +/******************************************************************************/ + +const reportedPage = (( ) => { + const url = new URL(window.location.href); + try { + const pageURL = url.searchParams.get('url'); + if ( pageURL === null ) { return null; } + const parsedURL = new URL(pageURL); + parsedURL.username = ''; + parsedURL.password = ''; + parsedURL.hash = ''; + const select = qs$('select[name="url"]'); + dom.text(select.options[0], parsedURL.href); + if ( parsedURL.search !== '' ) { + const option = dom.create('option'); + parsedURL.search = ''; + dom.text(option, parsedURL.href); + select.append(option); + } + if ( parsedURL.pathname !== '/' ) { + const option = dom.create('option'); + parsedURL.pathname = ''; + dom.text(option, parsedURL.href); + select.append(option); + } + return { + hostname: parsedURL.hostname.replace(/^(m|mobile|www)\./, ''), + mode: url.searchParams.get('mode'), + }; + } catch(ex) { + } + return null; +})(); + +/******************************************************************************/ + +function reportSpecificFilterType() { + return qs$('select[name="type"]').value; +} + +/******************************************************************************/ + +function renderData(data, depth = 0) { + const indent = ' '.repeat(depth); + if ( Array.isArray(data) ) { + const out = []; + for ( const value of data ) { + out.push(renderData(value, depth)); + } + return out.join('\n'); + } + if ( typeof data !== 'object' || data === null ) { + return `${indent}${data}`; + } + const out = []; + for ( const [ name, value ] of Object.entries(data) ) { + if ( typeof value === 'object' && value !== null ) { + out.push(`${indent}${name}:`); + out.push(renderData(value, depth + 1)); + continue; + } + out.push(`${indent}${name}: ${value}`); + } + return out.join('\n'); +} + +/******************************************************************************/ + +async function reportSpecificFilterIssue() { + const githubURL = new URL( + 'https://github.com/uBlockOrigin/uAssets/issues/new?template=specific_report_from_ubol.yml' + ); + const issueType = reportSpecificFilterType(); + let title = `${reportedPage.hostname}: ${issueType}`; + if ( qs$('#isNSFW').checked ) { + title = `[nsfw] ${title}`; + } + githubURL.searchParams.set('title', title); + githubURL.searchParams.set( + 'url_address_of_the_web_page', + '`' + qs$('select[name="url"]').value + '`' + ); + githubURL.searchParams.set('category', issueType); + githubURL.searchParams.set('labels', 'uBOL'); + + const manifest = runtime.getManifest(); + const rulesets = await dnr.getEnabledRulesets(); + const defaultMode = await sendMessage({ what: 'getDefaultFilteringMode' }); + const modes = [ 'no filtering', 'basic', 'optimal', 'complete' ]; + const config = { + version: `uBOL ${manifest.version}`, + mode: `${modes[reportedPage.mode]} / ${modes[defaultMode]}`, + rulesets, + }; + const configBody = [ + '```yaml', + renderData(config), + '```', + '', + ].join('\n'); + githubURL.searchParams.set('configuration', configBody); + sendMessage({ what: 'gotoURL', url: githubURL.href }); +} + +/******************************************************************************/ + +(async ( ) => { + dom.on('[data-url]', 'click', ev => { + const elem = ev.target.closest('[data-url]'); + const url = dom.attr(elem, 'data-url'); + if ( typeof url !== 'string' || url === '' ) { return; } + sendMessage({ what: 'gotoURL', url }); + ev.preventDefault(); + }); + + if ( reportedPage !== null ) { + dom.on('[data-i18n="supportReportSpecificButton"]', 'click', ev => { + reportSpecificFilterIssue(); + ev.preventDefault(); + }); + + dom.on('[data-i18n="supportFindSpecificButton"]', 'click', ev => { + const url = new URL('https://github.com/uBlockOrigin/uAssets/issues'); + url.searchParams.set('q', `is:issue sort:updated-desc "${reportedPage.hostname}" in:title`); + sendMessage({ what: 'gotoURL', url: url.href }); + ev.preventDefault(); + }); + } + +})(); diff --git a/platform/mv3/extension/matched-rules.html b/platform/mv3/extension/matched-rules.html index ec392ca2338ab..488e150a3079e 100644 --- a/platform/mv3/extension/matched-rules.html +++ b/platform/mv3/extension/matched-rules.html @@ -7,7 +7,6 @@ - diff --git a/platform/mv3/extension/popup.html b/platform/mv3/extension/popup.html index 990f6590af438..e231acc9b9d2a 100644 --- a/platform/mv3/extension/popup.html +++ b/platform/mv3/extension/popup.html @@ -13,6 +13,7 @@ +
­
@@ -30,6 +31,7 @@ list-altShow matched rules + comment-alt cogs
diff --git a/platform/mv3/extension/report.html b/platform/mv3/extension/report.html new file mode 100644 index 0000000000000..21997e936eefc --- /dev/null +++ b/platform/mv3/extension/report.html @@ -0,0 +1,61 @@ + + + + + +uBO Lite — Report + + + + + + + + + + +
+ +

+

+
+
+

+ +
+
+
+

+
+ +

+

+
+ +

+

+ +

+ +
+ +
+ + + + + + + + From 99191d1363442d4cff440f28eb243f2315476f48 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 28 Sep 2024 14:12:13 -0400 Subject: [PATCH 281/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/cy/messages.json | 2 +- src/_locales/cy/messages.json | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/platform/mv3/extension/_locales/cy/messages.json b/platform/mv3/extension/_locales/cy/messages.json index 56a6d66e186bf..e3f1b68fef050 100644 --- a/platform/mv3/extension/_locales/cy/messages.json +++ b/platform/mv3/extension/_locales/cy/messages.json @@ -12,7 +12,7 @@ "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashfwrdd", + "message": "uBO Lite — Dangosfwrdd", "description": "English: uBO Lite — Dashboard" }, "settingsPageName": { diff --git a/src/_locales/cy/messages.json b/src/_locales/cy/messages.json index 813c625b3140b..d91b747e59b8d 100644 --- a/src/_locales/cy/messages.json +++ b/src/_locales/cy/messages.json @@ -4,15 +4,15 @@ "description": "extension name." }, "extShortDesc": { - "message": "O'r diwedd, rhwystrydd effeithlon. Ysgafn ar y CPU a'r cof.", + "message": "O'r diwedd, rhwystrydd effeithlon sy'n gwell ar y CPU a'r cof.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { - "message": "uBlock₀ — Dashfwrdd", + "message": "uBlock₀ — Dangosfwrdd", "description": "English: uBlock₀ — Dashboard" }, "dashboardUnsavedWarning": { - "message": "Rhybudd! Mae yna newidiadau heb eu cadw", + "message": "Rhybudd! Mae gennych newidiadau heb eu cadw", "description": "A warning in the dashboard when navigating away from unsaved changes" }, "dashboardUnsavedWarningStay": { @@ -116,11 +116,11 @@ "description": "English: Click to open the dashboard" }, "popupTipZapper": { - "message": "Modd saethu elfen", + "message": "Galluogi modd saethu elfen", "description": "Tooltip for the element-zapper icon in the popup panel" }, "popupTipPicker": { - "message": "Modd dewis elfen", + "message": "Galluogi modd dewis elfen", "description": "English: Enter element picker mode" }, "popupTipLog": { @@ -208,7 +208,7 @@ "description": "Caption for the no-scripting per-site switch" }, "popupMoreButton_v2": { - "message": "Mwy", + "message": "Rhagor", "description": "Label to be used to show popup panel sections" }, "popupLessButton_v2": { @@ -336,7 +336,7 @@ "description": "English: Color-blind friendly" }, "settingsAppearance": { - "message": "Golwg", + "message": "Gwedd", "description": "Section for controlling user interface appearance" }, "settingsThemeLabel": { @@ -520,7 +520,7 @@ "description": "used as a tooltip for the out-of-date icon beside a list" }, "3pViewContent": { - "message": "gweld y cynnwys", + "message": "gweld cynnwys", "description": "used as a tooltip for eye icon beside a list" }, "3pLastUpdate": { @@ -528,7 +528,7 @@ "description": "used as a tooltip for the clock icon beside a list" }, "3pUpdating": { - "message": "Updating…", + "message": "Wrthi'n diweddaru…", "description": "used as a tooltip for the spinner icon beside a list" }, "3pNetworkError": { @@ -1140,7 +1140,7 @@ "description": "Firefox/Fennec-specific: Show Logger" }, "fennecMenuItemBlockingOff": { - "message": "off", + "message": "na", "description": "Firefox-specific: appears as 'uBlock₀ (off)'" }, "docblockedTitle": { @@ -1228,7 +1228,7 @@ "description": "for generic 'Revert' buttons" }, "genericBytes": { - "message": "bytes", + "message": "beit", "description": "" }, "contextMenuBlockElementInFrame": { From 7f117e8d21d583bb9cbc1a589e80924de194d3b2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 28 Sep 2024 14:14:26 -0400 Subject: [PATCH 282/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/ar/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/az/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/be/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/bg/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/bn/messages.json | 68 +++++++++++++++++++ .../extension/_locales/br_FR/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/bs/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/ca/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/cs/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/cv/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/cy/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/da/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/de/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/el/messages.json | 68 +++++++++++++++++++ .../extension/_locales/en_GB/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/eo/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/es/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/et/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/eu/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/fa/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/fi/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/fil/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/fr/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/fy/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/gl/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/gu/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/he/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/hi/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/hr/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/hu/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/hy/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/id/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/it/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/ja/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/ka/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/kk/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/kn/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/ko/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/lt/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/lv/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/mk/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/ml/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/mr/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/ms/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/nb/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/nl/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/oc/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/pa/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/pl/messages.json | 68 +++++++++++++++++++ .../extension/_locales/pt_BR/messages.json | 68 +++++++++++++++++++ .../extension/_locales/pt_PT/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/ro/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/ru/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/si/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/sk/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/sl/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/so/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/sq/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/sr/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/sv/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/sw/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/ta/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/te/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/th/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/tr/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/uk/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/ur/messages.json | 68 +++++++++++++++++++ .../mv3/extension/_locales/vi/messages.json | 68 +++++++++++++++++++ .../extension/_locales/zh_CN/messages.json | 68 +++++++++++++++++++ .../extension/_locales/zh_TW/messages.json | 68 +++++++++++++++++++ 70 files changed, 4760 insertions(+) diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index 404066efaa0a9..f0cb94cebef39 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -31,6 +31,10 @@ "message": "وضع التصفية", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "افتح لوحة التحكم", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "التبعيات الخارجية (متوافقة مع GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "مرحبا", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/az/messages.json b/platform/mv3/extension/_locales/az/messages.json index 3f397e146f9ea..7c769e3f935dd 100644 --- a/platform/mv3/extension/_locales/az/messages.json +++ b/platform/mv3/extension/_locales/az/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "İdarəetmə panelini aç", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Xoş gəldiniz", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/be/messages.json b/platform/mv3/extension/_locales/be/messages.json index d15851fd1aad0..c25464d019166 100644 --- a/platform/mv3/extension/_locales/be/messages.json +++ b/platform/mv3/extension/_locales/be/messages.json @@ -31,6 +31,10 @@ "message": "рэжым фільтравання", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Адкрыць панэль кіравання", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Вонкавыя залежнасці (GPLv3-сумяшчальныя):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Вітаем", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index 0d35e5ec11f44..b505ed5762c97 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -31,6 +31,10 @@ "message": "режим на филтриране", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Табло с настройки", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Външни зависимости (съвместими с GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Добре дошли", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/bn/messages.json b/platform/mv3/extension/_locales/bn/messages.json index f987c1850a676..d080906856e76 100644 --- a/platform/mv3/extension/_locales/bn/messages.json +++ b/platform/mv3/extension/_locales/bn/messages.json @@ -31,6 +31,10 @@ "message": "ফিল্টারিং মোড", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "ড্যাশবোর্ড খুলুন", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "বাহ্যিক নির্ভরতা (GPLv3-সামঞ্জস্যপূর্ণ):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "স্বাগতম", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index dce348fb2e778..3b179eaf1dca6 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -31,6 +31,10 @@ "message": "mod silañ", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Digeriñ an daolenn-vourzh", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Dalc'hioù diavaez (a glot gant GPLv3)", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Donemat", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/bs/messages.json b/platform/mv3/extension/_locales/bs/messages.json index 6f7f257782a20..178795ae3117a 100644 --- a/platform/mv3/extension/_locales/bs/messages.json +++ b/platform/mv3/extension/_locales/bs/messages.json @@ -31,6 +31,10 @@ "message": "način filtriranja", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Otvorite nadzornu ploču", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Vanjske ovisnosti (kompatibilno s GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Dobrodošli", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/ca/messages.json b/platform/mv3/extension/_locales/ca/messages.json index ea727755353db..04f722f964bbb 100644 --- a/platform/mv3/extension/_locales/ca/messages.json +++ b/platform/mv3/extension/_locales/ca/messages.json @@ -31,6 +31,10 @@ "message": "mode de filtre", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Obre el tauler", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Dependències externes (compatibles amb GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Us donem la benvinguda", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/cs/messages.json b/platform/mv3/extension/_locales/cs/messages.json index 6daf4a73a9f51..556e7da210650 100644 --- a/platform/mv3/extension/_locales/cs/messages.json +++ b/platform/mv3/extension/_locales/cs/messages.json @@ -31,6 +31,10 @@ "message": "Filtrovací režim", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Otevřít ovládací panel", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Externí závislosti (kompatibilní s GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Vítejte", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/cv/messages.json b/platform/mv3/extension/_locales/cv/messages.json index 30c719d52722d..c5f77c667a506 100644 --- a/platform/mv3/extension/_locales/cv/messages.json +++ b/platform/mv3/extension/_locales/cv/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/cy/messages.json b/platform/mv3/extension/_locales/cy/messages.json index e3f1b68fef050..21ac20da0cddb 100644 --- a/platform/mv3/extension/_locales/cy/messages.json +++ b/platform/mv3/extension/_locales/cy/messages.json @@ -31,6 +31,10 @@ "message": "modd hidlo", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Agor y dashfwrdd", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Gofynion allanol (cydnaws â GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Croeso", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/da/messages.json b/platform/mv3/extension/_locales/da/messages.json index 303d3bd3810ee..93de76bb35611 100644 --- a/platform/mv3/extension/_locales/da/messages.json +++ b/platform/mv3/extension/_locales/da/messages.json @@ -31,6 +31,10 @@ "message": "filtreringstilstand", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Åbn kontrolpanelet", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Eksterne afhængigheder (GPLv3-kompatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Velkommen", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index 7e8e072ca80f5..65154b8d36dfc 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -31,6 +31,10 @@ "message": "Filtermodus", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Dashboard öffnen", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Externe Abhängigkeiten (GPLv3-kompatibel):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Willkommen", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index 9fab54e52f482..e5e8f663b7889 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -31,6 +31,10 @@ "message": "λειτουργία φιλτραρίσματος", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Ανοίξτε τον πίνακα ελέγχου", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Εξωτερικές εξαρτήσεις (συμβατές με GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Καλώς ήρθατε", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/en_GB/messages.json b/platform/mv3/extension/_locales/en_GB/messages.json index 42cde830929ad..f1d2e99626386 100644 --- a/platform/mv3/extension/_locales/en_GB/messages.json +++ b/platform/mv3/extension/_locales/en_GB/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/eo/messages.json b/platform/mv3/extension/_locales/eo/messages.json index 4481c48f28e8e..786ace6c3fa7c 100644 --- a/platform/mv3/extension/_locales/eo/messages.json +++ b/platform/mv3/extension/_locales/eo/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Bonvenon", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index f4ff120d131d7..ff55964e57f24 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -31,6 +31,10 @@ "message": "modo de filtrado", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Abrir panel de control", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Dependencias externas (compatibles con GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Bienvenida", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/et/messages.json b/platform/mv3/extension/_locales/et/messages.json index bdbf31a3afafd..62d13ed6cf447 100644 --- a/platform/mv3/extension/_locales/et/messages.json +++ b/platform/mv3/extension/_locales/et/messages.json @@ -31,6 +31,10 @@ "message": "filtreerimisrežiim", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Ava töölaud", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Välised sõltuvused (ühilduvad GPLv3-ga):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Tere tulemast", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/eu/messages.json b/platform/mv3/extension/_locales/eu/messages.json index 204ddba5bc649..a6dedc46b7d0d 100644 --- a/platform/mv3/extension/_locales/eu/messages.json +++ b/platform/mv3/extension/_locales/eu/messages.json @@ -31,6 +31,10 @@ "message": "Iragazteko modua", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Ireki lan-lekua", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Kanpo menpekotasunak (GPLv3 lizentziarekin bateragarriak):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Ongi etorri", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/fa/messages.json b/platform/mv3/extension/_locales/fa/messages.json index ba2d878aa6078..7f4e9782db8fb 100644 --- a/platform/mv3/extension/_locales/fa/messages.json +++ b/platform/mv3/extension/_locales/fa/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "باز کردن داشبورد", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/fi/messages.json b/platform/mv3/extension/_locales/fi/messages.json index 5e8ef6de8dc4b..6708ff96fa99c 100644 --- a/platform/mv3/extension/_locales/fi/messages.json +++ b/platform/mv3/extension/_locales/fi/messages.json @@ -31,6 +31,10 @@ "message": "suodatustila", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Avaa hallintapaneeli", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Ulkopuoliset riippuvuudet (GPLv3-yhteensopiva):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Tervetuloa", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/fil/messages.json b/platform/mv3/extension/_locales/fil/messages.json index 8b48cf12d2ac3..8f81e02a64ea5 100644 --- a/platform/mv3/extension/_locales/fil/messages.json +++ b/platform/mv3/extension/_locales/fil/messages.json @@ -31,6 +31,10 @@ "message": "moda nang pagsasala", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Buksan ang dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Mga panlabas na dependency (angkop sa GPLv3)", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Mabuhay", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/fr/messages.json b/platform/mv3/extension/_locales/fr/messages.json index a0c557d0ea923..d41b35931148b 100644 --- a/platform/mv3/extension/_locales/fr/messages.json +++ b/platform/mv3/extension/_locales/fr/messages.json @@ -31,6 +31,10 @@ "message": "Mode de filtrage", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Ouvrir le Tableau de bord", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Dépendances externes (compatibles GPLv3) :", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Bienvenue", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/fy/messages.json b/platform/mv3/extension/_locales/fy/messages.json index 634f28c88f3de..d74cc92db8a0e 100644 --- a/platform/mv3/extension/_locales/fy/messages.json +++ b/platform/mv3/extension/_locales/fy/messages.json @@ -31,6 +31,10 @@ "message": "filtermodus", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Dashboerd iepenje", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Eksterne ôfhinklikheden (GPLv3-kompatibel):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Wolkom", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/gl/messages.json b/platform/mv3/extension/_locales/gl/messages.json index 1dcc3844d46da..dc87e7591e00f 100644 --- a/platform/mv3/extension/_locales/gl/messages.json +++ b/platform/mv3/extension/_locales/gl/messages.json @@ -31,6 +31,10 @@ "message": "modo de filtrado", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Abrir o panel", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Dependencias externas (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Benvida", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/gu/messages.json b/platform/mv3/extension/_locales/gu/messages.json index 30c719d52722d..c5f77c667a506 100644 --- a/platform/mv3/extension/_locales/gu/messages.json +++ b/platform/mv3/extension/_locales/gu/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/he/messages.json b/platform/mv3/extension/_locales/he/messages.json index d76b50ebb83d1..16e21d55e13f6 100644 --- a/platform/mv3/extension/_locales/he/messages.json +++ b/platform/mv3/extension/_locales/he/messages.json @@ -31,6 +31,10 @@ "message": "מצב מסנן", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "פתיחת לוח־המחוונים", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "תלויות חיצוניות (תואם GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "ברוך בואך", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/hi/messages.json b/platform/mv3/extension/_locales/hi/messages.json index 0cfd586195cc7..d81b4d7bffb8a 100644 --- a/platform/mv3/extension/_locales/hi/messages.json +++ b/platform/mv3/extension/_locales/hi/messages.json @@ -31,6 +31,10 @@ "message": "फ़िल्टरिंग मोड", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "डैशबोर्ड खोलें", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "बाहरी निर्भरता (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "स्वागत", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/hr/messages.json b/platform/mv3/extension/_locales/hr/messages.json index 5ca15ed148feb..1a5ad1da7eaba 100644 --- a/platform/mv3/extension/_locales/hr/messages.json +++ b/platform/mv3/extension/_locales/hr/messages.json @@ -31,6 +31,10 @@ "message": "Način filtriranja", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Otvori nadzornu ploču", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Vanjski korišteni programi (GPLv3-kompatiblini):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Dobrodošli", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index 483b2eef56a22..53e7c2c672253 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -31,6 +31,10 @@ "message": "szűrési mód", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Vezérlőpult megnyitása", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Külső függőségek (GPLv3-kompatibilis):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Üdvözöljük", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/hy/messages.json b/platform/mv3/extension/_locales/hy/messages.json index 5a50db68ace07..a0cf19fa06bd7 100644 --- a/platform/mv3/extension/_locales/hy/messages.json +++ b/platform/mv3/extension/_locales/hy/messages.json @@ -31,6 +31,10 @@ "message": "զտման ռեժիմ", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Բացել կառավահանը", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Արտաքին կախվածություններ (GPLv3-համատեղելի)՝", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Բարի գալուստ", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/id/messages.json b/platform/mv3/extension/_locales/id/messages.json index 7907760e09ecd..1fb1e31ffa003 100644 --- a/platform/mv3/extension/_locales/id/messages.json +++ b/platform/mv3/extension/_locales/id/messages.json @@ -31,6 +31,10 @@ "message": "mode filter", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Buka dasbor", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Dependensi eksternal (kompatibel GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Selamat datang", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index dc7fbd930783d..52df0e5306c14 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -31,6 +31,10 @@ "message": "Modalità di filtraggio", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Apri il pannello di controllo", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Dipendenze esterne (GPLv3-compatibili):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Benvenuto", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/ja/messages.json b/platform/mv3/extension/_locales/ja/messages.json index 53ad766bb031a..eb7a89af2b45c 100644 --- a/platform/mv3/extension/_locales/ja/messages.json +++ b/platform/mv3/extension/_locales/ja/messages.json @@ -31,6 +31,10 @@ "message": "フィルタリングモード", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "ダッシュボードを開く", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "外部依存関係 (GPLv3 互換):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "ようこそ", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/ka/messages.json b/platform/mv3/extension/_locales/ka/messages.json index a0550c66e1a05..0f837f0152d45 100644 --- a/platform/mv3/extension/_locales/ka/messages.json +++ b/platform/mv3/extension/_locales/ka/messages.json @@ -31,6 +31,10 @@ "message": "გაფილტვრის რეჟიმი", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "სამართავის გახსნა", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "ცალკეული დაქვემდებარებული პროექტები (GPLv3-თან თავსებადი):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "მოგესალმებით", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/kk/messages.json b/platform/mv3/extension/_locales/kk/messages.json index 30c719d52722d..c5f77c667a506 100644 --- a/platform/mv3/extension/_locales/kk/messages.json +++ b/platform/mv3/extension/_locales/kk/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/kn/messages.json b/platform/mv3/extension/_locales/kn/messages.json index c1261b1651f77..7ff919c228737 100644 --- a/platform/mv3/extension/_locales/kn/messages.json +++ b/platform/mv3/extension/_locales/kn/messages.json @@ -31,6 +31,10 @@ "message": "ಫಿಲ್ಟರಿಂಗ್ ಮೋಡ್", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "ಡ್ಯಾಶ್‌ಬೋರ್ಡ್ ತೆರೆಯಿರಿ", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "ಸ್ವಾಗತ", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/ko/messages.json b/platform/mv3/extension/_locales/ko/messages.json index d7de8ce1654d5..edd5e747c28d7 100644 --- a/platform/mv3/extension/_locales/ko/messages.json +++ b/platform/mv3/extension/_locales/ko/messages.json @@ -31,6 +31,10 @@ "message": "필터링 모드", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "대시보드 열기", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "외부 의존성 (GPLv3 호환):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "환영합니다", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/lt/messages.json b/platform/mv3/extension/_locales/lt/messages.json index 497cd30837082..d810f531ed358 100644 --- a/platform/mv3/extension/_locales/lt/messages.json +++ b/platform/mv3/extension/_locales/lt/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Išorinės priklausomybės (suderinamos su „GPLv3“):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/lv/messages.json b/platform/mv3/extension/_locales/lv/messages.json index 4514c75b4f19a..810d5a0eab97b 100644 --- a/platform/mv3/extension/_locales/lv/messages.json +++ b/platform/mv3/extension/_locales/lv/messages.json @@ -31,6 +31,10 @@ "message": "aizturēšanas veids", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Atvērt vadības paneli", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Ārējās atkarības (GPLv3 saderīgas):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Sveicināti!", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/mk/messages.json b/platform/mv3/extension/_locales/mk/messages.json index 73d13cc15b35b..06f558231a77c 100644 --- a/platform/mv3/extension/_locales/mk/messages.json +++ b/platform/mv3/extension/_locales/mk/messages.json @@ -31,6 +31,10 @@ "message": "Начини на прочистување", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Отварање на Контролна Табла", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/ml/messages.json b/platform/mv3/extension/_locales/ml/messages.json index 42db083577715..a80d375c23054 100644 --- a/platform/mv3/extension/_locales/ml/messages.json +++ b/platform/mv3/extension/_locales/ml/messages.json @@ -31,6 +31,10 @@ "message": "ഫിൽട്ടറിംഗ് മോഡ്", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "ഡാഷ്ബോർഡ് തുറക്കുക", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "ബാഹ്യ ഡിപൻഡൻസികൾ (ജിപിൽവി3-അനുയോജ്യമായത്):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "സ്വാഗതം", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/mr/messages.json b/platform/mv3/extension/_locales/mr/messages.json index 30c719d52722d..c5f77c667a506 100644 --- a/platform/mv3/extension/_locales/mr/messages.json +++ b/platform/mv3/extension/_locales/mr/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/ms/messages.json b/platform/mv3/extension/_locales/ms/messages.json index 71f193001665a..6b015e7a9b1a6 100644 --- a/platform/mv3/extension/_locales/ms/messages.json +++ b/platform/mv3/extension/_locales/ms/messages.json @@ -31,6 +31,10 @@ "message": "mod penapisan", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Buka papan pemuka", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Pergantungan luaran (serasi dengan GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Selamat datang", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/nb/messages.json b/platform/mv3/extension/_locales/nb/messages.json index 44234c059857e..4fd7bd3d1135c 100644 --- a/platform/mv3/extension/_locales/nb/messages.json +++ b/platform/mv3/extension/_locales/nb/messages.json @@ -31,6 +31,10 @@ "message": "filtreringsmodus", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Åpne dashbordet", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Eksterne avhengigheter (GPLv3-kompatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Velkommen", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/nl/messages.json b/platform/mv3/extension/_locales/nl/messages.json index a32f81e591895..1044db20c2840 100644 --- a/platform/mv3/extension/_locales/nl/messages.json +++ b/platform/mv3/extension/_locales/nl/messages.json @@ -31,6 +31,10 @@ "message": "filtermodus", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Dashboard openen", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Externe afhankelijkheden (GPLv3-compatibel):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welkom", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/oc/messages.json b/platform/mv3/extension/_locales/oc/messages.json index 30c719d52722d..c5f77c667a506 100644 --- a/platform/mv3/extension/_locales/oc/messages.json +++ b/platform/mv3/extension/_locales/oc/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/pa/messages.json b/platform/mv3/extension/_locales/pa/messages.json index aff262e364ead..e3524501bce67 100644 --- a/platform/mv3/extension/_locales/pa/messages.json +++ b/platform/mv3/extension/_locales/pa/messages.json @@ -31,6 +31,10 @@ "message": "ਫਿਲਟਰ ਕਰਨ ਦਾ ਮੋਡ", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "ਡੈਸ਼ਬੋਰਡ ਨੂੰ ਖੋਲ੍ਹੋ", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "ਬਾਹਰੀ ਨਿਰਭਰਤਾਵਾਂ (GPLv3-ਅਨੁਕੂਲ):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "ਜੀ ਆਇਆਂ ਨੂੰ", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/pl/messages.json b/platform/mv3/extension/_locales/pl/messages.json index 61a1b8eb16fe5..6aa14a77ebcaa 100644 --- a/platform/mv3/extension/_locales/pl/messages.json +++ b/platform/mv3/extension/_locales/pl/messages.json @@ -31,6 +31,10 @@ "message": "Tryb filtrowania", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Otwórz panel sterowania", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Zewnętrzne zależności (kompatybilne z GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Witaj", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index f42f4b5a6ff3b..52757d7a8f719 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -31,6 +31,10 @@ "message": "modo de filtragem", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Abrir painel", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Dependências externas (compatíveis com GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Bem-vindo", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index a0cd625bda185..a6bc083461719 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -31,6 +31,10 @@ "message": "modo de filtragem", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Abrir o painel de controlo", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Dependências externas (compatíveis com GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Bem-vindo(a)", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/ro/messages.json b/platform/mv3/extension/_locales/ro/messages.json index 4502d6086b52a..38939b3439529 100644 --- a/platform/mv3/extension/_locales/ro/messages.json +++ b/platform/mv3/extension/_locales/ro/messages.json @@ -31,6 +31,10 @@ "message": "Mod de filtrare", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Deschide panoul de control", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Dependențe externe (compatibile GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Bun venit", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/ru/messages.json b/platform/mv3/extension/_locales/ru/messages.json index 63fee1591a597..f6074ff68faa6 100644 --- a/platform/mv3/extension/_locales/ru/messages.json +++ b/platform/mv3/extension/_locales/ru/messages.json @@ -31,6 +31,10 @@ "message": "режим фильтрации", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Открыть панель управления", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Внешние зависимости (совместимые с GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Добро пожаловать", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/si/messages.json b/platform/mv3/extension/_locales/si/messages.json index bc0e73fc0ddc2..2fa20d00c50e6 100644 --- a/platform/mv3/extension/_locales/si/messages.json +++ b/platform/mv3/extension/_locales/si/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/sk/messages.json b/platform/mv3/extension/_locales/sk/messages.json index b4ad74ba2fecc..cceb6c88b6132 100644 --- a/platform/mv3/extension/_locales/sk/messages.json +++ b/platform/mv3/extension/_locales/sk/messages.json @@ -31,6 +31,10 @@ "message": "Režim filtrovania", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Otvoriť ovládací panel", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Externé závislosti (kompatibilné s GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Vitajte", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/sl/messages.json b/platform/mv3/extension/_locales/sl/messages.json index 30c719d52722d..c5f77c667a506 100644 --- a/platform/mv3/extension/_locales/sl/messages.json +++ b/platform/mv3/extension/_locales/sl/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/so/messages.json b/platform/mv3/extension/_locales/so/messages.json index 30c719d52722d..c5f77c667a506 100644 --- a/platform/mv3/extension/_locales/so/messages.json +++ b/platform/mv3/extension/_locales/so/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index d7ec67c9dfe6d..20be851ec8e12 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -31,6 +31,10 @@ "message": "mënyra e filtrimit", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Hapni panelin e kontrollit", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Programet kushtëzuese (sipas GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Përshëndetje", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/sr/messages.json b/platform/mv3/extension/_locales/sr/messages.json index c33af6db43976..b994f245dc511 100644 --- a/platform/mv3/extension/_locales/sr/messages.json +++ b/platform/mv3/extension/_locales/sr/messages.json @@ -31,6 +31,10 @@ "message": "режим филтрирања", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Отвори контролну таблу", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Спољне зависности (компатибилно са GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Добродошли", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/sv/messages.json b/platform/mv3/extension/_locales/sv/messages.json index c95ce8d24db00..2431f0b9ab750 100644 --- a/platform/mv3/extension/_locales/sv/messages.json +++ b/platform/mv3/extension/_locales/sv/messages.json @@ -31,6 +31,10 @@ "message": "filtreringsläge", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Öppna kontrollpanelen", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Externa beroenden (GPLv3-kompatibla):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Välkommen", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/sw/messages.json b/platform/mv3/extension/_locales/sw/messages.json index 30c719d52722d..c5f77c667a506 100644 --- a/platform/mv3/extension/_locales/sw/messages.json +++ b/platform/mv3/extension/_locales/sw/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/ta/messages.json b/platform/mv3/extension/_locales/ta/messages.json index 30c719d52722d..c5f77c667a506 100644 --- a/platform/mv3/extension/_locales/ta/messages.json +++ b/platform/mv3/extension/_locales/ta/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/te/messages.json b/platform/mv3/extension/_locales/te/messages.json index 8437838c64a0c..dd2b1d19054ca 100644 --- a/platform/mv3/extension/_locales/te/messages.json +++ b/platform/mv3/extension/_locales/te/messages.json @@ -31,6 +31,10 @@ "message": "వడపోత మోడ్", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "డాష్‌బోర్డ్‌ను తెరవండి", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Welcome", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/th/messages.json b/platform/mv3/extension/_locales/th/messages.json index fee5db38e9fc4..3837f15a5e666 100644 --- a/platform/mv3/extension/_locales/th/messages.json +++ b/platform/mv3/extension/_locales/th/messages.json @@ -31,6 +31,10 @@ "message": "filtering mode", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Open the dashboard", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "External dependencies (GPLv3-compatible):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "ยินดีต้อนรับ", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/tr/messages.json b/platform/mv3/extension/_locales/tr/messages.json index 06e259997e21f..259d5412259af 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -31,6 +31,10 @@ "message": "Filtreleme modu", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Kontrol panelini aç", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Dış bağlılıklar (GPLv3-uyumlu):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Hoş geldiniz", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index 9a1a054b0f274..f3b1f1a8c9338 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -31,6 +31,10 @@ "message": "режим фільтрації", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Відкрити панель керування", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Зовнішні залежності (Сумісні з GPLv3)", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Ласкаво просимо", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/ur/messages.json b/platform/mv3/extension/_locales/ur/messages.json index 92ba9e9bc7b5f..4832e6feffc16 100644 --- a/platform/mv3/extension/_locales/ur/messages.json +++ b/platform/mv3/extension/_locales/ur/messages.json @@ -31,6 +31,10 @@ "message": "فلٹرنگ موڈ", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "ڈیش بورڈ کھولیں۔", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "بیرونی انحصار (GPLv3-مطابق):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "خوش آمدید", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/vi/messages.json b/platform/mv3/extension/_locales/vi/messages.json index 9a612c32deee0..489c0522b0139 100644 --- a/platform/mv3/extension/_locales/vi/messages.json +++ b/platform/mv3/extension/_locales/vi/messages.json @@ -31,6 +31,10 @@ "message": "chế độ lọc", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "Mở bảng điều khiển", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "Các phụ thuộc bên ngoài (tương thích GPLv3):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "Chào mừng", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/zh_CN/messages.json b/platform/mv3/extension/_locales/zh_CN/messages.json index 26f88f655f6d5..d50e605f35e36 100644 --- a/platform/mv3/extension/_locales/zh_CN/messages.json +++ b/platform/mv3/extension/_locales/zh_CN/messages.json @@ -31,6 +31,10 @@ "message": "过滤模式", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "在仪表板中", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "外部依赖(与 GPLv3 协议兼容):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "欢迎使用", "description": "The header text for the welcome message section" diff --git a/platform/mv3/extension/_locales/zh_TW/messages.json b/platform/mv3/extension/_locales/zh_TW/messages.json index d79f5d0ea4356..d1e273552b342 100644 --- a/platform/mv3/extension/_locales/zh_TW/messages.json +++ b/platform/mv3/extension/_locales/zh_TW/messages.json @@ -31,6 +31,10 @@ "message": "過濾模式", "description": "Label in the popup panel for the current filtering mode" }, + "popupTipReport": { + "message": "Report an issue on this website", + "description": "Tooltip used for the 'chat' icon in the panel" + }, "popupTipDashboard": { "message": "開啟控制台", "description": "English: Click to open the dashboard" @@ -99,6 +103,70 @@ "message": "外部相依套件(與 GPLv3 相容):", "description": "Shown in the About pane" }, + "supportS6H": { + "message": "Report a filter issue", + "description": "Header of 'Report a filter issue' section in Support pane" + }, + "supportS3P1": { + "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "description": "First paragraph of 'Filter issues' section in Support pane" + }, + "supportS6P1S1": { + "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "description": "A paragraph in the filter issue reporter section" + }, + "supportFindSpecificButton": { + "message": "Find similar reports", + "description": "A clickable link in the filter issue reporter section" + }, + "supportS6URL": { + "message": "Address of the webpage:", + "description": "Label for the URL of the page" + }, + "supportS6Select1": { + "message": "The webpage…", + "description": "Label for widget to select type of issue" + }, + "supportS6Select1Option0": { + "message": "-- Pick an entry --", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option1": { + "message": "Shows ads or ad leftovers", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option2": { + "message": "Has overlays or other nuisances", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option3": { + "message": "Detects uBO Lite", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option4": { + "message": "Has privacy-related issues", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option5": { + "message": "Malfunctions when uBO Lite is enabled", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option6": { + "message": "Opens unwanted tabs or windows", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Select1Option7": { + "message": "Leads to badware, phishing", + "description": "An entry in the widget used to select the type of issue" + }, + "supportS6Checkbox1": { + "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "description": "A checkbox to use for NSFW sites" + }, + "supportReportSpecificButton": { + "message": "Create new report", + "description": "Text for button which open an external webpage in Support pane" + }, "firstRunSectionLabel": { "message": "歡迎", "description": "The header text for the welcome message section" From e81e70937f5b6f8f98bdd8e6f71af030486efab8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 29 Sep 2024 10:51:56 -0400 Subject: [PATCH 283/553] Add ability to decode base64 in `urlskip=` Related case: https://github.com/uBlockOrigin/uAssets/issues/25467 New step: `-base64` Purpose: to decode base64-encoded output of previous step --- src/js/static-net-filtering.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index e5e9017d26b1a..f5b1841752368 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5441,6 +5441,11 @@ function urlSkip(urlin, steps) { urlin = urlout = `https://${s}`; continue; } + // Decode base64 + if ( step === '-base64' ) { + urlin = urlout = self.atob(urlin); + continue; + } // Unknown directive return; } From a2f81f19ff41d3fef462305ac4c0478c755f67af Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 29 Sep 2024 10:56:54 -0400 Subject: [PATCH 284/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48a39d7b1859c..913bfed9480f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add ability to decode base64 in `urlskip=`](https://github.com/gorhill/uBlock/commit/e81e70937f) - [Fix images not properly downloading on click](https://github.com/gorhill/uBlock/commit/aec0bd39e3) ---------- From 7a9481b5a582a24a4de6bc0c3d067c08398f402b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 29 Sep 2024 10:57:12 -0400 Subject: [PATCH 285/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 9fb35ca861864..0c424f18d5483 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.0 \ No newline at end of file +1.60.1.1 \ No newline at end of file From c6baa2fb51663756b1f76f380283fc1127ba571c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 29 Sep 2024 11:15:04 -0400 Subject: [PATCH 286/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/ar/messages.json | 4 +-- .../mv3/extension/_locales/bg/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/ca/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/cs/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/da/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/de/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/es/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/fr/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/he/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/hr/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/it/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/ja/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/nl/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/pl/messages.json | 34 +++++++++---------- .../extension/_locales/pt_BR/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/ru/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/sk/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/sv/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/tr/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/uk/messages.json | 6 ++-- .../extension/_locales/zh_TW/messages.json | 34 +++++++++---------- src/_locales/cs/messages.json | 4 +-- src/_locales/de/messages.json | 8 ++--- src/_locales/fr/messages.json | 2 +- 24 files changed, 335 insertions(+), 335 deletions(-) diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index f0cb94cebef39..588e258fd3100 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "الإبلاغ عن مشكلة في هذا الموقع", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,7 +104,7 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "الإبلاغ عن مشكلة في عوامل التصفية", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index b505ed5762c97..51df9ca15e460 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Докладване на проблем с този уебсайт", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Докладване на проблем с филтъра", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Докладвайте за проблеми с филтъра с конкретни уебсайтове към uBlockOrigin/uAssets инструмент за проследяване на проблеми. Изисква акаунт в GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "За да се избегне натоварването на доброволците с дублиращи се доклади, моля, проверете дали проблемът вече не е докладван.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Намиране на подобни доклади", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Адрес на уеб страницата:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Уеб страницата...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Изберете --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Показва реклами или остатъци от реклами", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Има наслагвания или други неудобства", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Открива uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Има проблеми, свързани с поверителността", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Неправилно функциониране, когато е активиран uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Отваря нежелани раздели или прозорци", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Води до зловреден софтуер, фишинг", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Маркиране на уебстраницата като \"NSFW\" (\"Не е безопасно за работа\")", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Създаване на нов доклад", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/ca/messages.json b/platform/mv3/extension/_locales/ca/messages.json index 04f722f964bbb..f307f31ca115a 100644 --- a/platform/mv3/extension/_locales/ca/messages.json +++ b/platform/mv3/extension/_locales/ca/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Informa d'un problema en aquest lloc web", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Informeu d'un problema de filtre", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Informeu d'un problema en llocs web específics mitjançant el uBlockOrigin/uAssets seguiment d'errors. Cal un compte al GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Per evitar carregar els voluntaris amb informes duplicats, verifiqueu que el problema encara no s'hagi notificat.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Cerca d'informes semblants", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Adreça de la pàgina web:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "La pàgina web...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Trieu una entrada --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Mostra anuncis o restes d'anuncis", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Té superposicions o altres errors", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Detecta l'ús de l'uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Té problemes relacionats amb la privadesa", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "No es mostra correctament amb l'uBO Lite habilitat", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Obre pestanyes o finestres no desitjades", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Condueix a programari maliciós, pesca electrònica", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Etiqueta l'enllaç com a «NSFW» (“No apte per al treball”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Crea un informe nou", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/cs/messages.json b/platform/mv3/extension/_locales/cs/messages.json index 556e7da210650..fb24661d25a84 100644 --- a/platform/mv3/extension/_locales/cs/messages.json +++ b/platform/mv3/extension/_locales/cs/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Nahlásit problém na této webové stránce", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Nahlásit problém s filtrem", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Nahlaste problémy s filtrem u učitých webových stránek do sledovače problémů uBlockOrigin/uAssets. Vyžaduje účet GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Abyste dobrovolníky nezatěžovali duplicitními hlášeními, ověřte si, zda již problém nebyl nahlášen.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Vyhledat podobná hlášení", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Adresa webové stránky:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Webová stránka…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Vyberte položku --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Zobrazuje reklamy nebo zbytky reklam", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Je překrytá nebo má jiné nedostatky", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Detekuje uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Má problémy související se soukromím", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Je rozbitá, když je povolen uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Otevírá nechtěné karty nebo okna", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Vede k badwaru, phishingu", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Označit webovou stránku jako “NSFW” (“Není bezpečné pro práci”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Vytvořit nové hlášení", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/da/messages.json b/platform/mv3/extension/_locales/da/messages.json index 93de76bb35611..8a8c760677c92 100644 --- a/platform/mv3/extension/_locales/da/messages.json +++ b/platform/mv3/extension/_locales/da/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Anmeld et problem på dette websted", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Anmeld et filterproblem", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Anmeld filterproblemer med bestemte websteder til uBlockOrigin/uAssets-problemsporingen. Kræver en GitHub-konto.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "For at undgå at belaste frivillige med dubletanmeldelser, så tjek venligst, at problemet ikke allerede er anmeldt.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Find lign. anmeldelser", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Websideadressen:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Websiden…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Vælg problemtype --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Viser annoncer eller annoncerester", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Har overlejringer eller andre gener", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Detekterer uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Har fortrolighedsrelaterede problemer", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Fejlfungerer, når uBO Lite er aktiveret", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Åbner uønskede faner eller vinduer", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Fører til badware, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Mærk websiden som “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Opret ny anmeldelse", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index 65154b8d36dfc..a2504f952ed9e 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Ein Problem mit dieser Website melden", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Ein Filterproblem melden", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Bitte melden Sie Filterprobleme mit bestimmten Websites an den uBlockOrigin/uAssets Issue Tracker. Erfordert ein GitHub-Konto.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Um die Freiwilligen nicht mit doppelten Meldungen zu belasten, vergewissern Sie sich bitte, dass das Problem nicht schon einmal gemeldet wurde.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Ähnliche Meldungen finden", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Adresse der Webseite:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Die Webseite …", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Einen Eintrag auswählen --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Zeigt Werbung oder Werbereste", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Hat Überdeckungen oder andere Belästigungen", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Erkennt uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Hat Datenschutzprobleme", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Funktioniert nicht richtig, wenn uBO Lite aktiviert ist", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Öffnet unerwünschte Tabs oder Fenster", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Führt zu Schadsoftware, Phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Webseite als »NSFW« kennzeichnen (»Unpassend für den Arbeitsplatz«)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Neue Meldung erstellen", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index ff55964e57f24..f7cfe51e61631 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Reportar un problema en este sitio web", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Reportar un problema de filtro", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Reportar problemas de filtros con sitios web específicos en uBlockOrigin/uAssets, un rastreador de problemas. Requiere una cuenta de GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Para evitar sobrecargar a voluntarios con reportes duplicados, verifique que el problema no haya sido reportado.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Encontrar reportes similares", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Dirección de la página web:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "La página web...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Elige una entrada --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Muestra anuncios o restos de anuncios", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Tiene superposiciones u otras molestias", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Detecta uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Tiene problemas relacionados con la privacidad", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Funciona mal cuando uBO Lite está habilitado", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Abre pestañas o ventanas no deseadas", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Conduce a malware, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Etiqueta la página web como “NSFW” (“No apto para el trabajo”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Crear nuevo reporte", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/fr/messages.json b/platform/mv3/extension/_locales/fr/messages.json index d41b35931148b..c18dccbeac544 100644 --- a/platform/mv3/extension/_locales/fr/messages.json +++ b/platform/mv3/extension/_locales/fr/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Rapporter un problème sur ce site Web", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Rapporter un problème de filtre", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Rapportez des problèmes de filtre sur des sites Web spécifiques dans le uBlockOrigin/uAssets suivi des problèmes. Nécessite un compte GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Pour éviter d'encombrer les contributeurs avec des rapports en double, veuillez vérifier que le problème n'a pas déjà été rapporté.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Trouver des rapports similaires", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Adresse de la page Web :", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "La page Web…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Choisir un type --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "affiche des publicités ou des résidus de publicité", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "a une surcouche ou d'autres nuisances", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "détecte uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "a des problèmes de confidentialité", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "fonctionne mal quand uBO Lite est activé", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "ouvre des onglets ou fenêtres indésirables", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "conduit à/redirige vers des logiciels malveillants, du hameçonnage", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Marquer la page Web comme \"IPLT\" (Inapproprié Pour Le Travail)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Créer un nouveau rapport", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/he/messages.json b/platform/mv3/extension/_locales/he/messages.json index 16e21d55e13f6..6dfbf8126ed13 100644 --- a/platform/mv3/extension/_locales/he/messages.json +++ b/platform/mv3/extension/_locales/he/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "דווח על בעיה באתר זה", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "דיווח על בעיית מסנן", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "לדיווח על בעיות באתרים ספציפים יש לפתוח דיווח חדש במעקב הדיווחים של uBlockOrigin/uAssets. נדרש חשבון ב GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "כדי להימנע מהכבדה על מתנדבים בדווחים כפולים, נא לודא שבעיה דומה טרם דווחה.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "מצאו דיווחים דומים", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "כתובת דף האינטרנט:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "דף האינטרנט…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- בחר קטגוריה --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "הצגת פרסומות או שאריות שלהן", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "קיים ריבוד או מטרד אחר", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "מזהה את uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "בעיות הקשורות לפרטיות", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "כשל תפעולי כאשר uBO Lite פעיל", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "נפתחים לשוניות או חלונות לא רצויים", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "מוביל לנוזקה, פישינג", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "תייג את הדף כ \"NSFW\" (“Not Safe For Work” - לא בטוח למקום העבודה)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "צור דיווח חדש", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/hr/messages.json b/platform/mv3/extension/_locales/hr/messages.json index 1a5ad1da7eaba..1834c868831d6 100644 --- a/platform/mv3/extension/_locales/hr/messages.json +++ b/platform/mv3/extension/_locales/hr/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Prijavite problem na ovoj web stranici", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Prijavi problem sa filterom", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Prijavite probleme s filtrima s određenim web-lokacijama uBlockOrigin/uAssets alatu za praćenje problema. Potreban je GitHub račun.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Kako biste izbjegli opterećivanje volontera duplim prijavama, provjerite nije li problem već prijavljen.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Nađi slične prijave", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Adresa web stranice:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Web stranica...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Odaberite unos --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Prikazuje oglase ili ostatke oglasa", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Ima overlaye ili druge smetnje", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Otkriva uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Ima problema u vezi s privatnošću", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Neispravno kada je uBO Lite omogućen", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Otvara neželjene kartice ili prozore", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Vodi do zloćudnog softvera, krađe identiteta", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Označite web stranicu kao “NSFW” (“Nije sigurno za rad”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Napravi novu prijavu", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index 52df0e5306c14..35bbc6c0ecb63 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Segnala un problema su questo sito web", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Segnala un problema di filtro", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Segnala i problemi di filtraggio con siti web specifici su uBlockOrigin/uAssets issue tracker. Richiede un account GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Per evitare di gravare sui volontari con segnalazioni doppie, verifica che il problema non sia già stato segnalato.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Trova segnalazioni simili", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Indirizzo della pagina web:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "La pagina web...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "Scegli una voce", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Mostra pubblicità o avanzi di pubblicità", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Presenta sovrapposizioni o altri disturbi", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Rileva uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Ha problemi relativi alla privacy", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Malfunzionamenti quando uBO Lite è abilitato", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Apre schede o finestre indesiderate", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Porta a badware, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Contrassegna la pagina web come “NSFW”. (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Crea una nuova segnalazione", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/ja/messages.json b/platform/mv3/extension/_locales/ja/messages.json index eb7a89af2b45c..0bbb9a0e36c06 100644 --- a/platform/mv3/extension/_locales/ja/messages.json +++ b/platform/mv3/extension/_locales/ja/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "このサイト上での問題を報告", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "フィルターの問題を報告する", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "uBlockOrigin/uAssets issue tracker で特定のウェブサイトでのフィルターの問題を報告します。GitHub アカウントが必要です", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "重複した報告によってボランティアに負担をかけないように、問題がすでに報告されていないか確認してください。", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "似た報告を探す", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "ウェブページのアドレス:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "ウェブページ…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- エントリーを選択 --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "広告または消し残りが表示される", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "オーバーレイなど邪魔なものがある", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "uBO Lite が検出される", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "プライバシーに関連する問題がある", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "uBO Lite 有効時に機能しなくなる", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "勝手にタブやウィンドウが開く", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "悪質ソフトやフィッシングへの誘導", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "ウェブページを “NSFW” (“Not Safe For Work”) としてラベル付け", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "新しい報告を作成", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/nl/messages.json b/platform/mv3/extension/_locales/nl/messages.json index 1044db20c2840..07f45e9c4b0bb 100644 --- a/platform/mv3/extension/_locales/nl/messages.json +++ b/platform/mv3/extension/_locales/nl/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Een probleem op deze website melden", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Een filterprobleem melden", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Meld filterproblemen met specifieke websites in de uBlockOrigin/uAssets-probleemtracker. Vereist een GitHub-account.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Controleer of het probleem niet eerder is gemeld om te voorkomen dat vrijwilligers met dubbele meldingen worden belast.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Soortgelijke meldingen zoeken", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Adres van de webpagina:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "De webpagina…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Maak een keuze --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Toont advertenties of restanten", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Heeft overlappingen of andere ongemakken", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Detecteert uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Heeft privacy-gerelateerde problemen", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Werkt niet als uBO Lite is ingeschakeld", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Opent ongewenste tabbladen of vensters", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Leidt tot badware, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "De webpagina labelen als ‘NSFW’ (‘Not Safe For Work’)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Nieuwe melding maken", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/pl/messages.json b/platform/mv3/extension/_locales/pl/messages.json index 6aa14a77ebcaa..5ecb3940621c0 100644 --- a/platform/mv3/extension/_locales/pl/messages.json +++ b/platform/mv3/extension/_locales/pl/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Zgłoś problem z tą stroną", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Zgłoś problem z filtrem", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Zgłoś problemy z filtrami dotyczące konkretnych witryn internetowych do systemu śledzenia problemów uBlockOrigin/uAssets. Wymagane jest konto GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Aby uniknąć obciążania wolontariuszy zduplikowanymi zgłoszeniami, sprawdź, czy problem nie został już zgłoszony.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Znajdź podobne raporty", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Adres strony internetowej:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Strona internetowa…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "— Wybierz pozycję —", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Wyświetla reklamy lub ich pozostałości", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Ma nakładki lub inne niedogodności", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Wykrywa uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Ma problemy związane z prywatnością", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Nieprawidłowe działanie po włączeniu uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Otwiera niepożądane karty lub okna", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Prowadzi do szkodliwego oprogramowania, phishingu", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Oznacz stronę internetową jako „NSFW” („Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Utwórz nowy raport", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index 52757d7a8f719..66f46188de874 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Reportar um problema neste site da web", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Reportar um problema com o filtro", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Reporte problemas dos filtros com sites da web específicos no rastreador de problemas uBlockOrigin/uAssets. Requer uma conta no GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Pra evitar sobrecarregar os voluntários com relatórios duplicados por favor verifique se o problema já não foi reportado.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Achar relatórios similares", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Endereço da página da web:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "A página da web…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "— Escolha uma entrada —", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Mostra os anúncios ou restos de anúncios", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Tem sobreposições ou outros incômodos", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Detecta o uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Tem problemas relacionados a privacidade", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Funciona mal quando o uBO Lite está ativado", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Abre abas ou janelas indesejadas", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Leva a badware, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Rotular a página da web como “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Criar novo relatório", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/ru/messages.json b/platform/mv3/extension/_locales/ru/messages.json index f6074ff68faa6..841b51491bd0b 100644 --- a/platform/mv3/extension/_locales/ru/messages.json +++ b/platform/mv3/extension/_locales/ru/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Сообщить о проблеме на этом сайте", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Сообщить о проблеме в фильтре", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Сообщайте о проблемах с фильтрами на определённых сайтах в трекер ошибок uBlockOrigin/uAssets. Требуется учётная запись в GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Чтобы не нагружать добровольцев повторяющимися сообщениями, убедитесь, что о вашей проблеме ещё не писали.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Найти похожие сообщения", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Адрес веб-страницы:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Веб-страница…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Выбрать тип --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Показывает рекламу или её остатки", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Содержит наложения или прочие помехи", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Определяет uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Содержит проблемы с конфиденциальностью", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Неполадки при работе uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Открываются нежелательные вкладки или окна", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Вредоносное ПО, фишинг", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Пометить эту страницу «небезопасной для просмотра на работе» («NSFW»)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Создать новое сообщение", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/sk/messages.json b/platform/mv3/extension/_locales/sk/messages.json index cceb6c88b6132..3354d50d4de24 100644 --- a/platform/mv3/extension/_locales/sk/messages.json +++ b/platform/mv3/extension/_locales/sk/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Nahlásiť problém na tejto webovej stránke", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Nahlásiť problém s filtrom", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Nahlásenie problémov s filtrom s konkrétnymi webovými stránkami na uBlockOrigin/uAssets issue tracker. Vyžaduje sa GitHub účet.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Aby ste dobrovoľníkov nezaťažovali duplicitnými hláseniami, overte si, či už problém nebol nahlásený.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Vyhľadať podobné hlásenia", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Adresa webovej stránky:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Webová stránka…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Vyberte položku --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Zobrazuje reklamy alebo zvyšky reklám", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Je prekrytá alebo má iné nedostatky", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Detegovaný uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Má problémy súvisiace so súkromím", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Poruchy pri povolenom uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Otvára nechcené karty alebo okná", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Smeruje k badvéru a phishingu", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Označiť webovú stránku ako \"NSFW\" (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Vytvoriť nové hlásenie", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/sv/messages.json b/platform/mv3/extension/_locales/sv/messages.json index 2431f0b9ab750..7ef1749a8cd68 100644 --- a/platform/mv3/extension/_locales/sv/messages.json +++ b/platform/mv3/extension/_locales/sv/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Rapportera ett problem på denna webbplats", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Rapportera ett filterproblem", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Rapportera filterproblem med specifika webbplatser till uBlockOrigin/uAssets problemhanteringssystemet. Kräver ett GitHub-konto.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "För att undvika att belasta volontärer med dubbletter av rapporter, kontrollera att problemet inte redan har rapporterats.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Hitta liknande rapporter", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Hemsidans adress:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Hemsidan...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Välj en post --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Visar annonser eller rester av annonser", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Har överlägg eller andra olägenheter", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Upptäcker uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Har integritetsrelaterade problem", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Fungerar inte när uBO Lite är aktiverad", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Öppnar oönskade flikar eller fönster", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Leder till skadlig programvara, nätfiske", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Märk webbsidan som “NSFW” (“Inte lämplig på jobbet”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Skapa ny rapport", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/tr/messages.json b/platform/mv3/extension/_locales/tr/messages.json index 259d5412259af..175effdcc1ad9 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Bu sitedeki bir sorunu bildir", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Bir filtre sorununu bildir", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Bir sitedeki filtre sorunlarını bildirmek için uBlockOrigin/uAssets issue tracker kullanın. Bir GitHub hesabı gerekir.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Gönüllüleri benzer raporlar ile bezdirmemek için sorunun zaten bildirilip bildirilmediğine bakın.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Benzer raporları bul", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Web sayfasının adresi:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Web sayfası…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Bir girdi seçin --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Reklamlar veya reklam artıkları gösteriyor", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Arayüzde kaplamalar veya diğer sıkıntıları var", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "uBO Lite tespit ediliyor", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Gizlilikle ilgili sorunları var", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "uBO Lite kullanımdayken sayfa bozuluyor ", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "İstenmeyen sekme veya pencereler açıyor", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Kötü niyetli yazılıma yönlendiriyor, oltalama", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Sayfayı “NSFW” (“iş için güvenli değil”) olarak işaretle", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Yeni rapor oluştur", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index f3b1f1a8c9338..b5826bc50029b 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Повідомити про помилку на цьому вебсайті", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -152,7 +152,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Відкриває небажані вкладки або вікна", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { @@ -164,7 +164,7 @@ "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Створити новий звіт", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/zh_TW/messages.json b/platform/mv3/extension/_locales/zh_TW/messages.json index d1e273552b342..d3eec22438c34 100644 --- a/platform/mv3/extension/_locales/zh_TW/messages.json +++ b/platform/mv3/extension/_locales/zh_TW/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "回報此網站的問題", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "回報過濾規則的問題", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "回報至特定網站的過濾器問題至 uBlockOrigin/uAssets 議題追蹤器需要 GitHub 帳號。", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "為免給志願者帶來額外負擔,請先檢查問題有沒有被回報過,避免重複回報。", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "尋找類似報告", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "網址:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "網頁……", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- 挑選一種情況 --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "會顯示廣告或殘留空位", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "含有覆蓋物或其他滋擾物", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "偵測 uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "有隱私權相關問題", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "開啟 uBO Lite 的時候運作不正常", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "會開啟不需要的分頁或視窗", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "導致惡意軟體、網路釣魚", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "將網頁標記為「NSFW」(「工作場所不宜」)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "建立新報告", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/src/_locales/cs/messages.json b/src/_locales/cs/messages.json index 9e28071c50cd1..0ceaf90e5a8e7 100644 --- a/src/_locales/cs/messages.json +++ b/src/_locales/cs/messages.json @@ -928,7 +928,7 @@ "description": "Header of 'Filter issues' section in Support pane" }, "supportS3P1": { - "message": "Hlášení problémů s filtrem u učitých web. stránek do uBlockOrigin/uAssets issue tracker. Vyžaduje účet GitHub.", + "message": "Nahlaste problémy s filtrem u učitých webových stránek do sledovače problémů uBlockOrigin/uAssets. Vyžaduje účet GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS3P2": { @@ -1016,7 +1016,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Označit webovou stránku jako “NSFW” (Není bezpečné pro práci”)", + "message": "Označit webovou stránku jako “NSFW” (“Není bezpečné pro práci”)", "description": "A checkbox to use for NSFW sites" }, "supportRedact": { diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index af7d997b6412e..7290bf620b51a 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -900,11 +900,11 @@ "description": "Text for button which open an external webpage in Support pane" }, "supportReportSpecificButton": { - "message": "Neuen Bericht erstellen", + "message": "Neue Meldung erstellen", "description": "Text for button which open an external webpage in Support pane" }, "supportFindSpecificButton": { - "message": "Ähnliche Berichte suchen", + "message": "Ähnliche Meldungen finden", "description": "A clickable link in the filter issue reporter section" }, "supportS1H": { @@ -988,11 +988,11 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Zeigt Werbung oder Anzeigenreste", + "message": "Zeigt Werbung oder Werbereste", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Enthält Überdeckungen oder andere Belästigungen", + "message": "Hat Überdeckungen oder andere Belästigungen", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { diff --git a/src/_locales/fr/messages.json b/src/_locales/fr/messages.json index 3e6731330100d..70c9d5920929f 100644 --- a/src/_locales/fr/messages.json +++ b/src/_locales/fr/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Conduit à/Redirige vers des logiciels malveillants, du hameçonnage...", + "message": "conduit à/redirige vers des logiciels malveillants, du hameçonnage", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { From 63cf3dc959e0e8324aea7ac46e3d33128d45c2ea Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 29 Sep 2024 12:50:55 -0400 Subject: [PATCH 287/553] 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 69eb03cba6fdd..9b03f94f2941e 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.0", + "version": "1.60.1.1", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b0/uBlock0_1.60.1b0.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b1/uBlock0_1.60.1b1.firefox.signed.xpi" } ] } From 3d6984aeafa3f8115853d29d7fa918b869852ef9 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 29 Sep 2024 17:06:51 -0400 Subject: [PATCH 288/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/fi/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/ru/messages.json | 16 ++++----- .../mv3/extension/_locales/uk/messages.json | 28 +++++++-------- src/_locales/fi/messages.json | 6 ++-- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/platform/mv3/extension/_locales/fi/messages.json b/platform/mv3/extension/_locales/fi/messages.json index 6708ff96fa99c..4db333e85b415 100644 --- a/platform/mv3/extension/_locales/fi/messages.json +++ b/platform/mv3/extension/_locales/fi/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Ilmoita ongelmasta tällä verkkosivustolla", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Ilmoita suodatinongelmasta", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Ilmoita sivustokohtaisista suodatinongelmista uBlockOrigin/uAssets -ongelmaseurantaan. Vaatii GitHub-tilin.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Välttääksesi vapaaehtoisten kuormittamisen ylimääräisillä ilmoituksilla, tarkista ensin onko ongelmasta jo ilmoitettu.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Etsi samankaltaisia ilmoituksia", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Verkkosivun osoite:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Verkkosivu…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Valitse aihe --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Näyttää mainoksia tai niiden jäänteitä", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Sisältää peiteruutuja tai muita ärsykkeitä", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Tunnistaa uBO Liten", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Sisältää tietosuojaan liittyviä ongelmia", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Ei toimi oikein uBO Liten ollessa käytössä", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Avaa ei-toivottuja välilehtiä tai ikkunoita", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Johtaa badwareen ja tietojenkalasteluun", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Luokittele verkkosivu \"NSFW\"-tyyppiseksi (\"Not Safe For Work\", eli ns. työpaikalle sopimattomaksi)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Luo uusi ilmoitus", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/ru/messages.json b/platform/mv3/extension/_locales/ru/messages.json index 841b51491bd0b..e54dcead462a5 100644 --- a/platform/mv3/extension/_locales/ru/messages.json +++ b/platform/mv3/extension/_locales/ru/messages.json @@ -112,11 +112,11 @@ "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "Чтобы не нагружать добровольцев повторяющимися сообщениями, убедитесь, что о вашей проблеме ещё не писали.", + "message": "Чтобы не обременять волонтеров повторяющимися отчетами, пожалуйста, убедитесь, что о данной проблеме еще не сообщали.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Найти похожие сообщения", + "message": "Найти похожие отчеты", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { @@ -128,23 +128,23 @@ "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Выбрать тип --", + "message": "-- Выберите категорию --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Показывает рекламу или её остатки", + "message": "Показывается реклама или ее заполнители", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Содержит наложения или прочие помехи", + "message": "Всплывающие окна или другие помехи", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Определяет uBO Lite", + "message": "Обнаруживается uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Содержит проблемы с конфиденциальностью", + "message": "Проблемы, связанные с приватностью", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { @@ -164,7 +164,7 @@ "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Создать новое сообщение", + "message": "Создать новый отчет", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index b5826bc50029b..eea2c7a415322 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -104,51 +104,51 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Повідомити про ваду фільтра", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Повідомляйте про вади с фільтрами на конкретних сайтах у трекер помилокuBlockOrigin/uAssets. Вимагає обліковий запис GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Щоб не обтяжувати волонтерів повторюваними звітами, переконайтеся, що про проблему ще не повідомлялося.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Знайти подібні звіти", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Адреса вебсторінки:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Вебсторінка...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Указати проблему --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "З'являється реклама або залишки оголошень", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Накладання або інші прикрощі", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Виявляє uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Пов'язані з приватністю проблеми", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Вади коли uBO Lite включено", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { @@ -156,11 +156,11 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Веде до шкідливого ПЗ, фішингу", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Помітити цю сторінку як «Небезпечно для роботи» («NSFW»)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { diff --git a/src/_locales/fi/messages.json b/src/_locales/fi/messages.json index 4d274bc102a57..8d8f045d1531b 100644 --- a/src/_locales/fi/messages.json +++ b/src/_locales/fi/messages.json @@ -928,7 +928,7 @@ "description": "Header of 'Filter issues' section in Support pane" }, "supportS3P1": { - "message": "Ilmoita ongelmista suodatuksessa tietyillä sivustoilla uBlockOrigin/uAssets-ongelmaseurannassa. Vaatii GitHub-tilin.", + "message": "Ilmoita sivustokohtaisista suodatinongelmista uBlockOrigin/uAssets -ongelmaseurantaan. Vaatii GitHub-tilin.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS3P2": { @@ -1004,7 +1004,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Hajoaa, kun uBlock Origin on käytössä", + "message": "Ei toimi oikein uBlock Originin ollessa käytössä", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Johtaa badwareen ja tietojenkalasteluun", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { From 6cac64583059b6abdbc35d310847c5e225e78ef3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 30 Sep 2024 10:16:48 -0400 Subject: [PATCH 289/553] Do not discard `!#else` block for unknown preprocessor tokens Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3393 --- src/js/static-filtering-parser.js | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index db5b2bd132e03..11858c20bda32 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -4430,14 +4430,14 @@ export const utils = (( ) => { const parts = [ 0 ]; let discard = false; - const shouldDiscard = ( ) => stack.some(v => v); + const shouldDiscard = ( ) => stack.some(v => v.known && v.discard); - const begif = (startDiscard, match) => { - if ( discard === false && startDiscard ) { - parts.push(match.index); + const begif = details => { + if ( discard === false && details.known && details.discard ) { + parts.push(details.pos); discard = true; } - stack.push(startDiscard); + stack.push(details); }; const endif = match => { @@ -4455,15 +4455,21 @@ export const utils = (( ) => { switch ( match[1] ) { case 'if': { - const startDiscard = this.evaluateExpr(match[2].trim(), env) === false; - begif(startDiscard, match); + const result = this.evaluateExpr(match[2].trim(), env); + begif({ + known: result !== undefined, + discard: result === false, + pos: match.index, + }); break; } case 'else': { if ( stack.length === 0 ) { break; } - const startDiscard = stack[stack.length-1] === false; + const details = stack[stack.length-1]; endif(match); - begif(startDiscard, match); + details.discard = details.discard === false; + details.pos = match.index; + begif(details); break; } case 'endif': { From 0b02c7ccb6f8f2c1b91bf820746902c3c721e1e3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 1 Oct 2024 12:27:56 -0400 Subject: [PATCH 290/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/ar/messages.json | 28 +++++++-------- .../extension/_locales/br_FR/messages.json | 26 +++++++------- .../mv3/extension/_locales/el/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/es/messages.json | 6 ++-- .../mv3/extension/_locales/et/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/fy/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/gl/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/hu/messages.json | 34 +++++++++---------- 8 files changed, 115 insertions(+), 115 deletions(-) diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index 588e258fd3100..3f051e050e2b0 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -112,59 +112,59 @@ "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "لتجنب تحميل المتطوعين بتقارير مكررة، يرجى التأكد من أن المشكلة لم يتم الإبلاغ عنها بالفعل.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "العثور على تقارير مماثلة", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "عنوان صفحة الويب", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "صفحة الويب...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "— اختر إدخالًا —", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "يظهر الإعلانات أو بقايا الإعلانات", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "يحتوي على تراكبات أو إزعاجات أخرى.", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "يكتشف uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "لديه مشاكل متعلقة بالخصوصية", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "تعطل عند تفعيل uBO Lite.", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "يفتح علامات تبويب أو نوافذ غير مرغوب فيها.", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "يؤدي إلى البرامج الضارة والإحتيال", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "تصنيف صفحة الويب على أنها \"NSFW\" (\"غير آمنة للعمل\")", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "إنشاء تقرير جديد", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index 3b179eaf1dca6..8bea1bb7cd344 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Danevelliñ ur gudenn war al lec'hienn-mañ", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,7 +104,7 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Danevelliñ ur gudenn gant ur sil", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { @@ -116,43 +116,43 @@ "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Klask danevelloù koulz ha homañ", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Chomlec'h ar bajenn web:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Ar bajenn web-mañ…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Dibab ur seurt --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Diskouez a ra bruderezh pe restachoù bruderezh", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Gwiskadoù pe saotradurioù all en deus", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Diguzhat a ra uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Kudennoù a-fed prevezded he deus", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Ne ya ket mat en-dro p'eo enaouet uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Digeriñ a ra ivinelloù pe prenestroù noazus", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { @@ -164,7 +164,7 @@ "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Sevel ur rentañ-kont nevez", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index e5e8f663b7889..7020c8b4c1e5c 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Αναφορά ενός ζητήματος σε αυτόν τον ιστότοπο", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Αναφορά ζητήματος φίλτρου", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Αναφέρετε ζητήματα φίλτρου για συγκεκριμένους ιστοτόπους στο εργαλείο παρακολούθησης ζητημάτων του uBlockOrigin/uAssets. Απαιτείται λογαριασμός GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Για να αποφύγετε την επιβάρυνση των εθελοντών με διπλές αναφορές, βεβαιωθείτε ότι το ζήτημα δεν έχει ήδη αναφερθεί.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Βρείτε παρόμοιες αναφορές", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Διεύθυνση ιστοσελίδας:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Η ιστοσελίδα…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Επιλέξτε μια καταχώρηση --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Εμφανίζει διαφημίσεις ή υπολείμματα διαφημίσεων", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Έχει επικαλύψεις ή άλλες ενοχλήσεις", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Ανιχνεύει το uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Έχει ζητήματα σχετικά με το απόρρητο", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Δυσλειτουργεί όταν είναι ενεργό το uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Ανοίγει ανεπιθύμητες καρτέλες ή παράθυρα", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Οδηγεί σε κακόβουλο λογισμικό, ηλεκτρονικό «ψάρεμα»", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Επισήμανση ιστοσελίδας ως «NSFW» («Not Safe For Work»)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Δημιουργία νέας αναφοράς", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index f7cfe51e61631..323bb1520a827 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Reportar un problema en este sitio web", + "message": "Informar de un problema en este sitio web", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,7 +104,7 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Reportar un problema de filtro", + "message": "Informar de un problema de filtro", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { @@ -164,7 +164,7 @@ "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Crear nuevo reporte", + "message": "Crear informe nuevo", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/et/messages.json b/platform/mv3/extension/_locales/et/messages.json index 62d13ed6cf447..ae248a7b0fc5f 100644 --- a/platform/mv3/extension/_locales/et/messages.json +++ b/platform/mv3/extension/_locales/et/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Teavita veast selle veebilehega", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Teavita filtri veast", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Teavita vigasest filtrist kindlate veebilehtedega uBlockOrigin/uAssets vigade andmebaasi kaudu. Nõuab GitHubi kontot.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Vabatahtlike koormamise vältimiseks samade teadetega veenduge, et keegi pole selle murega juba varem pöördunud.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Leidke sarnased aruanded", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Veebilehe aadress:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Veebileht...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Valige --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Näitab reklaame või reklaami kohatäitjaid", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Omab ülekatteid või teisi nuhtlusi", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Tuvastab uBO Lite'i", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Omab privaatsusega seonduvaid probleeme", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Streigib, kui uBO Lite on kasutusel", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Avab soovimatuid kaarte või aknaid", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Põhjustab pahavara, õngitsuskirju", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Märgi veebileht kui „NSFW” („Ohtlik”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Loo uus aruanne", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/fy/messages.json b/platform/mv3/extension/_locales/fy/messages.json index d74cc92db8a0e..ac1895fd5da09 100644 --- a/platform/mv3/extension/_locales/fy/messages.json +++ b/platform/mv3/extension/_locales/fy/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "In probleem op dizze website melde", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "In filterprobleem melde", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Meld filterproblemen mei spesifike websites yn de uBlockOrigin/uAssets-probleemtracker. Fereasket in GitHub-account.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Kontrolearje oft it probleem net earder meld is om foar te kommen dat frijwilligers mei dûbele meldingen belêst wurde.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Soartgelikense meldingen sykje", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Adres fan de webside:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "De webside…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Meitsje in kar --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Toant advertinsjes of restanten", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Hat oerlapingen of oare ûngemakken", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Detektearret uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Hat privacy-relatearre problemen", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Wurket net as uBO Lite ynskeakele is", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Iepenet net-winske ljepblêden of finsters", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Liedt ta badware, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "De webside labelje as ‘NSFW’ (‘Not Safe For Work’)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Nije melding meitsje", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/gl/messages.json b/platform/mv3/extension/_locales/gl/messages.json index dc87e7591e00f..59833de63f371 100644 --- a/platform/mv3/extension/_locales/gl/messages.json +++ b/platform/mv3/extension/_locales/gl/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Informar dun problema nesta web", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Informar dun problema co filtro", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Informa de problemas cos filtros en webs concretas no seguimento de problemas en uBlockOrigin/uAssets. Require unha conta GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Para evitar a sobrecarga de traballo para as persoas voluntarias con duplicados dos problemas, comproba que aínda non se informou acerca do problema.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Atopar denuncias parecidas", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Enderezo da páxina web:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "A páxina web...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Escolle unha opción --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Mostra publicidade ou restos dela", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Ten capas sobreimpostas ou elementos molestos", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Detecta uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Ten problemas relacionados coa privacidade", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Funciona mal se uBO Lite está activado", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Abre xanelas ou pestanas non solicitadas", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Leva a software malicioso, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Etiqueta a páxina como «NSFW» (Non axeitada no traballo)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Crear nova denuncia", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index 53e7c2c672253..987469483ed27 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Oldalon lévő probléma jelentése", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Szűrőhiba jelentése", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Az adott webhelyeket érintő szűrőhibákat a uBlockOrigin/uAssets hibakövetőjében jelentse. Ehhez GitHub-fiók szükséges.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Az önkéntesek terhelésének csökkentése érdekében győződjön meg róla, hogy a hiba még nem lett jelentve.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Hasonló jelentések keresése", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "A weboldal címe:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "A weboldal…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Válasszon egy bejegyzést --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Hirdetéseket vagy azok maradványait jeleníti meg", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Átfedő vagy egyéb zavaró elemeket tartalmaz", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Észleli az uBO Lite-ot", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Adatvédelmi problémákat vet fel", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Hibásan működik, ha a uBO Lite be van kapcsolva", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Kéretlen lapokat vagy ablakokat nyit meg", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Kártékony programokhoz, adathalászathoz vezet", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "A weboldal megjelölése „NSFW”-ként („Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Új jelentés létrehozása", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { From 73ce4e6bcf557254d7dd230f7635cbd9098a7a9c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 2 Oct 2024 13:39:36 -0400 Subject: [PATCH 291/553] Blocking large media elements also prevents autoplay, regardless of size Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3394 When the "No large media elements" per-site switch is toggled on, it will also act to prevent autoplay of video/audio media, regardless of their size. This also works for xhr-based media streaming. If blocking by size is not desirable while blocking autoplay is desired, one can toggle on "No large media elements" switch while setting "Block media elements larger than ..." to a very high value. --- platform/chromium/vapi-background-ext.js | 70 +++++---------- platform/common/vapi-background.js | 8 ++ platform/firefox/vapi-background-ext.js | 15 ++-- src/js/pagestore.js | 51 +++++------ .../load-large-media-interactive.js | 85 +++++++++++-------- src/js/traffic.js | 42 ++++++--- 6 files changed, 139 insertions(+), 132 deletions(-) diff --git a/platform/chromium/vapi-background-ext.js b/platform/chromium/vapi-background-ext.js index 29de305846647..9ee69d8199ae5 100644 --- a/platform/chromium/vapi-background-ext.js +++ b/platform/chromium/vapi-background-ext.js @@ -19,10 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -/* globals browser */ - -'use strict'; - /******************************************************************************/ // https://github.com/uBlockOrigin/uBlock-issues/issues/1659 @@ -90,71 +86,47 @@ vAPI.Tabs = class extends vAPI.Tabs { ['gif','image'],['ico','image'],['jpeg','image'],['jpg','image'],['png','image'],['webp','image'] ]); - const headerValue = (headers, name) => { - let i = headers.length; - while ( i-- ) { - if ( headers[i].name.toLowerCase() === name ) { - return headers[i].value.trim(); - } - } - return ''; - }; - const parsedURL = new URL('https://www.example.org/'); - // Extend base class to normalize as per platform. + // Extend base class to normalize as per platform vAPI.Net = class extends vAPI.Net { normalizeDetails(details) { // Chromium 63+ supports the `initiator` property, which contains - // the URL of the origin from which the network request was made. - if ( - typeof details.initiator === 'string' && - details.initiator !== 'null' - ) { + // the URL of the origin from which the network request was made + if ( details.initiator && details.initiator !== 'null' ) { details.documentUrl = details.initiator; } - - let type = details.type; - + const type = details.type; if ( type === 'imageset' ) { details.type = 'image'; return; } - - // The rest of the function code is to normalize type if ( type !== 'other' ) { return; } - - // Try to map known "extension" part of URL to request type. - parsedURL.href = details.url; - const path = parsedURL.pathname, - pos = path.indexOf('.', path.length - 6); - if ( pos !== -1 && (type = extToTypeMap.get(path.slice(pos + 1))) ) { - details.type = type; + // Try to map known "extension" part of URL to request type + if ( details.responseHeaders === undefined ) { + parsedURL.href = details.url; + const path = parsedURL.pathname; + const pos = path.indexOf('.', path.length - 6); + if ( pos !== -1 ) { + details.type = extToTypeMap.get(path.slice(pos + 1)) || type; + } return; } - - // Try to extract type from response headers if present. - if ( details.responseHeaders ) { - type = headerValue(details.responseHeaders, 'content-type'); - if ( type.startsWith('font/') ) { - details.type = 'font'; - return; - } - if ( type.startsWith('image/') ) { - details.type = 'image'; - return; - } - if ( type.startsWith('audio/') || type.startsWith('video/') ) { - details.type = 'media'; - return; - } + // Try to extract type from response headers + const ctype = this.headerValue(details.responseHeaders, 'content-type'); + if ( ctype.startsWith('font/') ) { + details.type = 'font'; + } else if ( ctype.startsWith('image/') ) { + details.type = 'image'; + } else if ( ctype.startsWith('audio/') || ctype.startsWith('video/') ) { + details.type = 'media'; } } // https://www.reddit.com/r/uBlockOrigin/comments/9vcrk3/ // Some types can be mapped from 'other', thus include 'other' if and - // only if the caller is interested in at least one of those types. + // only if the caller is interested in at least one of those types denormalizeTypes(types) { if ( types.length === 0 ) { return Array.from(this.validTypes); diff --git a/platform/common/vapi-background.js b/platform/common/vapi-background.js index 26507982a51e9..fac5121c00082 100644 --- a/platform/common/vapi-background.js +++ b/platform/common/vapi-background.js @@ -1382,6 +1382,14 @@ vAPI.Net = class { if ( this.suspendDepth !== 0 ) { return; } this.unsuspendAllRequests(discard); } + headerValue(headers, name) { + for ( const header of headers ) { + if ( header.name.toLowerCase() === name ) { + return header.value.trim(); + } + } + return ''; + } static canSuspend() { return false; } diff --git a/platform/firefox/vapi-background-ext.js b/platform/firefox/vapi-background-ext.js index 73a914d0ce650..a6032066d9258 100644 --- a/platform/firefox/vapi-background-ext.js +++ b/platform/firefox/vapi-background-ext.js @@ -110,18 +110,15 @@ vAPI.Net = class extends vAPI.Net { details.type = 'image'; return; } + if ( type !== 'object' ) { return; } + // Try to extract type from response headers if present. + if ( details.responseHeaders === undefined ) { return; } + const ctype = this.headerValue(details.responseHeaders, 'content-type'); // https://github.com/uBlockOrigin/uBlock-issues/issues/345 // Re-categorize an embedded object as a `sub_frame` if its // content type is that of a HTML document. - if ( type === 'object' && Array.isArray(details.responseHeaders) ) { - for ( const header of details.responseHeaders ) { - if ( header.name.toLowerCase() === 'content-type' ) { - if ( header.value.startsWith('text/html') ) { - details.type = 'sub_frame'; - } - break; - } - } + if ( ctype === 'text/html' ) { + details.type = 'sub_frame'; } } diff --git a/src/js/pagestore.js b/src/js/pagestore.js index 319367fe51b0d..1b94b1fef6d95 100644 --- a/src/js/pagestore.js +++ b/src/js/pagestore.js @@ -1019,48 +1019,51 @@ const PageStore = class { } // The caller is responsible to check whether filtering is enabled or not. - filterLargeMediaElement(fctxt, size) { + filterLargeMediaElement(fctxt, headers) { fctxt.filter = undefined; - - if ( this.allowLargeMediaElementsUntil === 0 ) { + if ( this.allowLargeMediaElementsUntil === 0 ) { return 0; } + if ( sessionSwitches.evaluateZ('no-large-media', fctxt.getTabHostname() ) !== true ) { + this.allowLargeMediaElementsUntil = 0; return 0; } - // Disregard large media elements previously allowed: for example, to - // seek inside a previously allowed audio/video. - if ( - this.allowLargeMediaElementsRegex instanceof RegExp && - this.allowLargeMediaElementsRegex.test(fctxt.url) - ) { + // XHR-based streaming is never blocked but we want to prevent autoplay + if ( fctxt.itype === fctxt.XMLHTTPREQUEST ) { + const ctype = headers.contentType; + if ( ctype.startsWith('audio/') || ctype.startsWith('video/') ) { + this.largeMediaTimer.on(500); + } return 0; } if ( Date.now() < this.allowLargeMediaElementsUntil ) { - const sources = this.allowLargeMediaElementsRegex instanceof RegExp - ? [ this.allowLargeMediaElementsRegex.source ] - : []; - sources.push('^' + µb.escapeRegex(fctxt.url)); - this.allowLargeMediaElementsRegex = new RegExp(sources.join('|')); + if ( fctxt.itype === fctxt.MEDIA ) { + const sources = this.allowLargeMediaElementsRegex instanceof RegExp + ? [ this.allowLargeMediaElementsRegex.source ] + : []; + sources.push('^' + µb.escapeRegex(fctxt.url)); + this.allowLargeMediaElementsRegex = new RegExp(sources.join('|')); + } return 0; } + // Disregard large media elements previously allowed: for example, to + // seek inside a previously allowed audio/video. if ( - sessionSwitches.evaluateZ( - 'no-large-media', - fctxt.getTabHostname() - ) !== true + this.allowLargeMediaElementsRegex instanceof RegExp && + this.allowLargeMediaElementsRegex.test(fctxt.url) ) { - this.allowLargeMediaElementsUntil = 0; return 0; } - if ( (size >>> 10) < µb.userSettings.largeMediaSize ) { - return 0; + // Regardless of whether a media is blocked, we want to prevent autoplay + if ( fctxt.itype === fctxt.MEDIA ) { + this.largeMediaTimer.on(500); } - + const size = headers.contentLength; + if ( isNaN(size) ) { return 0; } + if ( (size >>> 10) < µb.userSettings.largeMediaSize ) { return 0; } this.largeMediaCount += 1; this.largeMediaTimer.on(500); - if ( logger.enabled ) { fctxt.filter = sessionSwitches.toLogData(); } - return 1; } diff --git a/src/js/scriptlets/load-large-media-interactive.js b/src/js/scriptlets/load-large-media-interactive.js index 4887616d9b0f9..6158124726c70 100644 --- a/src/js/scriptlets/load-large-media-interactive.js +++ b/src/js/scriptlets/load-large-media-interactive.js @@ -28,8 +28,6 @@ if ( typeof vAPI !== 'object' || vAPI.loadAllLargeMedia instanceof Function ) { return; } -/******************************************************************************/ - const largeMediaElementAttribute = 'data-' + vAPI.sessionId; const largeMediaElementSelector = ':root audio[' + largeMediaElementAttribute + '],\n' + @@ -37,25 +35,19 @@ const largeMediaElementSelector = ':root picture[' + largeMediaElementAttribute + '],\n' + ':root video[' + largeMediaElementAttribute + ']'; -/******************************************************************************/ +const isMediaElement = elem => + (/^(?:audio|img|picture|video)$/.test(elem.localName)); -const isMediaElement = function(elem) { - return /^(?:audio|img|picture|video)$/.test(elem.localName); -}; +const isPlayableMediaElement = elem => + (/^(?:audio|video)$/.test(elem.localName)); /******************************************************************************/ const mediaNotLoaded = function(elem) { switch ( elem.localName ) { case 'audio': - case 'video': { - const src = elem.src || ''; - if ( src.startsWith('blob:') ) { - elem.autoplay = false; - elem.pause(); - } + case 'video': return elem.readyState === 0 || elem.error !== null; - } case 'img': { if ( elem.naturalWidth !== 0 || elem.naturalHeight !== 0 ) { break; @@ -99,29 +91,29 @@ const surveyMissingMediaElements = function() { return largeMediaElementCount; }; -if ( surveyMissingMediaElements() === 0 ) { return; } - -// Insert CSS to highlight blocked media elements. -if ( vAPI.largeMediaElementStyleSheet === undefined ) { - vAPI.largeMediaElementStyleSheet = [ - largeMediaElementSelector + ' {', - 'border: 2px dotted red !important;', - 'box-sizing: border-box !important;', - 'cursor: zoom-in !important;', - 'display: inline-block;', - 'filter: none !important;', - 'font-size: 1rem !important;', - 'min-height: 1em !important;', - 'min-width: 1em !important;', - 'opacity: 1 !important;', - 'outline: none !important;', - 'transform: none !important;', - 'visibility: visible !important;', - 'z-index: 2147483647', - '}', - ].join('\n'); - vAPI.userStylesheet.add(vAPI.largeMediaElementStyleSheet); - vAPI.userStylesheet.apply(); +if ( surveyMissingMediaElements() ) { + // Insert CSS to highlight blocked media elements. + if ( vAPI.largeMediaElementStyleSheet === undefined ) { + vAPI.largeMediaElementStyleSheet = [ + largeMediaElementSelector + ' {', + 'border: 2px dotted red !important;', + 'box-sizing: border-box !important;', + 'cursor: zoom-in !important;', + 'display: inline-block;', + 'filter: none !important;', + 'font-size: 1rem !important;', + 'min-height: 1em !important;', + 'min-width: 1em !important;', + 'opacity: 1 !important;', + 'outline: none !important;', + 'transform: none !important;', + 'visibility: visible !important;', + 'z-index: 2147483647', + '}', + ].join('\n'); + vAPI.userStylesheet.add(vAPI.largeMediaElementStyleSheet); + vAPI.userStylesheet.apply(); + } } /******************************************************************************/ @@ -258,6 +250,27 @@ document.addEventListener('error', onLoadError, true); /******************************************************************************/ +const autoPausedMedia = new WeakMap(); + +for ( const elem of document.querySelectorAll('audio,video') ) { + elem.setAttribute('autoplay', 'false'); +} + +const preventAutoplay = function(ev) { + const elem = ev.target; + if ( isPlayableMediaElement(elem) === false ) { return; } + const currentSrc = elem.getAttribute('src') || ''; + const pausedSrc = autoPausedMedia.get(elem); + if ( pausedSrc === currentSrc ) { return; } + autoPausedMedia.set(elem, currentSrc); + elem.setAttribute('autoplay', 'false'); + elem.pause(); +}; + +document.addEventListener('timeupdate', preventAutoplay, true); + +/******************************************************************************/ + vAPI.loadAllLargeMedia = function() { document.removeEventListener('click', onMouseClick, true); document.removeEventListener('loadeddata', onLoadedData, true); diff --git a/src/js/traffic.js b/src/js/traffic.js index 55538fa7e425e..5de002797671e 100644 --- a/src/js/traffic.js +++ b/src/js/traffic.js @@ -488,7 +488,7 @@ const onHeadersReceived = function(details) { } if ( pageStore.getNetFilteringSwitch(fctxt) === false ) { return; } - if ( fctxt.itype === fctxt.IMAGE || fctxt.itype === fctxt.MEDIA ) { + if ( (fctxt.itype & foilLargeMediaElement.TYPE_BITS) !== 0 ) { const result = foilLargeMediaElement(details, fctxt, pageStore); if ( result !== undefined ) { return result; } } @@ -1124,15 +1124,12 @@ const injectPP = function(fctxt, pageStore, responseHeaders) { const foilLargeMediaElement = function(details, fctxt, pageStore) { if ( details.fromCache === true ) { return; } - let size = 0; - if ( µb.userSettings.largeMediaSize !== 0 ) { - const headers = details.responseHeaders; - const i = headerIndexFromName('content-length', headers); - if ( i === -1 ) { return; } - size = parseInt(headers[i].value, 10) || 0; - } + onDemandHeaders.setHeaders(details.responseHeaders); + + const result = pageStore.filterLargeMediaElement(fctxt, onDemandHeaders); + + onDemandHeaders.reset(); - const result = pageStore.filterLargeMediaElement(fctxt, size); if ( result === 0 ) { return; } if ( logger.enabled ) { @@ -1142,16 +1139,15 @@ const foilLargeMediaElement = function(details, fctxt, pageStore) { return { cancel: true }; }; +foilLargeMediaElement.TYPE_BITS = fc.IMAGE | fc.MEDIA | fc.XMLHTTPREQUEST; + /******************************************************************************/ // Caller must ensure headerName is normalized to lower case. const headerIndexFromName = function(headerName, headers) { - let i = headers.length; - while ( i-- ) { - if ( headers[i].name.toLowerCase() === headerName ) { - return i; - } + for ( let i = 0, n = headers.length; i < n; i++ ) { + if ( headers[i].name.toLowerCase() === headerName ) { return i; } } return -1; }; @@ -1161,6 +1157,24 @@ const headerValueFromName = function(headerName, headers) { return i !== -1 ? headers[i].value : ''; }; +const onDemandHeaders = { + headers: [], + get contentLength() { + const contentLength = headerValueFromName('content-length', this.headers); + if ( contentLength === '' ) { return Number.NaN; } + return parseInt(contentLength, 10) || 0; + }, + get contentType() { + return headerValueFromName('content-type', this.headers); + }, + setHeaders(headers) { + this.headers = headers; + }, + reset() { + this.headers = []; + } +}; + /******************************************************************************/ const strictBlockBypasser = { From 4305bfbdb10f7cccd3fabbff11f0510dce794afb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 2 Oct 2024 14:51:26 -0400 Subject: [PATCH 292/553] Skip dns resolution when requests are proxied through http Related issue: https://github.com/uBlockOrigin/uBlock-issues/discussions/3396 Reference: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/proxy/ProxyInfo#type_2 --- platform/firefox/vapi-background-ext.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/platform/firefox/vapi-background-ext.js b/platform/firefox/vapi-background-ext.js index a6032066d9258..4cf7ec97824aa 100644 --- a/platform/firefox/vapi-background-ext.js +++ b/platform/firefox/vapi-background-ext.js @@ -36,6 +36,8 @@ const isPromise = o => o instanceof Promise; const isResolvedObject = o => o instanceof Object && o instanceof Promise === false; const reIPv4 = /^\d+\.\d+\.\d+\.\d+$/ +const skipDNS = proxyInfo => + proxyInfo?.proxyDNS || proxyInfo?.type?.startsWith('http'); /******************************************************************************/ @@ -102,7 +104,7 @@ vAPI.Net = class extends vAPI.Net { normalizeDetails(details) { // https://github.com/uBlockOrigin/uBlock-issues/issues/3379 - if ( details.proxyInfo?.proxyDNS && details.ip === '0.0.0.0' ) { + if ( skipDNS(details.proxyInfo) && details.ip === '0.0.0.0' ) { details.ip = null; } const type = details.type; @@ -182,8 +184,8 @@ vAPI.Net = class extends vAPI.Net { if ( isResolvedObject(dnsEntry) ) { return this.onAfterDNSResolution(hn, details, dnsEntry); } + if ( skipDNS(details.proxyInfo) ) { return; } if ( this.dnsShouldResolve(hn) === false ) { return; } - if ( details.proxyInfo?.proxyDNS ) { return; } const promise = dnsEntry || this.dnsResolve(hn, details); return promise.then(( ) => this.onAfterDNSResolution(hn, details)); } From 99593f82f4127cb357a251dd1c2d2905f195f60d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 2 Oct 2024 14:58:31 -0400 Subject: [PATCH 293/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 0c424f18d5483..77b51621e1800 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.1 \ No newline at end of file +1.60.1.2 \ No newline at end of file From ce8cc4793c12dccdb953c135d2181829f1e0d30c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 2 Oct 2024 14:58:39 -0400 Subject: [PATCH 294/553] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 913bfed9480f7..54c5126219204 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- [Skip dns resolution when requests are proxied through http](https://github.com/gorhill/uBlock/commit/4305bfbdb1) +- [Blocking large media elements also prevents autoplay, regardless of size](https://github.com/gorhill/uBlock/commit/73ce4e6bcf) - [Add ability to decode base64 in `urlskip=`](https://github.com/gorhill/uBlock/commit/e81e70937f) - [Fix images not properly downloading on click](https://github.com/gorhill/uBlock/commit/aec0bd39e3) From b25d2153afe1854e7252fceaa04ef942f0ac706d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 2 Oct 2024 15:05:42 -0400 Subject: [PATCH 295/553] 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 9b03f94f2941e..c4cc4eca09d3f 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.1", + "version": "1.60.1.2", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b1/uBlock0_1.60.1b1.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b2/uBlock0_1.60.1b2.firefox.signed.xpi" } ] } From bcb31db176883aa377d7619551e39ac7c3235bcd Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 2 Oct 2024 15:11:26 -0400 Subject: [PATCH 296/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54c5126219204..cd68e2beebf33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ - [Skip dns resolution when requests are proxied through http](https://github.com/gorhill/uBlock/commit/4305bfbdb1) - [Blocking large media elements also prevents autoplay, regardless of size](https://github.com/gorhill/uBlock/commit/73ce4e6bcf) +- [Do not discard `!#else` block for unknown preprocessor tokens](https://github.com/gorhill/uBlock/commit/6cac645830) - [Add ability to decode base64 in `urlskip=`](https://github.com/gorhill/uBlock/commit/e81e70937f) - [Fix images not properly downloading on click](https://github.com/gorhill/uBlock/commit/aec0bd39e3) From fe49ced2ac937a8556a19cb61f4c2cb05ab3c54c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 3 Oct 2024 13:31:52 -0400 Subject: [PATCH 297/553] Imrpove `prevent-xhr` scriptlet; add `trusted-prevent-xhr` scriptlet Add support for synchronous `send()` calls. `trusted-prevent-xhr` is essentially the same as `prevent-xhr` except that if the `directive` argument is not a known token, it will be used as is as the response text of the xhr request, whereas `prevent-xhr` returns an empty string when the directive is unknown. --- assets/resources/scriptlets.js | 432 ++++++++++++++++++--------------- 1 file changed, 236 insertions(+), 196 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 74e873974d739..895159baacd01 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -321,6 +321,9 @@ function runAtHtmlElementFn(fn) { // Reference: // https://github.com/AdguardTeam/Scriptlets/blob/master/wiki/about-scriptlets.md#prevent-xhr +// +// Added `trusted` argument to allow for returning arbitrary text. Can only +// be used through scriptlets requiring trusted source. builtinScriptlets.push({ name: 'generate-content.fn', @@ -329,7 +332,7 @@ builtinScriptlets.push({ 'safe-self.fn', ], }); -function generateContentFn(directive) { +function generateContentFn(trusted, directive) { const safe = safeSelf(); const randomize = len => { const chunks = []; @@ -343,27 +346,27 @@ function generateContentFn(directive) { return chunks.join(' ').slice(0, len); }; if ( directive === 'true' ) { - return Promise.resolve(randomize(10)); + return randomize(10); } if ( directive === 'emptyObj' ) { - return Promise.resolve('{}'); + return '{}'; } if ( directive === 'emptyArr' ) { - return Promise.resolve('[]'); + return '[]'; } if ( directive === 'emptyStr' ) { - return Promise.resolve(''); + return ''; } if ( directive.startsWith('length:') ) { const match = /^length:(\d+)(?:-(\d+))?$/.exec(directive); - if ( match ) { - const min = parseInt(match[1], 10); - const extent = safe.Math_max(parseInt(match[2], 10) || 0, min) - min; - const len = safe.Math_min(min + extent * safe.Math_random(), 500000); - return Promise.resolve(randomize(len | 0)); - } + if ( match === null ) { return ''; } + const min = parseInt(match[1], 10); + const extent = safe.Math_max(parseInt(match[2], 10) || 0, min) - min; + const len = safe.Math_min(min + extent * safe.Math_random(), 500000); + return randomize(len | 0); } - if ( directive.startsWith('war:') && scriptletGlobals.warOrigin ) { + if ( directive.startsWith('war:') ) { + if ( scriptletGlobals.warOrigin === undefined ) { return ''; } return new Promise(resolve => { const warOrigin = scriptletGlobals.warOrigin; const warName = directive.slice(4); @@ -379,9 +382,12 @@ function generateContentFn(directive) { }; warXHR.open('GET', fullpath.join('')); warXHR.send(); - }); + }).catch(( ) => ''); } - return Promise.resolve(''); + if ( trusted ) { + return directive; + } + return ''; } /******************************************************************************/ @@ -1565,6 +1571,196 @@ function proxyApplyFn( context[prop] = new Proxy(fn, proxyDetails); } +/******************************************************************************/ + +builtinScriptlets.push({ + name: 'prevent-xhr.fn', + fn: preventXhrFn, + dependencies: [ + 'generate-content.fn', + 'match-object-properties.fn', + 'parse-properties-to-match.fn', + 'safe-self.fn', + ], +}); +function preventXhrFn( + trusted = false, + propsToMatch = '', + directive = '' +) { + if ( typeof propsToMatch !== 'string' ) { return; } + const safe = safeSelf(); + const scriptletName = trusted ? 'trusted-prevent-xhr' : 'prevent-xhr'; + const logPrefix = safe.makeLogPrefix(scriptletName, propsToMatch, directive); + const xhrInstances = new WeakMap(); + const propNeedles = parsePropertiesToMatch(propsToMatch, 'url'); + const warOrigin = scriptletGlobals.warOrigin; + const safeDispatchEvent = (xhr, type) => { + try { + xhr.dispatchEvent(new Event(type)); + } catch(_) { + } + }; + const XHRBefore = XMLHttpRequest.prototype; + self.XMLHttpRequest = class extends self.XMLHttpRequest { + open(method, url, defer, ...args) { + xhrInstances.delete(this); + if ( warOrigin !== undefined && url.startsWith(warOrigin) ) { + return super.open(method, url, defer, ...args); + } + const haystack = { method, url }; + if ( propsToMatch === '' && directive === '' ) { + safe.uboLog(logPrefix, `Called: ${safe.JSON_stringify(haystack, null, 2)}`); + return super.open(method, url, defer, ...args); + } + if ( matchObjectProperties(propNeedles, haystack) ) { + const xhrDetails = Object.assign(haystack, { + xhr: this, + defer, + directive, + headers: { + 'date': '', + 'content-type': '', + 'content-length': '', + }, + props: { + response: { value: '' }, + responseText: { value: '' }, + responseXML: { value: null }, + responseURL: { value: haystack.url }, + }, + }); + xhrInstances.set(this, xhrDetails); + } + return super.open(method, url, defer, ...args); + } + send(...args) { + const xhrDetails = xhrInstances.get(this); + if ( xhrDetails === undefined ) { + return super.send(...args); + } + xhrDetails.headers['date'] = (new Date()).toUTCString(); + let xhrText = ''; + switch ( this.responseType ) { + case 'arraybuffer': + xhrDetails.props.response.value = new ArrayBuffer(0); + xhrDetails.headers['content-type'] = 'application/octet-stream'; + break; + case 'blob': + xhrDetails.props.response.value = new Blob([]); + xhrDetails.headers['content-type'] = 'application/octet-stream'; + break; + case 'document': { + const parser = new DOMParser(); + const doc = parser.parseFromString('', 'text/html'); + xhrDetails.props.response.value = doc; + xhrDetails.props.responseXML.value = doc; + xhrDetails.headers['content-type'] = 'text/html'; + break; + } + case 'json': + xhrDetails.props.response.value = {}; + xhrDetails.props.responseText.value = '{}'; + xhrDetails.headers['content-type'] = 'application/json'; + break; + default: { + if ( directive === '' ) { break; } + xhrText = generateContentFn(trusted, xhrDetails.directive); + if ( xhrText instanceof Promise ) { + xhrText = xhrText.then(text => { + xhrDetails.props.response.value = text; + xhrDetails.props.responseText.value = text; + }); + } else { + xhrDetails.props.response.value = xhrText; + xhrDetails.props.responseText.value = xhrText; + } + xhrDetails.headers['content-type'] = 'text/plain'; + break; + } + } + if ( xhrDetails.defer === false ) { + xhrDetails.headers['content-length'] = `${xhrDetails.props.response.value}`.length; + Object.defineProperties(xhrDetails.xhr, { + readyState: { value: 4 }, + status: { value: 200 }, + statusText: { value: 'OK' }, + }); + Object.defineProperties(xhrDetails.xhr, xhrDetails.props); + return; + } + Promise.resolve(xhrText).then(( ) => xhrDetails).then(details => { + Object.defineProperties(details.xhr, { + readyState: { value: 1, configurable: true }, + }); + safeDispatchEvent(details.xhr, 'readystatechange'); + return details; + }).then(details => { + xhrDetails.headers['content-length'] = `${details.props.response.value}`.length; + Object.defineProperties(details.xhr, { + readyState: { value: 2, configurable: true }, + status: { value: 200 }, + statusText: { value: 'OK' }, + }); + safeDispatchEvent(details.xhr, 'readystatechange'); + return details; + }).then(details => { + Object.defineProperties(details.xhr, { + readyState: { value: 3, configurable: true }, + }); + Object.defineProperties(details.xhr, details.props); + safeDispatchEvent(details.xhr, 'readystatechange'); + return details; + }).then(details => { + Object.defineProperties(details.xhr, { + readyState: { value: 4 }, + }); + safeDispatchEvent(details.xhr, 'readystatechange'); + safeDispatchEvent(details.xhr, 'load'); + safeDispatchEvent(details.xhr, 'loadend'); + safe.uboLog(logPrefix, `Prevented with response:\n${details.xhr.response}`); + }); + } + getResponseHeader(headerName) { + const xhrDetails = xhrInstances.get(this); + if ( xhrDetails === undefined || this.readyState < this.HEADERS_RECEIVED ) { + return super.getResponseHeader(headerName); + } + const value = xhrDetails.headers[headerName.toLowerCase()]; + if ( value !== undefined && value !== '' ) { return value; } + return null; + } + getAllResponseHeaders() { + const xhrDetails = xhrInstances.get(this); + if ( xhrDetails === undefined || this.readyState < this.HEADERS_RECEIVED ) { + return super.getAllResponseHeaders(); + } + const out = []; + for ( const [ name, value ] of Object.entries(xhrDetails.headers) ) { + if ( !value ) { continue; } + out.push(`${name}: ${value}`); + } + if ( out.length !== 0 ) { out.push(''); } + return out.join('\r\n'); + } + }; + self.XMLHttpRequest.prototype.open.toString = function() { + return XHRBefore.open.toString(); + }; + self.XMLHttpRequest.prototype.send.toString = function() { + return XHRBefore.send.toString(); + }; + self.XMLHttpRequest.prototype.getResponseHeader.toString = function() { + return XHRBefore.getResponseHeader.toString(); + }; + self.XMLHttpRequest.prototype.getAllResponseHeaders.toString = function() { + return XHRBefore.getAllResponseHeaders.toString(); + }; +} + + + + /******************************************************************************* Injectable scriptlets @@ -2271,7 +2467,7 @@ function noFetchIf( if ( proceed ) { return context.reflect(); } - return generateContentFn(responseBody).then(text => { + return Promise.resolve(generateContentFn(false, responseBody)).then(text => { safe.uboLog(logPrefix, `Prevented with response "${text}"`); const response = new Response(text, { headers: { @@ -2730,192 +2926,17 @@ function webrtcIf( /******************************************************************************/ builtinScriptlets.push({ - name: 'no-xhr-if.js', + name: 'prevent-xhr.js', aliases: [ - 'prevent-xhr.js', + 'no-xhr-if.js', ], - fn: noXhrIf, + fn: preventXhr, dependencies: [ - 'generate-content.fn', - 'match-object-properties.fn', - 'parse-properties-to-match.fn', - 'safe-self.fn', + 'prevent-xhr.fn', ], }); -function noXhrIf( - propsToMatch = '', - directive = '' -) { - if ( typeof propsToMatch !== 'string' ) { return; } - const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('prevent-xhr', propsToMatch, directive); - const xhrInstances = new WeakMap(); - const propNeedles = parsePropertiesToMatch(propsToMatch, 'url'); - const warOrigin = scriptletGlobals.warOrigin; - const headers = { - 'date': '', - 'content-type': '', - 'content-length': '', - }; - const safeDispatchEvent = (xhr, type) => { - try { - xhr.dispatchEvent(new Event(type)); - } catch(_) { - } - }; - const XHRBefore = XMLHttpRequest.prototype; - self.XMLHttpRequest = class extends self.XMLHttpRequest { - open(method, url, ...args) { - xhrInstances.delete(this); - if ( warOrigin !== undefined && url.startsWith(warOrigin) ) { - return super.open(method, url, ...args); - } - const haystack = { method, url }; - if ( propsToMatch === '' && directive === '' ) { - safe.uboLog(logPrefix, `Called: ${safe.JSON_stringify(haystack, null, 2)}`); - return super.open(method, url, ...args); - } - if ( matchObjectProperties(propNeedles, haystack) ) { - xhrInstances.set(this, haystack); - } - haystack.headers = Object.assign({}, headers); - return super.open(method, url, ...args); - } - send(...args) { - const haystack = xhrInstances.get(this); - if ( haystack === undefined ) { - return super.send(...args); - } - haystack.headers['date'] = (new Date()).toUTCString(); - let promise = Promise.resolve({ - xhr: this, - directive, - response: { - response: { value: '' }, - responseText: { value: '' }, - responseXML: { value: null }, - responseURL: { value: haystack.url }, - } - }); - switch ( this.responseType ) { - case 'arraybuffer': - promise = promise.then(details => { - const response = details.response; - response.response.value = new ArrayBuffer(0); - return details; - }); - haystack.headers['content-type'] = 'application/octet-stream'; - break; - case 'blob': - promise = promise.then(details => { - const response = details.response; - response.response.value = new Blob([]); - return details; - }); - haystack.headers['content-type'] = 'application/octet-stream'; - break; - case 'document': { - promise = promise.then(details => { - const parser = new DOMParser(); - const doc = parser.parseFromString('', 'text/html'); - const response = details.response; - response.response.value = doc; - response.responseXML.value = doc; - return details; - }); - haystack.headers['content-type'] = 'text/html'; - break; - } - case 'json': - promise = promise.then(details => { - const response = details.response; - response.response.value = {}; - response.responseText.value = '{}'; - return details; - }); - haystack.headers['content-type'] = 'application/json'; - break; - default: - if ( directive === '' ) { break; } - promise = promise.then(details => { - return generateContentFn(details.directive).then(text => { - const response = details.response; - response.response.value = text; - response.responseText.value = text; - return details; - }); - }); - haystack.headers['content-type'] = 'text/plain'; - break; - } - promise.then(details => { - Object.defineProperties(details.xhr, { - readyState: { value: 1, configurable: true }, - }); - safeDispatchEvent(details.xhr, 'readystatechange'); - return details; - }).then(details => { - const response = details.response; - haystack.headers['content-length'] = `${response.response.value}`.length; - Object.defineProperties(details.xhr, { - readyState: { value: 2, configurable: true }, - status: { value: 200 }, - statusText: { value: 'OK' }, - }); - safeDispatchEvent(details.xhr, 'readystatechange'); - return details; - }).then(details => { - Object.defineProperties(details.xhr, { - readyState: { value: 3, configurable: true }, - }); - Object.defineProperties(details.xhr, details.response); - safeDispatchEvent(details.xhr, 'readystatechange'); - return details; - }).then(details => { - Object.defineProperties(details.xhr, { - readyState: { value: 4 }, - }); - safeDispatchEvent(details.xhr, 'readystatechange'); - safeDispatchEvent(details.xhr, 'load'); - safeDispatchEvent(details.xhr, 'loadend'); - safe.uboLog(logPrefix, `Prevented with response:\n${details.xhr.response}`); - }); - } - getResponseHeader(headerName) { - const haystack = xhrInstances.get(this); - if ( haystack === undefined || this.readyState < this.HEADERS_RECEIVED ) { - return super.getResponseHeader(headerName); - } - const value = haystack.headers[headerName.toLowerCase()]; - if ( value !== undefined && value !== '' ) { return value; } - return null; - } - getAllResponseHeaders() { - const haystack = xhrInstances.get(this); - if ( haystack === undefined || this.readyState < this.HEADERS_RECEIVED ) { - return super.getAllResponseHeaders(); - } - const out = []; - for ( const [ name, value ] of Object.entries(haystack.headers) ) { - if ( !value ) { continue; } - out.push(`${name}: ${value}`); - } - if ( out.length !== 0 ) { out.push(''); } - return out.join('\r\n'); - } - }; - self.XMLHttpRequest.prototype.open.toString = function() { - return XHRBefore.open.toString(); - }; - self.XMLHttpRequest.prototype.send.toString = function() { - return XHRBefore.send.toString(); - }; - self.XMLHttpRequest.prototype.getResponseHeader.toString = function() { - return XHRBefore.getResponseHeader.toString(); - }; - self.XMLHttpRequest.prototype.getAllResponseHeaders.toString = function() { - return XHRBefore.getAllResponseHeaders.toString(); - }; +function preventXhr(...args) { + return preventXhrFn(false, ...args); } /******************************************************************************/ @@ -5103,4 +5124,23 @@ function trustedSuppressNativeMethod( }); } +/******************************************************************************* + * + * Trusted version of prevent-xhr(), which allows the use of an arbitrary + * string as response text. + * + * */ + +builtinScriptlets.push({ + name: 'trusted-prevent-xhr.js', + requiresTrust: true, + fn: trustedPreventXhr, + dependencies: [ + 'prevent-xhr.fn', + ], +}); +function trustedPreventXhr(...args) { + return preventXhrFn(true, ...args); +} + /******************************************************************************/ From f3bc426a57e5aaf9e783c5f4b3897ecb6e7a4085 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 3 Oct 2024 13:42:03 -0400 Subject: [PATCH 298/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd68e2beebf33..493f6ab04347f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `prevent-xhr` scriptlet; add `trusted-prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/fe49ced2ac) - [Skip dns resolution when requests are proxied through http](https://github.com/gorhill/uBlock/commit/4305bfbdb1) - [Blocking large media elements also prevents autoplay, regardless of size](https://github.com/gorhill/uBlock/commit/73ce4e6bcf) - [Do not discard `!#else` block for unknown preprocessor tokens](https://github.com/gorhill/uBlock/commit/6cac645830) From 89a1fd5b0e7dfa778c954627bc83b66fee0f128f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 3 Oct 2024 13:42:24 -0400 Subject: [PATCH 299/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 77b51621e1800..471c6bcf69459 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.2 \ No newline at end of file +1.60.1.3 \ No newline at end of file From 8196b99e9da59a50534eaab75c03d262c9200b4b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 3 Oct 2024 13:51:14 -0400 Subject: [PATCH 300/553] 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 c4cc4eca09d3f..f86d4ec19fff6 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.2", + "version": "1.60.1.3", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b2/uBlock0_1.60.1b2.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b3/uBlock0_1.60.1b3.firefox.signed.xpi" } ] } From 9f4123a4e2f89d817e69129cd01055fd77d9d502 Mon Sep 17 00:00:00 2001 From: "Ilya (Marshal)" Date: Fri, 4 Oct 2024 11:27:24 +0200 Subject: [PATCH 301/553] Fix AdGuard Knowledge Base URLs --- assets/assets.dev.json | 28 ++++++++++++++-------------- assets/assets.json | 28 ++++++++++++++-------------- src/js/static-filtering-parser.js | 2 +- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/assets/assets.dev.json b/assets/assets.dev.json index aa54da8290962..9c7accc0c3fea 100644 --- a/assets/assets.dev.json +++ b/assets/assets.dev.json @@ -137,7 +137,7 @@ "tags": "ads", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/2_without_easylist.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "adguard-mobile": { "content": "filters", @@ -148,7 +148,7 @@ "ua": "mobile", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/11.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "easylist": { "content": "filters", @@ -175,7 +175,7 @@ "tags": "privacy", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/17.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "adguard-spyware": { "content": "filters", @@ -184,7 +184,7 @@ "title": "AdGuard Tracking Protection", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/3.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "block-lan": { "content": "filters", @@ -256,7 +256,7 @@ "tags": "annoyances cookies", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/18.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "ublock-cookies-adguard": { "content": "filters", @@ -325,7 +325,7 @@ "tags": "annoyances social", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/4.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "fanboy-social": { "content": "filters", @@ -368,7 +368,7 @@ "tags": "annoyances", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/19.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "adguard-mobile-app-banners": { "content": "filters", @@ -379,7 +379,7 @@ "tags": "annoyances mobile", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/20.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "adguard-other-annoyances": { "content": "filters", @@ -390,7 +390,7 @@ "tags": "annoyances", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/21.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "adguard-widgets": { "content": "filters", @@ -401,7 +401,7 @@ "tags": "annoyances", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/22.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "easylist-annoyances": { "content": "filters", @@ -717,7 +717,7 @@ "lang": "ja", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/7.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "KOR-1": { "content": "filters", @@ -772,7 +772,7 @@ "lang": "af fy nl", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/8.txt", "cdnURLs": null, - "supportURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "supportURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "NOR-0": { "content": "filters", @@ -858,7 +858,7 @@ "lang": "an ast ca cak es eu gl gn trs pt quz", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/9.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "SVN-0": { "content": "filters", @@ -903,7 +903,7 @@ "lang": "tr", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/13.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "VIE-1": { "content": "filters", diff --git a/assets/assets.json b/assets/assets.json index 8665c36e8a2bc..8b0e79f39cdd5 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -137,7 +137,7 @@ "tags": "ads", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/2_without_easylist.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "adguard-mobile": { "content": "filters", @@ -148,7 +148,7 @@ "ua": "mobile", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/11.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "easylist": { "content": "filters", @@ -175,7 +175,7 @@ "tags": "privacy", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/17.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "adguard-spyware": { "content": "filters", @@ -184,7 +184,7 @@ "title": "AdGuard Tracking Protection", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/3.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "block-lan": { "content": "filters", @@ -256,7 +256,7 @@ "tags": "annoyances cookies", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/18.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "ublock-cookies-adguard": { "content": "filters", @@ -325,7 +325,7 @@ "tags": "annoyances social", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/4.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "fanboy-social": { "content": "filters", @@ -368,7 +368,7 @@ "tags": "annoyances", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/19.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "adguard-mobile-app-banners": { "content": "filters", @@ -379,7 +379,7 @@ "tags": "annoyances mobile", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/20.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "adguard-other-annoyances": { "content": "filters", @@ -390,7 +390,7 @@ "tags": "annoyances", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/21.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "adguard-widgets": { "content": "filters", @@ -401,7 +401,7 @@ "tags": "annoyances", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/22.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "easylist-annoyances": { "content": "filters", @@ -717,7 +717,7 @@ "lang": "ja", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/7.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "KOR-1": { "content": "filters", @@ -772,7 +772,7 @@ "lang": "af fy nl", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/8.txt", "cdnURLs": null, - "supportURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "supportURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "NOR-0": { "content": "filters", @@ -858,7 +858,7 @@ "lang": "an ast ca cak es eu gl gn trs pt quz", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/9.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "SVN-0": { "content": "filters", @@ -903,7 +903,7 @@ "lang": "tr", "contentURL": "https://filters.adtidy.org/extension/ublock/filters/13.txt", "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", - "instructionURL": "https://kb.adguard.com/en/general/adguard-ad-filters" + "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, "VIE-1": { "content": "filters", diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index 11858c20bda32..efbe8d97cfe53 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -4362,7 +4362,7 @@ export const utils = (( ) => { // only ABP. [ 'ext_abp', 'false' ], // Compatibility with other blockers - // https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters#adguard-specific + // https://adguard.com/kb/general/ad-filtering/create-own-filters/#conditions-directive [ 'adguard', 'adguard' ], [ 'adguard_app_android', 'false' ], [ 'adguard_app_ios', 'false' ], From 5133991f7e04ee3ad20dba2c42491c85f10438ea Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Oct 2024 08:57:10 -0400 Subject: [PATCH 302/553] Fix spurious error in content script No guarantee vAPI.bootstrap will still be present when callback executes. --- src/js/scriptlets/should-inject-contentscript.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/js/scriptlets/should-inject-contentscript.js b/src/js/scriptlets/should-inject-contentscript.js index 94d0cd3f1e571..df3378a88fb2c 100644 --- a/src/js/scriptlets/should-inject-contentscript.js +++ b/src/js/scriptlets/should-inject-contentscript.js @@ -19,8 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - // If content scripts are already injected, we need to respond with `false`, // to "should inject content scripts?" // @@ -31,7 +29,7 @@ try { const status = vAPI.uBO !== true; if ( status === false && vAPI.bootstrap ) { - self.requestIdleCallback(( ) => vAPI && vAPI.bootstrap()); + self.requestIdleCallback(( ) => vAPI?.bootstrap()); } return status; } catch(ex) { From 1abc8647425752960f6778fc451bd2a07cb3d3a6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Oct 2024 12:24:35 -0400 Subject: [PATCH 303/553] Add `trusted-prevent-dom-bypass` scriptlet @description Prevent the bypassing of uBO scriptlets through anonymous embedded context. To ensure that a target method in the embedded context is using the corresponding parent context's method (which is assumed to be properly patched), or to replace the embedded context with that of the parent context. Root issue: https://issues.chromium.org/issues/40202434 @param methodPath The method which calls must be intercepted. The arguments of the intercepted calls are assumed to be HTMLElement, anything else will be ignored. @param selector (optional) A plain CSS selector which will be used in a `document.querySelector()` call, to validate that the returned element must be processed by the scriptlet. If no selector is provided, all elements will be processed. @param targetMethod (optional) The method in the embedded context which should be delegated to the parent context. If no method is specified, the embedded context becomes the parent one, i.e. all properties of the embedded context will be that of the parent context. --- assets/resources/scriptlets.js | 75 ++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 895159baacd01..49861db339466 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -5143,4 +5143,79 @@ function trustedPreventXhr(...args) { return preventXhrFn(true, ...args); } +/** + * + * @trustedScriptlet trusted-prevent-dom-bypass + * + * @description + * Prevent the bypassing of uBO scriptlets through anonymous embedded context. + * + * Ensure that a target method in the embedded context is using the + * corresponding parent context's method (which is assumed to be + * properly patched), or to replace the embedded context with that of the + * parent context. + * + * Root issue: + * https://issues.chromium.org/issues/40202434 + * + * @param methodPath + * The method which calls must be intercepted. The arguments + * of the intercepted calls are assumed to be HTMLElement, anything else will + * be ignored. + * + * @param selector (optional) + * A plain CSS selector which will be used in a `document.querySelector()` + * call, to validate that the returned element must be processed by the + * scriptlet. If no selector is provided, all elements will be processed. + * + * @param targetMethod (optional) + * The method in the embedded context which should be delegated to the + * parent context. If no method is specified, the embedded context becomes + * the parent one, i.e. all properties of the embedded context will be that + * of the parent context. + * + * */ + +builtinScriptlets.push({ + name: 'trusted-prevent-dom-bypass.js', + requiresTrust: true, + fn: trustedPreventDomBypass, + dependencies: [ + 'proxy-apply.fn', + 'safe-self.fn', + ], +}); +function trustedPreventDomBypass( + methodPath = '', + selector = '', + targetMethod = '' +) { + if ( methodPath === '' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('trusted-prevent-dom-bypass', methodPath, selector, targetMethod); + proxyApplyFn(methodPath, function(context) { + const elems = context.callArgs.filter(e => e instanceof HTMLElement); + const r = context.reflect(); + if ( elems.length === 0 ) { return r; } + const targetContexts = selector !== '' + ? new Set(document.querySelectorAll(selector)) + : undefined; + for ( const elem of elems ) { + try { + if ( `${elem.contentWindow}` !== '[object Window]' ) { continue; } + if ( elem.contentWindow.location.href !== 'about:blank' ) { continue; } + if ( targetContexts && targetContexts.has(elem) === false ) { continue; } + if ( targetMethod !== '' ) { + elem.contentWindow[targetMethod] = self[targetMethod]; + } else { + Object.defineProperty(elem, 'contentWindow', { value: self }); + } + safe.uboLog(logPrefix, 'Bypass prevented'); + } catch(_) { + } + } + return r; + }); +} + /******************************************************************************/ From 5e2f94bebcf590b0e4751097921ae7af2c6bf204 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Oct 2024 12:27:57 -0400 Subject: [PATCH 304/553] New revision for dev build --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 493f6ab04347f..f07376d8a2c91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add `trusted-prevent-dom-bypass` scriptlet](https://github.com/gorhill/uBlock/commit/1abc864742) - [Improve `prevent-xhr` scriptlet; add `trusted-prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/fe49ced2ac) - [Skip dns resolution when requests are proxied through http](https://github.com/gorhill/uBlock/commit/4305bfbdb1) - [Blocking large media elements also prevents autoplay, regardless of size](https://github.com/gorhill/uBlock/commit/73ce4e6bcf) From fccda96bd7d4902da46d19f6877ebb97c501fe59 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Oct 2024 12:28:25 -0400 Subject: [PATCH 305/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 471c6bcf69459..b83080e7d3331 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.3 \ No newline at end of file +1.60.1.4 \ No newline at end of file From d24ffe6bb8e8c1920a8a92d9731f114f0b7d45fa Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Oct 2024 12:30:37 -0400 Subject: [PATCH 306/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.uk.txt | 6 ++-- .../mv3/extension/_locales/be/messages.json | 36 +++++++++---------- .../mv3/extension/_locales/sq/messages.json | 34 +++++++++--------- .../mv3/extension/_locales/uk/messages.json | 14 ++++---- .../extension/_locales/zh_CN/messages.json | 20 +++++------ src/_locales/be/messages.json | 2 +- 6 files changed, 56 insertions(+), 56 deletions(-) diff --git a/platform/mv3/description/webstore.uk.txt b/platform/mv3/description/webstore.uk.txt index 9fbd578480a61..e6f8a978d37e8 100644 --- a/platform/mv3/description/webstore.uk.txt +++ b/platform/mv3/description/webstore.uk.txt @@ -1,13 +1,13 @@ -uBO Lite (uBOL) - це блокувальник вмісту на основі MV3, що не потребує дозволу. +uBO Lite (uBOL) - це блокувальник вмісту на основі MV3, що не потребує дозволів. -Усталений набір правил відповідає типовому набору фільтрів uBlock Origin: +Набір правил за замовчанням відповідає типовому набору фільтрів uBlock Origin: - Вбудовані списки фільтрів uBlock Origin - EasyList - EasyPrivacy - Список серверів реклами та стеження від Peter Lowe -Ви можете ввімкнути більше наборів правил, перейшовши на сторінку налаштувань — натисніть на піктограму _Шестерень_ на спливній панелі. +Ви можете ввімкнути більше наборів правил, перейшовши на сторінку налаштувань — натисніть на піктограму "Перейти до панелі керування" на спливній панелі. uBOL повністю декларативний, тобто немає необхідності в постійному процесі uBOL для здійснення фільтрації, а фільтрація вмісту на основі CSS/JS-ін'єкцій надійно виконується самим браузером, а не розширенням. Це означає, що сам uBOL не споживає ресурси процесора/пам'яті під час блокування вмісту — службовий робочий процес uBOL потрібен _лише_ під час взаємодії зі спливною панеллю або сторінками опцій. diff --git a/platform/mv3/extension/_locales/be/messages.json b/platform/mv3/extension/_locales/be/messages.json index c25464d019166..ee5a133da0542 100644 --- a/platform/mv3/extension/_locales/be/messages.json +++ b/platform/mv3/extension/_locales/be/messages.json @@ -8,7 +8,7 @@ "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} правілаў, сканвертаваных з {{filterCount}} сеткавых фільтраў", + "message": "{{ruleCount}} правілаў, пераўтвораных з {{filterCount}} сеткавых фільтраў", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Паведаміць пра праблему на гэтым вэб-сайце", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Паведаміць пра праблему з фільтрам", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Паведамляйце пра праблемы з фільтрамі, датычныя канкрэтных вэб-сайтаў, праз трэкер праблемuBlockOrigin/uAssets . Патрэбны ўліковы запіс GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Каб не абцяжарваць добраахвотнікаў дубляванымі справаздачамі, калі ласка, пераканайцеся, што пра гэтую праблему не паведамлялі раней.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Знайсці падобныя справаздачы", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Адрас вэб-старонкі:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Вэб-старонка…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Выберыце тэму --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Паказвае рэкламу або яе астачу", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Мае накладкі або іншыя недарэчнасці", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Выяўляе uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Мае праблемы, датычныя прыватнасці", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Няспраўнасці пры ўключаным uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Адкрывае непажаданыя карткі або вокны", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Вядзе да шкодных праграм, фішынгу", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Пазначыць вэб-старонку як “NSFW” (“небяспечна для працы”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Стварыць новую справаздачу", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index 20be851ec8e12..4bcd36d07283a 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Raportoj problemin me uebsajtin", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Raportoni problemet me filtrat", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Raportoni problemet me filtrat në uebsajt specifikë në uBlockOrigin/uAssets issue tracker. Kërkon një llogari GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Verifikoni a është raportuar më parë problemi që të mos i lodhni vullnetarët e tjerë me të njëjtat gjëra.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Gjej raporte të ngjashme", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Adresa e uebsajtit:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Uebsajti...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Zgjidhni --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Shfaq reklama ose pjesë reklamash", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Ka mbivendosje ose parregullsi të tjera", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Zbulon uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Ka probleme me privatësinë", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Krijon mosfunksionime kur uBO Lite është i aktivizuar", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Hap skeda ose dritare të panevojshme", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Çon në instalimin e programeve keqdashëse, mashtruese", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Etiketoni faqen e internetit si “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Krijoj raport të ri", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index eea2c7a415322..5e5e47e002990 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -108,7 +108,7 @@ "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Повідомляйте про вади с фільтрами на конкретних сайтах у трекер помилокuBlockOrigin/uAssets. Вимагає обліковий запис GitHub.", + "message": "Повідомляйте про вади з фільтрами на конкретних вебсайтах у відстежувач помилок uBlockOrigin/uAssets. Потрібен обліковий запис GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { @@ -148,7 +148,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Вади коли uBO Lite включено", + "message": "Вади коли uBO Lite ввімкнено", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { @@ -160,7 +160,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Помітити цю сторінку як «Небезпечно для роботи» («NSFW»)", + "message": "Позначити цю сторінку «Небезпечною для роботи» («NSFW»)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { @@ -208,15 +208,15 @@ "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Розширена мережева фільтрація плюс специфічна та загальна розширена фільтрація з вибраних списків фільтрів.\n\nПотребує широкого дозволу на читання та зміну даних на всіх сайтах.\n\nЗагальна розширена фільтрація може призвести до збільшення використання ресурсів веб-сторінки.", + "message": "Розширена мережева фільтрація плюс специфічна та загальна розширена фільтрація з вибраних списків фільтрів.\n\nПотребує розширених дозволів на читання та зміну даних на всіх сайтах.\n\nЗагальна розширена фільтрація може призвести до збільшення використання ресурсів вебсторінкою.", "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Список імен хостів, для яких буде відбуватись фільтрування", + "message": "Список імен хостів, для яких не буде застосовуватись фільтрування", "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[тільки імена доменів]\nexample.com\ngames.example\n...", + "message": "[тільки імена хостів]\nexample.com\ngames.example\n...", "description": "Default text for in edit field" }, "behaviorSectionLabel": { @@ -228,7 +228,7 @@ "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { - "message": "Показувати кількість заблокованих запитів на піктограмі на панелі інструментів", + "message": "Показувати кількість заблокованих запитів на піктограмі панелі інструментів", "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 d50e605f35e36..e8b4b31de453e 100644 --- a/platform/mv3/extension/_locales/zh_CN/messages.json +++ b/platform/mv3/extension/_locales/zh_CN/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "反馈该网站上的问题", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -112,19 +112,19 @@ "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "请确认该问题未曾上报,以避免加重志愿者负担。", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "找到相似报告", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "网页地址:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "网页...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { @@ -136,7 +136,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "存在遮盖或类似问题", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { @@ -144,7 +144,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "存在隐私相关问题", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { @@ -152,7 +152,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "打开了不想要的标签页或窗口", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { @@ -164,7 +164,7 @@ "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "创建新报告", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { @@ -216,7 +216,7 @@ "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[hostnames only]\nexample.com\ngames.example\n...", + "message": "[域名]\nexample.com\ngames.example\n...", "description": "Default text for in edit field" }, "behaviorSectionLabel": { diff --git a/src/_locales/be/messages.json b/src/_locales/be/messages.json index 6ae12101583fe..7d66c4d1e1fe3 100644 --- a/src/_locales/be/messages.json +++ b/src/_locales/be/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Вядзе да шкодных праграм, фішынгу", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { From 05ba71aef0b714e1a19d292c456853510da967fa Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 4 Oct 2024 13:30:54 -0400 Subject: [PATCH 307/553] 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 f86d4ec19fff6..ba091f474950a 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.3", + "version": "1.60.1.4", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b3/uBlock0_1.60.1b3.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b4/uBlock0_1.60.1b4.firefox.signed.xpi" } ] } From a0a33eb9b98cdab1e3e3412ed33ce2ad96181f86 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 5 Oct 2024 07:41:44 -0400 Subject: [PATCH 308/553] Code review for new `trusted-prevent-dom-bypass` scriptlet Related commit: https://github.com/gorhill/uBlock/commit/1abc864742 --- assets/resources/scriptlets.js | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 49861db339466..f674c714d4041 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -5163,17 +5163,18 @@ function trustedPreventXhr(...args) { * of the intercepted calls are assumed to be HTMLElement, anything else will * be ignored. * - * @param selector (optional) - * A plain CSS selector which will be used in a `document.querySelector()` - * call, to validate that the returned element must be processed by the - * scriptlet. If no selector is provided, all elements will be processed. - * - * @param targetMethod (optional) + * @param [targetProp] * The method in the embedded context which should be delegated to the * parent context. If no method is specified, the embedded context becomes * the parent one, i.e. all properties of the embedded context will be that * of the parent context. * + * @example + * ##+js(trusted-prevent-dom-bypass, Element.prototype.append, open) + * + * @example + * ##+js(trusted-prevent-dom-bypass, Element.prototype.appendChild, XMLHttpRequest) + * * */ builtinScriptlets.push({ @@ -5187,26 +5188,25 @@ builtinScriptlets.push({ }); function trustedPreventDomBypass( methodPath = '', - selector = '', - targetMethod = '' + targetProp = '' ) { if ( methodPath === '' ) { return; } const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('trusted-prevent-dom-bypass', methodPath, selector, targetMethod); + const logPrefix = safe.makeLogPrefix('trusted-prevent-dom-bypass', methodPath, targetProp); proxyApplyFn(methodPath, function(context) { - const elems = context.callArgs.filter(e => e instanceof HTMLElement); + const elems = new Set(context.callArgs.filter(e => e instanceof HTMLElement)); const r = context.reflect(); if ( elems.length === 0 ) { return r; } - const targetContexts = selector !== '' - ? new Set(document.querySelectorAll(selector)) - : undefined; for ( const elem of elems ) { try { if ( `${elem.contentWindow}` !== '[object Window]' ) { continue; } - if ( elem.contentWindow.location.href !== 'about:blank' ) { continue; } - if ( targetContexts && targetContexts.has(elem) === false ) { continue; } - if ( targetMethod !== '' ) { - elem.contentWindow[targetMethod] = self[targetMethod]; + if ( elem.contentWindow.location.href !== 'about:blank' ) { + if ( elem.contentWindow.location.href !== self.location.href ) { + continue; + } + } + if ( targetProp !== '' ) { + elem.contentWindow[targetProp] = self[targetProp]; } else { Object.defineProperty(elem, 'contentWindow', { value: self }); } From 95b0ce5e3a64d966924dd701d1e336402d586b25 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 5 Oct 2024 08:35:43 -0400 Subject: [PATCH 309/553] Add `trusted-override-element-method` scriptlet @description Override the behavior of a method on matching elements. @param methodPath The method which calls must be intercepted. @param [selector] A CSS selector which the target element must match. If not specified, the override will occur for all elements. @param [disposition] How the override should be handled. If not specified, the overridden call will be equivalent to an empty function. If set to `throw`, an exception will be thrown. Any other value will be validated and returned as a supported safe constant. @example ..##+js(trusted-override-element-method, HTMLAnchorElement.prototype.click, a[target="_blank"][style]) --- assets/resources/scriptlets.js | 64 ++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index f674c714d4041..2b188ebef8216 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -5218,4 +5218,68 @@ function trustedPreventDomBypass( }); } +/** + * + * @trustedScriptlet trusted-override-element-method + * + * @description + * Override the behavior of a method on matching elements. + * + * @param methodPath + * The method which calls must be intercepted. + * + * @param [selector] + * A CSS selector which the target element must match. If not specified, + * the override will occur for all elements. + * + * @param [disposition] + * How the override should be handled. If not specified, the overridden call + * will be equivalent to an empty function. If set to `throw`, an exception + * will be thrown. Any other value will be validated and returned as a + * supported safe constant. + * + * @example + * ##+js(trusted-override-element-method, HTMLAnchorElement.prototype.click, a[target="_blank"][style]) + * + * */ + +builtinScriptlets.push({ + name: 'trusted-override-element-method.js', + requiresTrust: true, + fn: trustedOverrideElementMethod, + dependencies: [ + 'proxy-apply.fn', + 'safe-self.fn', + 'validate-constant.fn', + ], +}); +function trustedOverrideElementMethod( + methodPath = '', + selector = '', + disposition = '' +) { + if ( methodPath === '' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('trusted-override-element-method', methodPath, selector, disposition); + proxyApplyFn(methodPath, function(context) { + let override = selector === ''; + if ( override === false ) { + const { thisArg } = context; + try { + override = thisArg.closest(selector) === thisArg; + } catch(_) { + } + } + if ( override === false ) { + return context.reflect(); + } + safe.uboLog(logPrefix, 'Overridden'); + if ( disposition === '' ) { return; } + if ( disposition === 'throw' ) { + throw new ReferenceError(); + } + return validateConstantFn(false, disposition); + }); +} + /******************************************************************************/ From 3b53d8e5b73e77f85cebf3786c854c6e1bf7501e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 5 Oct 2024 08:43:14 -0400 Subject: [PATCH 310/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f07376d8a2c91..7bb559f6bb64e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add `trusted-override-element-method` scriptlet](https://github.com/gorhill/uBlock/commit/95b0ce5e3a) - [Add `trusted-prevent-dom-bypass` scriptlet](https://github.com/gorhill/uBlock/commit/1abc864742) - [Improve `prevent-xhr` scriptlet; add `trusted-prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/fe49ced2ac) - [Skip dns resolution when requests are proxied through http](https://github.com/gorhill/uBlock/commit/4305bfbdb1) From 41693407b27d517486741ff19c2774cb55fd1319 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 5 Oct 2024 11:32:59 -0400 Subject: [PATCH 311/553] Fix npm test suite Ensure serialization returns copy of data rather than live references to data. This allows to immediately deserialize() the result of serialize(). Also, adjust code to modified behavior of filterQuery(). --- platform/nodejs/index.js | 1 + platform/npm/package-lock.json | 91 +++++++++++++++++++--------------- src/js/biditrie.js | 4 +- src/js/hntrie.js | 4 +- src/js/static-net-filtering.js | 29 +++-------- 5 files changed, 65 insertions(+), 64 deletions(-) diff --git a/platform/nodejs/index.js b/platform/nodejs/index.js index 1d39a7d11292e..7bc808e89941f 100644 --- a/platform/nodejs/index.js +++ b/platform/nodejs/index.js @@ -218,6 +218,7 @@ class StaticNetFilteringEngine { } filterQuery(details) { + fctx.redirectURL = undefined; const directives = snfe.filterQuery(fctx.fromDetails(details)); if ( directives === undefined ) { return; } return { redirectURL: fctx.redirectURL, directives }; diff --git a/platform/npm/package-lock.json b/platform/npm/package-lock.json index b819bb0fddb68..3a1790e27a906 100644 --- a/platform/npm/package-lock.json +++ b/platform/npm/package-lock.json @@ -242,12 +242,15 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/browser-stdout": { @@ -683,12 +686,15 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/find-up": { @@ -892,7 +898,10 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, "node_modules/is-path-inside": { "version": "3.0.3", @@ -1062,15 +1071,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1398,6 +1398,15 @@ "resolved": "git+ssh://git@github.com/mjethani/scaling-palm-tree.git#15cf1ab37e038771e1ff8005edc46d95f176739f", "dev": true }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -1481,6 +1490,9 @@ "dev": true, "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, "node_modules/type-check": { @@ -1537,10 +1549,13 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/workerpool": { "version": "6.2.1", @@ -1818,12 +1833,12 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browser-stdout": { @@ -2202,9 +2217,9 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -2532,14 +2547,6 @@ "dev": true, "requires": { "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "minimatch": { @@ -2808,6 +2815,12 @@ "dev": true, "from": "scaling-palm-tree@github:mjethani/scaling-palm-tree#15cf1ab37e038771e1ff8005edc46d95f176739f" }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, "serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -2935,9 +2948,9 @@ } }, "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true }, "workerpool": { diff --git a/src/js/biditrie.js b/src/js/biditrie.js index 06566d2e1ac98..2fa0495062fc6 100644 --- a/src/js/biditrie.js +++ b/src/js/biditrie.js @@ -582,12 +582,12 @@ class BidiTrieContainer { } toSelfie() { - const buf32 = this.buf32.subarray(0, this.buf32[CHAR1_SLOT] + 3 >>> 2); + const buf32 = this.buf32.slice(0, this.buf32[CHAR1_SLOT] + 3 >>> 2); return { buf32, checksum: i32Checksum(buf32) }; } fromSelfie(selfie) { - if ( selfie instanceof Object === false ) { return false; } + if ( typeof selfie !== 'object' || selfie === null ) { return false; } if ( selfie.buf32 instanceof Uint32Array === false ) { return false; } if ( selfie.checksum !== i32Checksum(selfie.buf32) ) { return false; } const byteLength = selfie.buf32.length << 2; diff --git a/src/js/hntrie.js b/src/js/hntrie.js index 4f89a99642633..5885e6e21175d 100644 --- a/src/js/hntrie.js +++ b/src/js/hntrie.js @@ -452,12 +452,12 @@ class HNTrieContainer { } toSelfie() { - const buf32 = this.buf32.subarray(0, this.buf32[CHAR1_SLOT] + 3 >>> 2); + const buf32 = this.buf32.slice(0, this.buf32[CHAR1_SLOT] + 3 >>> 2); return { buf32, checksum: i32Checksum(buf32) }; } fromSelfie(selfie) { - if ( selfie instanceof Object === false ) { return false; } + if ( typeof selfie !== 'object' || selfie === null ) { return false; } if ( selfie.buf32 instanceof Uint32Array === false ) { return false; } if ( selfie.checksum !== i32Checksum(selfie.buf32) ) { return false; } this.needle = ''; diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index f5b1841752368..ac4b373df616d 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -495,7 +495,7 @@ const filterDataReset = ( ) => { filterDataWritePtr = 2; }; const filterDataToSelfie = ( ) => - filterData.subarray(0, filterDataWritePtr); + filterData.slice(0, filterDataWritePtr); const filterDataFromSelfie = selfie => { if ( selfie instanceof Int32Array === false ) { return false; } @@ -3193,7 +3193,7 @@ const urlTokenizer = new (class { } toSelfie() { - return this.knownTokens; + return this.knownTokens.slice(); } fromSelfie(selfie) { @@ -4779,7 +4779,7 @@ StaticNetFilteringEngine.prototype.toSelfie = function() { processedFilterCount: this.processedFilterCount, acceptedCount: this.acceptedCount, discardedCount: this.discardedCount, - bitsToBucket: this.bitsToBucket, + bitsToBucket: new Map(this.bitsToBucket), urlTokenizer: urlTokenizer.toSelfie(), destHNTrieContainer: destHNTrieContainer.toSelfie(), origHNTrieContainer: origHNTrieContainer.toSelfie(), @@ -4789,20 +4789,13 @@ StaticNetFilteringEngine.prototype.toSelfie = function() { }; }; -StaticNetFilteringEngine.prototype.serialize = async function() { - const selfie = []; - const storage = { - put(name, data) { - selfie.push([ name, data ]); - } - }; - await this.toSelfie(storage, ''); - return JSON.stringify(selfie); +StaticNetFilteringEngine.prototype.serialize = function() { + return this.toSelfie(); }; /******************************************************************************/ -StaticNetFilteringEngine.prototype.fromSelfie = async function(selfie) { +StaticNetFilteringEngine.prototype.fromSelfie = function(selfie) { if ( typeof selfie !== 'object' || selfie === null ) { return; } this.reset(); @@ -4835,14 +4828,8 @@ StaticNetFilteringEngine.prototype.fromSelfie = async function(selfie) { return true; }; -StaticNetFilteringEngine.prototype.unserialize = async function(s) { - const selfie = new Map(JSON.parse(s)); - const storage = { - async get(name) { - return { content: selfie.get(name) }; - } - }; - return this.fromSelfie(storage, ''); +StaticNetFilteringEngine.prototype.unserialize = function(selfie) { + return this.fromSelfie(selfie); }; /******************************************************************************/ From 6d2b3375f863d21751794f2d3745c6705600f7f2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 5 Oct 2024 12:42:30 -0400 Subject: [PATCH 312/553] Mind that BroadcastChannel contructor can throw in Firefox BroadcastChannel constructor throws in Firefox when Enhanced Tracking Protection is set to "strict". This behavior could cause scriptlet injection to wholly break when uBO's logger was opened, as BroadcastChannel() is used by scriptlets to report information to the logger. This commit ensures that exceptions from BroadcastChannel constructor are properly handled. The scriptlets will fall back to report at the console should they be unable to report to the logger through BroadcastChannel. --- assets/resources/scriptlets.js | 67 ++++++++++++++++++++-------------- src/js/scriptlet-filtering.js | 39 +++++++++++--------- 2 files changed, 60 insertions(+), 46 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 2b188ebef8216..788354f920e1c 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -173,13 +173,11 @@ function safeSelf() { scriptletGlobals.safeSelf = safe; if ( scriptletGlobals.bcSecret === undefined ) { return safe; } // This is executed only when the logger is opened - const bc = new self.BroadcastChannel(scriptletGlobals.bcSecret); - let bcBuffer = []; safe.logLevel = scriptletGlobals.logLevel || 1; let lastLogType = ''; let lastLogText = ''; let lastLogTime = 0; - safe.sendToLogger = (type, ...args) => { + safe.toLogText = (type, ...args) => { if ( args.length === 0 ) { return; } const text = `[${document.location.hostname || document.location.href}]${args.join(' ')}`; if ( text === lastLogText && type === lastLogType ) { @@ -188,30 +186,45 @@ function safeSelf() { lastLogType = type; lastLogText = text; lastLogTime = Date.now(); - if ( bcBuffer === undefined ) { - return bc.postMessage({ what: 'messageToLogger', type, text }); - } - bcBuffer.push({ type, text }); - }; - bc.onmessage = ev => { - const msg = ev.data; - switch ( msg ) { - case 'iamready!': - if ( bcBuffer === undefined ) { break; } - bcBuffer.forEach(({ type, text }) => - bc.postMessage({ what: 'messageToLogger', type, text }) - ); - bcBuffer = undefined; - break; - case 'setScriptletLogLevelToOne': - safe.logLevel = 1; - break; - case 'setScriptletLogLevelToTwo': - safe.logLevel = 2; - break; - } + return text; }; - bc.postMessage('areyouready?'); + try { + const bc = new self.BroadcastChannel(scriptletGlobals.bcSecret); + let bcBuffer = []; + safe.sendToLogger = (type, ...args) => { + const text = safe.toLogText(type, ...args); + if ( text === undefined ) { return; } + if ( bcBuffer === undefined ) { + return bc.postMessage({ what: 'messageToLogger', type, text }); + } + bcBuffer.push({ type, text }); + }; + bc.onmessage = ev => { + const msg = ev.data; + switch ( msg ) { + case 'iamready!': + if ( bcBuffer === undefined ) { break; } + bcBuffer.forEach(({ type, text }) => + bc.postMessage({ what: 'messageToLogger', type, text }) + ); + bcBuffer = undefined; + break; + case 'setScriptletLogLevelToOne': + safe.logLevel = 1; + break; + case 'setScriptletLogLevelToTwo': + safe.logLevel = 2; + break; + } + }; + bc.postMessage('areyouready?'); + } catch(_) { + safe.sendToLogger = (type, ...args) => { + const text = safe.toLogText(type, ...args); + if ( text === undefined ) { return; } + console.log(`uBO${text}`); + }; + } return safe; } @@ -5144,7 +5157,6 @@ function trustedPreventXhr(...args) { } /** - * * @trustedScriptlet trusted-prevent-dom-bypass * * @description @@ -5219,7 +5231,6 @@ function trustedPreventDomBypass( } /** - * * @trustedScriptlet trusted-override-element-method * * @description diff --git a/src/js/scriptlet-filtering.js b/src/js/scriptlet-filtering.js index e221a4197c0d0..1cc6a959b3536 100644 --- a/src/js/scriptlet-filtering.js +++ b/src/js/scriptlet-filtering.js @@ -176,25 +176,28 @@ const onScriptletMessageInjector = (( ) => { '(', function(name) { if ( self.uBO_bcSecret ) { return; } - const bcSecret = new self.BroadcastChannel(name); - bcSecret.onmessage = ev => { - const msg = ev.data; - switch ( typeof msg ) { - case 'string': - if ( msg !== 'areyouready?' ) { break; } - bcSecret.postMessage('iamready!'); - break; - case 'object': - if ( self.vAPI && self.vAPI.messaging ) { - self.vAPI.messaging.send('contentscript', msg); - } else { - console.log(`[uBO][${msg.type}]${msg.text}`); + try { + const bcSecret = new self.BroadcastChannel(name); + bcSecret.onmessage = ev => { + const msg = ev.data; + switch ( typeof msg ) { + case 'string': + if ( msg !== 'areyouready?' ) { break; } + bcSecret.postMessage('iamready!'); + break; + case 'object': + if ( self.vAPI && self.vAPI.messaging ) { + self.vAPI.messaging.send('contentscript', msg); + } else { + console.log(`[uBO][${msg.type}]${msg.text}`); + } + break; } - break; - } - }; - bcSecret.postMessage('iamready!'); - self.uBO_bcSecret = bcSecret; + }; + bcSecret.postMessage('iamready!'); + self.uBO_bcSecret = bcSecret; + } catch(_) { + } }.toString(), ')(', 'bcSecret-slot', From 5145747ac78d6e8fda002821be2debaebb028f87 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 5 Oct 2024 13:30:18 -0400 Subject: [PATCH 313/553] Update chengelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bb559f6bb64e..807a49ec6dfac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- [Mind that BroadcastChannel contructor can throw in Firefox](https://github.com/gorhill/uBlock/commit/6d2b3375f8) +- [Fix npm test suite](https://github.com/gorhill/uBlock/commit/41693407b2) - [Add `trusted-override-element-method` scriptlet](https://github.com/gorhill/uBlock/commit/95b0ce5e3a) - [Add `trusted-prevent-dom-bypass` scriptlet](https://github.com/gorhill/uBlock/commit/1abc864742) - [Improve `prevent-xhr` scriptlet; add `trusted-prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/fe49ced2ac) From 73404e59884b49fb4bf63af5c51b034cd6996304 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 5 Oct 2024 13:30:49 -0400 Subject: [PATCH 314/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index b83080e7d3331..eacccbee2b04d 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.4 \ No newline at end of file +1.60.1.5 \ No newline at end of file From 5f2ee6caf85a71a3f819edebac49ed315e08f9e2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 5 Oct 2024 14:00:44 -0400 Subject: [PATCH 315/553] 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 ba091f474950a..63e7097041649 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.4", + "version": "1.60.1.5", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b4/uBlock0_1.60.1b4.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b5/uBlock0_1.60.1b5.firefox.signed.xpi" } ] } From 02cba63331b4ba8f62d72ef7222584d003367e94 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 5 Oct 2024 14:51:38 -0400 Subject: [PATCH 316/553] Partially revert 4169340 --- src/js/biditrie.js | 2 +- src/js/hntrie.js | 2 +- src/js/static-net-filtering.js | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/js/biditrie.js b/src/js/biditrie.js index 2fa0495062fc6..560d5918a2276 100644 --- a/src/js/biditrie.js +++ b/src/js/biditrie.js @@ -582,7 +582,7 @@ class BidiTrieContainer { } toSelfie() { - const buf32 = this.buf32.slice(0, this.buf32[CHAR1_SLOT] + 3 >>> 2); + const buf32 = this.buf32.subarray(0, this.buf32[CHAR1_SLOT] + 3 >>> 2); return { buf32, checksum: i32Checksum(buf32) }; } diff --git a/src/js/hntrie.js b/src/js/hntrie.js index 5885e6e21175d..518d0b8ddb19c 100644 --- a/src/js/hntrie.js +++ b/src/js/hntrie.js @@ -452,7 +452,7 @@ class HNTrieContainer { } toSelfie() { - const buf32 = this.buf32.slice(0, this.buf32[CHAR1_SLOT] + 3 >>> 2); + const buf32 = this.buf32.subarray(0, this.buf32[CHAR1_SLOT] + 3 >>> 2); return { buf32, checksum: i32Checksum(buf32) }; } diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index ac4b373df616d..ec62bb945aea7 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -495,7 +495,7 @@ const filterDataReset = ( ) => { filterDataWritePtr = 2; }; const filterDataToSelfie = ( ) => - filterData.slice(0, filterDataWritePtr); + filterData.subarray(0, filterDataWritePtr); const filterDataFromSelfie = selfie => { if ( selfie instanceof Int32Array === false ) { return false; } @@ -3193,7 +3193,7 @@ const urlTokenizer = new (class { } toSelfie() { - return this.knownTokens.slice(); + return this.knownTokens; } fromSelfie(selfie) { @@ -4779,7 +4779,7 @@ StaticNetFilteringEngine.prototype.toSelfie = function() { processedFilterCount: this.processedFilterCount, acceptedCount: this.acceptedCount, discardedCount: this.discardedCount, - bitsToBucket: new Map(this.bitsToBucket), + bitsToBucket: this.bitsToBucket, urlTokenizer: urlTokenizer.toSelfie(), destHNTrieContainer: destHNTrieContainer.toSelfie(), origHNTrieContainer: origHNTrieContainer.toSelfie(), From 64b2086ba44e986af2f1b052cdbe2b07b3034e1a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 5 Oct 2024 14:59:43 -0400 Subject: [PATCH 317/553] Add ability to lookup parameter name in `urlskip=` Relate case: https://github.com/uBlockOrigin/uBlock-issues/issues/3206#issuecomment-2395121619 Newly supported step: `&i`, meant to lookup a parameter's name at position `i` (1-based). The parameter name will be used as the URL (whereas `?` is meant to lookup a parameter's value). --- src/js/static-filtering-parser.js | 2 +- src/js/static-net-filtering.js | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index efbe8d97cfe53..1249b07b8e35c 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -1531,7 +1531,7 @@ export class AstFilterParser { break; } const value = this.getNetOptionValue(NODE_TYPE_NET_OPTION_NAME_URLSKIP); - if ( value.startsWith('?') === false || value.length < 2 ) { + if ( value.length < 2 ) { this.astError = AST_ERROR_OPTION_BADVALUE; realBad = true; } diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index ec62bb945aea7..1942295732215 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5411,8 +5411,9 @@ function urlSkip(urlin, steps) { try { let urlout; for ( const step of steps ) { + const c0 = step.charCodeAt(0); // Extract from URL parameter - if ( step.startsWith('?') ) { + if ( c0 === 0x3F ) { /* ? */ urlout = (new URL(urlin)).searchParams.get(step.slice(1)); if ( urlout === null ) { return; } if ( urlout.includes(' ') ) { @@ -5421,6 +5422,16 @@ function urlSkip(urlin, steps) { urlin = urlout; continue; } + // Extract from URL parameter name at position i + if ( c0 === 0x26 ) { /* & */ + const i = (parseInt(step.slice(1)) || 0) - 1; + if ( i < 0 ) { return; } + const url = new URL(urlin); + if ( i >= url.searchParams.size ) { return; } + const params = Array.from(url.searchParams.keys()); + urlin = urlout = decodeURIComponent(params[i]); + continue; + } // Enforce https if ( step === '+https' ) { const s = urlin.replace(/^https?:\/\//, ''); From 4c1b1d4cdb3602c92c0f09fd6893cb832506e593 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 5 Oct 2024 16:09:41 -0400 Subject: [PATCH 318/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 807a49ec6dfac..916250a61119e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add ability to lookup parameter name in `urlskip=`](https://github.com/gorhill/uBlock/commit/64b2086ba4) - [Mind that BroadcastChannel contructor can throw in Firefox](https://github.com/gorhill/uBlock/commit/6d2b3375f8) - [Fix npm test suite](https://github.com/gorhill/uBlock/commit/41693407b2) - [Add `trusted-override-element-method` scriptlet](https://github.com/gorhill/uBlock/commit/95b0ce5e3a) From 4775c9cb458b46d90ba0a9ac8c4d9108be7b7127 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 5 Oct 2024 16:10:03 -0400 Subject: [PATCH 319/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index eacccbee2b04d..7b36c924aba8c 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.5 \ No newline at end of file +1.60.1.6 \ No newline at end of file From 1f45902a61175c4206f7fcda499f15380c513339 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 5 Oct 2024 16:21:29 -0400 Subject: [PATCH 320/553] 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 63e7097041649..c303b212de4ee 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.5", + "version": "1.60.1.6", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b5/uBlock0_1.60.1b5.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b6/uBlock0_1.60.1b6.firefox.signed.xpi" } ] } From 160d7f3c33b9880735246b023df12a5f87df08c4 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Oct 2024 11:07:42 -0400 Subject: [PATCH 321/553] Improve `trusted-override-element-method` scriptlet Support `debug` as valid `disposition` value: to trigger a `debugger` statement, but only if uBO's logger is opened. Related feedback: https://github.com/uBlockOrigin/uAssets/issues/25510#issuecomment-2395446342 --- assets/resources/scriptlets.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 788354f920e1c..e35757cfa4d0c 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -222,7 +222,7 @@ function safeSelf() { safe.sendToLogger = (type, ...args) => { const text = safe.toLogText(type, ...args); if ( text === undefined ) { return; } - console.log(`uBO${text}`); + safe.log(`uBO ${text}`); }; } return safe; @@ -5286,6 +5286,9 @@ function trustedOverrideElementMethod( } safe.uboLog(logPrefix, 'Overridden'); if ( disposition === '' ) { return; } + if ( disposition === 'debug' && safe.logLevel !== 0 ) { + debugger; // eslint-disable-line no-debugger + } if ( disposition === 'throw' ) { throw new ReferenceError(); } From 818cb2d801d9a486ee010133a67a824856951ee6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Oct 2024 11:15:08 -0400 Subject: [PATCH 322/553] Fix npm test suite Related commits: - https://github.com/gorhill/uBlock/commit/02cba63331 - https://github.com/gorhill/uBlock/commit/41693407b2 --- .gitignore | 1 + platform/nodejs/.eslintrc.json | 38 +++++++++++++++++++++++++ platform/nodejs/index.js | 51 +++++++++++++++++++++------------- platform/npm/package.json | 2 +- src/js/s14e-serializer.js | 35 ++++++++++++++++++----- tools/make-nodejs.sh | 1 + 6 files changed, 100 insertions(+), 28 deletions(-) create mode 100644 platform/nodejs/.eslintrc.json diff --git a/.gitignore b/.gitignore index 1f064b847d71f..2c0e571513d19 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.bak *.pem __pycache__/ +node_modules/ /dist/build/ /tmp/ diff --git a/platform/nodejs/.eslintrc.json b/platform/nodejs/.eslintrc.json new file mode 100644 index 0000000000000..5f7c6b58c5ccf --- /dev/null +++ b/platform/nodejs/.eslintrc.json @@ -0,0 +1,38 @@ +{ + "root": true, + "env": { + "es2021": true, + "node": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "ecmaVersion": 12, + "sourceType": "module" + }, + "rules": { + "eqeqeq": [ "warn", "always" ], + "indent": [ + "warn", + 4, + { + "ArrayExpression": "first", + "CallExpression": { "arguments": "first" }, + "MemberExpression": "off", + "ObjectExpression": "off", + "ignoreComments": true, + "ignoredNodes": [ + "AssignmentExpression:has(Literal)" + ] + } + ], + "getter-return": "off", + "no-control-regex": "off", + "no-empty": [ "error", { "allowEmptyCatch": true } ], + "no-promise-executor-return": [ "error" ], + "no-template-curly-in-string": [ "error" ], + "no-unreachable-loop": [ "error" ], + "no-useless-backreference": [ "error" ], + "no-useless-escape": "off", + "require-atomic-updates": [ "warn" ] + } +} diff --git a/platform/nodejs/index.js b/platform/nodejs/index.js index 7bc808e89941f..fbc17da859000 100644 --- a/platform/nodejs/index.js +++ b/platform/nodejs/index.js @@ -19,31 +19,40 @@ Home: https://github.com/gorhill/uBlock */ -/* globals WebAssembly */ - -'use strict'; +import * as s14e from './js/s14e-serializer.js'; +import * as sfp from './js/static-filtering-parser.js'; -/******************************************************************************/ +import { + CompiledListReader, + CompiledListWriter, +} from './js/static-filtering-io.js'; +import { + TextDecoder, + TextEncoder, +} from 'util'; +import { + dirname, + resolve +} from 'path'; +import { + domainToASCII, + fileURLToPath +} from 'url'; +import { FilteringContext } from './js/filtering-context.js'; +import { LineIterator } from './js/text-utils.js'; import { createRequire } from 'module'; - +import publicSuffixList from './lib/publicsuffixlist/publicsuffixlist.js'; import { readFileSync } from 'fs'; -import { dirname, resolve } from 'path'; -import { domainToASCII, fileURLToPath } from 'url'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); +import snfe from './js/static-net-filtering.js'; -import publicSuffixList from './lib/publicsuffixlist/publicsuffixlist.js'; +/******************************************************************************/ -import snfe from './js/static-net-filtering.js'; -import { FilteringContext } from './js/filtering-context.js'; -import { LineIterator } from './js/text-utils.js'; -import * as sfp from './js/static-filtering-parser.js'; +const __dirname = dirname(fileURLToPath(import.meta.url)); -import { - CompiledListReader, - CompiledListWriter, -} from './js/static-filtering-io.js'; +// https://stackoverflow.com/questions/69187442/const-utf8encoder-new-textencoder-in-node-js +globalThis.TextDecoder = TextDecoder; +globalThis.TextEncoder = TextEncoder; /******************************************************************************/ @@ -241,11 +250,13 @@ class StaticNetFilteringEngine { } serialize() { - return snfe.serialize(); + const data = snfe.serialize(); + return s14e.serialize(data, { compress: true }); } deserialize(serialized) { - return snfe.unserialize(serialized); + const data = s14e.deserialize(serialized); + return snfe.unserialize(data); } static async create({ noPSL = false } = {}) { diff --git a/platform/npm/package.json b/platform/npm/package.json index a505449e624f6..a65faffd37569 100644 --- a/platform/npm/package.json +++ b/platform/npm/package.json @@ -31,7 +31,7 @@ }, "homepage": "https://github.com/gorhill/uBlock#readme", "engines": { - "node": ">=14.0.0", + "node": ">=18.0.0", "npm": ">=6.14.4" }, "devDependencies": { diff --git a/src/js/s14e-serializer.js b/src/js/s14e-serializer.js index 8ef715a23ac10..98f0d9cc20982 100644 --- a/src/js/s14e-serializer.js +++ b/src/js/s14e-serializer.js @@ -249,8 +249,29 @@ const toArrayBufferViewConstructor = { /******************************************************************************/ -const textDecoder = new TextDecoder(); -const textEncoder = new TextEncoder(); +const textCodec = { + decoder: null, + encoder: null, + decode(...args) { + if ( this.decoder === null ) { + this.decoder = new globalThis.TextDecoder(); + } + return this.decoder.decode(...args); + }, + encode(...args) { + if ( this.encoder === null ) { + this.encoder = new globalThis.TextEncoder(); + } + return this.encoder.encode(...args); + }, + encodeInto(...args) { + if ( this.encoder === null ) { + this.encoder = new globalThis.TextEncoder(); + } + return this.encoder.encodeInto(...args); + }, +}; + const isInteger = Number.isInteger; const writeRefs = new Map(); @@ -269,7 +290,7 @@ const uint8InputFromAsciiStr = s => { if ( uint8Input === null || uint8Input.length < s.length ) { uint8Input = new Uint8Array(s.length + 0x03FF & ~0x03FF); } - textEncoder.encodeInto(s, uint8Input); + textCodec.encodeInto(s, uint8Input); return uint8Input; }; @@ -407,7 +428,7 @@ const denseArrayBufferToStr = (arrbuf, details) => { } } } - return textDecoder.decode(output); + return textCodec.decode(output); }; const BASE88_POW1 = NUMSAFECHARS; @@ -489,7 +510,7 @@ const sparseArrayBufferToStr = (arrbuf, details) => { uint8out[j++] = SEPARATORCHARCODE; } } - return textDecoder.decode(uint8out); + return textCodec.decode(uint8out); }; const sparseArrayBufferFromStr = (sparseStr, arrbuf) => { @@ -1060,7 +1081,7 @@ export const serialize = (data, options = {}) => { writeBuffer.length = 0; if ( shouldCompress(s, options) === false ) { return s; } const lz4Util = new LZ4BlockJS(); - const uint8ArrayBefore = textEncoder.encode(s); + const uint8ArrayBefore = textCodec.encode(s); const uint8ArrayAfter = lz4Util.encode(uint8ArrayBefore, 0); const lz4 = { size: uint8ArrayBefore.length, @@ -1087,7 +1108,7 @@ export const deserialize = s => { readStr = ''; const lz4Util = new LZ4BlockJS(); const uint8ArrayAfter = lz4Util.decode(lz4.data, 0, lz4.size); - s = textDecoder.decode(new Uint8Array(uint8ArrayAfter)); + s = textCodec.decode(new Uint8Array(uint8ArrayAfter)); } if ( s.startsWith(MAGICPREFIX) === false ) { return; } refCounter = 1; diff --git a/tools/make-nodejs.sh b/tools/make-nodejs.sh index 1e38ba1434043..b17a0a4695db0 100755 --- a/tools/make-nodejs.sh +++ b/tools/make-nodejs.sh @@ -14,6 +14,7 @@ cp src/js/filtering-context.js $DES/js cp src/js/hnswitches.js $DES/js cp src/js/hntrie.js $DES/js cp src/js/redirect-resources.js $DES/js +cp src/js/s14e-serializer.js $DES/js cp src/js/static-dnr-filtering.js $DES/js cp src/js/static-filtering-parser.js $DES/js cp src/js/static-net-filtering.js $DES/js From 57004247164df301939b49c928e7a80517c658cc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Oct 2024 12:34:26 -0400 Subject: [PATCH 323/553] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 916250a61119e..1bf594905b03a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ +- [Fix npm test suite](https://github.com/gorhill/uBlock/commit/818cb2d801) - [Add ability to lookup parameter name in `urlskip=`](https://github.com/gorhill/uBlock/commit/64b2086ba4) - [Mind that BroadcastChannel contructor can throw in Firefox](https://github.com/gorhill/uBlock/commit/6d2b3375f8) -- [Fix npm test suite](https://github.com/gorhill/uBlock/commit/41693407b2) - [Add `trusted-override-element-method` scriptlet](https://github.com/gorhill/uBlock/commit/95b0ce5e3a) - [Add `trusted-prevent-dom-bypass` scriptlet](https://github.com/gorhill/uBlock/commit/1abc864742) - [Improve `prevent-xhr` scriptlet; add `trusted-prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/fe49ced2ac) From e0eb59c5d45ba294751f460c99083cfab0348526 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Oct 2024 12:34:58 -0400 Subject: [PATCH 324/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 7b36c924aba8c..894536ebf496a 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.6 \ No newline at end of file +1.60.1.7 \ No newline at end of file From a12bf9405e303507403e68ac72f5b89945a28b83 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Oct 2024 12:40:51 -0400 Subject: [PATCH 325/553] 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 c303b212de4ee..785e9000e8a80 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.6", + "version": "1.60.1.7", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b6/uBlock0_1.60.1b6.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b7/uBlock0_1.60.1b7.firefox.signed.xpi" } ] } From 447476ab9bcf112743277d89e355809967393624 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Oct 2024 14:27:46 -0400 Subject: [PATCH 326/553] New npm package version --- platform/npm/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/npm/package.json b/platform/npm/package.json index a65faffd37569..74625c48e8f26 100644 --- a/platform/npm/package.json +++ b/platform/npm/package.json @@ -1,6 +1,6 @@ { "name": "@gorhill/ubo-core", - "version": "0.1.26", + "version": "0.1.27", "description": "To create a working instance of uBlock Origin's static network filtering engine", "type": "module", "main": "index.js", From c7466336934d7d22378a10c7c9bb5d77a8f7d11b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Oct 2024 14:27:55 -0400 Subject: [PATCH 327/553] Validate result type of XPath expressions Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3403 To ensure XPath expressions not meant to return a nodeset are discarded at compile time. --- src/js/static-filtering-parser.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index 1249b07b8e35c..8f95b88d662a5 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -4116,9 +4116,11 @@ class ExtSelectorCompiler { compileXpathExpression(s) { const r = this.unquoteString(s); if ( r.i !== s.length ) { return; } - if ( globalThis.document instanceof Object === false ) { return r.s; } + const doc = globalThis.document; + if ( doc instanceof Object === false ) { return r.s; } try { - globalThis.document.createExpression(r.s, null); + const expr = doc.createExpression(r.s, null); + expr.evaluate(doc, XPathResult.ANY_UNORDERED_NODE_TYPE); } catch (e) { return; } From cc60dfa4c5d7c191a4439be8ddfa7611456b39e7 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Oct 2024 14:56:47 -0400 Subject: [PATCH 328/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1bf594905b03a..e9acf0bb0c22a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Validate result type of XPath expressions](https://github.com/gorhill/uBlock/commit/c746633693) - [Fix npm test suite](https://github.com/gorhill/uBlock/commit/818cb2d801) - [Add ability to lookup parameter name in `urlskip=`](https://github.com/gorhill/uBlock/commit/64b2086ba4) - [Mind that BroadcastChannel contructor can throw in Firefox](https://github.com/gorhill/uBlock/commit/6d2b3375f8) From 1f32bbc322f9103ba76d10e3bbebc69642bf9dff Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Oct 2024 14:57:07 -0400 Subject: [PATCH 329/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 894536ebf496a..a4692c736eff0 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.7 \ No newline at end of file +1.60.1.8 \ No newline at end of file From ccbf957f5599578117722352ae0ae454f44341e5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Oct 2024 15:06:21 -0400 Subject: [PATCH 330/553] 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 785e9000e8a80..650baa7b55ca7 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.7", + "version": "1.60.1.8", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b7/uBlock0_1.60.1b7.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b8/uBlock0_1.60.1b8.firefox.signed.xpi" } ] } From 9233e6b7c66fa0d518c3a0320665493beb02ad6e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Oct 2024 16:29:42 -0400 Subject: [PATCH 331/553] Fix npm documentation Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3402 --- platform/nodejs/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platform/nodejs/README.md b/platform/nodejs/README.md index 0b3e3d8c074dc..bd5775abb6de4 100644 --- a/platform/nodejs/README.md +++ b/platform/nodejs/README.md @@ -44,7 +44,7 @@ const { StaticNetFilteringEngine } = await import('@gorhill/ubo-core'); Create an instance of SNFE: ```js -const snfe = StaticNetFilteringEngine.create(); +const snfe = await StaticNetFilteringEngine.create(); ``` Feed the SNFE with filter lists -- `useLists()` accepts an array of @@ -54,8 +54,8 @@ through the `raw` property, and optionally the name of the list through the ```js await snfe.useLists([ - fetch('easylist').then(raw => ({ name: 'easylist', raw })), - fetch('easyprivacy').then(raw => ({ name: 'easyprivacy', raw })), + fetch('easylist').then(r => r.text()).then(raw => ({ name: 'easylist', raw })), + fetch('easyprivacy').then(r => r.text()).then(raw => ({ name: 'easyprivacy', raw })), ]); ``` From 86aeae75dfd125f6e4cb7a22521b4badaf54837d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Oct 2024 17:03:18 -0400 Subject: [PATCH 332/553] Further fix npm documentation, minor code review --- platform/nodejs/README.md | 18 ++++++++++++++---- platform/nodejs/index.js | 7 +++---- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/platform/nodejs/README.md b/platform/nodejs/README.md index bd5775abb6de4..db6c5d775475d 100644 --- a/platform/nodejs/README.md +++ b/platform/nodejs/README.md @@ -90,10 +90,20 @@ if ( snfe.matchRequest({ } ``` -It is possible to pre-parse filter lists and save the intermediate results for -later use -- useful to speed up the loading of filter lists. This will be -documented eventually, but if you feel adventurous, you can look at the code -and use this capability now if you figure out the details. +Once all the filter lists are loaded into the static network filtering engine, +you can serialize the content of the engine into a JS string: + +```js +const serializedData = await snfe.serialize(); +``` + +You can save and later use that JS string to fast-load the content of the +static network filtering engine without having to parse and compile the lists: + +```js +const snfe = await StaticNetFilteringEngine.create(); +await snfe.deserialize(serializedData); +``` --- diff --git a/platform/nodejs/index.js b/platform/nodejs/index.js index fbc17da859000..d50fb4e1969d3 100644 --- a/platform/nodejs/index.js +++ b/platform/nodejs/index.js @@ -182,8 +182,7 @@ async function useLists(lists, options = {}) { // Populate filtering engine with resolved filter lists const promises = []; for ( const list of lists ) { - const promise = list instanceof Promise ? list : Promise.resolve(list); - promises.push(promise.then(list => consumeList(list))); + promises.push(Promise.resolve(list).then(list => consumeList(list)); } useLists.promise = Promise.all(promises); @@ -249,12 +248,12 @@ class StaticNetFilteringEngine { return compileList(...args); } - serialize() { + async serialize() { const data = snfe.serialize(); return s14e.serialize(data, { compress: true }); } - deserialize(serialized) { + async deserialize(serialized) { const data = s14e.deserialize(serialized); return snfe.unserialize(data); } From acf7f39a60e7881b55b82440ecb3208573fcb3cc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Oct 2024 17:04:08 -0400 Subject: [PATCH 333/553] New revision for npm package --- platform/npm/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/npm/package.json b/platform/npm/package.json index 74625c48e8f26..308404d2346a2 100644 --- a/platform/npm/package.json +++ b/platform/npm/package.json @@ -1,6 +1,6 @@ { "name": "@gorhill/ubo-core", - "version": "0.1.27", + "version": "0.1.28", "description": "To create a working instance of uBlock Origin's static network filtering engine", "type": "module", "main": "index.js", From 013e6db6ef6ea5f412282c7af697897aeb98b206 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 6 Oct 2024 17:05:44 -0400 Subject: [PATCH 334/553] Fix typo --- platform/nodejs/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/nodejs/index.js b/platform/nodejs/index.js index d50fb4e1969d3..5fad3bec2b818 100644 --- a/platform/nodejs/index.js +++ b/platform/nodejs/index.js @@ -182,7 +182,7 @@ async function useLists(lists, options = {}) { // Populate filtering engine with resolved filter lists const promises = []; for ( const list of lists ) { - promises.push(Promise.resolve(list).then(list => consumeList(list)); + promises.push(Promise.resolve(list).then(list => consumeList(list))); } useLists.promise = Promise.all(promises); From 26c0aa357e887ed524e6092e3d3c65f1849d5d24 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Oct 2024 07:38:41 -0400 Subject: [PATCH 335/553] New npm version --- platform/npm/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/npm/package.json b/platform/npm/package.json index 308404d2346a2..180b297ed1c6d 100644 --- a/platform/npm/package.json +++ b/platform/npm/package.json @@ -1,6 +1,6 @@ { "name": "@gorhill/ubo-core", - "version": "0.1.28", + "version": "0.1.29", "description": "To create a working instance of uBlock Origin's static network filtering engine", "type": "module", "main": "index.js", From 34508a1c2d690f3552b4f8feef739483a7f3ccee Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Oct 2024 08:47:45 -0400 Subject: [PATCH 336/553] Add demo.js to npm build To help people to get quickly started with using the package. --- platform/nodejs/index.js | 1 + platform/npm/demo.js | 120 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 platform/npm/demo.js diff --git a/platform/nodejs/index.js b/platform/nodejs/index.js index 5fad3bec2b818..56aa74f42c67c 100644 --- a/platform/nodejs/index.js +++ b/platform/nodejs/index.js @@ -119,6 +119,7 @@ function pslInit(raw) { /******************************************************************************/ function compileList({ name, raw }, compiler, writer, options = {}) { + if ( typeof raw !== 'string' || raw === '' ) { return; } const lineIter = new LineIterator(raw); const events = Array.isArray(options.events) ? options.events : undefined; diff --git a/platform/npm/demo.js b/platform/npm/demo.js new file mode 100644 index 0000000000000..ebe314b2fdf6d --- /dev/null +++ b/platform/npm/demo.js @@ -0,0 +1,120 @@ +/******************************************************************************* + * + * A simple demo to quickly get started. + * + * Command line: + * + * mkdir myproject + * cd myproject + * npm install @gorhill/ubo-core + * cp node_modules/@gorhill/ubo-core/demo.js . + * + * There will be a `demo.js` file in your `myproject` folder, which you can + * modify and execute: + * + * node demo.js + * + * Since the demo here uses ES module syntax, you may want to add the following + * to the generated package.json file to avoid the warning: + * + * "type": "module", + * + * The demo will fetch filter lists from EasyList server, then serialize the + * content of the static network filtering engine into a local `./cache/` + * folder. + * + * The serialized data will be reused if available in order to avoid fetching + * from remote server each time it is executed. + * + * This demo is kept as simple as possible, so there is not a lot of error + * handling. + * + * */ + +import fs from 'fs/promises'; +import { StaticNetFilteringEngine } from '@gorhill/ubo-core'; + +/******************************************************************************/ + +async function main() { + const pathToSelfie = 'cache/selfie.txt'; + + const snfe = await StaticNetFilteringEngine.create(); + + // Up to date serialization data (aka selfie) available? + let selfie; + const ageInDays = await fs.stat(pathToSelfie).then(stat => { + const fileDate = new Date(stat.mtime); + return (Date.now() - fileDate.getTime()) / (7 * 24 * 60 * 60); + }).catch(( ) => Number.MAX_SAFE_INTEGER); + + // Use a selfie if available and not older than 7 days + if ( ageInDays <= 7 ) { + selfie = await fs.readFile(pathToSelfie, { encoding: 'utf8' }) + .then(data => typeof data === 'string' && data !== '' && data) + .catch(( ) => { }); + if ( typeof selfie === 'string' ) { + await snfe.deserialize(selfie); + } + } + + // Fetch filter lists if no up to date selfie available + if ( !selfie ) { + console.log(`Fetching lists...`); + await snfe.useLists([ + fetch('https://easylist.to/easylist/easylist.txt') + .then(r => { + return r.text(); + }).then(raw => { + console.log(`easylist fetched`); + return { name: 'easylist', raw }; + }).catch(reason => { + console.error(reason); + }), + fetch('https://easylist.to/easylist/easyprivacy.txt') + .then(r => { + return r.text(); + }).then(raw => { + console.log(`easyprivacy fetched`); + return { name: 'easyprivacy', raw }; + }).catch(reason => { + console.error(reason); + }), + ]); + const selfie = await snfe.serialize(); + await fs.mkdir('cache', { recursive: true }); + await fs.writeFile(pathToSelfie, selfie); + } + + // List of tests to perform + const tests = [ + { + originURL: 'https://www.bloomberg.com/', + url: 'https://www.google-analytics.com/gs.js', + type: 'script', + }, { + originURL: 'https://www.bloomberg.com/', + url: 'https://securepubads.g.doubleclick.net/tag/js/gpt.js', + type: 'script', + }, { + originURL: 'https://www.bloomberg.com/', + url: 'https://bloomberg.com/main.css', + type: 'stylesheet', + } + ]; + + // Test each entry for a match against the content of the engine + for ( const test of tests ) { + console.log('\nRequest details:', test); + const r = snfe.matchRequest(test); + if ( r === 1 ) { // Blocked + console.log('Blocked:', snfe.toLogData()); + } else if ( r === 2 ) { // Unblocked + console.log('Unblocked:', snfe.toLogData()); + } else { // Not blocked + console.log('Not blocked'); + } + } +} + +main(); From 9a286495a5ebf9116ff5bbb8ef6d42a5a6384dbf Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Oct 2024 08:49:09 -0400 Subject: [PATCH 337/553] New npm version --- platform/npm/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/npm/package.json b/platform/npm/package.json index 180b297ed1c6d..6430bec8e52c9 100644 --- a/platform/npm/package.json +++ b/platform/npm/package.json @@ -1,6 +1,6 @@ { "name": "@gorhill/ubo-core", - "version": "0.1.29", + "version": "0.1.30", "description": "To create a working instance of uBlock Origin's static network filtering engine", "type": "module", "main": "index.js", From daa62c30812a258c18524ba5d3821958973a338a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Oct 2024 08:56:34 -0400 Subject: [PATCH 338/553] Update README for npm package --- platform/{nodejs => npm}/README.md | 2 ++ tools/make-nodejs.sh | 1 - tools/make-npm.sh | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) rename platform/{nodejs => npm}/README.md (98%) diff --git a/platform/nodejs/README.md b/platform/npm/README.md similarity index 98% rename from platform/nodejs/README.md rename to platform/npm/README.md index db6c5d775475d..a1ce7f42e7004 100644 --- a/platform/nodejs/README.md +++ b/platform/npm/README.md @@ -27,6 +27,8 @@ and also lists of domain names or hosts file format (i.e. block lists from [The ## Usage +See `./demo.js` in package for instructions to quickly get started. + At the moment, there can be only one instance of the static network filtering engine ("SNFE"), which proxy API must be imported as follow: diff --git a/tools/make-nodejs.sh b/tools/make-nodejs.sh index b17a0a4695db0..270456814b9b3 100755 --- a/tools/make-nodejs.sh +++ b/tools/make-nodejs.sh @@ -41,5 +41,4 @@ node -pe "JSON.stringify(Array.from(fs.readFileSync('src/lib/publicsuffixlist/wa > $DES/lib/publicsuffixlist/wasm/publicsuffixlist.wasm.json cp platform/nodejs/*.js $DES/ -cp platform/nodejs/README.md $DES/ cp LICENSE.txt $DES/ diff --git a/tools/make-npm.sh b/tools/make-npm.sh index 6bffadc735646..8a17b0e3c1e51 100755 --- a/tools/make-npm.sh +++ b/tools/make-npm.sh @@ -20,6 +20,7 @@ cp platform/npm/*.json $DES/ cp platform/npm/.*.json $DES/ cp platform/npm/*.js $DES/ cp -R platform/npm/tests $DES/ +cp platform/npm/README.md $DES/ cd $DES cd tests/data From 4aae1bdf474ec1d2df88bd79235a9b91a68c77f1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Oct 2024 11:56:22 -0400 Subject: [PATCH 339/553] Minor code review --- platform/firefox/vapi-background-ext.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/firefox/vapi-background-ext.js b/platform/firefox/vapi-background-ext.js index 4cf7ec97824aa..65420bc3f39cf 100644 --- a/platform/firefox/vapi-background-ext.js +++ b/platform/firefox/vapi-background-ext.js @@ -37,7 +37,7 @@ const isResolvedObject = o => o instanceof Object && o instanceof Promise === false; const reIPv4 = /^\d+\.\d+\.\d+\.\d+$/ const skipDNS = proxyInfo => - proxyInfo?.proxyDNS || proxyInfo?.type?.startsWith('http'); + proxyInfo && (proxyInfo.proxyDNS || proxyInfo.type?.charCodeAt(0) === 0x68 /* h */); /******************************************************************************/ From f825a65f8e8c5e1c54c5b71bd70f8883a0d4cd75 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Oct 2024 12:00:21 -0400 Subject: [PATCH 340/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index a4692c736eff0..2cf4877c51e61 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.8 \ No newline at end of file +1.60.1.9 \ No newline at end of file From a80c749096c7e9c9eb4fa0acdf6091c93078642a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Oct 2024 12:05:41 -0400 Subject: [PATCH 341/553] 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 650baa7b55ca7..4cbf182466d39 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.8", + "version": "1.60.1.9", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b8/uBlock0_1.60.1b8.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b9/uBlock0_1.60.1b9.firefox.signed.xpi" } ] } From ec3852b74598fe9679dc6ea2d366ac355019237b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 7 Oct 2024 15:06:12 -0400 Subject: [PATCH 342/553] Re-word: it's timing per request, not per call to SNFE.match() A single request can require multiple calls to the static network filtering engine (SNFE). The reported timing is the result of going through *all* the required calls to SNFE. In effect, a single call to SNFE.match() is a fraction of the reported timing. --- src/js/benchmarks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/benchmarks.js b/src/js/benchmarks.js index 83cd97c955a7f..c4102469863fb 100644 --- a/src/js/benchmarks.js +++ b/src/js/benchmarks.js @@ -217,7 +217,7 @@ export async function benchmarkStaticNetFiltering(options = {}) { const output = [ 'Benchmarked static network filtering engine:', - `\tEvaluated ${matchCount} match calls in ${dur.toFixed(0)} ms`, + `\tEvaluated ${matchCount} requests in ${dur.toFixed(0)} ms`, `\tAverage: ${(dur / matchCount).toFixed(3)} ms per request`, `\tNot blocked: ${matchCount - blockCount - allowCount}`, `\tBlocked: ${blockCount}`, From 58bfe4c846e1065a56f16b15f7a99f5c3b116167 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 8 Oct 2024 19:19:08 -0400 Subject: [PATCH 343/553] Add support to parse Adguard's `[$domain=/.../]` regex-based modifier The modifier will be converted to one that is compatible with uBO, i.e.: [$domain=/^trgoals\d+\.xyz$/]##+js(set-constant, isShow, true) Will parsed as equivalent of: /^trgoals\d+\.xyz$/##+js(set-constant, isShow, true) Related issue: https://github.com/AdguardTeam/FiltersCompiler/issues/204 Reference: https://adguard.com/kb/general/ad-filtering/create-own-filters/#non-basic-domain-modifier --- src/js/static-filtering-parser.js | 107 ++++++++++++++++++------------ 1 file changed, 66 insertions(+), 41 deletions(-) diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index 8f95b88d662a5..1cc4b5a8db9dd 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -1988,6 +1988,7 @@ export class AstFilterParser { if ( parentEnd === parentBeg ) { return 0; } const s = this.getNodeString(parent); const optionsEnd = s.length; + const parseDetails = { node: 0, len: 0 }; const head = this.allocHeadNode(); let prev = head, next = 0; let optionBeg = 0, optionEnd = 0; @@ -1997,11 +1998,11 @@ export class AstFilterParser { parentBeg + optionBeg, parentBeg + optionsEnd // open ended ); - const { node: down, len: optionLen } = this.parseNetOption(next); + this.parseNetOption(next, parseDetails); // set next's end to down's end - optionEnd += optionLen; + optionEnd += parseDetails.len; this.nodes[next+NODE_END_INDEX] = parentBeg + optionEnd; - this.linkDown(next, down); + this.linkDown(next, parseDetails.node); prev = this.linkRight(prev, next); if ( optionEnd === optionsEnd ) { break; } optionBeg = optionEnd + 1; @@ -2010,7 +2011,7 @@ export class AstFilterParser { parentBeg + optionEnd, parentBeg + optionBeg ); - if ( optionLen === 0 || optionBeg === optionsEnd ) { + if ( parseDetails.len === 0 || optionBeg === optionsEnd ) { this.addNodeFlags(next, NODE_FLAG_ERROR); this.addFlags(AST_FLAG_HAS_ERROR); } @@ -2023,7 +2024,7 @@ export class AstFilterParser { return this.throwHeadNode(head); } - parseNetOption(parent) { + parseNetOption(parent, parseDetails) { const parentBeg = this.nodes[parent+NODE_BEG_INDEX]; const s = this.getNodeString(parent); const match = this.reNetOption.exec(s) || []; @@ -2031,7 +2032,9 @@ export class AstFilterParser { this.addNodeFlags(parent, NODE_FLAG_ERROR); this.addFlags(AST_FLAG_HAS_ERROR); this.astError = AST_ERROR_OPTION_UNKNOWN; - return { node: 0, len: s.length }; + parseDetails.node = 0; + parseDetails.len = s.length; + return; } const head = this.allocHeadNode(); let prev = head, next = 0; @@ -2073,7 +2076,9 @@ export class AstFilterParser { } prev = this.linkRight(prev, next); if ( assigned === false ) { - return { node: this.throwHeadNode(head), len: matchEnd }; + parseDetails.node = this.throwHeadNode(head); + parseDetails.len = matchEnd; + return; } next = this.allocTypedNode( NODE_TYPE_NET_OPTION_ASSIGN, @@ -2129,7 +2134,8 @@ export class AstFilterParser { ); this.linkRight(prev, next); } - return { node: this.throwHeadNode(head), len: details.quoteEnd }; + parseDetails.node = this.throwHeadNode(head); + parseDetails.len = details.quoteEnd; } endOfNetOption(s, beg) { @@ -2156,32 +2162,26 @@ export class AstFilterParser { ); if ( parentEnd === parentBeg ) { return containerNode; } const separatorCode = separator.charCodeAt(0); + const parseDetails = { separator, mode, node: 0, len: 0 }; const listNode = this.allocHeadNode(); let prev = listNode; let domainNode = 0; let separatorNode = 0; const s = this.getNodeString(parent); const listEnd = s.length; - let beg = 0, end = 0, c = 0; + let beg = 0, end = 0; while ( beg < listEnd ) { - c = s.charCodeAt(beg); - if ( c === 0x7E /* ~ */ ) { - c = s.charCodeAt(beg+1) || 0; - } - if ( c !== 0x2F /* / */ ) { - end = s.indexOf(separator, beg); - } else { - end = s.indexOf('/', beg+1); - end = s.indexOf(separator, end !== -1 ? end+1 : beg); - } - if ( end === -1 ) { end = listEnd; } + const next = this.allocTypedNode( + NODE_TYPE_OPTION_VALUE_DOMAIN_RAW, + parentBeg + beg, + parentBeg + listEnd // open ended + ); + this.parseDomain(next, parseDetails); + end = beg + parseDetails.len; + this.nodes[next+NODE_END_INDEX] = parentBeg + end; if ( end !== beg ) { - domainNode = this.allocTypedNode( - NODE_TYPE_OPTION_VALUE_DOMAIN_RAW, - parentBeg + beg, - parentBeg + end - ); - this.linkDown(domainNode, this.parseDomain(domainNode, mode)); + domainNode = next; + this.linkDown(domainNode, parseDetails.node); prev = this.linkRight(prev, domainNode); } else { domainNode = 0; @@ -2217,23 +2217,38 @@ export class AstFilterParser { return containerNode; } - parseDomain(parent, mode = 0b0000) { + parseDomain(parent, parseDetails) { const parentBeg = this.nodes[parent+NODE_BEG_INDEX]; const parentEnd = this.nodes[parent+NODE_END_INDEX]; + const not = this.charCodeAt(parentBeg) === 0x7E /* ~ */; let head = 0, next = 0; let beg = parentBeg; - const c = this.charCodeAt(beg); - if ( c === 0x7E /* ~ */ ) { + if ( not ) { this.addNodeFlags(parent, NODE_FLAG_IS_NEGATED); head = this.allocTypedNode(NODE_TYPE_OPTION_VALUE_NOT, beg, beg + 1); - if ( (mode & 0b1000) === 0 ) { + if ( (parseDetails.mode & 0b1000) === 0 ) { this.addNodeFlags(parent, NODE_FLAG_ERROR); } beg += 1; } - if ( beg !== parentEnd ) { - next = this.allocTypedNode(NODE_TYPE_OPTION_VALUE_DOMAIN, beg, parentEnd); - const hn = this.normalizeDomainValue(this.getNodeString(next), mode); + const c0 = this.charCodeAt(beg); + let end = beg; + let type = 0; + if ( c0 === 0x2F /* / */ ) { + end = this.indexOf('/', beg + 1, parentEnd); + if ( end !== -1 ) { end += 1; } + type = 1; + } else if ( c0 === 0x5B /* [ */ && this.startsWith('[$domain=/', beg) ) { + end = this.indexOf('/]', beg + 10, parentEnd); + if ( end !== -1 ) { end += 2; } + type = 2; + } else { + end = this.indexOf(parseDetails.separator, end, parentEnd); + } + if ( end === -1 ) { end = parentEnd; } + if ( beg !== end ) { + next = this.allocTypedNode(NODE_TYPE_OPTION_VALUE_DOMAIN, beg, end); + const hn = this.normalizeDomainValue(next, type, parseDetails.mode); if ( hn !== undefined ) { if ( hn !== '' ) { this.setNodeTransform(next, hn); @@ -2252,7 +2267,8 @@ export class AstFilterParser { this.addNodeFlags(parent, NODE_FLAG_ERROR); this.addFlags(AST_FLAG_HAS_ERROR); } - return head; + parseDetails.node = head; + parseDetails.len = end - parentBeg; } // mode bits: @@ -2261,16 +2277,16 @@ export class AstFilterParser { // 0b00100: can use single wildcard // 0b01000: can be negated // 0b10000: can be a regex - normalizeDomainValue(s, modeBits) { - if ( (modeBits & 0b10000) === 0 || - s.length <= 2 || - s.charCodeAt(0) !== 0x2F /* / */ || - exCharCodeAt(s, -1) !== 0x2F /* / */ - ) { + normalizeDomainValue(node, type, modeBits) { + const s = this.getNodeString(node); + if ( type === 0 ) { return this.normalizeHostnameValue(s, modeBits); } - const source = this.normalizeRegexPattern(s); + if ( (modeBits & 0b10000) === 0 ) { return ''; } + const regex = type === 1 ? s : `/${s.slice(10, -2)}/`; + const source = this.normalizeRegexPattern(regex); if ( source === '' ) { return ''; } + if ( type === 1 && source === regex ) { return; } return `/${source}/`; } @@ -2857,6 +2873,15 @@ export class AstFilterParser { return pos < this.rawEnd ? this.raw.charCodeAt(pos) : -1; } + indexOf(needle, beg, end = 0) { + const haystack = end === 0 ? this.raw : this.raw.slice(0, end); + return haystack.indexOf(needle, beg); + } + + startsWith(s, pos) { + return pos < this.rawEnd && this.raw.startsWith(s, pos); + } + isTokenCharCode(c) { return c === 0x25 || c >= 0x30 && c <= 0x39 || From 85877b12ed75c30cd7b07cefee787fdf02f454f3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 8 Oct 2024 19:47:35 -0400 Subject: [PATCH 344/553] Improve `prevent-window-open` scriptlet Support triggering a `debugger` statement when `window.open()` is called. Related feedback: https://github.com/uBlockOrigin/uAssets/issues/25510#issuecomment-2400067735 --- assets/resources/scriptlets.js | 42 +++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index e35757cfa4d0c..cd4c7ea0cb227 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -2952,13 +2952,45 @@ function preventXhr(...args) { return preventXhrFn(false, ...args); } -/******************************************************************************/ +/** + * @scriptlet prevent-window-open + * + * @description + * Prevent a webpage from opening new tabs through `window.open()`. + * + * @param pattern + * A plain string or regex to match against the `url` argument for the + * prevention to be triggered. If not provided, all calls to `window.open()` + * are prevented. + * If set to the special value `debug` *and* the logger is opened, the scriptlet + * will trigger a `debugger` statement and the prevention will not occur. + * + * @param [delay] + * If provided, a decoy will be created or opened, and this parameter states + * the number of seconds to wait for before the decoy is terminated, i.e. + * either removed from the DOM or closed. + * + * @param [decoy] + * A string representing the type of decoy to use: + * - `blank`: replace the `url` parameter with `about:blank` + * - `object`: create and append an `object` element to the DOM, and return + * its `contentWindow` property. + * - `frame`: create and append an `iframe` element to the DOM, and return + * its `contentWindow` property. + * + * @example + * ##+js(prevent-window-open, ads.example.com/) + * + * @example + * ##+js(prevent-window-open, ads.example.com/, 1, iframe) + * + * */ builtinScriptlets.push({ - name: 'no-window-open-if.js', + name: 'prevent-window-open.js', aliases: [ 'nowoif.js', - 'prevent-window-open.js', + 'no-window-open-if.js', 'window.open-defuser.js', ], fn: noWindowOpenIf, @@ -2994,6 +3026,10 @@ function noWindowOpenIf( }; const noopFunc = function(){}; proxyApplyFn('open', function open(context) { + if ( pattern === 'debug' && safe.logLevel !== 0 ) { + debugger; // eslint-disable-line no-debugger + return context.reflect(); + } const { callArgs } = context; const haystack = callArgs.join(' '); if ( rePattern.test(haystack) !== targetMatchResult ) { From 987e198016a1bc61e7ec8fe0255554f51f3aa2c3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 8 Oct 2024 19:50:14 -0400 Subject: [PATCH 345/553] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9acf0bb0c22a..2a6341a977cf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- [Improve `prevent-window-open` scriptlet](https://github.com/gorhill/uBlock/commit/85877b12ed) +- [Add support to parse Adguard's `[$domain=/.../]` regex-based modifier](https://github.com/gorhill/uBlock/commit/58bfe4c846) - [Validate result type of XPath expressions](https://github.com/gorhill/uBlock/commit/c746633693) - [Fix npm test suite](https://github.com/gorhill/uBlock/commit/818cb2d801) - [Add ability to lookup parameter name in `urlskip=`](https://github.com/gorhill/uBlock/commit/64b2086ba4) From a72def1cbf4b7ad4ac063d01e91943cd00b10f70 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 8 Oct 2024 19:50:34 -0400 Subject: [PATCH 346/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 2cf4877c51e61..8e10b8e25a3ea 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.9 \ No newline at end of file +1.60.1.10 \ No newline at end of file From 913f20f0a8a8ad7f706e347f4fd2f0fe81d63edb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 8 Oct 2024 19:56:23 -0400 Subject: [PATCH 347/553] 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 4cbf182466d39..2958ae715b05b 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.9", + "version": "1.60.1.10", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b9/uBlock0_1.60.1b9.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b10/uBlock0_1.60.1b10.firefox.signed.xpi" } ] } From c86ed5287b6277ee0768125d145b868519039537 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 10 Oct 2024 11:11:07 -0400 Subject: [PATCH 348/553] Add regex extraction transformation step to `urlskip=` option Related feedback: https://github.com/uBlockOrigin/uBlock-issues/issues/3206#issuecomment-2403795984 The first capture group of the regex will be used as the result of the transformation. Example: ||podtrac.com/pts/redirect.mp3/$urlskip=/podtrac\.com\/pts\/redirect\.mp3\/(.*?\.mp3\b)/ +https If the regex is invalid, or if it fails to extract a first capture group, no redirection will occur. --- src/js/static-net-filtering.js | 101 +++++++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 25 deletions(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 1942295732215..9f50e0b16616a 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5356,12 +5356,10 @@ StaticNetFilteringEngine.prototype.transformRequest = function(fctxt, out = []) out.push(directive); continue; } - const { refs } = directive; - if ( refs instanceof Object === false ) { continue; } - if ( refs.$cache === null ) { - refs.$cache = sfp.parseReplaceValue(refs.value); + if ( directive.cache === null ) { + directive.cache = sfp.parseReplaceValue(directive.value); } - const cache = refs.$cache; + const cache = directive.cache; if ( cache === undefined ) { continue; } const before = `${redirectURL.pathname}${redirectURL.search}${redirectURL.hash}`; if ( cache.re.test(before) !== true ) { continue; } @@ -5382,7 +5380,49 @@ StaticNetFilteringEngine.prototype.transformRequest = function(fctxt, out = []) return out; }; -/******************************************************************************/ +/** + * @trustedOption urlkip + * + * @description + * Extract a URL from another URL according to one or more transformation steps, + * thereby skipping over intermediate network request(s) to remote servers. + * Requires a trusted source. + * + * @param steps + * A serie of space-separated directives representing the transformation steps + * to perform to extract the final URL to which a network request should be + * redirected. + * + * Supported directives: + * + * `?name`: extract the value of parameter `name` as the current string. + * + * `&i`: extract the name of the parameter at position `i` as the current + * string. The position is 1-based. + * + * `/.../`: extract the first capture group of a regex as the current string. + * + * `+https`: prepend the current string with `https://`. + * + * `-base64`: decode the current string as a base64-encoded string. + * + * At any given step, the currently extracted string may not necessarily be + * a valid URL, and more transformation steps may be needed to obtain a valid + * URL once all the steps are applied. + * + * An unsupported step or a failed step will abort the transformation and no + * redirection will be performed. + * + * The final step is expected to yield a valid URL. If the result is not a + * valid URL, no redirection will be performed. + * + * @example + * ||example.com/path/to/tracker$urlskip=?url + * ||example.com/path/to/tracker$urlskip=?url ?to + * ||pixiv.net/jump.php?$urlskip=&1 + * ||podtrac.com/pts/redirect.mp3/$urlskip=/podtrac\.com\/pts\/redirect\.mp3\/(.*?\.mp3\b)/ +https + * + * */ StaticNetFilteringEngine.prototype.urlSkip = function(fctxt, out = []) { if ( fctxt.redirectURL !== undefined ) { return; } @@ -5396,7 +5436,7 @@ StaticNetFilteringEngine.prototype.urlSkip = function(fctxt, out = []) { const urlin = fctxt.url; const value = directive.value; const steps = value.includes(' ') && value.split(/ +/) || [ value ]; - const urlout = urlSkip(urlin, steps); + const urlout = urlSkip(directive, urlin, steps); if ( urlout === undefined ) { continue; } if ( urlout === urlin ) { continue; } fctxt.redirectURL = urlout; @@ -5407,41 +5447,52 @@ StaticNetFilteringEngine.prototype.urlSkip = function(fctxt, out = []) { return out; }; -function urlSkip(urlin, steps) { +function urlSkip(directive, urlin, steps) { try { - let urlout; + let urlout = urlin; for ( const step of steps ) { + const urlin = urlout; const c0 = step.charCodeAt(0); - // Extract from URL parameter - if ( c0 === 0x3F ) { /* ? */ - urlout = (new URL(urlin)).searchParams.get(step.slice(1)); - if ( urlout === null ) { return; } - if ( urlout.includes(' ') ) { - urlout = urlout.replace(/ /g, '%20'); - } - urlin = urlout; - continue; - } // Extract from URL parameter name at position i - if ( c0 === 0x26 ) { /* & */ + if ( c0 === 0x26 ) { // & const i = (parseInt(step.slice(1)) || 0) - 1; if ( i < 0 ) { return; } const url = new URL(urlin); if ( i >= url.searchParams.size ) { return; } const params = Array.from(url.searchParams.keys()); - urlin = urlout = decodeURIComponent(params[i]); + urlout = decodeURIComponent(params[i]); continue; } // Enforce https - if ( step === '+https' ) { + if ( c0 === 0x2B && step === '+https' ) { const s = urlin.replace(/^https?:\/\//, ''); if ( /^[\w-]:\/\//.test(s) ) { return; } - urlin = urlout = `https://${s}`; + urlout = `https://${s}`; continue; } // Decode base64 - if ( step === '-base64' ) { - urlin = urlout = self.atob(urlin); + if ( c0 === 0x2D && step === '-base64' ) { + urlout = self.atob(urlin); + continue; + } + // Regex extraction from first capture group + if ( c0 === 0x2F ) { // / + if ( directive.cache === null ) { + directive.cache = new RegExp(step.slice(1, -1)); + } + const match = directive.cache.exec(urlin); + if ( match === null ) { return; } + if ( match.length <= 1 ) { return; } + urlout = match[1]; + continue; + } + // Extract from URL parameter + if ( c0 === 0x3F ) { // ? + urlout = (new URL(urlin)).searchParams.get(step.slice(1)); + if ( urlout === null ) { return; } + if ( urlout.includes(' ') ) { + urlout = urlout.replace(/ /g, '%20'); + } continue; } // Unknown directive From 0c462e3ca1fba8f3bf01c762073c7dcbed59df00 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 10 Oct 2024 11:22:23 -0400 Subject: [PATCH 349/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a6341a977cf7..d8241635b1edf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add regex extraction transformation step to `urlskip=` option](https://github.com/gorhill/uBlock/commit/c86ed5287b) - [Improve `prevent-window-open` scriptlet](https://github.com/gorhill/uBlock/commit/85877b12ed) - [Add support to parse Adguard's `[$domain=/.../]` regex-based modifier](https://github.com/gorhill/uBlock/commit/58bfe4c846) - [Validate result type of XPath expressions](https://github.com/gorhill/uBlock/commit/c746633693) From 2e1dac5950ce806f01959193ad6bbb4a91f6e950 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 10 Oct 2024 11:22:44 -0400 Subject: [PATCH 350/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 8e10b8e25a3ea..738bba80466b5 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.10 \ No newline at end of file +1.60.1.11 \ No newline at end of file From 9e3c978d55ea52fce34fb3ccdb97808fccdfd237 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 10 Oct 2024 11:31:57 -0400 Subject: [PATCH 351/553] Minor edit to comment --- src/js/static-net-filtering.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 9f50e0b16616a..6a9f8cd129078 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5420,7 +5420,7 @@ StaticNetFilteringEngine.prototype.transformRequest = function(fctxt, out = []) * ||example.com/path/to/tracker$urlskip=?url * ||example.com/path/to/tracker$urlskip=?url ?to * ||pixiv.net/jump.php?$urlskip=&1 - * ||podtrac.com/pts/redirect.mp3/$urlskip=/podtrac\.com\/pts\/redirect\.mp3\/(.*?\.mp3\b)/ +https + * ||podtrac.com/pts/redirect.mp3/$urlskip=/\/redirect\.mp3\/(.*?\.mp3\b)/ +https * * */ From 3cee922e688547a427b79dec6540da936828784c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 10 Oct 2024 11:35:40 -0400 Subject: [PATCH 352/553] 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 2958ae715b05b..9637cf7c5f058 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.10", + "version": "1.60.1.11", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b10/uBlock0_1.60.1b10.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b11/uBlock0_1.60.1b11.firefox.signed.xpi" } ] } From e5d16a1883b6f30ce621e59890059881d33fa5a8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 10 Oct 2024 11:35:58 -0400 Subject: [PATCH 353/553] Typo --- src/js/static-net-filtering.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 6a9f8cd129078..6bd9fe00cd83f 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5381,7 +5381,7 @@ StaticNetFilteringEngine.prototype.transformRequest = function(fctxt, out = []) }; /** - * @trustedOption urlkip + * @trustedOption urlskip * * @description * Extract a URL from another URL according to one or more transformation steps, From 4d982d9972be4eb0a23e289c6f3ec3ae8cca36f2 Mon Sep 17 00:00:00 2001 From: Fanboynz Date: Sat, 12 Oct 2024 01:26:37 +1300 Subject: [PATCH 354/553] Add forbidden/forever values (#3925) --- assets/resources/scriptlets.js | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index cd4c7ea0cb227..8db2877fcb87a 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -1002,6 +1002,7 @@ function getSafeCookieValuesFn() { 'enable', 'disable', 'enabled', 'disabled', 'essential', 'nonessential', + 'forbidden', 'forever', 'hide', 'hidden', 'necessary', 'required', 'ok', From 01eebffc1fd133f4f72f886551e79ba4bfc3bb24 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 11 Oct 2024 08:54:50 -0400 Subject: [PATCH 355/553] Add `-uricomponent` to `urlskip=` option To unescape URI-encoded characters. Related discussion: https://github.com/uBlockOrigin/uBlock-issues/issues/3206#issuecomment-2406479971 --- src/js/static-net-filtering.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 6bd9fe00cd83f..92fc51b33cb2a 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5406,6 +5406,8 @@ StaticNetFilteringEngine.prototype.transformRequest = function(fctxt, out = []) * * `-base64`: decode the current string as a base64-encoded string. * + * `-uricomponent`: decode the current string as a URI component string. + * * At any given step, the currently extracted string may not necessarily be * a valid URL, and more transformation steps may be needed to obtain a valid * URL once all the steps are applied. @@ -5470,10 +5472,18 @@ function urlSkip(directive, urlin, steps) { urlout = `https://${s}`; continue; } - // Decode base64 - if ( c0 === 0x2D && step === '-base64' ) { - urlout = self.atob(urlin); - continue; + // Decode + if ( c0 === 0x2D ) { + // Base64 + if ( step === '-base64' ) { + urlout = self.atob(urlin); + continue; + } + // URI component + if ( step === '-uricomponent' ) { + urlout = self.decodeURIComponent(urlin); + continue; + } } // Regex extraction from first capture group if ( c0 === 0x2F ) { // / From caba9cdefa082fa36c82a9888bc84f3dbec5c7a2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 11 Oct 2024 09:03:30 -0400 Subject: [PATCH 356/553] Use uBO's default listset --- platform/npm/demo.js | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/platform/npm/demo.js b/platform/npm/demo.js index ebe314b2fdf6d..bc0ca87a1f7e3 100644 --- a/platform/npm/demo.js +++ b/platform/npm/demo.js @@ -36,6 +36,17 @@ import { StaticNetFilteringEngine } from '@gorhill/ubo-core'; /******************************************************************************/ +async function fetchList(name, url) { + return fetch(url).then(r => { + return r.text(); + }).then(raw => { + console.log(`${name} fetched`); + return { name, raw }; + }).catch(reason => { + console.error(reason); + }); +} + async function main() { const pathToSelfie = 'cache/selfie.txt'; @@ -62,24 +73,14 @@ async function main() { if ( !selfie ) { console.log(`Fetching lists...`); await snfe.useLists([ - fetch('https://easylist.to/easylist/easylist.txt') - .then(r => { - return r.text(); - }).then(raw => { - console.log(`easylist fetched`); - return { name: 'easylist', raw }; - }).catch(reason => { - console.error(reason); - }), - fetch('https://easylist.to/easylist/easyprivacy.txt') - .then(r => { - return r.text(); - }).then(raw => { - console.log(`easyprivacy fetched`); - return { name: 'easyprivacy', raw }; - }).catch(reason => { - console.error(reason); - }), + fetchList('ubo-ads', 'https://ublockorigin.github.io/uAssetsCDN/filters/filters.min.txt'), + fetchList('ubo-badware', 'https://ublockorigin.github.io/uAssetsCDN/filters/badware.min.txt'), + fetchList('ubo-privacy', 'https://ublockorigin.github.io/uAssetsCDN/filters/privacy.min.txt'), + fetchList('ubo-unbreak', 'https://ublockorigin.github.io/uAssetsCDN/filters/unbreak.min.txt'), + fetchList('ubo-quick', 'https://ublockorigin.github.io/uAssetsCDN/filters/quick-fixes.min.txt'), + fetchList('easylist', 'https://easylist.to/easylist/easylist.txt'), + fetchList('easyprivacy', 'https://easylist.to/easylist/easyprivacy.txt'), + fetchList('plowe', 'https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext'), ]); const selfie = await snfe.serialize(); await fs.mkdir('cache', { recursive: true }); From b8959dcca9ad2bfcd50bc2c322021f5d1ac473f2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 11 Oct 2024 09:04:23 -0400 Subject: [PATCH 357/553] Comment --- src/js/static-net-filtering.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 92fc51b33cb2a..73218aba5b194 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5406,7 +5406,7 @@ StaticNetFilteringEngine.prototype.transformRequest = function(fctxt, out = []) * * `-base64`: decode the current string as a base64-encoded string. * - * `-uricomponent`: decode the current string as a URI component string. + * `-uricomponent`: decode the current string as a URI encoded string. * * At any given step, the currently extracted string may not necessarily be * a valid URL, and more transformation steps may be needed to obtain a valid From d0ae3c3e77c7e5408ddd440c7205c9732bf26a88 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 11 Oct 2024 09:06:49 -0400 Subject: [PATCH 358/553] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8241635b1edf..7111358dd76d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- [Add `-uricomponent` to `urlskip=` option](https://github.com/gorhill/uBlock/commit/01eebffc1f) +- [Add `forbidden`/`forever` as safe cookie values](https://github.com/gorhill/uBlock/commit/4d982d9972) (by @ryanbr) - [Add regex extraction transformation step to `urlskip=` option](https://github.com/gorhill/uBlock/commit/c86ed5287b) - [Improve `prevent-window-open` scriptlet](https://github.com/gorhill/uBlock/commit/85877b12ed) - [Add support to parse Adguard's `[$domain=/.../]` regex-based modifier](https://github.com/gorhill/uBlock/commit/58bfe4c846) From f5a7053acb8bf1d67579ecaa1561bb9abe8ee4fa Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 11 Oct 2024 09:07:12 -0400 Subject: [PATCH 359/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 738bba80466b5..080adefd7cd65 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.11 \ No newline at end of file +1.60.1.12 \ No newline at end of file From 44bcb5fd996e6f54eea355ed667bac8a5d664b68 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 11 Oct 2024 09:15:40 -0400 Subject: [PATCH 360/553] 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 9637cf7c5f058..ace180c1a03d2 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.11", + "version": "1.60.1.12", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b11/uBlock0_1.60.1b11.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b12/uBlock0_1.60.1b12.firefox.signed.xpi" } ] } From 2c60bb3b07fc0b234e1c843889e047f8f3a04a84 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 11 Oct 2024 16:41:03 -0400 Subject: [PATCH 361/553] [mv3] Issue labels cannot be set client-side --- platform/mv3/extension/js/report.js | 1 - 1 file changed, 1 deletion(-) diff --git a/platform/mv3/extension/js/report.js b/platform/mv3/extension/js/report.js index 676342b9e0ac3..35c3a85094100 100644 --- a/platform/mv3/extension/js/report.js +++ b/platform/mv3/extension/js/report.js @@ -106,7 +106,6 @@ async function reportSpecificFilterIssue() { '`' + qs$('select[name="url"]').value + '`' ); githubURL.searchParams.set('category', issueType); - githubURL.searchParams.set('labels', 'uBOL'); const manifest = runtime.getManifest(); const rulesets = await dnr.getEnabledRulesets(); From ce9fc5dc14e198c83f6f7e553477f5c82ff26e4b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 12 Oct 2024 08:52:05 -0400 Subject: [PATCH 362/553] Add support to `urlskip=` media resources Related feedback: https://github.com/uBlockOrigin/uBlock-issues/issues/3206#issuecomment-2406777654 --- src/js/benchmarks.js | 20 ++++++++++------- src/js/pagestore.js | 41 +++++++++++++++++++++------------- src/js/static-net-filtering.js | 4 ++-- src/js/traffic.js | 3 ++- 4 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/js/benchmarks.js b/src/js/benchmarks.js index c4102469863fb..8603b8737a89c 100644 --- a/src/js/benchmarks.js +++ b/src/js/benchmarks.js @@ -166,11 +166,11 @@ export async function benchmarkStaticNetFiltering(options = {}) { let allowCount = 0; let redirectCount = 0; let removeparamCount = 0; + let urlskipCount = 0; let cspCount = 0; let permissionsCount = 0; let replaceCount = 0; - for ( let i = 0; i < requests.length; i++ ) { - const request = requests[i]; + for ( const request of requests ) { fctxt.setURL(request.url); if ( fctxt.getIPAddress() === '' ) { fctxt.setIPAddress('93.184.215.14\n2606:2800:21f:cb07:6820:80da:af6b:8b2c'); @@ -186,12 +186,15 @@ export async function benchmarkStaticNetFiltering(options = {}) { if ( sfne.transformRequest(fctxt) ) { redirectCount += 1; } - if ( fctxt.redirectURL !== undefined && sfne.hasQuery(fctxt) ) { - if ( sfne.filterQuery(fctxt, 'removeparam') ) { + if ( sfne.hasQuery(fctxt) ) { + if ( sfne.filterQuery(fctxt) ) { removeparamCount += 1; } } - if ( fctxt.type === 'main_frame' || fctxt.type === 'sub_frame' ) { + if ( sfne.urlSkip(fctxt) ) { + urlskipCount += 1; + } + if ( fctxt.isDocument() ) { if ( sfne.matchAndFetchModifiers(fctxt, 'csp') ) { cspCount += 1; } @@ -207,9 +210,9 @@ export async function benchmarkStaticNetFiltering(options = {}) { if ( sfne.redirectRequest(redirectEngine, fctxt) ) { redirectCount += 1; } - } - if ( fctxt.type === 'main_frame' ) { - sfne.matchAndFetchModifiers(fctxt, 'urlskip'); + if ( fctxt.isRootDocument() && sfne.urlSkip(fctxt) ) { + urlskipCount += 1; + } } } const t1 = performance.now(); @@ -224,6 +227,7 @@ export async function benchmarkStaticNetFiltering(options = {}) { `\tUnblocked: ${allowCount}`, `\tredirect=: ${redirectCount}`, `\tremoveparam=: ${removeparamCount}`, + `\turlskip=: ${urlskipCount}`, `\tcsp=: ${cspCount}`, `\tpermissions=: ${permissionsCount}`, `\treplace=: ${replaceCount}`, diff --git a/src/js/pagestore.js b/src/js/pagestore.js index 1b94b1fef6d95..e23f0950ec8f3 100644 --- a/src/js/pagestore.js +++ b/src/js/pagestore.js @@ -942,6 +942,9 @@ const PageStore = class { if ( staticNetFilteringEngine.hasQuery(fctxt) ) { staticNetFilteringEngine.filterQuery(fctxt, directives); } + if ( this.urlSkippableResources.has(fctxt.itype) ) { + staticNetFilteringEngine.urlSkip(fctxt, directives); + } if ( directives.length === 0 ) { return; } if ( logger.enabled !== true ) { return; } fctxt.pushFilters(directives.map(a => a.logData())); @@ -1132,22 +1135,30 @@ const PageStore = class { response.blockedResources = this.netFilteringCache.lookupAllBlocked(fctxt.getDocHostname()); } -}; - -PageStore.prototype.cacheableResults = new Set([ - µb.FilteringContext.SUB_FRAME, -]); -PageStore.prototype.collapsibleResources = new Set([ - µb.FilteringContext.IMAGE, - µb.FilteringContext.MEDIA, - µb.FilteringContext.OBJECT, - µb.FilteringContext.SUB_FRAME, -]); - -// To mitigate memory churning -PageStore.junkyard = []; -PageStore.junkyardMax = 10; + cacheableResults = new Set([ + µb.FilteringContext.SUB_FRAME + ]); + + collapsibleResources = new Set([ + µb.FilteringContext.IMAGE, + µb.FilteringContext.MEDIA, + µb.FilteringContext.OBJECT, + µb.FilteringContext.SUB_FRAME, + ]); + + urlSkippableResources = new Set([ + µb.FilteringContext.IMAGE, + µb.FilteringContext.MAIN_FRAME, + µb.FilteringContext.MEDIA, + µb.FilteringContext.OBJECT, + µb.FilteringContext.SUB_FRAME, + ]); + + // To mitigate memory churning + static junkyard = []; + static junkyardMax = 10; +}; /******************************************************************************/ diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 73218aba5b194..0fb6dc5b86b30 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5449,9 +5449,9 @@ StaticNetFilteringEngine.prototype.urlSkip = function(fctxt, out = []) { return out; }; -function urlSkip(directive, urlin, steps) { +function urlSkip(directive, url, steps) { try { - let urlout = urlin; + let urlout = url; for ( const step of steps ) { const urlin = urlout; const c0 = step.charCodeAt(0); diff --git a/src/js/traffic.js b/src/js/traffic.js index 5de002797671e..eab93be742432 100644 --- a/src/js/traffic.js +++ b/src/js/traffic.js @@ -196,8 +196,9 @@ const onBeforeRootFrameRequest = function(fctxt) { if ( trusted === false && pageStore !== null ) { if ( result !== 1 ) { pageStore.redirectNonBlockedRequest(fctxt); + } else { + pageStore.skipMainDocument(fctxt); } - pageStore.skipMainDocument(fctxt); } if ( logger.enabled ) { From 3e7a79ebefc46929dd43a56bdff6f118d75a12f2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 12 Oct 2024 08:55:43 -0400 Subject: [PATCH 363/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7111358dd76d0..188fcda42137a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add support to `urlskip=` media resources](https://github.com/gorhill/uBlock/commit/ce9fc5dc14) - [Add `-uricomponent` to `urlskip=` option](https://github.com/gorhill/uBlock/commit/01eebffc1f) - [Add `forbidden`/`forever` as safe cookie values](https://github.com/gorhill/uBlock/commit/4d982d9972) (by @ryanbr) - [Add regex extraction transformation step to `urlskip=` option](https://github.com/gorhill/uBlock/commit/c86ed5287b) From 6df1ea8cd6bd064d7f99a7f609870689c5b33e15 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 12 Oct 2024 08:56:20 -0400 Subject: [PATCH 364/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 080adefd7cd65..83a9e98f25b3a 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.12 \ No newline at end of file +1.60.1.13 \ No newline at end of file From 94ca27acd1ee38322a5106cfb3ea7f6b9d8e557e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 12 Oct 2024 09:25:59 -0400 Subject: [PATCH 365/553] 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 ace180c1a03d2..20abab4c95a73 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.12", + "version": "1.60.1.13", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b12/uBlock0_1.60.1b12.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b13/uBlock0_1.60.1b13.firefox.signed.xpi" } ] } From 32f27c5131ecffa4dba412c9f39ff3d3e2c21340 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 16 Oct 2024 08:25:56 -0400 Subject: [PATCH 366/553] Ensure `urlskip=` redirects only to `https:` --- src/js/static-net-filtering.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 0fb6dc5b86b30..6a2f6c9c37418 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5508,7 +5508,8 @@ function urlSkip(directive, url, steps) { // Unknown directive return; } - void new URL(urlout); + const urlfinal = new URL(urlout); + if ( urlfinal.protocol !== 'https:' ) { return; } return urlout; } catch(x) { } From e9c0ad59dd47dcd7f33840aea35f517b9401f928 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 16 Oct 2024 08:29:25 -0400 Subject: [PATCH 367/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 188fcda42137a..41a61ca55926c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Ensure `urlskip=` redirects only to `https:`](https://github.com/gorhill/uBlock/commit/32f27c5131) - [Add support to `urlskip=` media resources](https://github.com/gorhill/uBlock/commit/ce9fc5dc14) - [Add `-uricomponent` to `urlskip=` option](https://github.com/gorhill/uBlock/commit/01eebffc1f) - [Add `forbidden`/`forever` as safe cookie values](https://github.com/gorhill/uBlock/commit/4d982d9972) (by @ryanbr) From e6b7f06ab42ba86b260fb75413584520f8210a08 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 16 Oct 2024 08:29:52 -0400 Subject: [PATCH 368/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 83a9e98f25b3a..9769226cad84b 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.13 \ No newline at end of file +1.60.1.14 \ No newline at end of file From 98db549bb762d6ad07d4f626af9bf94313faca50 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 16 Oct 2024 08:56:20 -0400 Subject: [PATCH 369/553] 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 20abab4c95a73..79c5afb38d0dd 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.13", + "version": "1.60.1.14", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b13/uBlock0_1.60.1b13.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b14/uBlock0_1.60.1b14.firefox.signed.xpi" } ] } From 4291c874d9bdfe3d6997afdf5863c532f463e877 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 17 Oct 2024 12:11:50 -0400 Subject: [PATCH 370/553] Fix regression in `prevent-xhr` scriptlet Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3418 --- assets/resources/scriptlets.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 8db2877fcb87a..3a7511ba9d187 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -1617,20 +1617,20 @@ function preventXhrFn( }; const XHRBefore = XMLHttpRequest.prototype; self.XMLHttpRequest = class extends self.XMLHttpRequest { - open(method, url, defer, ...args) { + open(method, url, ...args) { xhrInstances.delete(this); if ( warOrigin !== undefined && url.startsWith(warOrigin) ) { - return super.open(method, url, defer, ...args); + return super.open(method, url, ...args); } const haystack = { method, url }; if ( propsToMatch === '' && directive === '' ) { safe.uboLog(logPrefix, `Called: ${safe.JSON_stringify(haystack, null, 2)}`); - return super.open(method, url, defer, ...args); + return super.open(method, url, ...args); } if ( matchObjectProperties(propNeedles, haystack) ) { const xhrDetails = Object.assign(haystack, { xhr: this, - defer, + defer: args.length === 0 || !!args[0], directive, headers: { 'date': '', @@ -1646,7 +1646,7 @@ function preventXhrFn( }); xhrInstances.set(this, xhrDetails); } - return super.open(method, url, defer, ...args); + return super.open(method, url, ...args); } send(...args) { const xhrDetails = xhrInstances.get(this); From 89c353640e39f0aaece005071be832e5448fb334 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 17 Oct 2024 12:27:49 -0400 Subject: [PATCH 371/553] [mv3] Add EST-0 list --- platform/mv3/make-rulesets.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index c85a11a5869f0..09719101055b4 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -1194,6 +1194,16 @@ async function main() { }); } + await rulesetFromURLs({ + id: 'est-0', + group: 'regions', + lang: 'et', + name: '🇪🇪ee: Eesti saitidele kohandatud filter', + enabled: false, + urls: [ 'https://ubol-et.adblock.ee/list.txt' ], + homeURL: 'https://github.com/sander85/uBOL-et', + }); + // Handpicked rulesets from assets.json const handpicked = [ 'block-lan', From 27f3612fdfeb6a1b4b7c1a95d0c49c1f6a23d0ec Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 17 Oct 2024 12:32:28 -0400 Subject: [PATCH 372/553] [mv3] Set Optimal as default if extension broad permission at install time This is to prepare uBOL to be ready to set Optimal mode as default if ever Chromium-based browsers support a way to pre-grant broad host permissions in a policy. Related issue: https://github.com/uBlockOrigin/uBOL-home/discussions/232 https://github.com/uBlockOrigin/uBOL-home/discussions/135 --- platform/mv3/extension/js/background.js | 14 +++++++++++++- platform/mv3/extension/js/settings.js | 4 ++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index c8183e9251895..791625d2a1c92 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -38,6 +38,8 @@ import { } from './ruleset-manager.js'; import { + MODE_BASIC, + MODE_OPTIMAL, getDefaultFilteringMode, getFilteringMode, getTrustedSites, @@ -136,7 +138,7 @@ async function onPermissionsRemoved() { const modified = await syncWithBrowserPermissions(); if ( modified === false ) { return false; } const afterMode = await getDefaultFilteringMode(); - if ( beforeMode > 1 && afterMode <= 1 ) { + if ( beforeMode > MODE_BASIC && afterMode <= MODE_BASIC ) { updateDynamicRules(); } registerInjectables(); @@ -420,9 +422,19 @@ async function start() { ); if ( firstRun ) { + const enableOptimal = await hasOmnipotence(); + if ( enableOptimal ) { + const afterLevel = await setDefaultFilteringMode(MODE_OPTIMAL); + if ( afterLevel === MODE_OPTIMAL ) { + updateDynamicRules(); + registerInjectables(); + } + } const disableFirstRunPage = await adminRead('disableFirstRunPage'); if ( disableFirstRunPage !== true ) { runtime.openOptionsPage(); + } else { + firstRun = false; } } } diff --git a/platform/mv3/extension/js/settings.js b/platform/mv3/extension/js/settings.js index 6f50055df6554..c916c46577f96 100644 --- a/platform/mv3/extension/js/settings.js +++ b/platform/mv3/extension/js/settings.js @@ -316,7 +316,7 @@ dom.on('#showBlockedCount input[type="checkbox"]', 'change', ev => { function renderTrustedSites() { const textarea = qs$('#trustedSites'); - const hostnames = cachedRulesetData.trustedSites; + const hostnames = cachedRulesetData.trustedSites || []; textarea.value = hostnames.map(hn => punycode.toUnicode(hn)).join('\n'); if ( textarea.value !== '' ) { textarea.value += '\n'; @@ -325,7 +325,7 @@ function renderTrustedSites() { function changeTrustedSites() { const hostnames = getStagedTrustedSites(); - const hash = hashFromIterable(cachedRulesetData.trustedSites); + const hash = hashFromIterable(cachedRulesetData.trustedSites || []); if ( hashFromIterable(hostnames) === hash ) { return; } sendMessage({ what: 'setTrustedSites', From 0425bdfd35fc6e9d423cab839610bc7eaa7c8917 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 17 Oct 2024 12:44:02 -0400 Subject: [PATCH 373/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.zh_CN.txt | 2 +- .../mv3/extension/_locales/ar/messages.json | 2 +- .../mv3/extension/_locales/hi/messages.json | 2 +- .../extension/_locales/pt_PT/messages.json | 34 +++++++++---------- .../mv3/extension/_locales/sq/messages.json | 10 +++--- .../mv3/extension/_locales/th/messages.json | 6 ++-- .../mv3/extension/_locales/vi/messages.json | 34 +++++++++---------- .../extension/_locales/zh_CN/messages.json | 16 ++++----- src/_locales/ar/messages.json | 2 +- src/_locales/fa/messages.json | 20 +++++------ src/_locales/ja/messages.json | 4 +-- 11 files changed, 66 insertions(+), 66 deletions(-) diff --git a/platform/mv3/description/webstore.zh_CN.txt b/platform/mv3/description/webstore.zh_CN.txt index 413f499ea0d50..e0ae72dd5eb33 100644 --- a/platform/mv3/description/webstore.zh_CN.txt +++ b/platform/mv3/description/webstore.zh_CN.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) 是一个基于最新浏览器扩展接口(Manifest Version 3 - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +访问选项页面,点击弹出面板中的齿轮图标,即可启用更多规则集。 uBOL 的过滤规则是完全声明式的,并不需要固定保留一个 uBOL 扩展进程,基于 CSS/JS 注入的内容过滤更是交由浏览器进行调度,比起扩展本身更为可靠。 这也即是说当内容被过滤时 uBOL 自身并不占用额外 CPU 和内存资源,只有在您打开弹出面板或是设置页面时才会生成 uBOL 扩展进程。 diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index 3f051e050e2b0..d3c4d9a76f88e 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -52,7 +52,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "اعلانات", + "message": "إعلانات", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { diff --git a/platform/mv3/extension/_locales/hi/messages.json b/platform/mv3/extension/_locales/hi/messages.json index d81b4d7bffb8a..2a9dae26b6814 100644 --- a/platform/mv3/extension/_locales/hi/messages.json +++ b/platform/mv3/extension/_locales/hi/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "इस वेबसाइट पर किसी समस्या को रिपोर्ट करें", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index a6bc083461719..f73c906c6560b 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Relatar um problema neste website", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Relatar um problema de filtro", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Relate problemas de filtros em websites específicos no rastreador de problemas uBlockOrigin/uAssets. Requer uma conta no GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Para evitar sobrecarregar os voluntários com relatórios duplicados, por favor verifique se o problema ainda não foi relatado.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Encontrar relatórios semelhantes", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Endereço da página web:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "A página web...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Escolha uma entrada --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Mostra anúncios ou restos de anúncios", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Tem sobreposições ou outros incómodos", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Deteta uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Tem problemas relacionados com a privacidade", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Falha quando o uBO Lite é ativado", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Abre separadores ou janelas indesejáveis", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Leva a badware e phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Classifica a página web como “NSFW” (“Não segura para o trabalho”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Criar novo relatório", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index 4bcd36d07283a..464f49455b042 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -108,7 +108,7 @@ "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Raportoni problemet me filtrat në uebsajt specifikë në uBlockOrigin/uAssets issue tracker. Kërkon një llogari GitHub.", + "message": "Problemet e disa faqeve me filtrat duhen raportuar në ditarin e problemeve uBlockOrigin/uAssets. Duhet një konto GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { @@ -124,7 +124,7 @@ "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "Uebsajti...", + "message": "Uebsajti…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { @@ -144,11 +144,11 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Ka probleme me privatësinë", + "message": "Ka probleme me ruajtjen e privatësisë", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Krijon mosfunksionime kur uBO Lite është i aktivizuar", + "message": "Punon keq kur uBO Lite është i aktivizuar", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { @@ -156,7 +156,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Çon në instalimin e programeve keqdashëse, mashtruese", + "message": "Çon te programet keqdashëse, mashtruese", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/platform/mv3/extension/_locales/th/messages.json b/platform/mv3/extension/_locales/th/messages.json index 3837f15a5e666..9905daf714b4e 100644 --- a/platform/mv3/extension/_locales/th/messages.json +++ b/platform/mv3/extension/_locales/th/messages.json @@ -28,7 +28,7 @@ "description": "Link to privacy policy on GitHub (English)" }, "popupFilteringModeLabel": { - "message": "filtering mode", + "message": "โหมดตัวกรอง", "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { @@ -52,7 +52,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "โฆษณา", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { @@ -164,7 +164,7 @@ "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "สร้างรายงานใหม่", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/vi/messages.json b/platform/mv3/extension/_locales/vi/messages.json index 489c0522b0139..061c7416a4398 100644 --- a/platform/mv3/extension/_locales/vi/messages.json +++ b/platform/mv3/extension/_locales/vi/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Báo cáo lỗi trên trang này", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Báo cáo lỗi bộ lọc cụ thể", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Báo cáo các vấn đề về bộ lọc với các trang web cụ thể cho trình theo dõi vấn đề uBlockOrigin/uAssets xử lý. Cần có tài khoản GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Để tránh tạo thêm gánh nặng cho các tình nguyện viên, hãy chắc chắn rằng chưa từng có vấn đề tương tự được báo cáo.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Tìm các báo cáo tương tự", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Địa chỉ của trang web:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Trang web…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Chọn một mục --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Hiện quảng cáo hoặc vùng chứa quảng cáo", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Có lớp phủ hoặc những phiền toái khác", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Phát hiện uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Có các cấn đề về quyền riêng tư", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Trục trặc khi bật uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Xuất hiện các tab và cửa sổ ngoài mong muốn", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Dẫn đến phần mềm độc hại, lừa đảo", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Đánh dấu trang web là “NSFW” (“Không an toàn cho công việc”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Tạo báo cáo mới", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/zh_CN/messages.json b/platform/mv3/extension/_locales/zh_CN/messages.json index e8b4b31de453e..bcc72a5fc3f9b 100644 --- a/platform/mv3/extension/_locales/zh_CN/messages.json +++ b/platform/mv3/extension/_locales/zh_CN/messages.json @@ -104,11 +104,11 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "报告过滤问题", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "将特定网站的过滤问题报告给uBlockOrigin/uAssets issue tracker需要有 GitHub 账户。", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { @@ -128,11 +128,11 @@ "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- 选择一个条目 --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "显示广告或残留广告", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { @@ -140,7 +140,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "检测到 uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { @@ -148,7 +148,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "启用 uBO Lite 时发生故障", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { @@ -156,11 +156,11 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "导致恶意软件、网络钓鱼", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "将网页标记为 “NSFW”(“工作场所不宜”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { diff --git a/src/_locales/ar/messages.json b/src/_locales/ar/messages.json index ca454de959e84..e4f8e6505622f 100644 --- a/src/_locales/ar/messages.json +++ b/src/_locales/ar/messages.json @@ -1248,7 +1248,7 @@ "description": "A context menu entry, to view the source code of the target resource" }, "shortcutCapturePlaceholder": { - "message": "ادخل اختصار", + "message": "أدخِل اختصار", "description": "Placeholder string for input field used to capture a keyboard shortcut" }, "genericMergeViewScrollLock": { diff --git a/src/_locales/fa/messages.json b/src/_locales/fa/messages.json index 23838c8ff4412..366b8689317f7 100644 --- a/src/_locales/fa/messages.json +++ b/src/_locales/fa/messages.json @@ -484,7 +484,7 @@ "description": "Filter lists section name" }, "3pGroupSocial": { - "message": "Social widgets", + "message": "ابزارک‌های اجتماعی", "description": "Filter lists section name" }, "3pGroupCookies": { @@ -856,7 +856,7 @@ "description": "A logger setting" }, "loggerSettingPerEntryLineCount": { - "message": "Use {{input}} lines per entry in vertically expanded mode", + "message": "استفاده از {{input}} خط برای هر ورودی در حالت عمودی گسترش‌یافته", "description": "A logger setting" }, "loggerSettingHideColumnsPrompt": { @@ -928,7 +928,7 @@ "description": "Header of 'Filter issues' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "مشکلات فیلتر با وب‌سایت‌های خاص را به uBlockOrigin/uAssets گزارش دهید. نیاز به یک حساب کاربری GitHub دارد.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS3P2": { @@ -936,7 +936,7 @@ "description": "Second paragraph of 'Filter issues' section in Support pane" }, "supportS3P3": { - "message": "Tips: Be sure your filter lists are up to date. The logger is the primary tool to diagnose filter-related issues.", + "message": "نکته‌ها: مطمئن شوید که فهرست‌های فیلتر شما به‌روز هستند. گزارشگر ابزار اصلی برای تشخیص مشکلات مربوط به فیلترهاست.", "description": "Third paragraph of 'Filter issues' section in Support pane" }, "supportS4H": { @@ -944,7 +944,7 @@ "description": "Header of 'Bug report' section in Support pane" }, "supportS4P1": { - "message": "Report issues with uBlock Origin itself to the uBlockOrigin/uBlock-issue issue tracker. Requires a GitHub account.", + "message": "مشکلات مربوط به خود uBlock Origin را به uBlockOrigin/uBlock-issue گزارش دهید. نیاز به یک حساب کاربری GitHub دارد.", "description": "First paragraph of 'Bug report' section in Support pane" }, "supportS5H": { @@ -972,7 +972,7 @@ "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S2": { - "message": "Verify that the issue still exists after reloading the problematic webpage.", + "message": "تأیید کنید که مشکل پس از بارگذاری مجدد صفحهٔ مشکل‌دار همچنان وجود دارد.", "description": "A paragraph in the filter issue reporter section" }, "supportS6URL": { @@ -992,7 +992,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "دارای لایه‌های اضافی یا مشکلات مزاحم دیگر", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "منجر به بدافزار یا فیشینگ می‌شود", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { @@ -1264,7 +1264,7 @@ "description": "Label for buttons used to select all text in editor" }, "toggleCosmeticFiltering": { - "message": "Toggle cosmetic filtering", + "message": "فیلترگذاری ظاهری را فعال/غیرفعال کنید", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, "toggleJavascript": { @@ -1300,7 +1300,7 @@ "description": "Summary of number of errors as reported by the linter " }, "unprocessedRequestTooltip": { - "message": "Could not filter properly at browser launch. Reload the page to ensure proper filtering.", + "message": "فیلترگذاری به‌درستی در هنگام راه‌اندازی مرورگر انجام نشد. صفحه را دوباره بارگذاری کنید تا از فیلترگذاری صحیح اطمینان حاصل کنید.", "description": "A warning which will appear in the popup panel if needed" }, "dummy": { diff --git a/src/_locales/ja/messages.json b/src/_locales/ja/messages.json index 0b8c6d014a6ea..6401003460508 100644 --- a/src/_locales/ja/messages.json +++ b/src/_locales/ja/messages.json @@ -480,7 +480,7 @@ "description": "Filter lists section name" }, "3pGroupMalware": { - "message": "マルウェアドメイン", + "message": "マルウェアからの保護、セキュリティ", "description": "Filter lists section name" }, "3pGroupSocial": { @@ -540,7 +540,7 @@ "description": "Warning against copy-pasting filters from random sources" }, "1pEnableMyFiltersLabel": { - "message": "マイカスタムフィルターを有効化", + "message": "自分のカスタムフィルターを有効化", "description": "Label for the checkbox use to enable/disable 'My filters' list" }, "1pTrustMyFiltersLabel": { From d5e662a50fc68fe795ba9534d0ecf1fa712c2354 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 17 Oct 2024 12:45:04 -0400 Subject: [PATCH 374/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 9769226cad84b..e65c396f2941b 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.14 \ No newline at end of file +1.60.1.15 \ No newline at end of file From 12435d96ccc932b608626c0931b1e524f25f530f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 17 Oct 2024 13:05:37 -0400 Subject: [PATCH 375/553] 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 79c5afb38d0dd..fc072739944bc 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.14", + "version": "1.60.1.15", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b14/uBlock0_1.60.1b14.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b15/uBlock0_1.60.1b15.firefox.signed.xpi" } ] } From d4f15ca6357bdd744e6078e411153157d0aa430e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 19 Oct 2024 10:26:31 -0400 Subject: [PATCH 376/553] [mv3] Fix regression in extended filtering with some lists Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/236 Regression from: https://github.com/gorhill/uBlock/commit/58bfe4c846 Cosmetic- and scriptlet injection-based filters broke with filter lists using AdGuard's `[$domain=/.../]` syntax. Potentially affected filter lists: - AdGuard Chinese - AdGuard Turkish --- src/js/static-dnr-filtering.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/js/static-dnr-filtering.js b/src/js/static-dnr-filtering.js index ca66b861df619..2e87695bf593f 100644 --- a/src/js/static-dnr-filtering.js +++ b/src/js/static-dnr-filtering.js @@ -19,12 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - -/******************************************************************************/ - -import staticNetFilteringEngine from './static-net-filtering.js'; -import { LineIterator } from './text-utils.js'; import * as sfp from './static-filtering-parser.js'; import { @@ -32,6 +26,9 @@ import { CompiledListWriter, } from './static-filtering-io.js'; +import { LineIterator } from './text-utils.js'; +import staticNetFilteringEngine from './static-net-filtering.js'; + /******************************************************************************/ // http://www.cse.yorku.ca/~oz/hash.html#djb2 @@ -47,13 +44,15 @@ const hashFromStr = (type, s) => { return hash & 0xFFFFFF; }; +const isRegex = hn => hn.startsWith('/') && hn.endsWith('/'); + /******************************************************************************/ // Copied from cosmetic-filter.js for the time being to avoid unwanted // dependencies const rePlainSelector = /^[#.][\w\\-]+/; -const rePlainSelectorEx = /^[^#.\[(]+([#.][\w-]+)|([#.][\w-]+)$/; +const rePlainSelectorEx = /^[^#.[(]+([#.][\w-]+)|([#.][\w-]+)$/; const rePlainSelectorEscaped = /^[#.](?:\\[0-9A-Fa-f]+ |\\.|\w|-)+/; const reEscapeSequence = /\\([0-9A-Fa-f]+ |.)/g; @@ -106,6 +105,7 @@ function addExtendedToDNR(context, parser) { for ( const { hn, not, bad } of parser.getExtFilterDomainIterator() ) { if ( bad ) { continue; } if ( exception ) { continue; } + if ( isRegex(hn) ) { continue; } let details = context.scriptletFilters.get(argsToken); if ( details === undefined ) { context.scriptletFilters.set(argsToken, details = { args }); @@ -163,6 +163,7 @@ function addExtendedToDNR(context, parser) { }; for ( const { hn, not, bad } of parser.getExtFilterDomainIterator() ) { if ( bad ) { continue; } + if ( isRegex(hn) ) { continue; } if ( not ) { if ( rule.condition.excludedInitiatorDomains === undefined ) { rule.condition.excludedInitiatorDomains = []; @@ -235,6 +236,7 @@ function addExtendedToDNR(context, parser) { } for ( const { hn, not, bad } of parser.getExtFilterDomainIterator() ) { if ( bad ) { continue; } + if ( isRegex(hn) ) { continue; } let { compiled, exception, raw } = parser.result; if ( exception ) { continue; } let rejected; From b3408a46d16ebe5a4e001c007d63705c545a66fc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 19 Oct 2024 12:09:48 -0400 Subject: [PATCH 377/553] Fix spurious error message re. bootstrap() not being present Need `?.` before parenthesis for optional chaining to apply on method call. Related commit: https://github.com/gorhill/uBlock/commit/5133991f7e --- src/js/scriptlets/should-inject-contentscript.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/scriptlets/should-inject-contentscript.js b/src/js/scriptlets/should-inject-contentscript.js index df3378a88fb2c..2317e20688777 100644 --- a/src/js/scriptlets/should-inject-contentscript.js +++ b/src/js/scriptlets/should-inject-contentscript.js @@ -29,7 +29,7 @@ try { const status = vAPI.uBO !== true; if ( status === false && vAPI.bootstrap ) { - self.requestIdleCallback(( ) => vAPI?.bootstrap()); + self.requestIdleCallback(( ) => vAPI?.bootstrap?.()); } return status; } catch(ex) { From 2782b16ecf4e25414ca1b27a144535676a764740 Mon Sep 17 00:00:00 2001 From: Nadav Mermer Date: Thu, 4 Jul 2024 11:54:17 +0300 Subject: [PATCH 378/553] Allow rulesets enabled in manifest.json to stay enabled when finding language defaults --- platform/mv3/extension/js/ruleset-manager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mv3/extension/js/ruleset-manager.js b/platform/mv3/extension/js/ruleset-manager.js index 749a83c708c0a..7f7c6e1eefd2b 100644 --- a/platform/mv3/extension/js/ruleset-manager.js +++ b/platform/mv3/extension/js/ruleset-manager.js @@ -428,7 +428,7 @@ async function updateDynamicRules() { /******************************************************************************/ async function defaultRulesetsFromLanguage() { - const out = [ 'default' ]; + const out = await dnr.getEnabledRulesets(); const dropCountry = lang => { const pos = lang.indexOf('-'); From 2621c908c31b70a983dacf5482600c116ee35102 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 22 Oct 2024 19:49:29 -0400 Subject: [PATCH 379/553] Remove `64:ff9b:` as private network block Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3426 --- src/js/static-net-filtering.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 6a2f6c9c37418..23343acec60f2 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -3048,9 +3048,6 @@ class FilterIPAddress { if ( ipaddr.startsWith('::ffff:') === false ) { return false; } return this.reIPv6IPv4lan.test(ipaddr); } - if ( c0 === 0x36 /* 6 */ ) { - return ipaddr.startsWith('64:ff9b:'); - } if ( c0 === 0x66 /* f */ ) { return this.reIPv6local.test(ipaddr); } From 76041bdc6467d71bd54157656a210003214be516 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 22 Oct 2024 19:57:11 -0400 Subject: [PATCH 380/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41a61ca55926c..89ec03c7681b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Remove `64:ff9b:` as private network block](https://github.com/gorhill/uBlock/commit/2621c908c3) - [Ensure `urlskip=` redirects only to `https:`](https://github.com/gorhill/uBlock/commit/32f27c5131) - [Add support to `urlskip=` media resources](https://github.com/gorhill/uBlock/commit/ce9fc5dc14) - [Add `-uricomponent` to `urlskip=` option](https://github.com/gorhill/uBlock/commit/01eebffc1f) From c9ebe07d394685ac176da7f3d776a4850dea383e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 22 Oct 2024 19:57:45 -0400 Subject: [PATCH 381/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index e65c396f2941b..2cd675e52b1ae 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.15 \ No newline at end of file +1.60.1.16 \ No newline at end of file From 0851015d7d69100b05e903a472fb1bb8a785a179 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 22 Oct 2024 20:11:11 -0400 Subject: [PATCH 382/553] 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 fc072739944bc..c431e6bcb9016 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.15", + "version": "1.60.1.16", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b15/uBlock0_1.60.1b15.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b16/uBlock0_1.60.1b16.firefox.signed.xpi" } ] } From 11ca4a39239478e35605ec072fca140ac4c70d3b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 25 Oct 2024 19:12:08 -0400 Subject: [PATCH 383/553] Add `trusted-set-attr` scriptlet @trustedScriptlet trusted-set-attr @description Sets the specified attribute on the specified elements. This scriptlet runs once when the page loads then afterward on DOM mutations. Reference: https://github.com/AdguardTeam/Scriptlets/blob/master/wiki/about-trusted-scriptlets.md#-%EF%B8%8F-trusted-set-attr @param selector A CSS selector for the elements to target. @param attr The name of the attribute to modify. @param value The new value of the attribute. Since the scriptlet requires a trusted source, the value can be anything. ===== Additionally, start to move scriptlets into their own source files for easier maintenance and code review. --- assets/resources/run-at.js | 64 ++++++ assets/resources/safe-self.js | 218 ++++++++++++++++++++ assets/resources/scriptlets.js | 367 +++------------------------------ assets/resources/set-attr.js | 201 ++++++++++++++++++ tools/make-mv3.sh | 2 +- 5 files changed, 512 insertions(+), 340 deletions(-) create mode 100644 assets/resources/run-at.js create mode 100644 assets/resources/safe-self.js create mode 100644 assets/resources/set-attr.js diff --git a/assets/resources/run-at.js b/assets/resources/run-at.js new file mode 100644 index 0000000000000..f9971155ae91b --- /dev/null +++ b/assets/resources/run-at.js @@ -0,0 +1,64 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2019-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 + + The scriptlets below are meant to be injected only into a + web page context. +*/ + +import { safeSelf } from './safe-self.js'; + +/* eslint no-prototype-builtins: 0 */ + +/******************************************************************************/ + +export function runAt(fn, when) { + const intFromReadyState = state => { + const targets = { + 'loading': 1, 'asap': 1, + 'interactive': 2, 'end': 2, '2': 2, + 'complete': 3, 'idle': 3, '3': 3, + }; + const tokens = Array.isArray(state) ? state : [ state ]; + for ( const token of tokens ) { + const prop = `${token}`; + if ( targets.hasOwnProperty(prop) === false ) { continue; } + return targets[prop]; + } + return 0; + }; + const runAt = intFromReadyState(when); + if ( intFromReadyState(document.readyState) >= runAt ) { + fn(); return; + } + const onStateChange = ( ) => { + if ( intFromReadyState(document.readyState) < runAt ) { return; } + fn(); + safe.removeEventListener.apply(document, args); + }; + const safe = safeSelf(); + const args = [ 'readystatechange', onStateChange, { capture: true } ]; + safe.addEventListener.apply(document, args); +} +runAt.details = { + name: 'run-at.fn', + dependencies: [ + safeSelf, + ], +}; diff --git a/assets/resources/safe-self.js b/assets/resources/safe-self.js new file mode 100644 index 0000000000000..33f3201e7550e --- /dev/null +++ b/assets/resources/safe-self.js @@ -0,0 +1,218 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2019-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 + + The scriptlets below are meant to be injected only into a + web page context. +*/ + +/******************************************************************************/ + +// Externally added to the private namespace in which scriptlets execute. +/* global scriptletGlobals */ + +export function safeSelf() { + if ( scriptletGlobals.safeSelf ) { + return scriptletGlobals.safeSelf; + } + const self = globalThis; + const safe = { + 'Array_from': Array.from, + 'Error': self.Error, + 'Function_toStringFn': self.Function.prototype.toString, + 'Function_toString': thisArg => safe.Function_toStringFn.call(thisArg), + 'Math_floor': Math.floor, + 'Math_max': Math.max, + 'Math_min': Math.min, + 'Math_random': Math.random, + 'Object': Object, + 'Object_defineProperty': Object.defineProperty.bind(Object), + 'Object_defineProperties': Object.defineProperties.bind(Object), + 'Object_fromEntries': Object.fromEntries.bind(Object), + 'Object_getOwnPropertyDescriptor': Object.getOwnPropertyDescriptor.bind(Object), + 'RegExp': self.RegExp, + 'RegExp_test': self.RegExp.prototype.test, + 'RegExp_exec': self.RegExp.prototype.exec, + 'Request_clone': self.Request.prototype.clone, + 'String_fromCharCode': String.fromCharCode, + 'XMLHttpRequest': self.XMLHttpRequest, + 'addEventListener': self.EventTarget.prototype.addEventListener, + '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), + 'log': console.log.bind(console), + // Properties + logLevel: 0, + // Methods + makeLogPrefix(...args) { + return this.sendToLogger && `[${args.join(' \u205D ')}]` || ''; + }, + uboLog(...args) { + if ( this.sendToLogger === undefined ) { return; } + if ( args === undefined || args[0] === '' ) { return; } + return this.sendToLogger('info', ...args); + + }, + uboErr(...args) { + if ( this.sendToLogger === undefined ) { return; } + if ( args === undefined || args[0] === '' ) { return; } + return this.sendToLogger('error', ...args); + }, + escapeRegexChars(s) { + return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + }, + initPattern(pattern, options = {}) { + if ( pattern === '' ) { + return { matchAll: true, expect: true }; + } + const expect = (options.canNegate !== true || pattern.startsWith('!') === false); + if ( expect === false ) { + pattern = pattern.slice(1); + } + const match = /^\/(.+)\/([gimsu]*)$/.exec(pattern); + if ( match !== null ) { + return { + re: new this.RegExp( + match[1], + match[2] || options.flags + ), + expect, + }; + } + if ( options.flags !== undefined ) { + return { + re: new this.RegExp(this.escapeRegexChars(pattern), + options.flags + ), + expect, + }; + } + return { pattern, expect }; + }, + testPattern(details, haystack) { + if ( details.matchAll ) { return true; } + if ( details.re ) { + return this.RegExp_test.call(details.re, haystack) === details.expect; + } + return haystack.includes(details.pattern) === details.expect; + }, + patternToRegex(pattern, flags = undefined, verbatim = false) { + if ( pattern === '' ) { return /^/; } + const match = /^\/(.+)\/([gimsu]*)$/.exec(pattern); + if ( match === null ) { + const reStr = this.escapeRegexChars(pattern); + return new RegExp(verbatim ? `^${reStr}$` : reStr, flags); + } + try { + return new RegExp(match[1], match[2] || undefined); + } + catch(ex) { + } + 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 ]); + } + return out; + }, []); + return this.Object_fromEntries(entries); + }, + onIdle(fn, options) { + if ( self.requestIdleCallback ) { + return self.requestIdleCallback(fn, options); + } + return self.requestAnimationFrame(fn); + }, + offIdle(id) { + if ( self.requestIdleCallback ) { + return self.cancelIdleCallback(id); + } + return self.cancelAnimationFrame(id); + } + }; + scriptletGlobals.safeSelf = safe; + if ( scriptletGlobals.bcSecret === undefined ) { return safe; } + // This is executed only when the logger is opened + safe.logLevel = scriptletGlobals.logLevel || 1; + let lastLogType = ''; + let lastLogText = ''; + let lastLogTime = 0; + safe.toLogText = (type, ...args) => { + if ( args.length === 0 ) { return; } + const text = `[${document.location.hostname || document.location.href}]${args.join(' ')}`; + if ( text === lastLogText && type === lastLogType ) { + if ( (Date.now() - lastLogTime) < 5000 ) { return; } + } + lastLogType = type; + lastLogText = text; + lastLogTime = Date.now(); + return text; + }; + try { + const bc = new self.BroadcastChannel(scriptletGlobals.bcSecret); + let bcBuffer = []; + safe.sendToLogger = (type, ...args) => { + const text = safe.toLogText(type, ...args); + if ( text === undefined ) { return; } + if ( bcBuffer === undefined ) { + return bc.postMessage({ what: 'messageToLogger', type, text }); + } + bcBuffer.push({ type, text }); + }; + bc.onmessage = ev => { + const msg = ev.data; + switch ( msg ) { + case 'iamready!': + if ( bcBuffer === undefined ) { break; } + bcBuffer.forEach(({ type, text }) => + bc.postMessage({ what: 'messageToLogger', type, text }) + ); + bcBuffer = undefined; + break; + case 'setScriptletLogLevelToOne': + safe.logLevel = 1; + break; + case 'setScriptletLogLevelToTwo': + safe.logLevel = 2; + break; + } + }; + bc.postMessage('areyouready?'); + } catch(_) { + safe.sendToLogger = (type, ...args) => { + const text = safe.toLogText(type, ...args); + if ( text === undefined ) { return; } + safe.log(`uBO ${text}`); + }; + } + return safe; +} +safeSelf.details = { + name: 'safe-self.fn', +}; diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 3a7511ba9d187..1a835f7279f7f 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -22,6 +22,10 @@ web page context. */ +import { setAttr, setAttrFn, trustedSetAttr } from './set-attr.js'; +import { runAt } from './run-at.js'; +import { safeSelf } from './safe-self.js'; + /* eslint no-prototype-builtins: 0 */ // Externally added to the private namespace in which scriptlets execute. @@ -29,6 +33,30 @@ export const builtinScriptlets = []; +/******************************************************************************/ + +// Register scriptlets declared in other files. + +const registerScriptlet = fn => { + const details = fn.details; + if ( typeof details !== 'object' ) { + throw new ReferenceError('Unknown scriptlet function'); + } + details.fn = fn; + if ( Array.isArray(details.dependencies) ) { + details.dependencies.forEach((fn, i, array) => { + if ( typeof fn !== 'function' ) { return; } + array[i] = fn.details.name; + }); + } + builtinScriptlets.push(details); +}; + +registerScriptlet(safeSelf); +registerScriptlet(setAttrFn); +registerScriptlet(setAttr); +registerScriptlet(trustedSetAttr); + /******************************************************************************* Helper functions @@ -37,199 +65,6 @@ export const builtinScriptlets = []; *******************************************************************************/ -builtinScriptlets.push({ - name: 'safe-self.fn', - fn: safeSelf, -}); -function safeSelf() { - if ( scriptletGlobals.safeSelf ) { - return scriptletGlobals.safeSelf; - } - const self = globalThis; - const safe = { - 'Array_from': Array.from, - 'Error': self.Error, - 'Function_toStringFn': self.Function.prototype.toString, - 'Function_toString': thisArg => safe.Function_toStringFn.call(thisArg), - 'Math_floor': Math.floor, - 'Math_max': Math.max, - 'Math_min': Math.min, - 'Math_random': Math.random, - 'Object': Object, - 'Object_defineProperty': Object.defineProperty.bind(Object), - 'Object_defineProperties': Object.defineProperties.bind(Object), - 'Object_fromEntries': Object.fromEntries.bind(Object), - 'Object_getOwnPropertyDescriptor': Object.getOwnPropertyDescriptor.bind(Object), - 'RegExp': self.RegExp, - 'RegExp_test': self.RegExp.prototype.test, - 'RegExp_exec': self.RegExp.prototype.exec, - 'Request_clone': self.Request.prototype.clone, - 'String_fromCharCode': String.fromCharCode, - 'XMLHttpRequest': self.XMLHttpRequest, - 'addEventListener': self.EventTarget.prototype.addEventListener, - '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), - 'log': console.log.bind(console), - // Properties - logLevel: 0, - // Methods - makeLogPrefix(...args) { - return this.sendToLogger && `[${args.join(' \u205D ')}]` || ''; - }, - uboLog(...args) { - if ( this.sendToLogger === undefined ) { return; } - if ( args === undefined || args[0] === '' ) { return; } - return this.sendToLogger('info', ...args); - - }, - uboErr(...args) { - if ( this.sendToLogger === undefined ) { return; } - if ( args === undefined || args[0] === '' ) { return; } - return this.sendToLogger('error', ...args); - }, - escapeRegexChars(s) { - return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - }, - initPattern(pattern, options = {}) { - if ( pattern === '' ) { - return { matchAll: true, expect: true }; - } - const expect = (options.canNegate !== true || pattern.startsWith('!') === false); - if ( expect === false ) { - pattern = pattern.slice(1); - } - const match = /^\/(.+)\/([gimsu]*)$/.exec(pattern); - if ( match !== null ) { - return { - re: new this.RegExp( - match[1], - match[2] || options.flags - ), - expect, - }; - } - if ( options.flags !== undefined ) { - return { - re: new this.RegExp(this.escapeRegexChars(pattern), - options.flags - ), - expect, - }; - } - return { pattern, expect }; - }, - testPattern(details, haystack) { - if ( details.matchAll ) { return true; } - if ( details.re ) { - return this.RegExp_test.call(details.re, haystack) === details.expect; - } - return haystack.includes(details.pattern) === details.expect; - }, - patternToRegex(pattern, flags = undefined, verbatim = false) { - if ( pattern === '' ) { return /^/; } - const match = /^\/(.+)\/([gimsu]*)$/.exec(pattern); - if ( match === null ) { - const reStr = this.escapeRegexChars(pattern); - return new RegExp(verbatim ? `^${reStr}$` : reStr, flags); - } - try { - return new RegExp(match[1], match[2] || undefined); - } - catch(ex) { - } - 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 ]); - } - return out; - }, []); - return this.Object_fromEntries(entries); - }, - onIdle(fn, options) { - if ( self.requestIdleCallback ) { - return self.requestIdleCallback(fn, options); - } - return self.requestAnimationFrame(fn); - }, - offIdle(id) { - if ( self.requestIdleCallback ) { - return self.cancelIdleCallback(id); - } - return self.cancelAnimationFrame(id); - } - }; - scriptletGlobals.safeSelf = safe; - if ( scriptletGlobals.bcSecret === undefined ) { return safe; } - // This is executed only when the logger is opened - safe.logLevel = scriptletGlobals.logLevel || 1; - let lastLogType = ''; - let lastLogText = ''; - let lastLogTime = 0; - safe.toLogText = (type, ...args) => { - if ( args.length === 0 ) { return; } - const text = `[${document.location.hostname || document.location.href}]${args.join(' ')}`; - if ( text === lastLogText && type === lastLogType ) { - if ( (Date.now() - lastLogTime) < 5000 ) { return; } - } - lastLogType = type; - lastLogText = text; - lastLogTime = Date.now(); - return text; - }; - try { - const bc = new self.BroadcastChannel(scriptletGlobals.bcSecret); - let bcBuffer = []; - safe.sendToLogger = (type, ...args) => { - const text = safe.toLogText(type, ...args); - if ( text === undefined ) { return; } - if ( bcBuffer === undefined ) { - return bc.postMessage({ what: 'messageToLogger', type, text }); - } - bcBuffer.push({ type, text }); - }; - bc.onmessage = ev => { - const msg = ev.data; - switch ( msg ) { - case 'iamready!': - if ( bcBuffer === undefined ) { break; } - bcBuffer.forEach(({ type, text }) => - bc.postMessage({ what: 'messageToLogger', type, text }) - ); - bcBuffer = undefined; - break; - case 'setScriptletLogLevelToOne': - safe.logLevel = 1; - break; - case 'setScriptletLogLevelToTwo': - safe.logLevel = 2; - break; - } - }; - bc.postMessage('areyouready?'); - } catch(_) { - safe.sendToLogger = (type, ...args) => { - const text = safe.toLogText(type, ...args); - if ( text === undefined ) { return; } - safe.log(`uBO ${text}`); - }; - } - return safe; -} - -/******************************************************************************/ - builtinScriptlets.push({ name: 'get-random-token.fn', fn: getRandomToken, @@ -283,34 +118,6 @@ builtinScriptlets.push({ 'safe-self.fn', ], }); -function runAt(fn, when) { - const intFromReadyState = state => { - const targets = { - 'loading': 1, 'asap': 1, - 'interactive': 2, 'end': 2, '2': 2, - 'complete': 3, 'idle': 3, '3': 3, - }; - const tokens = Array.isArray(state) ? state : [ state ]; - for ( const token of tokens ) { - const prop = `${token}`; - if ( targets.hasOwnProperty(prop) === false ) { continue; } - return targets[prop]; - } - return 0; - }; - const runAt = intFromReadyState(when); - if ( intFromReadyState(document.readyState) >= runAt ) { - fn(); return; - } - const onStateChange = ( ) => { - if ( intFromReadyState(document.readyState) < runAt ) { return; } - fn(); - safe.removeEventListener.apply(document, args); - }; - const safe = safeSelf(); - const args = [ 'readystatechange', onStateChange, { capture: true } ]; - safe.addEventListener.apply(document, args); -} /******************************************************************************/ @@ -4119,124 +3926,6 @@ function setSessionStorageItem(key = '', value = '') { setLocalStorageItemFn('session', false, key, value); } -/******************************************************************************* - * - * @scriptlet set-attr - * - * @description - * Sets the specified attribute on the specified elements. This scriptlet runs - * once when the page loads then afterward on DOM mutations. - - * Reference: https://github.com/AdguardTeam/Scriptlets/blob/master/src/scriptlets/set-attr.js - * - * ### Syntax - * - * ```text - * example.org##+js(set-attr, selector, attr [, value]) - * ``` - * - * - `selector`: CSS selector of DOM elements for which the attribute `attr` - * must be modified. - * - `attr`: the name of the attribute to modify - * - `value`: the value to assign to the target attribute. Possible values: - * - `''`: empty string (default) - * - `true` - * - `false` - * - positive decimal integer 0 <= value < 32768 - * - `[other]`: copy the value from attribute `other` on the same element - * */ - -builtinScriptlets.push({ - name: 'set-attr.js', - fn: setAttr, - world: 'ISOLATED', - dependencies: [ - 'run-at.fn', - 'safe-self.fn', - ], -}); -function setAttr( - selector = '', - attr = '', - value = '' -) { - if ( selector === '' ) { return; } - if ( attr === '' ) { return; } - - const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('set-attr', attr, value); - const validValues = [ '', 'false', 'true' ]; - let copyFrom = ''; - - if ( validValues.includes(value.toLowerCase()) === false ) { - if ( /^\d+$/.test(value) ) { - const n = parseInt(value, 10); - if ( n >= 32768 ) { return; } - value = `${n}`; - } else if ( /^\[.+\]$/.test(value) ) { - copyFrom = value.slice(1, -1); - } else { - return; - } - } - - const extractValue = elem => { - if ( copyFrom !== '' ) { - return elem.getAttribute(copyFrom) || ''; - } - return value; - }; - - const applySetAttr = ( ) => { - const elems = []; - try { - elems.push(...document.querySelectorAll(selector)); - } - catch(ex) { - return false; - } - for ( const elem of elems ) { - const before = elem.getAttribute(attr); - const after = extractValue(elem); - if ( after === before ) { continue; } - if ( after !== '' && /^on/i.test(attr) ) { - if ( attr.toLowerCase() in elem ) { continue; } - } - elem.setAttribute(attr, after); - safe.uboLog(logPrefix, `${attr}="${after}"`); - } - return true; - }; - let observer, timer; - const onDomChanged = mutations => { - if ( timer !== undefined ) { return; } - let shouldWork = false; - for ( const mutation of mutations ) { - if ( mutation.addedNodes.length === 0 ) { continue; } - for ( const node of mutation.addedNodes ) { - if ( node.nodeType !== 1 ) { continue; } - shouldWork = true; - break; - } - if ( shouldWork ) { break; } - } - if ( shouldWork === false ) { return; } - timer = self.requestAnimationFrame(( ) => { - timer = undefined; - applySetAttr(); - }); - }; - const start = ( ) => { - if ( applySetAttr() === false ) { return; } - observer = new MutationObserver(onDomChanged); - observer.observe(document.body, { - subtree: true, - childList: true, - }); - }; - runAt(( ) => { start(); }, 'idle'); -} - /******************************************************************************* * * @scriptlet prevent-canvas diff --git a/assets/resources/set-attr.js b/assets/resources/set-attr.js new file mode 100644 index 0000000000000..cb90b51fae153 --- /dev/null +++ b/assets/resources/set-attr.js @@ -0,0 +1,201 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2019-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 + + The scriptlets below are meant to be injected only into a + web page context. +*/ + +import { runAt } from './run-at.js'; +import { safeSelf } from './safe-self.js'; + +/******************************************************************************/ + +export function setAttrFn( + logPrefix, + selector = '', + attr = '', + value = '' +) { + if ( selector === '' ) { return; } + if ( attr === '' ) { return; } + + const safe = safeSelf(); + const copyFrom = /^\[.+\]$/.test(value) + ? value.slice(1, -1) + : ''; + + const extractValue = elem => copyFrom !== '' + ? elem.getAttribute(copyFrom) || '' + : value; + + const applySetAttr = ( ) => { + let elems; + try { + elems = document.querySelectorAll(selector); + } catch(_) { + return false; + } + for ( const elem of elems ) { + const before = elem.getAttribute(attr); + const after = extractValue(elem); + if ( after === before ) { continue; } + if ( after !== '' && /^on/i.test(attr) ) { + if ( attr.toLowerCase() in elem ) { continue; } + } + elem.setAttribute(attr, after); + safe.uboLog(logPrefix, `${attr}="${after}"`); + } + return true; + }; + + let observer, timer; + const onDomChanged = mutations => { + if ( timer !== undefined ) { return; } + let shouldWork = false; + for ( const mutation of mutations ) { + if ( mutation.addedNodes.length === 0 ) { continue; } + for ( const node of mutation.addedNodes ) { + if ( node.nodeType !== 1 ) { continue; } + shouldWork = true; + break; + } + if ( shouldWork ) { break; } + } + if ( shouldWork === false ) { return; } + timer = self.requestAnimationFrame(( ) => { + timer = undefined; + applySetAttr(); + }); + }; + + const start = ( ) => { + if ( applySetAttr() === false ) { return; } + observer = new MutationObserver(onDomChanged); + observer.observe(document.body, { + subtree: true, + childList: true, + }); + }; + runAt(( ) => { start(); }, 'idle'); +} +setAttrFn.details = { + name: 'set-attr.fn', + dependencies: [ + runAt, + safeSelf, + ], +}; + +/** + * @scriptlet set-attr + * + * @description + * Sets the specified attribute on the specified elements. This scriptlet runs + * once when the page loads then afterward on DOM mutations. + * + * Reference: https://github.com/AdguardTeam/Scriptlets/blob/master/src/scriptlets/set-attr.js + * + * @param selector + * A CSS selector for the elements to target. + * + * @param attr + * The name of the attribute to modify. + * + * @param value + * The new value of the attribute. Supported values: + * - `''`: empty string (default) + * - `true` + * - `false` + * - positive decimal integer 0 <= value < 32768 + * - `[other]`: copy the value from attribute `other` on the same element + * + * */ + +export function setAttr( + selector = '', + attr = '', + value = '' +) { + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('set-attr', selector, attr, value); + const validValues = [ '', 'false', 'true' ]; + + if ( validValues.includes(value.toLowerCase()) === false ) { + if ( /^\d+$/.test(value) ) { + const n = parseInt(value, 10); + if ( n >= 32768 ) { return; } + value = `${n}`; + } else if ( /^\[.+\]$/.test(value) === false ) { + return; + } + } + + setAttrFn(logPrefix, selector, attr, value); +} +setAttr.details = { + name: 'set-attr.js', + dependencies: [ + safeSelf, + setAttrFn, + ], + world: 'ISOLATED', +}; + +/** + * @trustedScriptlet trusted-set-attr + * + * @description + * Sets the specified attribute on the specified elements. This scriptlet runs + * once when the page loads then afterward on DOM mutations. + * + * Reference: https://github.com/AdguardTeam/Scriptlets/blob/master/wiki/about-trusted-scriptlets.md#-%EF%B8%8F-trusted-set-attr + * + * @param selector + * A CSS selector for the elements to target. + * + * @param attr + * The name of the attribute to modify. + * + * @param value + * The new value of the attribute. Since the scriptlet requires a trusted + * source, the value can be anything. + * + * */ + +export function trustedSetAttr( + selector = '', + attr = '', + value = '' +) { + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('trusted-set-attr', selector, attr, value); + setAttrFn(logPrefix, selector, attr, value); +} +trustedSetAttr.details = { + name: 'trusted-set-attr.js', + requiresTrust: true, + dependencies: [ + safeSelf, + setAttrFn, + ], + world: 'ISOLATED', +}; + +/******************************************************************************/ diff --git a/tools/make-mv3.sh b/tools/make-mv3.sh index a4c20c48e5737..3bb3c9ce4ae67 100755 --- a/tools/make-mv3.sh +++ b/tools/make-mv3.sh @@ -109,7 +109,7 @@ if [ "$QUICK" != "yes" ]; then cp platform/mv3/*.mjs "$TMPDIR"/ cp platform/mv3/extension/js/utils.js "$TMPDIR"/js/ cp "$UBO_DIR"/assets/assets.json "$TMPDIR"/ - cp "$UBO_DIR"/assets/resources/scriptlets.js "$TMPDIR"/ + cp "$UBO_DIR"/assets/resources/*.js "$TMPDIR"/ cp -R platform/mv3/scriptlets "$TMPDIR"/ mkdir -p "$TMPDIR"/web_accessible_resources cp "$UBO_DIR"/src/web_accessible_resources/* "$TMPDIR"/web_accessible_resources/ From 033314ed342a67d5b49a0731efa0a6c62ce7e49d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 25 Oct 2024 19:25:44 -0400 Subject: [PATCH 384/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89ec03c7681b9..ab2d6a45d0c45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add `trusted-set-attr` scriptlet](https://github.com/gorhill/uBlock/commit/11ca4a3923) - [Remove `64:ff9b:` as private network block](https://github.com/gorhill/uBlock/commit/2621c908c3) - [Ensure `urlskip=` redirects only to `https:`](https://github.com/gorhill/uBlock/commit/32f27c5131) - [Add support to `urlskip=` media resources](https://github.com/gorhill/uBlock/commit/ce9fc5dc14) From d49062db089cd75019db776570b963337e5af5a1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 25 Oct 2024 19:25:57 -0400 Subject: [PATCH 385/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 2cd675e52b1ae..507682f248c74 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.16 \ No newline at end of file +1.60.1.17 \ No newline at end of file From 50785ea38b08cefa5736df0a450ab2b528efa8fa Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 25 Oct 2024 19:31:28 -0400 Subject: [PATCH 386/553] 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 c431e6bcb9016..52a035bb6f809 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.16", + "version": "1.60.1.17", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b16/uBlock0_1.60.1b16.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b17/uBlock0_1.60.1b17.firefox.signed.xpi" } ] } From d04dc4c767721fb13d91a67cb62ecad9b9219103 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 26 Oct 2024 12:50:40 -0400 Subject: [PATCH 387/553] Add `-blocked` directive to `urlskip=` option Potentially breaking change: `urlskip=` option will no longer apply by default to blocked network requests, only network requests which are not blocked can be skipped through a `urlskip=` filter. The new `urlskip=` directive `-blocked` can be used to explicitly allow a `urlskip=` filter to also apply to blocked network requests. Example: given the filter `||example.com^`, the filter: ||example.com/path/to/tracker$urlskip=?url Will not prevent strict-blocking when navigating to: https://example.com/path/to/tracker?url=https://example.org/ However, the filter: ||example.com/path/to/tracker$urlskip=-blocked ?url Will cause the strict-blocking to be ignored and allow navigation to proceed to the URL extracted as a result of applying the `urlskip=` filter: https://example.org/ Related discussion: https://github.com/uBlockOrigin/uBlock-issues/issues/3206#issuecomment-2439627386 --- src/js/benchmarks.js | 4 ++-- src/js/pagestore.js | 2 +- src/js/static-net-filtering.js | 20 +++++++++++++++++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/js/benchmarks.js b/src/js/benchmarks.js index 8603b8737a89c..59996b0f63746 100644 --- a/src/js/benchmarks.js +++ b/src/js/benchmarks.js @@ -191,7 +191,7 @@ export async function benchmarkStaticNetFiltering(options = {}) { removeparamCount += 1; } } - if ( sfne.urlSkip(fctxt) ) { + if ( sfne.urlSkip(fctxt, false) ) { urlskipCount += 1; } if ( fctxt.isDocument() ) { @@ -210,7 +210,7 @@ export async function benchmarkStaticNetFiltering(options = {}) { if ( sfne.redirectRequest(redirectEngine, fctxt) ) { redirectCount += 1; } - if ( fctxt.isRootDocument() && sfne.urlSkip(fctxt) ) { + if ( fctxt.isRootDocument() && sfne.urlSkip(fctxt, true) ) { urlskipCount += 1; } } diff --git a/src/js/pagestore.js b/src/js/pagestore.js index e23f0950ec8f3..e6ca91f9a3cea 100644 --- a/src/js/pagestore.js +++ b/src/js/pagestore.js @@ -943,7 +943,7 @@ const PageStore = class { staticNetFilteringEngine.filterQuery(fctxt, directives); } if ( this.urlSkippableResources.has(fctxt.itype) ) { - staticNetFilteringEngine.urlSkip(fctxt, directives); + staticNetFilteringEngine.urlSkip(fctxt, false, directives); } if ( directives.length === 0 ) { return; } if ( logger.enabled !== true ) { return; } diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 23343acec60f2..71b67e30c6a21 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5405,6 +5405,9 @@ StaticNetFilteringEngine.prototype.transformRequest = function(fctxt, out = []) * * `-uricomponent`: decode the current string as a URI encoded string. * + * `-blocked`: allow the redirection of blocked requests. By default, blocked + * requests can't by urlskip'ed. + * * At any given step, the currently extracted string may not necessarily be * a valid URL, and more transformation steps may be needed to obtain a valid * URL once all the steps are applied. @@ -5423,7 +5426,11 @@ StaticNetFilteringEngine.prototype.transformRequest = function(fctxt, out = []) * * */ -StaticNetFilteringEngine.prototype.urlSkip = function(fctxt, out = []) { +StaticNetFilteringEngine.prototype.urlSkip = function( + fctxt, + blocked, + out = [] +) { if ( fctxt.redirectURL !== undefined ) { return; } const directives = this.matchAndFetchModifiers(fctxt, 'urlskip'); if ( directives === undefined ) { return; } @@ -5435,7 +5442,7 @@ StaticNetFilteringEngine.prototype.urlSkip = function(fctxt, out = []) { const urlin = fctxt.url; const value = directive.value; const steps = value.includes(' ') && value.split(/ +/) || [ value ]; - const urlout = urlSkip(directive, urlin, steps); + const urlout = urlSkip(directive, urlin, blocked, steps); if ( urlout === undefined ) { continue; } if ( urlout === urlin ) { continue; } fctxt.redirectURL = urlout; @@ -5446,8 +5453,9 @@ StaticNetFilteringEngine.prototype.urlSkip = function(fctxt, out = []) { return out; }; -function urlSkip(directive, url, steps) { +function urlSkip(directive, url, blocked, steps) { try { + let redirectBlocked = false; let urlout = url; for ( const step of steps ) { const urlin = urlout; @@ -5481,6 +5489,11 @@ function urlSkip(directive, url, steps) { urlout = self.decodeURIComponent(urlin); continue; } + // Enable skip of blocked requests + if ( step === '-blocked' ) { + redirectBlocked = true; + continue; + } } // Regex extraction from first capture group if ( c0 === 0x2F ) { // / @@ -5507,6 +5520,7 @@ function urlSkip(directive, url, steps) { } const urlfinal = new URL(urlout); if ( urlfinal.protocol !== 'https:' ) { return; } + if ( blocked && redirectBlocked !== true ) { return; } return urlout; } catch(x) { } From 4cb92102c77947c9000b05b81c01d9e7b65e4801 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 26 Oct 2024 14:03:58 -0400 Subject: [PATCH 388/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab2d6a45d0c45..acc25b034ab46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Add `-blocked` directive to `urlskip=` option](https://github.com/gorhill/uBlock/commit/d04dc4c767) - [Add `trusted-set-attr` scriptlet](https://github.com/gorhill/uBlock/commit/11ca4a3923) - [Remove `64:ff9b:` as private network block](https://github.com/gorhill/uBlock/commit/2621c908c3) - [Ensure `urlskip=` redirects only to `https:`](https://github.com/gorhill/uBlock/commit/32f27c5131) From 87716cf7814e92398e7544c2da7930302ab52119 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 26 Oct 2024 14:04:55 -0400 Subject: [PATCH 389/553] New revision for stable release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 507682f248c74..3421f2601185b 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.17 \ No newline at end of file +1.60.1.100 \ No newline at end of file From 6aa9391c8d853c84a61579c692706027821a2ccf Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 26 Oct 2024 14:31:33 -0400 Subject: [PATCH 390/553] 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 52a035bb6f809..f404906cd32d3 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.17", + "version": "1.60.1.100", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1b17/uBlock0_1.60.1b17.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1rc0/uBlock0_1.60.1rc0.firefox.signed.xpi" } ] } From 20b54185fac6f56ea871cc81554ee7ce8521d606 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 27 Oct 2024 14:24:08 -0400 Subject: [PATCH 391/553] Offer ability to skip redirects in strict-blocked page Related discussion: https://github.com/uBlockOrigin/uBlock-issues/issues/3206#issuecomment-2439639215 If a strict-blocked page matches a `urlskip=` filter, the page will show the user the destination URL as a result of applying the `urlskip` filter should they choose to proceed with the navigation. --- src/_locales/en/messages.json | 4 ++++ src/css/document-blocked.css | 19 ++++++++++++++++++- src/document-blocked.html | 16 +++++++++------- src/js/document-blocked.js | 24 ++++++++++++++++++++---- src/js/i18n.js | 6 ++---- src/js/pagestore.js | 4 ++-- src/js/traffic.js | 12 ++++++++---- 7 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 433ff60772a69..de0a8af1500eb 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -1193,6 +1193,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Export to cloud storage", "description": "tooltip" diff --git a/src/css/document-blocked.css b/src/css/document-blocked.css index 62d49216a5b03..e0504230a7862 100644 --- a/src/css/document-blocked.css +++ b/src/css/document-blocked.css @@ -28,12 +28,18 @@ body { } #rootContainer { - width: min(100vw, 640px); + width: min(100%, 640px); } #rootContainer > * { margin: 0 0 var(--default-gap-xxlarge) 0; } +:root.mobile #rootContainer > * { + margin-bottom: var(--default-gap-xlarge); + } +p { + margin: 0.5em 0; + } a { text-decoration: none; } @@ -45,8 +51,12 @@ a { color: var(--accent-surface-1); fill: var(--accent-surface-1); font-size: 96px; + line-height: 1; width: 100%; } +:root.mobile #warningSign { + font-size: 64px; + } #theURL { color: var(--ink-2); padding: 0; @@ -120,6 +130,13 @@ body[dir="rtl"] #toggleParse { padding-inline-start: var(--default-gap-xsmall); } +#urlskip a { + display: block; + overflow-x: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + #actionContainer { display: flex; justify-content: space-between; diff --git a/src/document-blocked.html b/src/document-blocked.html index 80a45461afd7f..56d6a95a42b9d 100644 --- a/src/document-blocked.html +++ b/src/document-blocked.html @@ -33,6 +33,9 @@
+ +
@@ -42,13 +45,12 @@
- - +
+ diff --git a/src/js/document-blocked.js b/src/js/document-blocked.js index 59a6bc85a3533..82511436c1ceb 100644 --- a/src/js/document-blocked.js +++ b/src/js/document-blocked.js @@ -19,10 +19,8 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - -import { i18n, i18n$ } from './i18n.js'; import { dom, qs$ } from './dom.js'; +import { i18n, i18n$ } from './i18n.js'; /******************************************************************************/ @@ -47,7 +45,7 @@ let details = {}; let lists; for ( const rawFilter in response ) { - if ( response.hasOwnProperty(rawFilter) ) { + if ( Object.prototype.hasOwnProperty.call(response, rawFilter) ) { lists = response[rawFilter]; break; } @@ -80,6 +78,24 @@ let details = {}; dom.text('#theURL > p > span:first-of-type', details.url); dom.text('#why', details.fs); +if ( typeof details.to === 'string' && details.to.length !== 0 ) { + const fragment = new DocumentFragment(); + const text = i18n$('docblockedRedirectPrompt'); + const linkPlaceholder = '{{url}}'; + let pos = text.indexOf(linkPlaceholder); + if ( pos !== -1 ) { + const link = document.createElement('a'); + link.href = link.textContent = details.to; + fragment.append( + text.slice(0, pos), + link, + text.slice(pos + linkPlaceholder.length) + ); + qs$('#urlskip').append(fragment); + dom.attr('#urlskip', 'hidden', null); + } +} + /******************************************************************************/ // https://github.com/gorhill/uBlock/issues/691 diff --git a/src/js/i18n.js b/src/js/i18n.js index 18c7e1456cd43..6ce3b5f96284c 100644 --- a/src/js/i18n.js +++ b/src/js/i18n.js @@ -19,8 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - /******************************************************************************/ const i18n = @@ -168,14 +166,14 @@ if ( isBackgroundProcess !== true ) { const re = /\{\{\w+\}\}/g; let textout = ''; for (;;) { - let match = re.exec(textin); + const match = re.exec(textin); if ( match === null ) { textout += textin; break; } textout += textin.slice(0, match.index); let prop = match[0].slice(2, -2); - if ( dict.hasOwnProperty(prop) ) { + if ( Object.prototype.hasOwnProperty.call(dict, prop) ) { textout += dict[prop].replace(//g, '>'); } else { diff --git a/src/js/pagestore.js b/src/js/pagestore.js index e6ca91f9a3cea..4b19f3975493c 100644 --- a/src/js/pagestore.js +++ b/src/js/pagestore.js @@ -955,8 +955,8 @@ const PageStore = class { }); } - skipMainDocument(fctxt) { - const directives = staticNetFilteringEngine.urlSkip(fctxt); + skipMainDocument(fctxt, blocked) { + const directives = staticNetFilteringEngine.urlSkip(fctxt, blocked); if ( directives === undefined ) { return; } if ( logger.enabled !== true ) { return; } fctxt.pushFilters(directives.map(a => a.logData())); diff --git a/src/js/traffic.js b/src/js/traffic.js index eab93be742432..894554a804f70 100644 --- a/src/js/traffic.js +++ b/src/js/traffic.js @@ -197,7 +197,7 @@ const onBeforeRootFrameRequest = function(fctxt) { if ( result !== 1 ) { pageStore.redirectNonBlockedRequest(fctxt); } else { - pageStore.skipMainDocument(fctxt); + pageStore.skipMainDocument(fctxt, true); } } @@ -216,16 +216,20 @@ const onBeforeRootFrameRequest = function(fctxt) { if ( result !== 1 ) { return; } // No log data means no strict blocking (because we need to report why - // the blocking occurs. + // the blocking occurs if ( logData === undefined ) { return; } // Blocked + // Find out the URL navigated to should the document not be strict-blocked + pageStore.skipMainDocument(fctxt, false); + const query = encodeURIComponent(JSON.stringify({ url: requestURL, - hn: requestHostname, dn: fctxt.getDomain() || requestHostname, - fs: logData.raw + fs: logData.raw, + hn: requestHostname, + to: fctxt.redirectURL || '', })); vAPI.tabs.replace( From 9b3e94b23ff1023c5b61344732ffd845b35df81e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 27 Oct 2024 14:46:25 -0400 Subject: [PATCH 392/553] Import translation work from https://crowdin.com/project/ --- platform/mv3/description/webstore.ka.txt | 2 +- .../mv3/extension/_locales/ar/messages.json | 2 +- .../mv3/extension/_locales/id/messages.json | 34 +++++++++--------- .../mv3/extension/_locales/ka/messages.json | 36 +++++++++---------- .../mv3/extension/_locales/pa/messages.json | 18 +++++----- .../mv3/extension/_locales/vi/messages.json | 6 ++-- src/_locales/ka/messages.json | 2 +- src/_locales/pa/messages.json | 2 +- src/_locales/sv/messages.json | 2 +- src/_locales/uk/messages.json | 6 ++-- 10 files changed, 55 insertions(+), 55 deletions(-) diff --git a/platform/mv3/description/webstore.ka.txt b/platform/mv3/description/webstore.ka.txt index 7fb68dd2508b8..e659ad87953ee 100644 --- a/platform/mv3/description/webstore.ka.txt +++ b/platform/mv3/description/webstore.ka.txt @@ -7,7 +7,7 @@ uBO Lite (uBOL) *ნებართვებისგან თავისუ - EasyPrivacy - Peter Lowe – სარეკლამო სერვერების სია -You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +შეგიძლიათ სხვა კრებულებიც აამოქმედოთ პარამეტრების გვერდიდან -- დაწკაპეთ _Cogs_ ხატულაზე ამომხტომ არეში. uBOL სრულად დეკლარაციულია, ანუ არაა საჭირო მუდმივად იყოს გაშვებული uBOL-პროცესი გასაფილტრად, CSS/JS ჩანაცვლებით შიგთავსის გაფილტვრას თავად ბრაუზერი უზრუნველყოფს ნაცვლად გაფართოებისა, რაც მეტად საიმედოა. შესაბამისად, uBOL თავად არ დატვირთავს პროცესორს/ოპერატიულს შიგთავსის შეზღუდვის დროს -- uBOL-ის შუამავალი მომსახურე პროცესი საჭიროა _მხოლოდ_ მაშინ, როცა ამომხტომ არესთან ურთიერთქმედებთ ან ცვლით პარამეტრებს. diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index d3c4d9a76f88e..76d422b078854 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -20,7 +20,7 @@ "description": "appears as tab name in dashboard" }, "aboutPageName": { - "message": "عن التطبيق", + "message": "حول البرنامج", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { diff --git a/platform/mv3/extension/_locales/id/messages.json b/platform/mv3/extension/_locales/id/messages.json index 1fb1e31ffa003..806263ff961c1 100644 --- a/platform/mv3/extension/_locales/id/messages.json +++ b/platform/mv3/extension/_locales/id/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Laporkan masalah pada situs ini", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Laporkan masalah filter", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Laporkan masalah filter situs web tertentu ke pelacak masalah uBlockOrigin/uAssets. Membutuhkan akun GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Untuk menghindari membebani sukarelawan dengan laporan duplikat, harap verifikasi bahwa masalah tersebut belum dilaporkan.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Temukan laporan serupa", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Alamat laman web:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Laman web…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Pilih entri --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Menampilkan iklan atau sejenisnya", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Memiliki overlay atau gangguan lainnya", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Mendeteksi uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Memiliki masalah terkait privasi", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Malfungsi saat uBO Lite diaktifkan", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Membuka tab atau jendela yang tidak diinginkan", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Mengarah ke perangkat lunak jahat, phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Label laman web sebagai “NSFW” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Buat laporan baru", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/ka/messages.json b/platform/mv3/extension/_locales/ka/messages.json index 0f837f0152d45..3f64b336305e0 100644 --- a/platform/mv3/extension/_locales/ka/messages.json +++ b/platform/mv3/extension/_locales/ka/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "ამ საიტზე ხარვეზის მოხსენება", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "ფილტრის ხარვეზის მოხსენება", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "ცალკეულ საიტზე ფილტრების ხარვეზების მოსახსენებლად გამოიყენეთ uBlockOrigin/uAssets ხარვეზების აღსარიცხავი. დაგჭირდებათ GitHub-ანგარიში.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "მოხალისეები რომ არ მოცდნენ ერთნაირი მოსხენებების ნახვით, გთოხვთ გადაამოწმოთ, უკვე ხომ არაა გაგზავნილი საჩივარი ამ ხარვეზზე.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "იპოვეთ მსგავსი მოხსენებები", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "ვებგვერდის მისამართი:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "ვებგვერდი...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- შეარჩიეთ --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "აჩვენებს რეკლამებს ან მის ნარჩენებს", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "ადებს შემაწუხებელ შრეებსა და მისთანებს", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "ამჩნევს, რომ uBO Lite ჩართულია", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": " პირადულობის დაცვის ხარვეზებითაა", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "შეფერხებით მუშაობს, როცა uBO Lite ჩართულია", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "ხსნის არასასურველ ჩანართებს ან ფანჯრებს", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "გადადის მავნე, თაღლითურ შიგთავსზე", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "გვერდს დაედოს მონიშვნა „NSFW“ („შეუფერებელი შიგთავსი“ (Not Safe For Work))", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "შექმენით ახალი მოსხენება", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { @@ -216,7 +216,7 @@ "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[hostnames only]\nexample.com\ngames.example\n...", + "message": "[მხოლოდ მისამართის საწყისი]\nexample.com\ngames.example\n…", "description": "Default text for in edit field" }, "behaviorSectionLabel": { diff --git a/platform/mv3/extension/_locales/pa/messages.json b/platform/mv3/extension/_locales/pa/messages.json index e3524501bce67..6858a0393cc7a 100644 --- a/platform/mv3/extension/_locales/pa/messages.json +++ b/platform/mv3/extension/_locales/pa/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "ਇਸ ਵੈੱਬਸਾਈਟ ਉੱਤੇ ਮਸਲੇ ਬਾਰੇ ਰਿਪੋਰਟ ਕਰੋ", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,7 +104,7 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "ਫਿਲਟਰ ਮਸਲੇ ਬਾਰੇ ਰਿਪੋਰਟ ਕਰੋ", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { @@ -116,15 +116,15 @@ "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "ਰਲਦੀਆਂ ਰਿਪੋਰਟਾਂ ਲੱਭੋ", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "ਵੈੱਬ-ਸਫ਼ੇ ਦਾ ਸਿਰਨਾਵਾਂ:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "ਵੈੱਬ ਸਫ਼ਾ…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { @@ -132,7 +132,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "ਇਸ਼ਤਿਹਾਰ ਜਾਂ ਇਸ਼ਤਿਹਾਰ ਦੀ ਰਹਿੰਦ-ਖੂੰਦ ਦਿਖਾਉਂਦਾ ਹੈ", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { @@ -144,7 +144,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "ਪਰਦੇਦਾਰੀ ਸੰਬੰਧੀ ਮਸਲੇ ਹਨ", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { @@ -152,7 +152,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "ਬੇਲੋੜੀਆਂ ਟੈਬਾਂ ਜਾਂ ਵਿੰਡੋ ਖੋਲ੍ਹਦਾ ਹੈ", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { @@ -164,7 +164,7 @@ "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "ਨਵੀਂ ਰਿਪੋਰਟ ਬਣਾਓ", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/platform/mv3/extension/_locales/vi/messages.json b/platform/mv3/extension/_locales/vi/messages.json index 061c7416a4398..306b1b1f46992 100644 --- a/platform/mv3/extension/_locales/vi/messages.json +++ b/platform/mv3/extension/_locales/vi/messages.json @@ -44,7 +44,7 @@ "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Ít hơn", + "message": "Thu gọn", "description": "Label to be used to hide popup panel sections" }, "3pGroupDefault": { @@ -56,7 +56,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Riêng tư", + "message": "Bảo mật", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { @@ -84,7 +84,7 @@ "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Những người đóng góp", + "message": "Người đóng góp", "description": "English: Contributors" }, "aboutSourceCode": { diff --git a/src/_locales/ka/messages.json b/src/_locales/ka/messages.json index 08b504bf58fce..82f8ca3896be2 100644 --- a/src/_locales/ka/messages.json +++ b/src/_locales/ka/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "გადადის მავნე, თაღლითურ შიგთავსზე", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/pa/messages.json b/src/_locales/pa/messages.json index e295df49b7e2e..3fb287b198e82 100644 --- a/src/_locales/pa/messages.json +++ b/src/_locales/pa/messages.json @@ -484,7 +484,7 @@ "description": "Filter lists section name" }, "3pGroupSocial": { - "message": "Social widgets", + "message": "ਸ਼ੋਸ਼ਲ ਵਿਜੈਟ", "description": "Filter lists section name" }, "3pGroupCookies": { diff --git a/src/_locales/sv/messages.json b/src/_locales/sv/messages.json index da30a923a1ff7..8b57d82fa512e 100644 --- a/src/_locales/sv/messages.json +++ b/src/_locales/sv/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Äntligen en effektiv blockerare. Snäll mot både processor och minne.", + "message": "Äntligen en effektiv blockerare. Skonsam mot både processor och minne.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { diff --git a/src/_locales/uk/messages.json b/src/_locales/uk/messages.json index bf8dafa5f8476..4b93c67ad9a98 100644 --- a/src/_locales/uk/messages.json +++ b/src/_locales/uk/messages.json @@ -108,7 +108,7 @@ "description": "For the new mobile-friendly popup design" }, "popupDomainsConnected_v2": { - "message": "Доменів під'єднано", + "message": "Підключені домени", "description": "For the new mobile-friendly popup design" }, "popupTipDashboard": { @@ -336,7 +336,7 @@ "description": "English: Color-blind friendly" }, "settingsAppearance": { - "message": "Вигляд", + "message": "Зовнішній вигляд", "description": "Section for controlling user interface appearance" }, "settingsThemeLabel": { @@ -344,7 +344,7 @@ "description": "Label for checkbox to enable a custom dark theme" }, "settingsThemeAccent0Label": { - "message": "Акцент кольору користувача", + "message": "Індивідуальний колір акценту", "description": "Label for checkbox to pick an accent color" }, "settingsCloudStorageEnabledPrompt": { From 60a1dea0f6d0f70667481104893e8e8fda2bf4ad Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 27 Oct 2024 14:49:14 -0400 Subject: [PATCH 393/553] Import translation work from https://crowdin.com/project/ublock --- src/_locales/ar/messages.json | 4 ++++ src/_locales/az/messages.json | 4 ++++ src/_locales/be/messages.json | 4 ++++ src/_locales/bg/messages.json | 4 ++++ src/_locales/bn/messages.json | 4 ++++ src/_locales/br_FR/messages.json | 4 ++++ src/_locales/bs/messages.json | 4 ++++ src/_locales/ca/messages.json | 4 ++++ src/_locales/cs/messages.json | 4 ++++ src/_locales/cv/messages.json | 4 ++++ src/_locales/cy/messages.json | 4 ++++ src/_locales/da/messages.json | 4 ++++ src/_locales/de/messages.json | 4 ++++ src/_locales/el/messages.json | 4 ++++ src/_locales/en_GB/messages.json | 4 ++++ src/_locales/eo/messages.json | 4 ++++ src/_locales/es/messages.json | 4 ++++ src/_locales/et/messages.json | 4 ++++ src/_locales/eu/messages.json | 4 ++++ src/_locales/fa/messages.json | 4 ++++ src/_locales/fi/messages.json | 4 ++++ src/_locales/fil/messages.json | 4 ++++ src/_locales/fr/messages.json | 4 ++++ src/_locales/fy/messages.json | 4 ++++ src/_locales/gl/messages.json | 4 ++++ src/_locales/gu/messages.json | 4 ++++ src/_locales/he/messages.json | 4 ++++ src/_locales/hi/messages.json | 4 ++++ src/_locales/hr/messages.json | 4 ++++ src/_locales/hu/messages.json | 4 ++++ src/_locales/hy/messages.json | 4 ++++ src/_locales/id/messages.json | 4 ++++ src/_locales/it/messages.json | 4 ++++ src/_locales/ja/messages.json | 4 ++++ src/_locales/ka/messages.json | 4 ++++ src/_locales/kk/messages.json | 4 ++++ src/_locales/kn/messages.json | 4 ++++ src/_locales/ko/messages.json | 4 ++++ src/_locales/lt/messages.json | 4 ++++ src/_locales/lv/messages.json | 4 ++++ src/_locales/mk/messages.json | 4 ++++ src/_locales/ml/messages.json | 4 ++++ src/_locales/mr/messages.json | 4 ++++ src/_locales/ms/messages.json | 4 ++++ src/_locales/nb/messages.json | 4 ++++ src/_locales/nl/messages.json | 4 ++++ src/_locales/oc/messages.json | 4 ++++ src/_locales/pa/messages.json | 4 ++++ src/_locales/pl/messages.json | 4 ++++ src/_locales/pt_BR/messages.json | 4 ++++ src/_locales/pt_PT/messages.json | 4 ++++ src/_locales/ro/messages.json | 4 ++++ src/_locales/ru/messages.json | 4 ++++ src/_locales/si/messages.json | 4 ++++ src/_locales/sk/messages.json | 4 ++++ src/_locales/sl/messages.json | 4 ++++ src/_locales/so/messages.json | 4 ++++ src/_locales/sq/messages.json | 4 ++++ src/_locales/sr/messages.json | 4 ++++ src/_locales/sv/messages.json | 4 ++++ src/_locales/sw/messages.json | 4 ++++ src/_locales/ta/messages.json | 4 ++++ src/_locales/te/messages.json | 4 ++++ src/_locales/th/messages.json | 4 ++++ src/_locales/tr/messages.json | 4 ++++ src/_locales/uk/messages.json | 4 ++++ src/_locales/ur/messages.json | 4 ++++ src/_locales/vi/messages.json | 4 ++++ src/_locales/zh_CN/messages.json | 4 ++++ src/_locales/zh_TW/messages.json | 4 ++++ 70 files changed, 280 insertions(+) diff --git a/src/_locales/ar/messages.json b/src/_locales/ar/messages.json index e4f8e6505622f..ac025f2060466 100644 --- a/src/_locales/ar/messages.json +++ b/src/_locales/ar/messages.json @@ -1191,6 +1191,10 @@ "message": "تقدّم", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "التصدير إلى سحابة التخزين", "description": "tooltip" diff --git a/src/_locales/az/messages.json b/src/_locales/az/messages.json index 38540ecc79e74..13549bd06b28d 100644 --- a/src/_locales/az/messages.json +++ b/src/_locales/az/messages.json @@ -1191,6 +1191,10 @@ "message": "Davam et", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Bulud yaddaşa göndər", "description": "tooltip" diff --git a/src/_locales/be/messages.json b/src/_locales/be/messages.json index 7d66c4d1e1fe3..990acacdc99d8 100644 --- a/src/_locales/be/messages.json +++ b/src/_locales/be/messages.json @@ -1191,6 +1191,10 @@ "message": "Працягнуць", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Экспартаваць у воблачнае сховішча", "description": "tooltip" diff --git a/src/_locales/bg/messages.json b/src/_locales/bg/messages.json index 086e813398ab2..01d4f48c2bcb0 100644 --- a/src/_locales/bg/messages.json +++ b/src/_locales/bg/messages.json @@ -1191,6 +1191,10 @@ "message": "Продължаване", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Изнасяне в облачно хранилище", "description": "tooltip" diff --git a/src/_locales/bn/messages.json b/src/_locales/bn/messages.json index 0c3b776afa454..13aa3ac653e1f 100644 --- a/src/_locales/bn/messages.json +++ b/src/_locales/bn/messages.json @@ -1191,6 +1191,10 @@ "message": "এগিয়ে যান", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "ক্লাউড সঞ্চয়ে রপ্তানি করুন", "description": "tooltip" diff --git a/src/_locales/br_FR/messages.json b/src/_locales/br_FR/messages.json index 92c0b73ca0d75..47e133aa46fed 100644 --- a/src/_locales/br_FR/messages.json +++ b/src/_locales/br_FR/messages.json @@ -1191,6 +1191,10 @@ "message": "Kenderc'hel", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Ezporzhiañ etrezek stokañ ar goumoulenn (cloud)", "description": "tooltip" diff --git a/src/_locales/bs/messages.json b/src/_locales/bs/messages.json index d5e299aab9bf6..d8464590ffc60 100644 --- a/src/_locales/bs/messages.json +++ b/src/_locales/bs/messages.json @@ -1191,6 +1191,10 @@ "message": "Nastavi", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Izvezi u cloud pohranu", "description": "tooltip" diff --git a/src/_locales/ca/messages.json b/src/_locales/ca/messages.json index 27963d45c2ccb..0d1121f775aca 100644 --- a/src/_locales/ca/messages.json +++ b/src/_locales/ca/messages.json @@ -1191,6 +1191,10 @@ "message": "Procedeix", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Exporta a un servei al núvol", "description": "tooltip" diff --git a/src/_locales/cs/messages.json b/src/_locales/cs/messages.json index 0ceaf90e5a8e7..e583814b5d1f1 100644 --- a/src/_locales/cs/messages.json +++ b/src/_locales/cs/messages.json @@ -1191,6 +1191,10 @@ "message": "Pokračovat", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Exportovat do cloudového úložiště", "description": "tooltip" diff --git a/src/_locales/cv/messages.json b/src/_locales/cv/messages.json index 70ee6f7e21e16..b648059a7aed4 100644 --- a/src/_locales/cv/messages.json +++ b/src/_locales/cv/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Export to cloud storage", "description": "tooltip" diff --git a/src/_locales/cy/messages.json b/src/_locales/cy/messages.json index d91b747e59b8d..6a327d423fa44 100644 --- a/src/_locales/cy/messages.json +++ b/src/_locales/cy/messages.json @@ -1191,6 +1191,10 @@ "message": "Parhau", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Export to cloud storage", "description": "tooltip" diff --git a/src/_locales/da/messages.json b/src/_locales/da/messages.json index 20557ad5cae5e..834c9f27a395e 100644 --- a/src/_locales/da/messages.json +++ b/src/_locales/da/messages.json @@ -1191,6 +1191,10 @@ "message": "Fortsæt", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Eksportér til Skylager", "description": "tooltip" diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index 7290bf620b51a..7f1eecba1d065 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -1191,6 +1191,10 @@ "message": "Fortfahren", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "In den Cloud-Speicher exportieren", "description": "tooltip" diff --git a/src/_locales/el/messages.json b/src/_locales/el/messages.json index a382c2476a58d..2785503d83910 100644 --- a/src/_locales/el/messages.json +++ b/src/_locales/el/messages.json @@ -1191,6 +1191,10 @@ "message": "Συνέχεια", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Εξαγωγή στο cloud storage", "description": "tooltip" diff --git a/src/_locales/en_GB/messages.json b/src/_locales/en_GB/messages.json index 69334adb0d506..4b56a88ab99c9 100644 --- a/src/_locales/en_GB/messages.json +++ b/src/_locales/en_GB/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Export to cloud storage", "description": "tooltip" diff --git a/src/_locales/eo/messages.json b/src/_locales/eo/messages.json index 448de1a33596f..1f00db737c90e 100644 --- a/src/_locales/eo/messages.json +++ b/src/_locales/eo/messages.json @@ -1191,6 +1191,10 @@ "message": "Procedi", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Eksporti al nuba konservado", "description": "tooltip" diff --git a/src/_locales/es/messages.json b/src/_locales/es/messages.json index 76604d8fb9f90..e1a37e59784d8 100644 --- a/src/_locales/es/messages.json +++ b/src/_locales/es/messages.json @@ -1191,6 +1191,10 @@ "message": "Continuar", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Exportar datos a la nube", "description": "tooltip" diff --git a/src/_locales/et/messages.json b/src/_locales/et/messages.json index 178950aef80b9..0884c8a186921 100644 --- a/src/_locales/et/messages.json +++ b/src/_locales/et/messages.json @@ -1191,6 +1191,10 @@ "message": "Jätka", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Ekspordi pilvehoidlasse", "description": "tooltip" diff --git a/src/_locales/eu/messages.json b/src/_locales/eu/messages.json index 302800d723aef..c99740bb9436d 100644 --- a/src/_locales/eu/messages.json +++ b/src/_locales/eu/messages.json @@ -1191,6 +1191,10 @@ "message": "Aurrera", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Esportatu hodei biltegiratzera", "description": "tooltip" diff --git a/src/_locales/fa/messages.json b/src/_locales/fa/messages.json index 366b8689317f7..654dead392add 100644 --- a/src/_locales/fa/messages.json +++ b/src/_locales/fa/messages.json @@ -1191,6 +1191,10 @@ "message": "ادامه", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "صدور به فضای ذخیره سازی ابری", "description": "tooltip" diff --git a/src/_locales/fi/messages.json b/src/_locales/fi/messages.json index 8d8f045d1531b..cb3290d859c46 100644 --- a/src/_locales/fi/messages.json +++ b/src/_locales/fi/messages.json @@ -1191,6 +1191,10 @@ "message": "Jatka", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Vie pilvitallennustilaan", "description": "tooltip" diff --git a/src/_locales/fil/messages.json b/src/_locales/fil/messages.json index 58305b46858be..cc8937f5ead86 100644 --- a/src/_locales/fil/messages.json +++ b/src/_locales/fil/messages.json @@ -1191,6 +1191,10 @@ "message": "Tumuloy", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "I-export sa imbakan sa cloud", "description": "tooltip" diff --git a/src/_locales/fr/messages.json b/src/_locales/fr/messages.json index 70c9d5920929f..d29b44d9685dc 100644 --- a/src/_locales/fr/messages.json +++ b/src/_locales/fr/messages.json @@ -1191,6 +1191,10 @@ "message": "Poursuivre", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Exporter vers le stockage dans le nuage", "description": "tooltip" diff --git a/src/_locales/fy/messages.json b/src/_locales/fy/messages.json index 863d058ee3762..afd16cd77172d 100644 --- a/src/_locales/fy/messages.json +++ b/src/_locales/fy/messages.json @@ -1191,6 +1191,10 @@ "message": "Trochgean", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Eksportearje nei cloudûnthâld", "description": "tooltip" diff --git a/src/_locales/gl/messages.json b/src/_locales/gl/messages.json index f09c526ef8dee..3d6596c00573a 100644 --- a/src/_locales/gl/messages.json +++ b/src/_locales/gl/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceder", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Exportar ó almacenamento na nube", "description": "tooltip" diff --git a/src/_locales/gu/messages.json b/src/_locales/gu/messages.json index b2c8b432116e8..ef8377fd70c8f 100644 --- a/src/_locales/gu/messages.json +++ b/src/_locales/gu/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Export to cloud storage", "description": "tooltip" diff --git a/src/_locales/he/messages.json b/src/_locales/he/messages.json index a9bf5714bc254..4d5f023f07dce 100644 --- a/src/_locales/he/messages.json +++ b/src/_locales/he/messages.json @@ -1191,6 +1191,10 @@ "message": "המשך", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "ייצא לאחסון ענן", "description": "tooltip" diff --git a/src/_locales/hi/messages.json b/src/_locales/hi/messages.json index 1a26f87293c52..34b7c17617134 100644 --- a/src/_locales/hi/messages.json +++ b/src/_locales/hi/messages.json @@ -1191,6 +1191,10 @@ "message": "आगे बढ़ें", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "क्लाउड स्टोरेज में भेजें", "description": "tooltip" diff --git a/src/_locales/hr/messages.json b/src/_locales/hr/messages.json index e7a831de98333..87e66e36aeee2 100644 --- a/src/_locales/hr/messages.json +++ b/src/_locales/hr/messages.json @@ -1191,6 +1191,10 @@ "message": "Nastavi", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Izvezi u pohranu u oblaku", "description": "tooltip" diff --git a/src/_locales/hu/messages.json b/src/_locales/hu/messages.json index e80959222fc59..6408662920d50 100644 --- a/src/_locales/hu/messages.json +++ b/src/_locales/hu/messages.json @@ -1191,6 +1191,10 @@ "message": "Továbblépés", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Exportálás a felhőszolgáltatásba", "description": "tooltip" diff --git a/src/_locales/hy/messages.json b/src/_locales/hy/messages.json index 7956bce8736f7..e76041419c9c7 100644 --- a/src/_locales/hy/messages.json +++ b/src/_locales/hy/messages.json @@ -1191,6 +1191,10 @@ "message": "Շարունակել", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Արտահանել առ ամպային պահեստ", "description": "tooltip" diff --git a/src/_locales/id/messages.json b/src/_locales/id/messages.json index 955931f6adbc2..493b6210bbe57 100644 --- a/src/_locales/id/messages.json +++ b/src/_locales/id/messages.json @@ -1191,6 +1191,10 @@ "message": "Lanjutkan", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Ekspor ke penyimpanan awan", "description": "tooltip" diff --git a/src/_locales/it/messages.json b/src/_locales/it/messages.json index 242d997e1fadd..2a325986ebf21 100644 --- a/src/_locales/it/messages.json +++ b/src/_locales/it/messages.json @@ -1191,6 +1191,10 @@ "message": "Procedi", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Esporta nel cloud", "description": "tooltip" diff --git a/src/_locales/ja/messages.json b/src/_locales/ja/messages.json index 6401003460508..067f6d7448577 100644 --- a/src/_locales/ja/messages.json +++ b/src/_locales/ja/messages.json @@ -1191,6 +1191,10 @@ "message": "続行する", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "クラウドストレージにエクスポートします", "description": "tooltip" diff --git a/src/_locales/ka/messages.json b/src/_locales/ka/messages.json index 82f8ca3896be2..7655d2857e9dc 100644 --- a/src/_locales/ka/messages.json +++ b/src/_locales/ka/messages.json @@ -1191,6 +1191,10 @@ "message": "მაინც გადასვლა", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "ღრუბლოვან საცავში შენახვა", "description": "tooltip" diff --git a/src/_locales/kk/messages.json b/src/_locales/kk/messages.json index 55f5653a015ae..a352345886b29 100644 --- a/src/_locales/kk/messages.json +++ b/src/_locales/kk/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Бұлтты жадқа экспорттау", "description": "tooltip" diff --git a/src/_locales/kn/messages.json b/src/_locales/kn/messages.json index 27374f2fca4e5..84394e4656a4f 100644 --- a/src/_locales/kn/messages.json +++ b/src/_locales/kn/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Export to cloud storage", "description": "tooltip" diff --git a/src/_locales/ko/messages.json b/src/_locales/ko/messages.json index 1907260429fd3..c0e354ef7f31e 100644 --- a/src/_locales/ko/messages.json +++ b/src/_locales/ko/messages.json @@ -1191,6 +1191,10 @@ "message": "계속", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "클라우드 저장소로 내보내기", "description": "tooltip" diff --git a/src/_locales/lt/messages.json b/src/_locales/lt/messages.json index 5769d17566d35..263a9d8fe6e9a 100644 --- a/src/_locales/lt/messages.json +++ b/src/_locales/lt/messages.json @@ -1191,6 +1191,10 @@ "message": "Tęsti", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Eksportuoti į nuotolinę saugyklą", "description": "tooltip" diff --git a/src/_locales/lv/messages.json b/src/_locales/lv/messages.json index f0359c580da59..b9f696cd0e5da 100644 --- a/src/_locales/lv/messages.json +++ b/src/_locales/lv/messages.json @@ -1191,6 +1191,10 @@ "message": "Turpināt", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Eksports uz mākoņdatu glabātuvi", "description": "tooltip" diff --git a/src/_locales/mk/messages.json b/src/_locales/mk/messages.json index 2eedde6695197..35c5285872a98 100644 --- a/src/_locales/mk/messages.json +++ b/src/_locales/mk/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Export to cloud storage", "description": "tooltip" diff --git a/src/_locales/ml/messages.json b/src/_locales/ml/messages.json index 584f165d68b16..1bb8d1e866f65 100644 --- a/src/_locales/ml/messages.json +++ b/src/_locales/ml/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "ക്ലൌഡ് സ്റ്റോറേജിലേക്ക് എക്സ്പോര്‍ട്ട്‌ ചെയ്യുക", "description": "tooltip" diff --git a/src/_locales/mr/messages.json b/src/_locales/mr/messages.json index e0bc26d1ec638..56407af1acfa3 100644 --- a/src/_locales/mr/messages.json +++ b/src/_locales/mr/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Export to cloud storage", "description": "tooltip" diff --git a/src/_locales/ms/messages.json b/src/_locales/ms/messages.json index 88e52805548bd..de9b9cdee9c4d 100644 --- a/src/_locales/ms/messages.json +++ b/src/_locales/ms/messages.json @@ -1191,6 +1191,10 @@ "message": "Teruskan", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Eksport ke storan awan", "description": "tooltip" diff --git a/src/_locales/nb/messages.json b/src/_locales/nb/messages.json index 634fcca615fe2..912dbf4d127b6 100644 --- a/src/_locales/nb/messages.json +++ b/src/_locales/nb/messages.json @@ -1191,6 +1191,10 @@ "message": "Fortsett", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Eksporter til nettlagring", "description": "tooltip" diff --git a/src/_locales/nl/messages.json b/src/_locales/nl/messages.json index 49a3af00b2fe9..acf9375cae478 100644 --- a/src/_locales/nl/messages.json +++ b/src/_locales/nl/messages.json @@ -1191,6 +1191,10 @@ "message": "Doorgaan", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Exporteren naar cloudopslag", "description": "tooltip" diff --git a/src/_locales/oc/messages.json b/src/_locales/oc/messages.json index 8dd23f9833000..1b4b4c0d251de 100644 --- a/src/_locales/oc/messages.json +++ b/src/_locales/oc/messages.json @@ -1191,6 +1191,10 @@ "message": "Contunhar", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Export to cloud storage", "description": "tooltip" diff --git a/src/_locales/pa/messages.json b/src/_locales/pa/messages.json index 3fb287b198e82..570ef52205114 100644 --- a/src/_locales/pa/messages.json +++ b/src/_locales/pa/messages.json @@ -1191,6 +1191,10 @@ "message": "ਜਾਰੀ ਰੱਖੋ", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "ਕਲਾਉਡ ਸਟੋਰੇਜ਼ ਉੱਤੇ ਐਕਸਪੋਰਟ ਕਰੋ", "description": "tooltip" diff --git a/src/_locales/pl/messages.json b/src/_locales/pl/messages.json index b95ccce576959..598f185b3c49d 100644 --- a/src/_locales/pl/messages.json +++ b/src/_locales/pl/messages.json @@ -1191,6 +1191,10 @@ "message": "Kontynuuj", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Eksportuj do chmury", "description": "tooltip" diff --git a/src/_locales/pt_BR/messages.json b/src/_locales/pt_BR/messages.json index f1a1e3666d399..f1bf87f53b42e 100644 --- a/src/_locales/pt_BR/messages.json +++ b/src/_locales/pt_BR/messages.json @@ -1191,6 +1191,10 @@ "message": "Prosseguir", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Exportar pro armazenamento na nuvem", "description": "tooltip" diff --git a/src/_locales/pt_PT/messages.json b/src/_locales/pt_PT/messages.json index 7c4df74bc522c..79b0efb6b1868 100644 --- a/src/_locales/pt_PT/messages.json +++ b/src/_locales/pt_PT/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceder", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Exportar para a nuvem", "description": "tooltip" diff --git a/src/_locales/ro/messages.json b/src/_locales/ro/messages.json index ce4595d71c440..5aacc0ff2048a 100644 --- a/src/_locales/ro/messages.json +++ b/src/_locales/ro/messages.json @@ -1191,6 +1191,10 @@ "message": "Continuă", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Exportă către stocarea în cloud", "description": "tooltip" diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json index c0bfd156f5427..a4b4f92f5b271 100644 --- a/src/_locales/ru/messages.json +++ b/src/_locales/ru/messages.json @@ -1191,6 +1191,10 @@ "message": "Продолжить", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Экспорт в облачное хранилище", "description": "tooltip" diff --git a/src/_locales/si/messages.json b/src/_locales/si/messages.json index 5b1819838b86a..cd39d0ddcaa1a 100644 --- a/src/_locales/si/messages.json +++ b/src/_locales/si/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "මේඝ ආචයනයට නිර්යාත කරන්න", "description": "tooltip" diff --git a/src/_locales/sk/messages.json b/src/_locales/sk/messages.json index c263032e10a41..2ce73295e3636 100644 --- a/src/_locales/sk/messages.json +++ b/src/_locales/sk/messages.json @@ -1191,6 +1191,10 @@ "message": "Pokračovať", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Exportovať do cloudového úložiska", "description": "tooltip" diff --git a/src/_locales/sl/messages.json b/src/_locales/sl/messages.json index 703ce9f8732db..201ae9988a820 100644 --- a/src/_locales/sl/messages.json +++ b/src/_locales/sl/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Izvozi v shrambe oblaka", "description": "tooltip" diff --git a/src/_locales/so/messages.json b/src/_locales/so/messages.json index 4276bf8c7ac68..c0ba2c7c70356 100644 --- a/src/_locales/so/messages.json +++ b/src/_locales/so/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "{{value}} saac kahor", "description": "tooltip" diff --git a/src/_locales/sq/messages.json b/src/_locales/sq/messages.json index cfcff08c0e3c4..629c0ce102de7 100644 --- a/src/_locales/sq/messages.json +++ b/src/_locales/sq/messages.json @@ -1191,6 +1191,10 @@ "message": "Vazhdoj", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Eksportoni në renë informatike", "description": "tooltip" diff --git a/src/_locales/sr/messages.json b/src/_locales/sr/messages.json index 734925be9e56d..bf92e441d98e2 100644 --- a/src/_locales/sr/messages.json +++ b/src/_locales/sr/messages.json @@ -1191,6 +1191,10 @@ "message": "Настави", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Извези у складиште у облаку", "description": "tooltip" diff --git a/src/_locales/sv/messages.json b/src/_locales/sv/messages.json index 8b57d82fa512e..e9f9457b56590 100644 --- a/src/_locales/sv/messages.json +++ b/src/_locales/sv/messages.json @@ -1191,6 +1191,10 @@ "message": "Fortsätt", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Exportera till molnlagring", "description": "tooltip" diff --git a/src/_locales/sw/messages.json b/src/_locales/sw/messages.json index ecb8214e3e0d6..5ecd7de52bfab 100644 --- a/src/_locales/sw/messages.json +++ b/src/_locales/sw/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Hamisha hadi hifadhi ya wingu", "description": "tooltip" diff --git a/src/_locales/ta/messages.json b/src/_locales/ta/messages.json index fe1be27a9ef3c..262a988ed4256 100644 --- a/src/_locales/ta/messages.json +++ b/src/_locales/ta/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "மேகக்கணினி சேமிப்பகத்திற்கு ஏற்று", "description": "tooltip" diff --git a/src/_locales/te/messages.json b/src/_locales/te/messages.json index e4d15b99375c1..68ebfc80a0801 100644 --- a/src/_locales/te/messages.json +++ b/src/_locales/te/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "క్లౌడ్ లో పొందుపరచు", "description": "tooltip" diff --git a/src/_locales/th/messages.json b/src/_locales/th/messages.json index 8bcdce36b5c7f..55ba15a03f0a6 100644 --- a/src/_locales/th/messages.json +++ b/src/_locales/th/messages.json @@ -1191,6 +1191,10 @@ "message": "ดำเนินการ", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Export to cloud storage", "description": "tooltip" diff --git a/src/_locales/tr/messages.json b/src/_locales/tr/messages.json index 5d6544a7eb862..6191786471489 100644 --- a/src/_locales/tr/messages.json +++ b/src/_locales/tr/messages.json @@ -1191,6 +1191,10 @@ "message": "Devam et", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Bulut depolamaya aktar", "description": "tooltip" diff --git a/src/_locales/uk/messages.json b/src/_locales/uk/messages.json index 4b93c67ad9a98..aef75f9c163cc 100644 --- a/src/_locales/uk/messages.json +++ b/src/_locales/uk/messages.json @@ -1191,6 +1191,10 @@ "message": "Продовжити", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Експортувати до хмарного сховища", "description": "tooltip" diff --git a/src/_locales/ur/messages.json b/src/_locales/ur/messages.json index 4a608998bc2d0..ec794cbfb966e 100644 --- a/src/_locales/ur/messages.json +++ b/src/_locales/ur/messages.json @@ -1191,6 +1191,10 @@ "message": "Proceed", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "کلاؤڈ سٹوریج میں برآمد کریں", "description": "tooltip" diff --git a/src/_locales/vi/messages.json b/src/_locales/vi/messages.json index 6c828ba4388c5..4b6559af68124 100644 --- a/src/_locales/vi/messages.json +++ b/src/_locales/vi/messages.json @@ -1191,6 +1191,10 @@ "message": "Tiếp tục", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "Xuất ra lưu trữ trực tuyến", "description": "tooltip" diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json index bd8c5513ce7a8..cfec9ea169c09 100644 --- a/src/_locales/zh_CN/messages.json +++ b/src/_locales/zh_CN/messages.json @@ -1191,6 +1191,10 @@ "message": "继续加载", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "导出到云端储存", "description": "tooltip" diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json index bdd82a0cb187d..4d8d1bcc34748 100644 --- a/src/_locales/zh_TW/messages.json +++ b/src/_locales/zh_TW/messages.json @@ -1191,6 +1191,10 @@ "message": "繼續載入", "description": "Button text to navigate to the blocked page" }, + "docblockedRedirectPrompt": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "cloudPush": { "message": "匯出至雲端儲存空間", "description": "tooltip" From c90eab5e10d3d35e41c1e1150e47046d9e19a0b6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 27 Oct 2024 14:53:33 -0400 Subject: [PATCH 394/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index acc25b034ab46..9e9fa9a69ed5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Offer ability to skip redirects in strict-blocked page](https://github.com/gorhill/uBlock/commit/20b54185fa) - [Add `-blocked` directive to `urlskip=` option](https://github.com/gorhill/uBlock/commit/d04dc4c767) - [Add `trusted-set-attr` scriptlet](https://github.com/gorhill/uBlock/commit/11ca4a3923) - [Remove `64:ff9b:` as private network block](https://github.com/gorhill/uBlock/commit/2621c908c3) From 0face5e362323dc5a02e06febb3a78954f1d7b8f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 27 Oct 2024 14:54:03 -0400 Subject: [PATCH 395/553] New revision for stable release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 3421f2601185b..7ccd40de168e9 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.100 \ No newline at end of file +1.60.1.101 \ No newline at end of file From 672f2f376901c1ab9305ccbba2574e5a3547ddf6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 27 Oct 2024 15:06:13 -0400 Subject: [PATCH 396/553] 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 f404906cd32d3..c0bcbc5cf9e74 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.100", + "version": "1.60.1.101", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1rc0/uBlock0_1.60.1rc0.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1rc1/uBlock0_1.60.1rc1.firefox.signed.xpi" } ] } From ac4506091e49cb1767d2eca040055c375c2f9d0f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 28 Oct 2024 12:04:34 -0400 Subject: [PATCH 397/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/extension/_locales/br_FR/messages.json | 2 +- src/_locales/be/messages.json | 2 +- src/_locales/bg/messages.json | 2 +- src/_locales/br_FR/messages.json | 2 +- src/_locales/ca/messages.json | 2 +- src/_locales/da/messages.json | 2 +- src/_locales/de/messages.json | 2 +- src/_locales/es/messages.json | 2 +- src/_locales/et/messages.json | 2 +- src/_locales/fr/messages.json | 2 +- src/_locales/fy/messages.json | 2 +- src/_locales/gl/messages.json | 2 +- src/_locales/hr/messages.json | 2 +- src/_locales/it/messages.json | 2 +- src/_locales/ja/messages.json | 2 +- src/_locales/lv/messages.json | 2 +- src/_locales/nl/messages.json | 2 +- src/_locales/pl/messages.json | 2 +- src/_locales/pt_BR/messages.json | 2 +- src/_locales/ru/messages.json | 4 ++-- src/_locales/sk/messages.json | 2 +- src/_locales/sq/messages.json | 2 +- src/_locales/tr/messages.json | 2 +- src/_locales/uk/messages.json | 2 +- src/_locales/zh_TW/messages.json | 2 +- 25 files changed, 26 insertions(+), 26 deletions(-) diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index 8bea1bb7cd344..38d5e7715ba5a 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -112,7 +112,7 @@ "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Evit nompas sammañ ar genlabourerien a-youl vat gant meur a zanevell heñvel, gwiriit ma n'eo ket bet danevellet ho kudenn en ar-raok mar plij.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { diff --git a/src/_locales/be/messages.json b/src/_locales/be/messages.json index 990acacdc99d8..43aef84b7a2ff 100644 --- a/src/_locales/be/messages.json +++ b/src/_locales/be/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Заблакаваная старонка мае намер перанакіраваць на іншы сайт. Калі вырашыце працягнуць, вы пяройдзеце непасрэдна да: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/bg/messages.json b/src/_locales/bg/messages.json index 01d4f48c2bcb0..c17e58fc00399 100644 --- a/src/_locales/bg/messages.json +++ b/src/_locales/bg/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Блокираната страница иска да ви пренасочи към друг сайт. Ако изберете да продължите, ще отидете директно на: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/br_FR/messages.json b/src/_locales/br_FR/messages.json index 47e133aa46fed..d0a4f82abff8a 100644 --- a/src/_locales/br_FR/messages.json +++ b/src/_locales/br_FR/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Ar bajenn stanket a fell dezhi adkas d'ul lec'hienn all. M'ho peus c'hoant da genderc'hel e vioc'h kaset d'ar chomlec'h-mañ: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/ca/messages.json b/src/_locales/ca/messages.json index 0d1121f775aca..e2f4623328e4f 100644 --- a/src/_locales/ca/messages.json +++ b/src/_locales/ca/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "La pàgina blocada vol redirigir-vos a un altre web diferent. Si continueu, si us reenviarà a: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/da/messages.json b/src/_locales/da/messages.json index 834c9f27a395e..b737ac367952e 100644 --- a/src/_locales/da/messages.json +++ b/src/_locales/da/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Den blokerede side ønsker at omdirigere til et andet websted. Vælger man at fortsætte, navigeres direkte til: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index 7f1eecba1d065..68523b1b28235 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Die blockierte Seite möchte zu einer anderen Website weiterleiten. Wenn Sie fortfahren, wird folgende Seite aufgerufen: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/es/messages.json b/src/_locales/es/messages.json index e1a37e59784d8..2f19a0836cee1 100644 --- a/src/_locales/es/messages.json +++ b/src/_locales/es/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "La página bloqueada quiere redireccionar a otro sitio web. Si eliges proceder, navegaras directamente a: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/et/messages.json b/src/_locales/et/messages.json index 0884c8a186921..0829551848ef9 100644 --- a/src/_locales/et/messages.json +++ b/src/_locales/et/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Tõkestatud veebileht üritab suunata muule veebilehele. Jätkates suunatakse teid veebilehele {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/fr/messages.json b/src/_locales/fr/messages.json index d29b44d9685dc..309bba8600080 100644 --- a/src/_locales/fr/messages.json +++ b/src/_locales/fr/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "La page bloquée souhaite rediriger vers un autre site. Si vous choisissez de continuer, vous vous rendrez à l'adresse suivante : {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/fy/messages.json b/src/_locales/fy/messages.json index afd16cd77172d..3c21e63033e23 100644 --- a/src/_locales/fy/messages.json +++ b/src/_locales/fy/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "De blokkearre side wol nei in oare website trochferwize. As jo fierder gean, wurdt de folgjende side oproppen: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/gl/messages.json b/src/_locales/gl/messages.json index 3d6596c00573a..e1104c0ebe33f 100644 --- a/src/_locales/gl/messages.json +++ b/src/_locales/gl/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "A páxina bloqueada quere redirixir a outra web. Se elixes continuar vas ir directamente a: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/hr/messages.json b/src/_locales/hr/messages.json index 87e66e36aeee2..68e37c5dd8eb2 100644 --- a/src/_locales/hr/messages.json +++ b/src/_locales/hr/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Blokirana stranica želi preusmjeriti na drugu stranicu. Ako odlučite nastaviti, otići ćete izravno na: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/it/messages.json b/src/_locales/it/messages.json index 2a325986ebf21..fc7b8499500bc 100644 --- a/src/_locales/it/messages.json +++ b/src/_locales/it/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "La pagina bloccata vuole reindirizzare a un altro sito. Se scegli di procedere, navigherai direttamente a: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/ja/messages.json b/src/_locales/ja/messages.json index 067f6d7448577..673909dfe8f7c 100644 --- a/src/_locales/ja/messages.json +++ b/src/_locales/ja/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "ブロックしたページは別のサイトへリダイレクトしようとしています。続行すると次の URL へ移動します: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/lv/messages.json b/src/_locales/lv/messages.json index b9f696cd0e5da..0775a23ec7dcc 100644 --- a/src/_locales/lv/messages.json +++ b/src/_locales/lv/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Aizturētā lapa veic pārvirzīšanu uz citu vietni. Ja izvēlēsies turpināt, nonāksi uzreiz šeit: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/nl/messages.json b/src/_locales/nl/messages.json index acf9375cae478..e0ab0747789a4 100644 --- a/src/_locales/nl/messages.json +++ b/src/_locales/nl/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "De geblokkeerde pagina wil u omleiden naar een andere website. Als u doorgaat, navigeert u rechtstreeks naar: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/pl/messages.json b/src/_locales/pl/messages.json index 598f185b3c49d..4599037658dce 100644 --- a/src/_locales/pl/messages.json +++ b/src/_locales/pl/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Zablokowana strona chce przekierować na inną witrynę. Jeśli zdecydujesz się kontynuować, przejdziesz bezpośrednio do: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/pt_BR/messages.json b/src/_locales/pt_BR/messages.json index f1bf87f53b42e..7c0790dca68bb 100644 --- a/src/_locales/pt_BR/messages.json +++ b/src/_locales/pt_BR/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "A página bloqueada quer redirecionar pra outro site. Se você escolher prosseguir você navegará diretamente para: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json index a4b4f92f5b271..8cd58ef040c49 100644 --- a/src/_locales/ru/messages.json +++ b/src/_locales/ru/messages.json @@ -1,6 +1,6 @@ { "extName": { - "message": "uBlock₀", + "message": "uBlock Origin", "description": "extension name." }, "extShortDesc": { @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Заблокированная страница собирается перенаправить вас на другой сайт. Если вы решите продолжить, вы перейдете непосредственно на: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/sk/messages.json b/src/_locales/sk/messages.json index 2ce73295e3636..04d46777ce198 100644 --- a/src/_locales/sk/messages.json +++ b/src/_locales/sk/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Zablokovaná stránka chce presmerovať na inú stránku. Ak sa rozhodnete pokračovať, prejdete priamo na: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/sq/messages.json b/src/_locales/sq/messages.json index 629c0ce102de7..8fa200e0bb16b 100644 --- a/src/_locales/sq/messages.json +++ b/src/_locales/sq/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Faqja e bllokuar do t'ju drejtojë në një uebsajt tjetër. Në rast se vijoni do të shkoni te: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/tr/messages.json b/src/_locales/tr/messages.json index 6191786471489..f3d2276db5950 100644 --- a/src/_locales/tr/messages.json +++ b/src/_locales/tr/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Engellenen sayfa sizi başka bir siteye yönlendirmek istiyor. Devam etmek isterseniz doğrudan şuraya yönlendirileceksiniz: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/uk/messages.json b/src/_locales/uk/messages.json index aef75f9c163cc..aeb7440ad3adf 100644 --- a/src/_locales/uk/messages.json +++ b/src/_locales/uk/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Заблокована сторінка хоче переадресувати на інший сайт. Якщо ви вирішите продовжити, ви перейдете безпосередньо на: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json index 4d8d1bcc34748..14e980968ced6 100644 --- a/src/_locales/zh_TW/messages.json +++ b/src/_locales/zh_TW/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "被封鎖的頁面想要重新導向至另一個網站。如果您選擇繼續,則會直接前往:{{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { From c07db7553d4990bf3e9a8b00aef4ba557a23af18 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 28 Oct 2024 14:13:50 -0400 Subject: [PATCH 398/553] Fix `urlskip=` with `-blocked` directive for blocked requests Related feedback: https://github.com/uBlockOrigin/uBlock-issues/issues/3206#issuecomment-2441470631 --- src/js/pagestore.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/js/pagestore.js b/src/js/pagestore.js index 4b19f3975493c..44a5674cbe718 100644 --- a/src/js/pagestore.js +++ b/src/js/pagestore.js @@ -925,8 +925,11 @@ const PageStore = class { } redirectBlockedRequest(fctxt) { - const directives = staticNetFilteringEngine.redirectRequest(redirectEngine, fctxt); - if ( directives === undefined ) { return; } + const directives = staticNetFilteringEngine.redirectRequest(redirectEngine, fctxt) || []; + if ( this.urlSkippableResources.has(fctxt.itype) ) { + staticNetFilteringEngine.urlSkip(fctxt, true, directives); + } + if ( directives.length === 0 ) { return; } if ( logger.enabled !== true ) { return; } fctxt.pushFilters(directives.map(a => a.logData())); if ( fctxt.redirectURL === undefined ) { return; } @@ -1152,6 +1155,7 @@ const PageStore = class { µb.FilteringContext.MAIN_FRAME, µb.FilteringContext.MEDIA, µb.FilteringContext.OBJECT, + µb.FilteringContext.OTHER, µb.FilteringContext.SUB_FRAME, ]); From 1264284a3c6bdf871ea3c4189a504c57c0a388cb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 28 Oct 2024 14:17:07 -0400 Subject: [PATCH 399/553] New revision for stable release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 7ccd40de168e9..4c884c028bd00 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.101 \ No newline at end of file +1.60.1.102 \ No newline at end of file From a793d693b561cb4fb88cebb0177ef94e69d8a696 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 28 Oct 2024 14:26:05 -0400 Subject: [PATCH 400/553] 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 c0bcbc5cf9e74..7c7502613c907 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.101", + "version": "1.60.1.102", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1rc1/uBlock0_1.60.1rc1.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1rc2/uBlock0_1.60.1rc2.firefox.signed.xpi" } ] } From f645e8f0d28e4afbfd2825ee5c3aa688eb1b8e27 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 30 Oct 2024 09:12:58 -0400 Subject: [PATCH 401/553] Improve `googlesyndication_adsbygoogle.js` scriptlet Related discussion: https://github.com/uBlockOrigin/uBlock-discussions/discussions/321#discussioncomment-11000356 --- src/web_accessible_resources/googlesyndication_adsbygoogle.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/web_accessible_resources/googlesyndication_adsbygoogle.js b/src/web_accessible_resources/googlesyndication_adsbygoogle.js index dec634bea57b3..294d054e51a23 100644 --- a/src/web_accessible_resources/googlesyndication_adsbygoogle.js +++ b/src/web_accessible_resources/googlesyndication_adsbygoogle.js @@ -38,7 +38,9 @@ const cfr = document.createElement('iframe'); cfr.id = `google_ads_frame${i}`; fr.appendChild(cfr); - phs[i].appendChild(fr); + const ph = phs[i]; + ph.appendChild(fr); + ph.setAttribute('data-adsbygoogle-status', 'done'); } }; if ( From a5d7e68ebea82547be8d857cad031d07c68e434a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 30 Oct 2024 19:06:57 -0400 Subject: [PATCH 402/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e9fa9a69ed5f..d2807561a9816 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `googlesyndication_adsbygoogle.js` scriptlet](https://github.com/gorhill/uBlock/commit/f645e8f0d2) - [Offer ability to skip redirects in strict-blocked page](https://github.com/gorhill/uBlock/commit/20b54185fa) - [Add `-blocked` directive to `urlskip=` option](https://github.com/gorhill/uBlock/commit/d04dc4c767) - [Add `trusted-set-attr` scriptlet](https://github.com/gorhill/uBlock/commit/11ca4a3923) From eb37cd870d2c99f1a5d6b749dd81d163c1329648 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 30 Oct 2024 19:07:24 -0400 Subject: [PATCH 403/553] New revision for stable release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 4c884c028bd00..3d03d9b9baa78 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.102 \ No newline at end of file +1.60.1.103 \ No newline at end of file From fd3624f5413a848f0c944f35d679b55e98aa72d5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 30 Oct 2024 19:16:41 -0400 Subject: [PATCH 404/553] 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 7c7502613c907..2892c96fbacb9 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.102", + "version": "1.60.1.103", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1rc2/uBlock0_1.60.1rc2.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1rc3/uBlock0_1.60.1rc3.firefox.signed.xpi" } ] } From 34771d02d18a3a5e1ed15f18e88fb8ee50dd4418 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 31 Oct 2024 11:18:42 -0400 Subject: [PATCH 405/553] Fine tune visuals in document-blocked page Related feedback: https://github.com/uBlockOrigin/uBlock-issues/issues/3206#issuecomment-2449415643 --- src/css/document-blocked.css | 16 +++++++++++++--- src/js/document-blocked.js | 24 ++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/css/document-blocked.css b/src/css/document-blocked.css index e0504230a7862..75fa392f0a06a 100644 --- a/src/css/document-blocked.css +++ b/src/css/document-blocked.css @@ -68,6 +68,14 @@ a { position: relative; z-index: 10; } +#theURL > p > span:first-of-type { + display: block; + max-height: 6lh; + overflow-y: auto; + } +:root.mobile #theURL > p > span:first-of-type { + max-height: 3lh; + } #theURL #toggleParse { background-color: transparent; top: 100%; @@ -132,9 +140,11 @@ body[dir="rtl"] #toggleParse { #urlskip a { display: block; - overflow-x: hidden; - text-overflow: ellipsis; - white-space: nowrap; + overflow-y: auto; + word-break: break-all; + } +:root.mobile #urlskip a { + max-height: 3lh; } #actionContainer { diff --git a/src/js/document-blocked.js b/src/js/document-blocked.js index 82511436c1ceb..0bccb06a208e8 100644 --- a/src/js/document-blocked.js +++ b/src/js/document-blocked.js @@ -75,7 +75,25 @@ let details = {}; /******************************************************************************/ -dom.text('#theURL > p > span:first-of-type', details.url); +const urlToFragment = raw => { + try { + const fragment = new DocumentFragment(); + const url = new URL(raw); + const hn = url.hostname; + const i = raw.indexOf(hn); + const b = document.createElement('b'); + b.append(hn); + fragment.append(raw.slice(0,i), b, raw.slice(i+hn.length)); + return fragment; + } catch(_) { + } + return raw; +}; + +/******************************************************************************/ + +dom.clear('#theURL > p > span:first-of-type'); +qs$('#theURL > p > span:first-of-type').append(urlToFragment(details.url)); dom.text('#why', details.fs); if ( typeof details.to === 'string' && details.to.length !== 0 ) { @@ -85,7 +103,9 @@ if ( typeof details.to === 'string' && details.to.length !== 0 ) { let pos = text.indexOf(linkPlaceholder); if ( pos !== -1 ) { const link = document.createElement('a'); - link.href = link.textContent = details.to; + link.href = details.to; + dom.cl.add(link, 'code'); + link.append(urlToFragment(details.to)); fragment.append( text.slice(0, pos), link, From d70c60257551a57d3b3f74414dfd33900615c0e5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 31 Oct 2024 11:25:18 -0400 Subject: [PATCH 406/553] New revision for stable release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 3d03d9b9baa78..55108a9ce0f69 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.103 \ No newline at end of file +1.60.1.104 \ No newline at end of file From d401527e8303c809be27e466e0a5b34fba3e82fe Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 31 Oct 2024 11:28:06 -0400 Subject: [PATCH 407/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/extension/_locales/es/messages.json | 14 +++++++------- src/_locales/de/messages.json | 2 +- src/_locales/el/messages.json | 2 +- src/_locales/es/messages.json | 4 ++-- src/_locales/he/messages.json | 2 +- src/_locales/pt_PT/messages.json | 2 +- src/_locales/sv/messages.json | 2 +- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 323bb1520a827..0232f371a0065 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Informar de un problema en este sitio web", + "message": "Reportar un problema en este sitio web", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,15 +104,15 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Informar de un problema de filtro", + "message": "Reportar un problema de filtro", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Reportar problemas de filtros con sitios web específicos en uBlockOrigin/uAssets, un rastreador de problemas. Requiere una cuenta de GitHub.", + "message": "Reportar problemas de filtros con sitios web específicos en el registro de problemas uBlockOrigin/uAssets. Requiere una cuenta en GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "Para evitar sobrecargar a voluntarios con reportes duplicados, verifique que el problema no haya sido reportado.", + "message": "Para evitar sobrecargar a voluntarios con reportes duplicados, verifica que el problema no haya sido reportado.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { @@ -156,15 +156,15 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Conduce a malware, phishing", + "message": "Conduce a malware y phishing", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Etiqueta la página web como “NSFW” (“No apto para el trabajo”)", + "message": "Etiquetar la página web como “NSFW” (“no es seguro/apropiado para el trabajo”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Crear informe nuevo", + "message": "Crear nuevo reporte", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index 68523b1b28235..60289ec911790 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "Die blockierte Seite möchte zu einer anderen Website weiterleiten. Wenn Sie fortfahren, wird folgende Seite aufgerufen: {{url}}", + "message": "Die blockierte Seite möchte zu einer anderen Website weiterleiten. Beim Fortfahren wird folgende Seite aufgerufen: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/el/messages.json b/src/_locales/el/messages.json index 2785503d83910..aefa2c6a580ad 100644 --- a/src/_locales/el/messages.json +++ b/src/_locales/el/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Η αποκλεισμένη σελίδα θέλει να κάνει ανακατεύθυνση σε άλλο ιστότοπο. Αν επιλέξετε να συνεχίσετε, θα μεταβείτε απευθείας στο: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/es/messages.json b/src/_locales/es/messages.json index 2f19a0836cee1..a4a418d0b45fc 100644 --- a/src/_locales/es/messages.json +++ b/src/_locales/es/messages.json @@ -1004,7 +1004,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Se rompe cuando uBlock Origin está habilitado", + "message": "Funciona mal cuando uBlock Origin está habilitado", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "La página bloqueada quiere redireccionar a otro sitio web. Si eliges proceder, navegaras directamente a: {{url}}", + "message": "La página bloqueada quiere redirigir a otro sitio. Si eliges continuar, navegarás directamente a: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/he/messages.json b/src/_locales/he/messages.json index 4d5f023f07dce..ca9073ecb951b 100644 --- a/src/_locales/he/messages.json +++ b/src/_locales/he/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "הדף החסום מבקש לעבור לאתר אחר. אם תחליטו להמשיך, תעברו ישירות ל: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/pt_PT/messages.json b/src/_locales/pt_PT/messages.json index 79b0efb6b1868..5298956affd17 100644 --- a/src/_locales/pt_PT/messages.json +++ b/src/_locales/pt_PT/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "A página bloqueada pretende redirecionar para outro site. Se optar por continuar, navegará diretamente para: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/sv/messages.json b/src/_locales/sv/messages.json index e9f9457b56590..e1dbccb445bb8 100644 --- a/src/_locales/sv/messages.json +++ b/src/_locales/sv/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Den blockerade sidan vill omdirigera dig till en annan webbplats. Om du väljer att fortsätta skickas du direkt till: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { From eab0fd4e5796a500c6745c22ca93944b34f72607 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 31 Oct 2024 12:11:01 -0400 Subject: [PATCH 408/553] 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 2892c96fbacb9..8adf2f81a40a4 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.103", + "version": "1.60.1.104", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1rc3/uBlock0_1.60.1rc3.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1rc4/uBlock0_1.60.1rc4.firefox.signed.xpi" } ] } From 8884f259c154ef88f17c67d70dbf177c854efdff Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 1 Nov 2024 11:33:34 -0400 Subject: [PATCH 409/553] Improve `prevent-refresh` scriptlet Related discussion: https://github.com/uBlockOrigin/uAssets/issues/25859#issuecomment-2449623891 --- assets/resources/scriptlets.js | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 1a835f7279f7f..ba08824916705 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -2315,30 +2315,34 @@ builtinScriptlets.push({ fn: preventRefresh, world: 'ISOLATED', dependencies: [ - 'run-at.fn', 'safe-self.fn', ], }); // https://www.reddit.com/r/uBlockOrigin/comments/q0frv0/while_reading_a_sports_article_i_was_redirected/hf7wo9v/ function preventRefresh( - arg1 = '' + delay = '' ) { - if ( typeof arg1 !== 'string' ) { return; } + if ( typeof delay !== 'string' ) { return; } const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('prevent-refresh', arg1); + const logPrefix = safe.makeLogPrefix('prevent-refresh', delay); + const stop = content => { + window.stop(); + safe.uboLog(logPrefix, `Prevented "${content}"`); + }; const defuse = ( ) => { const meta = document.querySelector('meta[http-equiv="refresh" i][content]'); if ( meta === null ) { return; } - safe.uboLog(logPrefix, `Prevented "${meta.textContent}"`); - const s = arg1 === '' - ? meta.getAttribute('content') - : arg1; - const ms = Math.max(parseFloat(s) || 0, 0) * 1000; - setTimeout(( ) => { window.stop(); }, ms); + const content = meta.getAttribute('content') || ''; + const ms = delay === '' + ? Math.max(parseFloat(content) || 0, 0) * 500 + : 0; + if ( ms === 0 ) { + stop(content); + } else { + setTimeout(( ) => { stop(content); }, ms); + } }; - runAt(( ) => { - defuse(); - }, 'interactive'); + self.addEventListener('load', defuse, { capture: true, once: true }); } /******************************************************************************/ From 331a82775f30d9a7e66f16551851b0d7433d44ee Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 1 Nov 2024 11:36:08 -0400 Subject: [PATCH 410/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2807561a9816..2d62d815d12a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `prevent-refresh` scriptlet](https://github.com/gorhill/uBlock/commit/8884f259c1) - [Improve `googlesyndication_adsbygoogle.js` scriptlet](https://github.com/gorhill/uBlock/commit/f645e8f0d2) - [Offer ability to skip redirects in strict-blocked page](https://github.com/gorhill/uBlock/commit/20b54185fa) - [Add `-blocked` directive to `urlskip=` option](https://github.com/gorhill/uBlock/commit/d04dc4c767) From 67310b0fb6120931bdf4d0edfd59439615b5f970 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 1 Nov 2024 11:36:43 -0400 Subject: [PATCH 411/553] New revision for stable release candidate --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 55108a9ce0f69..77c1ed4ee7b33 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.104 \ No newline at end of file +1.60.1.105 \ No newline at end of file From 121ac712f79d74cdce982c4137b7f1409614df15 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 1 Nov 2024 11:41:35 -0400 Subject: [PATCH 412/553] 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 8adf2f81a40a4..a34746cba91dc 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.104", + "version": "1.60.1.105", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1rc4/uBlock0_1.60.1rc4.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1rc5/uBlock0_1.60.1rc5.firefox.signed.xpi" } ] } From 2831a0d0fddf3c9b397addda91c4a6d4ae3b2b50 Mon Sep 17 00:00:00 2001 From: daylight Date: Fri, 1 Nov 2024 17:45:31 +0300 Subject: [PATCH 413/553] Update config --- .github/ISSUE_TEMPLATE/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index f1ca168f9fba9..097d0eccd5979 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -10,5 +10,5 @@ contact_links: url: https://github.com/uBlockOrigin/uAssets/issues about: Report issues with filter lists or broken website functionality in the uAssets issue tracker. - name: uBO Lite (uBOL) Issues - url: https://github.com/uBlockOrigin/uBOL-issues/issues + url: https://github.com/uBlockOrigin/uBOL-home/issues about: Report issues specific to the Manifest Version 3 (MV3) variant in the uBOL issue tracker. From 3b9333dbd8e69e8a2eecdb77113082caa307e0ad Mon Sep 17 00:00:00 2001 From: daylight Date: Fri, 1 Nov 2024 17:45:53 +0300 Subject: [PATCH 414/553] Update CI --- .github/workflows/main.yml | 76 ++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5ce7af1212a4f..503c7ac54d9e8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,15 +1,13 @@ name: uBO release on: + workflow_dispatch: create: branches: master permissions: contents: read -# I used the following project as template to get started: -# https://github.com/dessant/search-by-image/blob/master/.github/workflows/ci.yml - jobs: build: permissions: @@ -18,73 +16,81 @@ jobs: runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/') steps: - - name: Clone repository + - name: Checkout repository uses: actions/checkout@v4 with: persist-credentials: false - - name: Clone uAssets + + - name: Checkout uAssets repository run: | tools/pull-assets.sh - # https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html + - name: Get release information id: release_info run: | - echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} + echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV + - name: Assemble release notes run: | > release.body.txt grep -m1 -B10000 -- "----------" CHANGELOG.md >> release.body.txt - sed -e 's/%version%/${{ steps.release_info.outputs.VERSION }}/g' RELEASE.HEAD.md >> release.body.txt + sed -e 's/%version%/'"$VERSION"'/g' RELEASE.HEAD.md >> release.body.txt + + - name: Build MV2 packages + run: | + tools/make-chromium.sh $VERSION + tools/make-firefox.sh $VERSION + tools/make-thunderbird.sh $VERSION + tools/make-npm.sh $VERSION + - name: Create GitHub release id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ github.token }} + uses: softprops/action-gh-release@v2 with: - tag_name: ${{ steps.release_info.outputs.VERSION }} - release_name: ${{ steps.release_info.outputs.VERSION }} + tag_name: ${{ env.VERSION }} + release_name: ${{ env.VERSION }} draft: true prerelease: true body_path: release.body.txt - - name: Build MV2 packages - run: | - tools/make-chromium.sh ${{ steps.release_info.outputs.VERSION }} - tools/make-firefox.sh ${{ steps.release_info.outputs.VERSION }} - tools/make-thunderbird.sh ${{ steps.release_info.outputs.VERSION }} - tools/make-npm.sh ${{ steps.release_info.outputs.VERSION }} - - name: Upload Chromium package - uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload Chromium package + uses: softprops/action-gh-release@v2 with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.chromium.zip - asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.chromium.zip + asset_path: dist/build/uBlock0_${{ env.VERSION }}.chromium.zip + asset_name: uBlock0_${{ env.VERSION }}.chromium.zip asset_content_type: application/octet-stream - - name: Upload Firefox package - uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload Firefox package + uses: softprops/action-gh-release@v2 with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.firefox.xpi - asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.firefox.xpi + asset_path: dist/build/uBlock0_${{ env.VERSION }}.firefox.xpi + asset_name: uBlock0_${{ env.VERSION }}.firefox.xpi asset_content_type: application/octet-stream - - name: Upload Thunderbird package - uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload Thunderbird package + uses: softprops/action-gh-release@v2 with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.thunderbird.xpi - asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.thunderbird.xpi + asset_path: dist/build/uBlock0_${{ env.VERSION }}.thunderbird.xpi + asset_name: uBlock0_${{ env.VERSION }}.thunderbird.xpi asset_content_type: application/octet-stream - - name: Upload NodeJS package - uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload NodeJS package + uses: softprops/action-gh-release@v2 with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.npm.tgz - asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.npm.tgz + asset_path: dist/build/uBlock0_${{ env.VERSION }}.npm.tgz + asset_name: uBlock0_${{ env.VERSION }}.npm.tgz asset_content_type: application/octet-stream + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 3019dfc37a5eb8acc52d55fb1b5f218be6a30694 Mon Sep 17 00:00:00 2001 From: daylight Date: Fri, 1 Nov 2024 17:46:16 +0300 Subject: [PATCH 415/553] Update contributing guide --- CONTRIBUTING.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2717e823dd9f4..ce2d70ee0b5dc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,31 +1,31 @@ # Contributions -Refer to the following sections to direct you to the appropriate destination. Thank you in advance for your help. +Please refer to the sections below to find the appropriate destination for your contributions. Thank you for your support! --- ### Translations -Help translate uBO via [Crowdin](https://crowdin.com/project/ublock). +You can help translate uBO via [Crowdin](https://crowdin.com/project/ublock). --- ### Reporting Issues -The issue tracker in this repository is deprecated. Use the links below to guide you to where you need to report your issue. +The issue tracker in this repository is deprecated. Use the links below to report your issues. #### Support Forum -For support, questions, or help, visit [/r/uBlockOrigin](https://www.reddit.com/r/uBlockOrigin/). +For support, questions, or assistance, please visit [/r/uBlockOrigin](https://www.reddit.com/r/uBlockOrigin/). #### Filter List Issues -Report issues with filter lists or broken website functionality in the [uAssets issue tracker](https://github.com/uBlockOrigin/uAssets/issues). +Report issues related to filter lists or broken website functionality in the [uAssets issue tracker](https://github.com/uBlockOrigin/uAssets/issues). #### uBlock Origin (uBO) Issues -Report issues with uBO in the [uBO issue tracker](https://github.com/uBlockOrigin/uBlock-issues/issues). +For issues specifically about uBO, please use the [uBO issue tracker](https://github.com/uBlockOrigin/uBlock-issues/issues). #### uBO Lite (uBOL) Issues -Report issues specific to the Manifest Version 3 (MV3) variant in the [uBOL issue tracker](https://github.com/uBlockOrigin/uBOL-issues/issues). +For issues related to the Manifest Version 3 (MV3) variant, report them in the [uBOL issue tracker](https://github.com/uBlockOrigin/uBOL-home/issues). From be2da15508c0c34bb5e6319a32e7c06522a923a7 Mon Sep 17 00:00:00 2001 From: daylight Date: Fri, 1 Nov 2024 17:46:37 +0300 Subject: [PATCH 416/553] Update links in readme --- README.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d91e592142693..18e6aacad9e6b 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ uBlock Origin (uBO) ***

-Get uBlock Origin for Chromium
+Get uBlock Origin for Chromium
IMPORTANT: About Google Chrome's "This extension may soon no longer be supported"

@@ -151,13 +151,13 @@ If you ever want to contribute something, think about the people working hard to [Performance]: https://www.debugbear.com/blog/chrome-extension-performance-2021#how-do-ad-blockers-and-privacy-tools-affect-browser-performance [EasyPrivacy]: https://easylist.to/#easyprivacy [Thunderbird]: https://addons.thunderbird.net/thunderbird/addon/ublock-origin/ -[Chrome Dev]: https://chrome.google.com/webstore/detail/ublock-origin-development/cgbcahbpdhpcegmbfconppldiemgcoii +[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://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm +[Chrome]: https://chromewebstore.google.com/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm [Reddit]: https://www.reddit.com/r/uBlockOrigin/ -[Theft]: https://twitter.com/LeaVerou/status/518154828166725632 +[Theft]: https://x.com/LeaVerou/status/518154828166725632 [Opera]: https://addons.opera.com/extensions/details/ublock/ [Edge]: https://microsoftedge.microsoft.com/addons/detail/ublock-origin/odfafepnkmbhccpbejgmiehpchacaeak [NPM]: https://www.npmjs.com/package/@gorhill/ubo-core @@ -167,7 +167,6 @@ If you ever want to contribute something, think about the people working hard to [Nicole Rolls]: https://github.com/nicole-ashley - [Manual Installation]: https://github.com/gorhill/uBlock/tree/master/dist#install @@ -184,7 +183,6 @@ If you ever want to contribute something, think about the people working hard to [Beta]: https://github.com/gorhill/uBlock/blob/master/dist/README.md#for-beta-version [Wiki]: https://github.com/gorhill/uBlock/wiki - [Badge Localization]: https://d322cqt584bo4o.cloudfront.net/ublock/localized.svg @@ -195,4 +193,3 @@ If you ever want to contribute something, think about the people working hard to [Badge Edge]: https://img.shields.io/badge/dynamic/json?label=Edge&color=brightgreen&query=%24.averageRating&suffix=%2F%35&url=https%3A%2F%2Fmicrosoftedge.microsoft.com%2Faddons%2Fgetproductdetailsbycrxid%2Fodfafepnkmbhccpbejgmiehpchacaeak [Badge Issues]: https://img.shields.io/github/issues/uBlockOrigin/uBlock-issues [Badge NPM]: https://img.shields.io/npm/v/@gorhill/ubo-core - From b5aaec47b38b584deaa0e3b6351b0f5a8f1f286f Mon Sep 17 00:00:00 2001 From: daylight Date: Fri, 1 Nov 2024 17:46:53 +0300 Subject: [PATCH 417/553] Update release head --- RELEASE.HEAD.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/RELEASE.HEAD.md b/RELEASE.HEAD.md index ce149ad9c489e..986319b72bd8c 100644 --- a/RELEASE.HEAD.md +++ b/RELEASE.HEAD.md @@ -1,10 +1,12 @@ +[Commits to Master Since This Release](https://github.com/gorhill/uBlock/compare/%version%...master) -[Commits to master since this release](https://github.com/gorhill/uBlock/compare/%version%...master) +#### How to Install the Developer Build: -To install the developer build: +- **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 Firefox, 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). -- **Firefox**: Click [uBlock0_%version%.firefox.signed.xpi](https://github.com/gorhill/uBlock/releases/download/%version%/uBlock0_%version%.firefox.signed.xpi) - - [uBO works best on Firefox](https://github.com/gorhill/uBlock/wiki/uBlock-Origin-works-best-on-Firefox). -- **Chromium**: Install from the Chrome Web Store (CWS): . -- **Thunderbird**: Download [uBlock0_%version%.thunderbird.xpi](https://github.com/gorhill/uBlock/releases/download/%version%/uBlock0_%version%.thunderbird.xpi), then drag-n-drop it into Thunderbird's _Add-ons Manager_ pane (Thunderbird 91+ required) -- **Node.js**: Import from [npm](https://www.npmjs.com/package/@gorhill/ubo-core), or download and unzip [uBlock0_%version%.npm.tgz](https://github.com/gorhill/uBlock/releases/download/%version%/uBlock0_%version%.npm.tgz). +- **Thunderbird**: Download [uBlock0_%version%.thunderbird.xpi](https://github.com/gorhill/uBlock/releases/download/%version%/uBlock0_%version%.thunderbird.xpi) and drag it into Thunderbird's _Add-ons Manager_ (requires Thunderbird 91+). + +- **Node.js**: You can import from [npm](https://www.npmjs.com/package/@gorhill/ubo-core) or download and unzip [uBlock0_%version%.npm.tgz](https://github.com/gorhill/uBlock/releases/download/%version%/uBlock0_%version%.npm.tgz). From c936a72bb3030c821243c34720fba4327af58631 Mon Sep 17 00:00:00 2001 From: daylight Date: Fri, 1 Nov 2024 17:47:16 +0300 Subject: [PATCH 418/553] Update dist/README.md --- dist/README.md | 158 ++++++++++++++++++++++++++++--------------------- 1 file changed, 90 insertions(+), 68 deletions(-) diff --git a/dist/README.md b/dist/README.md index 37622c5e96da9..98cb46dc06607 100644 --- a/dist/README.md +++ b/dist/README.md @@ -1,81 +1,103 @@ -## INSTALL +# INSTALL -### Chromium +## Chromium -- Download and unzip `ublock0.chromium.zip` ([latest release desirable](https://github.com/gorhill/uBlock/releases)). -- Rename the unzipped directory to `ublock` - - When you later update manually, replace the **content** of the `ublock` folder with the **content** of the latest zipped version. - - This will ensure that all the extension settings will be preserved - - As long as the extension loads **from same folder path from which it was originally installed**, all your settings will be preserved. -- Go to chromium/chrome *Extensions*. -- Click to check *Developer mode*. -- Click *Load unpacked extension...*. -- In the file selector dialog: - - Select the directory `ublock` which was created above. - - Click *Open*. +1. Download and unzip `ublock0.chromium.zip` ([latest release desirable](https://github.com/gorhill/uBlock/releases)). +2. Rename the unzipped directory to `ublock`. + - When you update manually, replace the **content** of the `ublock` folder with the **content** of the latest zipped version. This ensures all extension settings are preserved. + - As long as the extension loads from the same folder path as it was originally installed, your settings will be kept. +3. Open Chromium/Chrome and go to *Extensions*. +4. Click to enable *Developer mode*. +5. Click *Load unpacked extension...*. +6. In the file selector dialog: + - Select the `ublock` directory you created. + - Click *Open*. -The extension will now be available in your chromium/chromium-based browser. +The extension will now be available in your Chromium/Chromium-based browser. -Remember that you have to update manually also. For some users, updating manually is actually an advantage because: -- You can update when **you** want -- If ever a new version sucks, you can easily just re-install the previous one +**Note:** You must update manually. For some users, manual updates are beneficial because: +- You can update when **you** want. +- If a new version is unsatisfactory, you can easily reinstall the previous one. -### Firefox +## Firefox -Compatible with Firefox 52 and beyond. +Compatible with Firefox 52 and beyond. -#### For stable release version +### For Stable Release Version -This works only if you set `xpinstall.signatures.required` to `false` in `about:config`.[see "Add-on signing in Firefox"](https://support.mozilla.org/en-US/kb/add-on-signing-in-firefox) +This method only works if you set `xpinstall.signatures.required` to `false` in `about:config`.[see "Add-on signing in Firefox"](https://support.mozilla.org/en-US/kb/add-on-signing-in-firefox) -- Download `ublock0.firefox.xpi` ([latest release desirable](https://github.com/gorhill/uBlock/releases)). - - Right-click and choose _"Save As..."_. -- Drag and drop the previously downloaded `ublock0.firefox.xpi` into Firefox +1. Download `ublock0.firefox.xpi` ([latest release desirable](https://github.com/gorhill/uBlock/releases)). + - Right-click and choose _"Save As..."_. +2. Drag and drop the downloaded `ublock0.firefox.xpi` into Firefox. -#### For beta version +### For Beta Version - Click on `ublock0.firefox.signed.xpi` ([latest release desirable](https://github.com/gorhill/uBlock/releases)). -#### Location of uBO settings - -On Linux, the settings are saved in a JSON file located at `~/.mozilla/firefox/[profile name]/browser-extension-data/uBlock0@raymondhill.net/storage.js`. - -When you uninstall the extension, Firefox deletes that file, so all your settings are lost when you uninstall. - -### Firefox legacy - -Compatible with Firefox 24-56, [Pale Moon](https://www.palemoon.org/) and [SeaMonkey](http://www.seamonkey-project.org/). - -- Download `ublock0.firefox-legacy.xpi` ([latest release desirable](https://github.com/gorhill/uBlock-for-firefox-legacy/releases)). - - Right-click and select "Save Link As..." -- Drag and drop the previously downloaded `ublock0.firefox-legacy.xpi` into Firefox - -With Firefox 43 and beyond, you may need to toggle the setting `xpinstall.signatures.required` to `false` in `about:config`.[see "Add-on signing in Firefox"](https://support.mozilla.org/en-US/kb/add-on-signing-in-firefox) - -Your uBlock Origin settings are kept intact even after you uninstall the addon. - -On Linux, the settings are saved in a SQlite file located at `~/.mozilla/firefox/[profile name]/extension-data/ublock0.sqlite`. - -On Windows, the settings are saved in a SQlite file located at `%APPDATA%\Mozilla\Firefox\Profiles\[profile name]\extension-data\ublock0.sqlite`. - -### Build instructions (for developers) - -- Clone [uBlock repo](https://github.com/gorhill/uBlock): `git clone https://github.com/gorhill/uBlock.git` -- Set path to uBlock: `cd uBlock` -- The official version of uBO is in the `master` branch - - `git checkout master` -- Build the plugin: - - Chromium: `make chromium` - - Firefox: `make firefox` - - NPM package: `make npm` -- Load the result of the build into your browser: - - Chromium: - - Navigate to `chrome://extensions/` - - Check _"Developer mode"_ - - Click _"Load unpacked"_ - - Select `/uBlock/dist/build/uBlock0.chromium/` - - Firefox: - - Navigate to `about:debugging#/runtime/this-firefox` - - Click _"Load Temporary Add-on..."_ - - Select `/uBlock/dist/build/uBlock0.firefox/` - +### Location of uBO Settings + +On Linux, the settings are saved in a JSON file located at: +``` +~/.mozilla/firefox/[profile name]/browser-extension-data/uBlock0@raymondhill.net/storage.js +``` +When you uninstall the extension, Firefox deletes this file, and all your settings will be lost. + +### Firefox Legacy + +Compatible with Firefox 24-56, [Pale Moon](https://www.palemoon.org/), and [SeaMonkey](https://www.seamonkey-project.org/). + +1. Download `ublock0.firefox-legacy.xpi` ([latest release desirable](https://github.com/gorhill/uBlock-for-firefox-legacy/releases)). + - Right-click and select "Save Link As..." +2. Drag and drop the downloaded `ublock0.firefox-legacy.xpi` into Firefox. + +For Firefox 43 and beyond, you may need to toggle the setting `xpinstall.signatures.required` to `false` in `about:config`.[see "Add-on signing in Firefox"](https://support.mozilla.org/en-US/kb/add-on-signing-in-firefox) + +Your uBlock Origin settings are preserved even after uninstalling the addon. + +- On Linux, settings are saved in a SQLite file located at: +``` +~/.mozilla/firefox/[profile name]/extension-data/ublock0.sqlite +``` +- On Windows, settings are saved in a SQLite file located at: +``` +%APPDATA%\Mozilla\Firefox\Profiles\[profile name]\extension-data\ublock0.sqlite +``` + +## Build Instructions (for Developers) + +1. Clone the [uBlock repository](https://github.com/gorhill/uBlock): + ```bash + git clone https://github.com/gorhill/uBlock.git + ``` +2. Set the path to uBlock: + ```bash + cd uBlock + ``` +3. The official version of uBO is in the `master` branch: + ```bash + git checkout master + ``` +4. Build the plugin: + - Chromium: + ```bash + make chromium + ``` + - Firefox: + ```bash + make firefox + ``` + - NPM package: + ```bash + make npm + ``` +5. Load the result of the build into your browser: + - **Chromium:** + - Navigate to `chrome://extensions/` + - Check _"Developer mode"_ + - Click _"Load unpacked"_ + - Select `/uBlock/dist/build/uBlock0.chromium/` + - **Firefox:** + - Navigate to `about:debugging#/runtime/this-firefox` + - Click _"Load Temporary Add-on..."_ + - Select `/uBlock/dist/build/uBlock0.firefox/` From 57b7d9814851e504f9c9f179a1bd594ded8184a7 Mon Sep 17 00:00:00 2001 From: daylight Date: Fri, 1 Nov 2024 17:47:50 +0300 Subject: [PATCH 419/553] Delete dist/mv3/log.txt --- dist/mv3/log.txt | 1584 ---------------------------------------------- 1 file changed, 1584 deletions(-) delete mode 100644 dist/mv3/log.txt diff --git a/dist/mv3/log.txt b/dist/mv3/log.txt deleted file mode 100644 index 122c47e95d023..0000000000000 --- a/dist/mv3/log.txt +++ /dev/null @@ -1,1584 +0,0 @@ -Version: 2023.8.19.910 -Secret: 72d7360bdd9117ff -============================ -Listset for 'default': - Fetching remote https://ublockorigin.github.io/uAssets/filters/filters.min.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/badware.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/privacy.min.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/unbreak.min.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/quick-fixes.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/ubol-filters.txt - Fetching remote https://ublockorigin.github.io/uAssets/thirdparties/easylist.txt - Fetching remote https://ublockorigin.github.io/uAssets/thirdparties/easyprivacy.txt - Fetching remote https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext -Input filter count: 92855 - Accepted filter count: 91275 - Rejected filter count: 146 -Output rule count: 17561 - Pruning requestDomains: from 54014 to 53859 - Pruning requestDomains: from 2681 to 2675 - Pruning requestDomains: from 5929 to 5925 - Plain good: 16732 - Salvaged rule by ignoring 1 entity-based domain= option: erotic-beauties.com|hardsex.cc|rule34.top|sex-movies.biz|tube18.sexy|xvideos.name|booru.* - Salvaged rule by ignoring 19 entity-based domain= option: fullxh.com|hamsterix.*|megaxh.com|unlockxh4.com|xhadult2.com|xhadult3.com|xhadult4.com|xhadult5.com|xhamster.*|xhamster10.*|xhamster11.*|xhamster12.*|xhamster13.*|xhamster14.*|xhamster15.*|xhamster16.*|xhamster17.*|xhamster18.*|xhamster19.*|xhamster2.*|xhamster20.*|xhamster3.*|xhamster4.*|xhamster46.com|xhamster5.*|xhamster7.*|xhamster8.*|xhday.com|xhday1.com|xhmoon5.com|xhplanet1.com|xhplanet2.com|xhreal2.com|xhreal3.com|xhtab2.com|xhvictory.com|xhwebsite.com|xhwebsite2.com|xhwide1.com|xhwide8.com - Salvaged rule by ignoring 19 entity-based domain= option: fullxh.com|hamsterix.*|megaxh.com|unlockxh4.com|xhadult2.com|xhadult3.com|xhadult4.com|xhadult5.com|xhamster.*|xhamster10.*|xhamster11.*|xhamster12.*|xhamster13.*|xhamster14.*|xhamster15.*|xhamster16.*|xhamster17.*|xhamster18.*|xhamster19.*|xhamster2.*|xhamster20.*|xhamster3.*|xhamster4.*|xhamster46.com|xhamster5.*|xhamster7.*|xhamster8.*|xhday.com|xhday1.com|xhmoon5.com|xhplanet1.com|xhplanet2.com|xhreal2.com|xhreal3.com|xhtab2.com|xhvictory.com|xhwebsite.com|xhwebsite2.com|xhwide1.com|xhwide8.com - Salvaged rule by ignoring 1 entity-based domain= option: 8boobs.com|angelgals.com|babesexy.com|babesinporn.com|fooxybabes.com|hotbabeswanted.com|hotstunners.com|mainbabes.com|nakedbabes.club|nakedgirlsroom.com|nudebabes.sexy|pleasuregirl.net|rabbitsfun.com|sexybabes.club|sexybabesart.com|wantedbabes.com|silkengirl.* - Salvaged rule by ignoring 1 entity-based domain= option: web.de|gmx.* - Salvaged rule by ignoring 2 entity-based domain= option: vizcloud.*|vizcloud2.*|mcloud.to - Salvaged rule by ignoring 1 entity-based domain= option: 8boobs.com|babesinporn.com|fooxybabes.com|hotstunners.com|mainbabes.com|pleasuregirl.net|rabbitsfun.com|wantedbabes.com|silkengirl.* - Salvaged rule by ignoring 2 entity-based domain= option: dood.*|dooood.*|doods.pro - Salvaged rule by ignoring 1 entity-based domain= option: vtplay.net|vtplayer.net|vtube.to|vtbe.* - Salvaged rule by ignoring 1 entity-based domain= option: piraproxy.app|unblocksite.pw|theproxy.* - Salvaged rule by ignoring 1 entity-based domain= option: androidapks.biz|androidsite.net|animeonlinefree.org|animesite.net|computercrack.com|crackedsoftware.biz|crackfree.org|cracksite.info|downloadapk.info|downloadapps.info|downloadgames.info|downloadmusic.info|downloadsite.org|ebooksite.org|emulatorsite.com|fmovies24.com|freeflix.info|freemoviesu4.com|freesoccer.net|fseries.org|gamefast.org|gamesite.info|gostreamon.net|hindisite.net|isosite.org|macsite.info|mangasite.org|megamovies.org|moviefree2.com|moviesite.app|moviesx.org|musicsite.biz|patchsite.net|pdfsite.net|play1002.com|productkeysite.com|romsite.org|seriesite.net|siteapk.net|siteflix.org|sitegames.net|sitekeys.net|sitepdf.com|sitetorrent.com|softwaresite.net|superapk.org|supermovies.org|tvonlinesports.com|ultramovies.org|warezsite.net|watchmovies2.com|watchmoviesforfree.org|watchsite.net|youapk.net|sitesunblocked.* - Salvaged rule by ignoring 19 entity-based domain= option: fullxh.com|hamsterix.*|megaxh.com|unlockxh4.com|xhadult2.com|xhadult3.com|xhadult4.com|xhadult5.com|xhamster.*|xhamster10.*|xhamster11.*|xhamster12.*|xhamster13.*|xhamster14.*|xhamster15.*|xhamster16.*|xhamster17.*|xhamster18.*|xhamster19.*|xhamster2.*|xhamster20.*|xhamster3.*|xhamster4.*|xhamster46.com|xhamster5.*|xhamster7.*|xhamster8.*|xhday.com|xhday1.com|xhmoon5.com|xhplanet1.com|xhplanet2.com|xhreal2.com|xhreal3.com|xhtab2.com|xhvictory.com|xhwebsite.com|xhwebsite2.com|xhwide1.com|xhwide8.com - Salvaged rule by ignoring 19 entity-based domain= option: fullxh.com|hamsterix.*|megaxh.com|unlockxh4.com|xhadult2.com|xhadult3.com|xhadult4.com|xhadult5.com|xhamster.*|xhamster10.*|xhamster11.*|xhamster12.*|xhamster13.*|xhamster14.*|xhamster15.*|xhamster16.*|xhamster17.*|xhamster18.*|xhamster19.*|xhamster2.*|xhamster20.*|xhamster3.*|xhamster4.*|xhamster46.com|xhamster5.*|xhamster7.*|xhamster8.*|xhday.com|xhday1.com|xhmoon5.com|xhplanet1.com|xhplanet2.com|xhreal2.com|xhreal3.com|xhtab2.com|xhvictory.com|xhwebsite.com|xhwebsite2.com|xhwide1.com|xhwide8.com - Salvaged rule by ignoring 11 entity-based domain= option: clik.pw|1ink.cc|pornfay.*|picbaron.com|bit-url.com|upbam.org|sexvid.*|sexrura.pl|isohuntz.*|isohunt.*|isohunts.*|isohuntx.*|isohunthydra.*|isohunters.*|isohunting.*|myisohunt.*|torrentproject2.* - Salvaged rule by ignoring 19 entity-based domain= option: fullxh.com|hamsterix.*|megaxh.com|unlockxh4.com|xhadult2.com|xhadult3.com|xhadult4.com|xhadult5.com|xhamster.*|xhamster10.*|xhamster11.*|xhamster12.*|xhamster13.*|xhamster14.*|xhamster15.*|xhamster16.*|xhamster17.*|xhamster18.*|xhamster19.*|xhamster20.*|xhamster2.*|xhamster3.*|xhamster4.*|xhamster46.com|xhamster5.*|xhamster7.*|xhamster8.*|xhday.com|xhday1.com|xhmoon5.com|xhplanet1.com|xhplanet2.com|xhreal2.com|xhreal3.com|xhtab2.com|xhvictory.com|xhwebsite.com|xhwebsite2.com|xhwide1.com|xhwide8.com|webnovel.com - Salvaged rule by ignoring 1 entity-based domain= option: torrentproject2.*|click.allkeyshop.com - Salvaged rule by ignoring 3 entity-based domain= option: 0gomovies.*|cdn1.fastvid.co|cdnqq.net|gorockmovies.top|kokostream.net|movi.pk|ncdn22.xyz|netu.ac|player.msmini.*|vapley.* - Salvaged rule by ignoring 1 entity-based domain= option: isaidub1.com|isaidubhd.* - Salvaged rule by ignoring 1 entity-based domain= option: d3ward.github.io|direct-cloud.* - Salvaged rule by ignoring 1 entity-based domain= option: povvldeo.lol|povvldeo.* - Salvaged rule by ignoring 1 entity-based domain= option: pngit.live|pingit.* - Salvaged rule by ignoring 1 entity-based domain= option: enrt.eu|seulink.* - Salvaged rule by ignoring 1 entity-based domain= option: imgair.net|imgblaze.net|imgfrost.net|imgwia.buzz|pixsera.net|vestimage.site|pixlev.* - Salvaged rule by ignoring 1 entity-based domain= option: javthe.com|javfree.* - Salvaged rule by ignoring 1 entity-based domain= option: dropcoins.xyz|fastcoin.ga|faucetbr.tk|is2btc.com|swift4claim.com|quickclaims.* - Salvaged rule by ignoring 1 entity-based domain= option: olympicstreams.me|vipboxtv.* - Salvaged rule by ignoring 8 entity-based domain= option: adbull.org|zdnet.fr|imgsen.com|titsbox.com|senmanga.com|hitomi.la|mangovideo.*|bolly4umovies.*|gaybeeg.info|lovelynudez.com|classicpornbest.com|skymovieshd.*|topwwnews.com|elsfile.org|javdoe.to|javtc.*|webmusic.*|pics4you.net|kiwiexploits.com|pornxp.com|silverpic.com|suicidepics.com|tanix.net|freeuseporn.com|ukrainesmodels.com|freeadultcomix.com|xxxwebdlxxx.top|uproxy2.biz|crownimg.com|masaporn.xyz|dvdplay.*|mangaraw.org|imgstar.eu|imgsto.*|picdollar.com|pics4upload.com|amateurblog.tv|fashionblog.tv|latinblog.tv|silverblog.tv|tokyoblog.tv|xblog.tv|maxsport.one|sportz.football|streamgo.to|streamgoto.*|amazingstream.net|imwatchingmovies.com|zinchanmanga.com|weaksports.xyz|vidoza.co|vidoza.net|govid.co|up-4ever.net|abcvideo.cc|ouo.io|ouo.press|imgbox.com|pirateproxy.live|thehiddenbay.com|thepiratebay.org|thepiratebay10.org - Salvaged rule by ignoring 1 entity-based domain= option: ceesty.com|corneey.com|destyy.com|festyy.com|gestyy.com|hd-easyporn.com|bolly4umovies.*|pcgamez-download.com|torrentvhd.biz|lovelynudez.com|gayforit.eu|movieston.com|kiwiexploits.com|dropload.io|nsfwyoutube.com|pomvideo.cc|steampiay.cc|vidoza.co|vidoza.net|mixdrop.co|govid.co|up-4ever.net|abcvideo.cc|ouo.io|ouo.press|pirateproxy.live|thehiddenbay.com|thepiratebay10.org|opensubtitles.org - Salvaged rule by ignoring 19 entity-based domain= option: fullxh.com|hamsterix.*|megaxh.com|unlockxh4.com|xhadult2.com|xhadult3.com|xhadult4.com|xhadult5.com|xhamster.*|xhamster10.*|xhamster11.*|xhamster12.*|xhamster13.*|xhamster14.*|xhamster15.*|xhamster16.*|xhamster17.*|xhamster18.*|xhamster19.*|xhamster2.*|xhamster20.*|xhamster3.*|xhamster4.*|xhamster46.com|xhamster5.*|xhamster7.*|xhamster8.*|xhday.com|xhday1.com|xhmoon5.com|xhplanet1.com|xhplanet2.com|xhreal2.com|xhreal3.com|xhtab2.com|xhvictory.com|xhwebsite.com|xhwebsite2.com|xhwide1.com|xhwide8.com - Salvaged rule by ignoring 1 entity-based domain= option: cpmlink.net|mwpaste.com|lusthero.com|22pixx.xyz|goto.com.np|imgtorrnt.in|shrinkearn.com|9ig.de|pingit.im|pngit.live|elil.cc|vev.red|vidop.icu|vidup.io|tubepornclassic.com|ironysub.net|bolly4umovies.*|pcgamez-download.com|curto.win|freeadultcomix.com|xxxwebdlxxx.top|crownimg.com|pomvideo.cc|steampiay.cc|bc.vc|vidoza.co|vidoza.net|pirateproxy.live|thehiddenbay.com|thepiratebay.org|thepiratebay10.org - Salvaged rule by ignoring 1 entity-based domain= option: financemonk.net|dropgalaxy.* - Salvaged rule by ignoring 1 entity-based domain= option: financemonk.net|dropgalaxy.* - Salvaged rule by ignoring 2 entity-based domain= option: gentside.*|ohmymag.*|maxisciences.com - Salvaged rule by ignoring 2 entity-based domain= option: gentside.*|ohmymag.*|maxisciences.com - Salvaged rule by ignoring 2 entity-based domain= option: gentside.*|ohmymag.*|maxisciences.com - Salvaged rule by ignoring 2 entity-based domain= option: gentside.*|ohmymag.*|maxisciences.com - Salvaged rule by ignoring 2 entity-based domain= option: gentside.*|ohmymag.*|maxisciences.com - Salvaged rule by ignoring 1 entity-based domain= option: gentside.co.uk|gentside.com|gentside.de|maxisciences.com|ohmymag.co.uk|ohmymag.com|ohmymag.de|gentside.* - Salvaged rule by ignoring 1 entity-based domain= option: financemonk.net|dropgalaxy.* - Salvaged rule by ignoring 1 entity-based domain= option: financemonk.net|techthematter.xyz|dropgalaxy.* - Salvaged rule by ignoring 1 entity-based domain= option: ladbible.com|tyla.com|unilad.com|gamingbible.* - Salvaged rule by ignoring 1 entity-based domain= option: ladbible.com|tyla.com|unilad.com|gamingbible.* - Salvaged rule by ignoring 1 entity-based domain= option: educatiocenter.online|a2zapk.* - Salvaged rule by ignoring 2 entity-based domain= option: gentside.*|ohmymag.*|maxisciences.com - Salvaged rule by ignoring 1 entity-based domain= option: financemonk.net|dropgalaxy.* - Salvaged rule by ignoring 1 entity-based domain= option: ladbible.com|tyla.com|unilad.com|gamingbible.* - Salvaged rule by ignoring 1 entity-based domain= option: ladbible.com|tyla.com|unilad.com|gamingbible.* - Salvaged rule by ignoring 1 entity-based domain= option: educatiocenter.online|a2zapk.* - Salvaged rule by ignoring 1 entity-based domain= option: cbhours.com|pussyspace.* - Salvaged rule by ignoring 2 entity-based domain= option: acortalo.*|acortar.*|megadescarga.net - Salvaged rule by ignoring 2 entity-based domain= option: gentside.*|ohmymag.*|maxisciences.com - Salvaged rule by ignoring 5 entity-based domain= option: mylink.*|my1ink.*|myl1nk.*|myli3k.*|audiotools.pro|magesy.blog|magesypro.pro|audioztools.com|solvetube.*|promo-visits.site|satoshi-win.xyz|healdad.com|mobitaak.com|gamalk-sehetk.com|allcryptoz.net|crewbase.net|crewus.net|shinbhu.net|shinchu.net|thumb8.net|thumb9.net|topcryptoz.net|uniqueten.net|ultraten.net - Maybe good (regexes): 146 - redirect=: 342 - removeparams= (accepted/discarded): 34/12 - modifyHeaders=: 64 - Unsupported: 243 - Can't salvage rule with only entity-based domain= option: vidmoly.* - Can't salvage rule with only entity-based domain= option: megalink.* - Can't salvage rule with only entity-based domain= option: bg-gledai.* - FilterStrictParty: Strict partyness strict3p not supported - Can't salvage rule with only entity-based domain= option: nishankhatri.* - Can't salvage rule with only entity-based domain= option: oploverz.* - Can't salvage rule with only entity-based domain= option: mangaku.* - Can't salvage rule with only entity-based domain= option: nekopoi.* - Can't salvage rule with only entity-based domain= option: vinaurl.* - Can't salvage rule with only entity-based domain= option: komikcast.* - Can't salvage rule with only entity-based domain= option: movs4u.* - Can't salvage rule with only entity-based domain= option: movieon21.* - Can't salvage rule with only entity-based domain= option: aagmaal.* - Can't salvage rule with only entity-based domain= option: otakudesu.* - Can't salvage rule with only entity-based domain= option: myflixer.* - FilterStrictParty: Strict partyness strict3p not supported - Can't salvage rule with only entity-based domain= option: yts.* - regexFilter is not RE2-compatible: \/[a-z]{4,}\/(?!holly7)(?!siksik7)[0-9a-z]{3,}\d\.\d{1,2}\.\d{1,2}\.[0-9a-f]{32}\.js$ - Can't salvage rule with only entity-based domain= option: ouo.* - Can't salvage rule with only entity-based domain= option: dewimg.*|imgtown.*|imgviu.*|mazpic.*|outletpic.*|picrok.* - Can't salvage rule with only entity-based domain= option: vinaurl.* - Can't salvage rule with only entity-based domain= option: mirrorace.* - Can't salvage rule with only entity-based domain= option: the-voice-of-germany.* - Can't salvage rule with only entity-based domain= option: linkvertise.* - regexFilter is not RE2-compatible: ^https?:\/\/a\.[-0-9a-z]{4,21}\.[a-z]{2,5}\/(?=[a-z]*[0-9A-Z])[0-9a-zA-Z]{5,7}\.js$ - regexFilter is not RE2-compatible: ^https?:\/\/asg\.[-0-9a-z]{4,21}\.[a-z]{2,5}\/(?=[a-z]{0,6}[0-9A-Z])[0-9a-zA-Z]{7}\.js$ - regexFilter is not RE2-compatible: ^https?:\/\/pre\.[0-9a-z]{6,12}\.[a-z]{3,4}\/(?=[a-z]{0,6}[0-9A-Z])[0-9a-zA-Z]{7}\.js$ - regexFilter is not RE2-compatible: ^https?:\/\/oi\.[0-9a-z]{6,12}\.[a-z]{3}\/(?=[a-z]{0,6}[0-9A-Z])[0-9a-zA-Z]{7}\.js$ - Can't salvage rule with only entity-based domain= option: vegamovies.* - Can't salvage rule with only entity-based domain= option: waaaw.*|waaw.* - Can't salvage rule with only entity-based domain= option: vizcloud.*|vizcloud2.* - FilterStrictParty: Strict partyness strict3p not supported - Can't salvage rule with only entity-based domain= option: sexvid.* - Can't salvage rule with only entity-based domain= option: slreamplay.* - Can't salvage rule with only entity-based domain= option: sexwebvideo.* - Can't salvage rule with only entity-based domain= option: dutchycorp.* - regexFilter is not RE2-compatible: ^https:\/\/(?:www\d\.)?[-a-z]{6,}\.(?:com|info|net|org)\/(?=[-_a-zA-Z]{0,42}\d)(?=[-_0-9a-z]{0,42}[A-Z])[-_0-9a-zA-Z]{43}\/\?cid=[-_0-9a-zA-Z]{10,36}(?:&qs\d=\S+)?&(?:s|pub)id=[-_0-9a-z{}]{1,32}(?:&s=0\.\d+)?(?:#\S+)?$ - regexFilter is not RE2-compatible: ^https:\/\/(?:www\d\.)?[-a-z]{6,}\.(?:com|info|net|org)\/(?=[-_a-zA-Z]{0,42}\d)(?=[-_0-9a-z]{0,42}[A-Z])[-_0-9a-zA-Z]{43}\/\?(?:pub|s)id=[-_0-9a-z{}]{1,32}(?:&qs\d=\S+)?&cid=[-_0-9a-zA-Z]{10,36}(?:&s=0\.\d+)?(?:#\S+)?$ - Can't salvage rule with only entity-based domain= option: 1337x.*|1337x.g3g.*|unblockit.*|x1337x.* - regexFilter is not RE2-compatible: \/img\/(?!new).+\.gif - FilterStrictParty: Strict partyness strict1p not supported - Can't salvage rule with only entity-based domain= option: slreamplay.* - Can't salvage rule with only entity-based domain= option: pouvideo.*|povvideo.*|povw1deo.*|povwideo.*|powv1deo.*|powvibeo.*|powvideo.*|powvldeo.* - Can't salvage rule with only entity-based domain= option: pouvideo.*|povvideo.*|povw1deo.*|povwideo.*|powv1deo.*|powvibeo.*|powvideo.*|powvldeo.* - Can't salvage rule with only entity-based domain= option: strcloud.*|streamta.*|streamtape.*|strtape.*|strtapeadblock.*|strtpe.* - Can't salvage rule with only entity-based domain= option: bigkickass.*|kat.*|kat2.*|katbay.*|katfreak.*|kathydra.*|katkickass.*|katkickass.*|kattracker.*|kick4ss.*|kickass-usa.*|kickass.*|kickass2.*|kickassaustralia.*|kickassbay.*|kickassdb.*|kickassfull.*|kickassgo.*|kickasshydra.*|kickassindia.*|kickasskat.*|kickassminds.*|kickassmovies.*|kickasspk.*|kickasst.*|kickasstorrents.*|kickasstorrents2.*|kickasstracker.*|kickasstrusty.*|kickassuk.*|kickassunlocked.*|kickassz.*|kkat.*|kkickass.*|thekat.*|thekickass.*|topkickass.*|torrentkat.*|torrentskickass.* - Can't salvage rule with only entity-based domain= option: isohunt.*|isohunters.*|isohunthydra.*|isohunting.*|isohunts.*|isohuntx.*|isohuntz.*|myisohunt.* - FilterStrictParty: Strict partyness strict1p not supported - Can't salvage rule with only entity-based domain= option: uptomega.* - Can't salvage rule with only entity-based domain= option: uplinkto.* - Can't salvage rule with only entity-based domain= option: link1s.* - Can't salvage rule with only entity-based domain= option: moviesda1.* - Can't salvage rule with only entity-based domain= option: dloader.* - Can't salvage rule with only entity-based domain= option: isaidub.* - Can't salvage rule with only entity-based domain= option: zone-telechargement.* - Can't salvage rule with only entity-based domain= option: earnload.* - regexFilter is not RE2-compatible: ^https?:\/\/[a-z]{7,16}\.com?\/(?=[+\/0-9a-zA-Z]*\+)(?=[+\/a-zA-Z]*\d)(?=[+\/0-9a-z]*[A-Z])[+\/0-9a-zA-Z]{140,}$ - regexFilter is not RE2-compatible: ^https?:\/\/[a-z]{7,16}\.org\/(?=[+\/0-9a-zA-Z]*\+)(?=[+\/a-zA-Z]*\d)(?=[+\/0-9a-z]*[A-Z])[+\/0-9a-zA-Z]{140,}$ - Can't salvage rule with only entity-based domain= option: torlock.*|torlock2.* - Can't salvage rule with only entity-based domain= option: vipleague.* - Can't salvage rule with only entity-based domain= option: my1ink.*|myl1nk.*|myli3k.*|mylink.* - Can't salvage rule with only entity-based domain= option: sxyprn.* - Can't salvage rule with only entity-based domain= option: palimas.* - Can't salvage rule with only entity-based domain= option: vjav.* - Can't salvage rule with only entity-based domain= option: linkshorts.* - Can't salvage rule with only entity-based domain= option: mazpic.* - Can't salvage rule with only entity-based domain= option: picrok.* - Can't salvage rule with only entity-based domain= option: imgviu.* - Can't salvage rule with only entity-based domain= option: outletpic.* - Can't salvage rule with only entity-based domain= option: dewimg.* - Can't salvage rule with only entity-based domain= option: imgtown.* - Can't salvage rule with only entity-based domain= option: oploverz.* - Can't salvage rule with only entity-based domain= option: readcomiconline.* - Can't salvage rule with only entity-based domain= option: adsrt.* - Can't salvage rule with only entity-based domain= option: animeflv.* - Can't salvage rule with only entity-based domain= option: kiss-anime.* - Can't salvage rule with only entity-based domain= option: japscan.* - Can't salvage rule with only entity-based domain= option: downloadhub.* - Can't salvage rule with only entity-based domain= option: 9xbuddy.* - Can't salvage rule with only entity-based domain= option: viprow.* - Can't salvage rule with only entity-based domain= option: anitube.* - Can't salvage rule with only entity-based domain= option: mixdroop.*|mixdrop.*|mixdrp.* - Can't salvage rule with only entity-based domain= option: dramacool9.* - Can't salvage rule with only entity-based domain= option: hdfriday.* - Can't salvage rule with only entity-based domain= option: extramovies.* - Can't salvage rule with only entity-based domain= option: atomixhq.*|pctfenix.* - Can't salvage rule with only entity-based domain= option: shortearn.* - Can't salvage rule with only entity-based domain= option: okstream.* - Can't salvage rule with only entity-based domain= option: megavideo.* - Can't salvage rule with only entity-based domain= option: tmearn.* - Can't salvage rule with only entity-based domain= option: leechall.* - Can't salvage rule with only entity-based domain= option: allcalidad.* - Can't salvage rule with only entity-based domain= option: movieshub.* - Can't salvage rule with only entity-based domain= option: dailysport.* - Can't salvage rule with only entity-based domain= option: mkvcinemas.* - Can't salvage rule with only entity-based domain= option: pelispedia.* - Can't salvage rule with only entity-based domain= option: linkviet.* - Can't salvage rule with only entity-based domain= option: btdb.* - Can't salvage rule with only entity-based domain= option: animesvision.* - Can't salvage rule with only entity-based domain= option: miniurl.* - Can't salvage rule with only entity-based domain= option: uploadhub.* - Can't salvage rule with only entity-based domain= option: bollyflix.* - Can't salvage rule with only entity-based domain= option: veranime.*|verhentai.* - Can't salvage rule with only entity-based domain= option: shortzzy.* - Can't salvage rule with only entity-based domain= option: xtits.* - Can't salvage rule with only entity-based domain= option: shorttey.* - Can't salvage rule with only entity-based domain= option: hdmovieplus.* - Can't salvage rule with only entity-based domain= option: img4fap.* - Can't salvage rule with only entity-based domain= option: elitetorrent.* - Can't salvage rule with only entity-based domain= option: lite-link.* - Can't salvage rule with only entity-based domain= option: adcorto.* - Can't salvage rule with only entity-based domain= option: streamhub.* - Can't salvage rule with only entity-based domain= option: 720pstream.* - Can't salvage rule with only entity-based domain= option: toonanime.* - Can't salvage rule with only entity-based domain= option: buffstreams.* - Can't salvage rule with only entity-based domain= option: cinemakottaga.* - Can't salvage rule with only entity-based domain= option: hog.* - Can't salvage rule with only entity-based domain= option: samehadaku.* - Can't salvage rule with only entity-based domain= option: atishmkv.* - Can't salvage rule with only entity-based domain= option: watchomovies.* - Can't salvage rule with only entity-based domain= option: hdhub4u.* - Can't salvage rule with only entity-based domain= option: livetvon.* - Can't salvage rule with only entity-based domain= option: sports-stream.* - regexFilter is not RE2-compatible: ^https?:\/\/[0-9a-z]{4,8}\.autos\/(?=[a-z]{0,6}[0-9A-Z])[0-9a-zA-Z]{7}\.js$ - regexFilter is not RE2-compatible: ^https?:\/\/[0-9a-z]{4,8}\.beauty\/(?=[a-z]{0,6}[0-9A-Z])[0-9a-zA-Z]{7}\.js$ - regexFilter is not RE2-compatible: ^https?:\/\/[0-9a-z]{4,8}\.lol\/(?=[a-z]{0,6}[0-9A-Z])[0-9a-zA-Z]{7}\.js$ - regexFilter is not RE2-compatible: ^https?:\/\/[0-9a-z]{4,8}\.mom\/(?=[a-z]{0,6}[0-9A-Z])[0-9a-zA-Z]{7}\.js$ - regexFilter is not RE2-compatible: ^https?:\/\/[0-9a-z]{4,8}\.pro\/(?=[a-z]{0,6}[0-9A-Z])[0-9a-zA-Z]{7}\.js$ - regexFilter is not RE2-compatible: ^https?:\/\/[0-9a-z]{4,8}\.xyz\/(?=[a-z]{0,6}[0-9A-Z])[0-9a-zA-Z]{7}\.js$ - regexFilter is not RE2-compatible: ^https?:\/\/[a-z]{8,15}\.com?\/(?=[0-9a-zA-Z]*%)(?=[%a-zA-Z]*\d)(?=[%0-9a-z]*[A-Z])[%0-9a-zA-Z]{170,}$ - regexFilter is not RE2-compatible: ^https:\/\/(?:[a-z]{2}\.)?[a-z]{7,14}\.com\/r(?=[a-z]*[0-9A-Z])[0-9A-Za-z]{10,16}\/[A-Za-z]{5}$ - Can't salvage rule with only entity-based domain= option: sdmoviespoint.* - Can't salvage rule with only entity-based domain= option: torrentgalaxy.* - regexFilter is not RE2-compatible: ^https:\/\/[0-9a-z]{7,25}\.com\/v2(?:\/0\/)?(?=[-_0-9a-z]{0,84}[A-Z])(?=[-_a-zA-Z]{0,84}[0-9])[-_0-9a-zA-Z]{54,85}(#\?v=[0-9a-f]{32})?$ - Can't salvage rule with only entity-based domain= option: mazpic.* - Can't salvage rule with only entity-based domain= option: picrok.* - Can't salvage rule with only entity-based domain= option: imgviu.* - Can't salvage rule with only entity-based domain= option: outletpic.* - Can't salvage rule with only entity-based domain= option: dewimg.* - Can't salvage rule with only entity-based domain= option: imgtown.* - Can't salvage rule with only entity-based domain= option: btdb.* - regexFilter is not RE2-compatible: ^https?:\/\/(?:[a-z]{2}\.)?[0-9a-z]{7,16}\.com\/[a-z](?=[a-z]{0,25}[0-9A-Z])[0-9a-zA-Z]{3,26}\/(?:[1-6]\d{4}|[3-9]\d{3})\??(?:_=\d+|v=\d)?$ - regexFilter is not RE2-compatible: ^https?:\/\/(?:[a-z]{2}\.)?[0-9a-z]{7,16}\.website\/[a-z](?=[a-z]{0,25}[0-9A-Z])[0-9a-zA-Z]{3,26}\/(?:[1-6]\d{4}|[3-9]\d{3})\??(?:_=\d+|v=\d)?$ - regexFilter is not RE2-compatible: ^https:\/\/[0-9a-z]{7,25}\.com\/v2(?:\/0\/)?(?=[-_0-9a-z]{0,84}[A-Z])(?=[-_a-zA-Z]{0,84}[0-9])[-_0-9a-zA-Z]{54,85}(#\?v=[0-9a-f]{32})?$ - Can't salvage rule with only entity-based domain= option: sxyprn.* - Can't salvage rule with only entity-based domain= option: txxx.* - Can't salvage rule with only entity-based domain= option: mazpic.* - Can't salvage rule with only entity-based domain= option: picrok.* - Can't salvage rule with only entity-based domain= option: imgviu.* - Can't salvage rule with only entity-based domain= option: outletpic.* - Can't salvage rule with only entity-based domain= option: dewimg.* - Can't salvage rule with only entity-based domain= option: imgtown.* - Can't salvage rule with only entity-based domain= option: pouvideo.*|povvideo.*|povvldeo.*|povw1deo.*|povwideo.*|powv1deo.*|powvibeo.*|powvideo.*|powvldeo.* - Can't salvage rule with only entity-based domain= option: btdb.* - regexFilter is not RE2-compatible: ^https?:\/\/(?:[a-z]{2}\.)?[0-9a-z]{7,16}\.com\/[a-z](?=[a-z]{0,25}[0-9A-Z])[0-9a-zA-Z]{3,26}\/(?:[1-6]\d{4}|[3-9]\d{3})\??(?:_=\d+|v=\d)?$ - regexFilter is not RE2-compatible: ^https?:\/\/(?:[a-z]{2}\.)?[0-9a-z]{7,16}\.website\/[a-z](?=[a-z]{0,25}[0-9A-Z])[0-9a-zA-Z]{3,26}\/(?:[1-6]\d{4}|[3-9]\d{3})\??(?:_=\d+|v=\d)?$ - Can't salvage rule with only entity-based domain= option: xtits.* - Can't salvage rule with only entity-based domain= option: animesa.* - regexFilter is not RE2-compatible: ^https?:\/\/[a-z]{7,16}\.com?\/(?=[+\/0-9a-zA-Z]*\+)(?=[+\/a-zA-Z]*\d)(?=[+\/0-9a-z]*[A-Z])[+\/0-9a-zA-Z]{400,}$ - regexFilter is not RE2-compatible: ^https?:\/\/[a-z]{7,16}\.org\/(?=[+\/0-9a-zA-Z]*\+)(?=[+\/a-zA-Z]*\d)(?=[+\/0-9a-z]*[A-Z])[+\/0-9a-zA-Z]{400,}$ - regexFilter is not RE2-compatible: ^https:\/\/[a-z]{7}\.com\/sub\/(?=[a-z]{0,9}[0-9A-Z])[0-9A-Za-z]{10}$ - Can't salvage rule with only entity-based domain= option: hqq.* - Can't salvage rule with only entity-based domain= option: bloomberg.* - Can't salvage rule with only entity-based domain= option: my1ink.*|myl1nk.*|myli3k.*|mylink.* - Can't salvage rule with only entity-based domain= option: my1ink.*|myl1nk.*|myli3k.*|mylink.* - Can't salvage rule with only entity-based domain= option: hqq.* - Can't salvage rule with only entity-based domain= option: einthusan.* - Can't salvage rule with only entity-based domain= option: gentside.*|ohmymag.* - Can't salvage rule with only entity-based domain= option: gentside.*|ohmymag.* - Can't salvage rule with only entity-based domain= option: pasty.* - Can't salvage rule with only entity-based domain= option: pasty.* - Can't salvage rule with only entity-based domain= option: wstream.* - Can't salvage rule with only entity-based domain= option: viafree.* - Can't salvage rule with only entity-based domain= option: hotfrog.* - Can't salvage rule with only entity-based domain= option: goodstream.* - Can't salvage rule with only entity-based domain= option: now.* - Can't salvage rule with only entity-based domain= option: bloomberg.* - Can't salvage rule with only entity-based domain= option: bloomberg.* - Can't salvage rule with only entity-based domain= option: bloomberg.* - Can't salvage rule with only entity-based domain= option: allestoringen.*|downdetector.*|xn--allestrungen-9ib.* - Can't salvage rule with only entity-based domain= option: allestoringen.*|downdetector.*|xn--allestrungen-9ib.* - Can't salvage rule with only entity-based domain= option: allestoringen.*|downdetector.*|xn--allestrungen-9ib.* - Can't salvage rule with only entity-based domain= option: tube8.* - Can't salvage rule with only entity-based domain= option: audible.* - Can't salvage rule with only entity-based domain= option: savethechildren.* - Can't salvage rule with only entity-based domain= option: discoveryplus.* - Can't salvage rule with only entity-based domain= option: viafree.* - Can't salvage rule with only entity-based domain= option: streamingcommunity.* - Can't salvage rule with only entity-based domain= option: streamingcommunity.* - Can't salvage rule with only entity-based domain= option: filepress.* - Can't salvage rule with only entity-based domain= option: bloomberg.* - Can't salvage rule with only entity-based domain= option: soap2day.* - Can't salvage rule with only entity-based domain= option: soap2day.* - Can't salvage rule with only entity-based domain= option: pussyspace.* - Can't salvage rule with only entity-based domain= option: pussyspace.* - Can't salvage rule with only entity-based domain= option: pussyspace.* - Can't salvage rule with only entity-based domain= option: pussyspace.* - Can't salvage rule with only entity-based domain= option: pussyspace.* - Can't salvage rule with only entity-based domain= option: pussyspace.* - Can't salvage rule with only entity-based domain= option: slreamplay.* - Can't salvage rule with only entity-based domain= option: pouvideo.*|povvideo.*|povw1deo.*|povwideo.*|powv1deo.*|powvibeo.*|powvideo.*|powvldeo.* - Unsupported regex-based removeParam: /utm_source|utm_campaign|utm_content/ - Unsupported regex-based removeParam: /utm_source|utm_campaign|utm_content/ - Unsupported regex-based removeParam: /utm_source|utm_campaign|utm_content|utm_term|wr/ - Unpatchable redirect filter: abp-resource:blank-mp4 - Unpatchable redirect filter: abp-resource:blank-mp4 - Unsupported regex-based removeParam: /^\/_ui\/desktop\/common\/js\/uiAnalytics\// - Can't salvage rule with only entity-based domain= option: 1movies.* - Can't salvage rule with only entity-based domain= option: 1movies.* - Unsupported regex-based removeParam: /^ad/ - Unsupported regex-based removeParam: /^ad/ - Can't salvage rule with only entity-based domain= option: discoveryplus.* - Unsupported regex-based removeParam: /^(cookie|ga_|u_)/ - Unsupported regex-based removeParam: /^((?!SMIL|formats).)*$/ - Unsupported regex-based removeParam: /^((?!formats|profile).)*$/ - Unsupported modifier exception - Unsupported modifier exception - Can't salvage rule with only entity-based domain= option: isohunt.*|isohunters.*|isohunthydra.*|isohunting.*|isohunts.*|isohuntx.*|isohuntz.*|myisohunt.* - Can't salvage rule with only entity-based domain= option: torrentproject2.* - Unsupported regex-based removeParam: /^(?:correlator|f[cr-w]|p[e-sv]|[abdeg-or-x])/ - Unsupported regex-based removeParam: /^(?:correlator|f[cr-w]|p[e-sv]|u_|ga_|url|dt|adk)/ - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Can't salvage rule with only entity-based domain= option: the-voice-of-germany.* - Can't salvage rule with only entity-based domain= option: discoveryplus.* - Can't salvage rule with only entity-based domain= option: pobre.* - Unsupported modifier exception - Can't salvage rule with only entity-based domain= option: bigkickass.*|kat.*|kat2.*|katbay.*|katfreak.*|kathydra.*|katkickass.*|katkickass.*|kattracker.*|kick4ss.*|kickass-usa.*|kickass.*|kickass2.*|kickassaustralia.*|kickassbay.*|kickassdb.*|kickassfull.*|kickassgo.*|kickasshydra.*|kickassindia.*|kickasskat.*|kickassminds.*|kickassmovies.*|kickasspk.*|kickasst.*|kickasstorrents2.*|kickasstracker.*|kickasstrusty.*|kickassuk.*|kickassunlocked.*|kickassz.*|kkat.*|kkickass.*|thekat.*|thekickass.*|topkickass.*|torrentkat.*|torrentskickass.* - Can't salvage rule with only entity-based domain= option: isohunt.*|isohunters.*|isohunthydra.*|isohunting.*|isohunts.*|isohuntx.*|isohuntz.*|myisohunt.* - Can't salvage rule with only entity-based domain= option: torrentproject2.* - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported regex-based removeParam: /^(?!offer_id=).*/ - Unsupported modifier exception - Can't salvage rule with only entity-based domain= option: empire-stream.*|empire-streaming.* - Unsupported modifier exception - Unsupported modifier exception - Can't salvage rule with only entity-based domain= option: empire-stream.*|empire-streaming.* - Unsupported modifier exception - regexFilter is not RE2-compatible: ^https?:\/\/(?:[a-z]{2}\.)?[0-9a-z]{5,16}\.[a-z]{3,7}\/[a-z](?=[a-z]{0,25}[0-9A-Z])[0-9a-zA-Z]{3,26}\/\d{4,5}(?:\?[_v]=\d+)?$ -CSS-generic: 15682 plain CSS selectors -CSS-generic-high: 553 plain CSS selectors -CSS-specific: 9630 distinct filters - Combined into 9055 distinct hostnames - Combined into 491 distinct entities -CSS-declarative: 421 distinct filters - Combined into 622 distinct hostnames - Combined into 51 distinct entities -Procedural-related distinct filters: 866 distinct combined selectors - Combined into 1381 distinct hostnames - Combined into 201 distinct entities -============================ -Listset for 'alb-0': - Fetching remote https://raw.githubusercontent.com/AnXh3L0/blocklist/master/albanian-easylist-addition/Albania.txt -Input filter count: 34 - Accepted filter count: 31 - Rejected filter count: 0 -Output rule count: 28 - Plain good: 25 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 3 - Can't salvage rule with only entity-based domain= option: filma24.* - Can't salvage rule with only entity-based domain= option: www.filma24.* - Can't salvage rule with only entity-based domain= option: filma24.* -CSS-generic: 6 plain CSS selectors -CSS-specific: 239 distinct filters - Combined into 104 distinct hostnames - Combined into 1 distinct entities -CSS-declarative: 3 distinct filters - Combined into 2 distinct hostnames - Combined into 1 distinct entities -Procedural-related distinct filters: 4 distinct combined selectors - Combined into 4 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'bgr-0': - Fetching remote https://stanev.org/abp/adblock_bg.txt -Input filter count: 661 - Accepted filter count: 661 - Rejected filter count: 0 -Output rule count: 650 - Plain good: 650 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic: 4 plain CSS selectors -CSS-specific: 350 distinct filters - Combined into 175 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'chn-0': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/224.txt -Input filter count: 15280 - Accepted filter count: 15215 - Rejected filter count: 1 -Output rule count: 6478 - Pruning requestDomains: from 6276 to 6268 - Pruning requestDomains: from 520 to 518 - Plain good: 6413 - - Maybe good (regexes): 11 - redirect=: 41 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 8 - Unsupported: 5 - regexFilter is not RE2-compatible: ^(?!.*(sharecast.ws|bunnycdn.ru|bootstrapcdn.com|cdn.ampproject.org|cloudflare.com|cdn.staticfile.org|disqus.com|disquscdn.com|dmca.com|ebacdn.com|facebook.net|fastlylb.net|fbcdn.net|fluidplayer.com|fontawesome.com|github.io|google.com|googleapis.com|googletagmanager.com|gstatic.com|jquery.com|jsdelivr.net|jwpcdn.com|jwplatform.com|polyfill.io|recaptcha.net|shrink.pe|twitter.com|ulogin.ru|unpkg.com|userapi.com|vidazoo.com|vk.com|yandex.|yastatic.net|ytimg.com|zencdn.net|player|youtube.com|cackle.me|googleoptimize.com|vuukle.com|chatango.com|twimg.com|google-analytics.com|hcaptcha.com|raincaptcha.com|media-imdb.com|blogger.com|hwcdn.net|instagram.com|wp.com|imgsmail.ru)).*$ - Unsupported modifier exception - Unsupported modifier exception - Invalid network filter in chn-0: @@||ad.alimama.com^$genericblock - Invalid network filter in chn-0: @@||cmechina.net^$genericblock -CSS-generic: 754 plain CSS selectors -CSS-generic-high: 403 plain CSS selectors -CSS-specific: 6507 distinct filters - Combined into 2795 distinct hostnames - Combined into 1 distinct entities -CSS-declarative: 77 distinct filters - Combined into 70 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 92 distinct combined selectors - Combined into 65 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'cze-0': - Fetching remote https://raw.githubusercontent.com/tomasko126/easylistczechandslovak/master/filters.txt - Fetching remote https://raw.githubusercontent.com/tomasko126/easylistczechandslovak/master/filters_ublock.txt -Input filter count: 228 - Accepted filter count: 228 - Rejected filter count: 0 -Output rule count: 120 - Plain good: 115 - - Maybe good (regexes): 0 - redirect=: 4 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 1 - Unsupported: 0 - -CSS-generic: 36 plain CSS selectors -CSS-generic-high: 4 plain CSS selectors -CSS-specific: 231 distinct filters - Combined into 167 distinct hostnames - Combined into 0 distinct entities -CSS-declarative: 8 distinct filters - Combined into 11 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 7 distinct combined selectors - Combined into 7 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'deu-0': - Fetching remote https://easylist.to/easylistgermany/easylistgermany.txt -Input filter count: 2340 - Accepted filter count: 2340 - Rejected filter count: 0 -Output rule count: 1783 - Plain good: 1777 - - Maybe good (regexes): 4 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 2 - Unpatchable redirect filter: abp-resource:blank-mp4 - Invalid network filter in deu-0: @@||gofeminin.de^$genericblock -CSS-generic: 356 plain CSS selectors -CSS-generic-high: 34 plain CSS selectors -CSS-specific: 2398 distinct filters - Combined into 1772 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 84 distinct combined selectors - Combined into 60 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'fin-0': - Fetching remote https://raw.githubusercontent.com/finnish-easylist-addition/finnish-easylist-addition/gh-pages/Finland_adb.txt - Fetching remote https://raw.githubusercontent.com/finnish-easylist-addition/finnish-easylist-addition/gh-pages/Finland_adb_uBO_extras.txt -Input filter count: 177 - Accepted filter count: 177 - Rejected filter count: 0 -Output rule count: 157 - Plain good: 149 - - Maybe good (regexes): 3 - redirect=: 4 - removeparams= (accepted/discarded): 1/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic: 53 plain CSS selectors -CSS-generic-high: 14 plain CSS selectors -CSS-specific: 1019 distinct filters - Combined into 556 distinct hostnames - Combined into 0 distinct entities -CSS-declarative: 24 distinct filters - Combined into 16 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 149 distinct combined selectors - Combined into 114 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'fra-0': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/16.txt -Input filter count: 18886 - Accepted filter count: 18813 - Rejected filter count: 58 -Output rule count: 6567 - Pruning requestDomains: from 7820 to 7809 - Plain good: 6514 - Salvaged rule by ignoring 2 entity-based domain= option: gentside.*|ohmymag.*|maxisciences.com - Salvaged rule by ignoring 2 entity-based domain= option: gentside.*|ohmymag.*|maxisciences.com - Maybe good (regexes): 7 - redirect=: 32 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 5 - Unsupported: 9 - regexFilter is not RE2-compatible: ^https?:\/\/vitamiiin\.com\/(?!wp-content|uploads|plugins|themes)(.*) - regexFilter is not RE2-compatible: ^(?!.*(sharecast.ws|bunnycdn.ru|bootstrapcdn.com|cdn.ampproject.org|cloudflare.com|cdn.staticfile.org|disqus.com|disquscdn.com|dmca.com|ebacdn.com|facebook.net|fastlylb.net|fbcdn.net|fluidplayer.com|fontawesome.com|github.io|google.com|googleapis.com|googletagmanager.com|gstatic.com|jquery.com|jsdelivr.net|jwpcdn.com|jwplatform.com|polyfill.io|recaptcha.net|shrink.pe|twitter.com|ulogin.ru|unpkg.com|userapi.com|vidazoo.com|vk.com|yandex.|yastatic.net|ytimg.com|zencdn.net|player|youtube.com|cackle.me|googleoptimize.com|vuukle.com|chatango.com|twimg.com|google-analytics.com|hcaptcha.com|raincaptcha.com|media-imdb.com|blogger.com|hwcdn.net|instagram.com|wp.com|imgsmail.ru)).*$ - Can't salvage rule with only entity-based domain= option: downdetector.* - Can't salvage rule with only entity-based domain= option: vidembed.* - Can't salvage rule with only entity-based domain= option: vidembed.* - Can't salvage rule with only entity-based domain= option: fmovies.* - Can't salvage rule with only entity-based domain= option: fmovies.* - Unsupported modifier exception - Unsupported modifier exception -CSS-generic: 2419 plain CSS selectors -CSS-generic-high: 522 plain CSS selectors -CSS-specific: 2218 distinct filters - Combined into 1693 distinct hostnames - Combined into 3 distinct entities -CSS-declarative: 42 distinct filters - Combined into 43 distinct hostnames - Combined into 1 distinct entities -Procedural-related distinct filters: 97 distinct combined selectors - Combined into 117 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'grc-0': - Fetching remote https://www.void.gr/kargig/void-gr-filters.txt -Input filter count: 451 - Accepted filter count: 451 - Rejected filter count: 0 -Output rule count: 416 - Plain good: 416 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic: 3 plain CSS selectors -CSS-generic-high: 5 plain CSS selectors -CSS-specific: 533 distinct filters - Combined into 162 distinct hostnames - Combined into 0 distinct entities -CSS-declarative: 5 distinct filters - Combined into 5 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 2 distinct combined selectors - Combined into 2 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'hrv-0': - Fetching remote https://raw.githubusercontent.com/DandelionSprout/adfilt/master/SerboCroatianList.txt -Input filter count: 53 - Accepted filter count: 53 - Rejected filter count: 0 -Output rule count: 44 - Plain good: 44 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic: 11 plain CSS selectors -CSS-specific: 249 distinct filters - Combined into 149 distinct hostnames - Combined into 0 distinct entities -CSS-declarative: 1 distinct filters - Combined into 1 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 2 distinct combined selectors - Combined into 2 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'hun-0': - Fetching remote https://raw.githubusercontent.com/hufilter/hufilter/master/hufilter-ublock.txt -Input filter count: 325 - Accepted filter count: 325 - Rejected filter count: 0 -Output rule count: 200 - Plain good: 197 - - Maybe good (regexes): 1 - redirect=: 2 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic: 60 plain CSS selectors -CSS-generic-high: 15 plain CSS selectors -CSS-specific: 1020 distinct filters - Combined into 469 distinct hostnames - Combined into 0 distinct entities -CSS-declarative: 23 distinct filters - Combined into 21 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 21 distinct combined selectors - Combined into 22 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'idn-0': - Fetching remote https://raw.githubusercontent.com/ABPindo/indonesianadblockrules/master/subscriptions/abpindo.txt -Input filter count: 4286 - Accepted filter count: 4283 - Rejected filter count: 0 -Output rule count: 3017 - Plain good: 3017 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic: 239 plain CSS selectors -CSS-generic-high: 3609 plain CSS selectors -CSS-specific: 847 distinct filters - Combined into 690 distinct hostnames - Combined into 12 distinct entities -CSS-declarative: 2 distinct filters - Combined into 2 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 1 distinct combined selectors - Combined into 1 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'ind-0': - Fetching remote https://easylist-downloads.adblockplus.org/indianlist.txt -Input filter count: 4882 - Accepted filter count: 4882 - Rejected filter count: 0 -Output rule count: 4836 - Plain good: 4836 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-specific: 3728 distinct filters - Combined into 4088 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 93 distinct combined selectors - Combined into 89 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'irn-0': - Fetching remote https://raw.githubusercontent.com/MasterKia/PersianBlocker/main/PersianBlocker.txt -Input filter count: 1103 - Accepted filter count: 1103 - Rejected filter count: 0 -Output rule count: 605 - Pruning requestDomains: from 215 to 210 - Plain good: 564 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 12/26 - modifyHeaders=: 1 - Unsupported: 28 - FilterStrictParty: Strict partyness strict3p not supported - FilterStrictParty: Strict partyness strict3p not supported - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^promo/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /promo/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /promo/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^itm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^utm_|tatoken/ -CSS-generic: 17 plain CSS selectors -CSS-specific: 742 distinct filters - Combined into 391 distinct hostnames - Combined into 0 distinct entities -CSS-declarative: 226 distinct filters - Combined into 53 distinct hostnames - Combined into 1 distinct entities -Procedural-related distinct filters: 163 distinct combined selectors - Combined into 119 distinct hostnames - Combined into 1 distinct entities -============================ -Listset for 'isl-0': - Fetching remote https://adblock.gardar.net/is.abp.txt -Input filter count: 68 - Accepted filter count: 68 - Rejected filter count: 0 -Output rule count: 68 - Plain good: 68 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic-high: 1 plain CSS selectors -CSS-specific: 121 distinct filters - Combined into 40 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'isr-0': - Fetching remote https://raw.githubusercontent.com/easylist/EasyListHebrew/master/EasyListHebrew.txt - Fetching remote https://raw.githubusercontent.com/easylist/EasyListHebrew/master/EasyListHebrew-uBO.txt -Input filter count: 703 - Accepted filter count: 702 - Rejected filter count: 1 -Output rule count: 274 - Plain good: 249 - - Maybe good (regexes): 4 - redirect=: 10 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 1 - Unsupported: 10 - regexFilter is not RE2-compatible: haaretz\.co\.il\/(?!.*\.(js)($|\?)).* - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+:\/+(api-mail|dal|dcx|isc|iscwne|6days|animals|astrology|b|buzzit|calendar|cars|celebs|e|elections|euro|fashion|finance|food|forums|fun|healthy|home|judaism|kids|mag|maps|milon|movies|mundial|nadlan|news|nick|olympics|search|sports|tags|tech|translate|travel|tv-guide|tv|usaelections|viva|vod|weather|www)\.walla\.co\.il\.?(\/|:|$))^[a-zA-Z0-9\-]+:\/+([a-zA-Z0-9\-]+\.)+walla\.co\.il\.?(\/|:|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+:\/+www\.sheee\.co\.il\.?(\/|:|$))^[a-zA-Z0-9\-]+:\/+([a-zA-Z0-9\-]+\.)+sheee\.co\.il\.?(\/|:|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+\:\/+([^\/\:\.]+\.)*((gov|idf|muni|ac|k12|net)\.il|(google|blogspot|phpbb|minifier|enable|nagich|nagishplus|nagishly|livedns|user-a|emap|23tv|glz|icast|ecast|mediacast|live1|siz|gif|meduzot|telesport|teleline|livegames|2net|weather2day|mekorotapp|e-vrit|fav|slash|rabbi|kaplanopensource|systematics|israelcoronamap|icdn|wcdn|wallanews|wallashops|wallatours|wallaart|wallaprint|hamal|sheee|globes|madlan|yad2|mipo|b144|bezeq|yes|fxp|nick|d|maariv|iol|dominos|magazineitsuv|doctors|mishpati|lawguide|arcdb|zebarur|wlcdn|linicom|erate)\.co\.il|(kan|kankids|makan|iba|oref|iaf|parks|imj|nli|bh|isoc|hebrew-academy|kineret|teva|zavit|ip6|profile)\.org\.il)\.?([\/\:]|$))^[a-zA-Z0-9\-]+\:\/+[^\/\:]+\.il\.?([\/\:]|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+\:\/+([^\/\:\.]+\.)*(facebook|fbcdn|threads|dmcdn|slideshare|cloudfront|cloudflare|fastly|fastlylb|gammacdn|edgecastcdn|footprint|incapdns|cloudapp|brightcove|jsdelivr|akamai|akamaihd|akamaized|akamaiedge|akahost|ctedgecdn|2mdn|edgesuite|azurewebsites|azureedge|windows|hwcdn|zencdn|llnwd|llnwi|boltdns|msecnd|bitsngo|nocookie|datatables|docdroid|iframely|algolia|anvato|maphub|dwcdn|typekit|edgefonts|recaptcha|ampproject|viafoura|yastatic|yahoodns|behance|darksky|google|twitchcdn|ttvnw|jtvnw|dailyuploads|deviantart|8ch|b-cdn|vodgc|hlsplayer|streamlock|web-view|streamgates|cdnwz|playgorithm|vidiom|radwarecloud|f-static|chartbeat|doubleclick|advsnx|sc-static|artipbox)\.net\.?([\/\:]|$))^[a-zA-Z0-9\-]+\:\/+[^\/\:]+\.net\.?([\/\:]|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+\:\/+([^\/\:\.]+\.)*(flowplayer|amara|h5p|d3js|ampproject|promisejs|backbonejs|angularjs|dojotoolkit|telegram|telegram-cdn|openstreetmap|wmflabs|wikimapia|wikimedia|wikipedia|w3|schema|archive|mozilla|documentcloud|w|mathjax|userway|pannellum|tmdb|muses|openweathermap|uploadimage|postimages|postimage|imgsafe|4chan|4channel|4cdn|olympic|pbs|pbskids|npr|ntp|gnu|creativecommons|eff|icann|iana|ietf|wikileaks|ourworldindata|cookielaw|google|cdn77|browser-update|consensu|wp-accessibility|covid19maps|coronaisrael)\.org\.?([\/\:]|$))^[a-zA-Z0-9\-]+\:\/+[^\/\:]+\.org\.?([\/\:]|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+\:\/+([^\/\:\.]+\.)*(google|gstatic|googleapis|jquery|youtube|youtubekids|youtube-nocookie|ytimg|facebook|fbsbx|twitter|twimg|x|instagram|cdninstagram|pinterest|pinimg|tumblr|giphy|vimeo|vimeocdn|dailymotion|flickr|staticflickr|soundcloud|sndcdn|scribd|scribdassets|tiktok|tiktokcdn|ttwstatic|muscdn|ibytedtos|sharethis|addthis|addthisedge|addthiscdn|reddit|redditmedia|redditstatic|redditgifts|linkedin|licdn|fontawesome|image-maps|cloudflare|bootstrapcdn|unpkg|cdnjs|stackpathdns|stackpathcdn|maxcdn|maxcdn-edge|netdna-ssl|netdna-cdn|kxcdn|ssl-cdn|muicss|tinymce|createjs|github|githubusercontent|aspnetcdn|azure|amazonaws|awswaf|elasticbeanstalk|rackcdn|netlify|jwplayer|jwpcdn|jwpltx|jwpsrv|jwplatform|brightcove|brightcovecdn|flowplayer|foliovision|streamable|kaltura|streamtheworld|mixcloud|bandcamp|bcbits|spotify|omnystudio|omnycontent|iheart|spreaker|podbean|buzzsprout|simplecast|podtail|apple|nobexpartners|vocaroo|embedly|iframely|snapwidget|thinglink|infogram|highcharts|airtable|printfriendly|algolianet|gravatar|svgur|svgshare|imgur|imgflip|gifer|gfycat|tenor|disqus|disquscdn|disqusservice|oneall|oneallcdn|tapatalk|tapatalk-cdn|mapbox|maptiler|mapquest|arcgis|arcgisonline|esri|here|ted|tedcdn|kickstarter|riddle|strawpoll|9gag|9cache|unsplash|freepik|imageshack|tinypic|photobox|photobucket|imgbox|imagebam|gifyu|makeagif|reactiongifs|gifbin|gif-finder|pastebin|rawgit|rawgithub|knockoutjs|gridstackjs|ravenjs|liveleak|metacafe|mcstatic|ign|ignimgs|365scores|buzzfeed|digg|stumbleupon|mix|getpocket|blogspot|wordpress|wp|videopress|wptavern|livejournal|withgoogle|googlegroups|googleusercontent|googlevideo|ggpht|noembed|appspot|firebaseio|firebaseapp|libring|hcaptcha|paypal|paypalobjects|amazon|media-amazon|media-imdb|ebay|microsoft|live|bing|msn|yahoo|yimg|yahooapis|duckduckgo|yandex|webflow|rtlcss|dropbox|dropboxusercontent|dropboxstatic|dropbox-dns|timeanddate|momentjs|weather|accuweather|theweathernetwork|windy|sat24|rainviewer|uvlens|statcounter|adobe|onesignal|livefyre|pushwoosh|tinypass|addtoany|addthisevent|addevent|addtocalendar|sumo|sumome|chatango|bitly|tinyurl|ipcamlive|steamstatic|playstation|discord|discordapp|mixer|odysee|rumble|bitchute|parler|gab|slideplayer|kym-cdn|gyazo|icons8|iconfinder|iconarchive|iconscout|flaticon|kindpng|pngitem|prntscr|deviantart|firefoxusercontent|box|feedly|feedburner|phpbb|vk|userapi|whatsapp|vroptimal-3dx-assets|bbc|cnn|go|nytimes|nyt|today|gofundme|fifa|uefa|nba|turner|xkcd|mtvnservices|cc|tmz|bugsnag|zoro|hebcal|fontsproject|kayma|kayma-dashboards|kayma-insights|kampyle|vicomi|openweb|cincopa|avplayer|vidnt|peer5|h-cdn|bynetcdn|cdnwiz|best-tv|viewbix|streamrail|smv-cdn|cloudvideoplatform|dxmcdn|dxmdp|waze|hunchbots|jeeng|cloudinary|sphereup|poloriz|applicaster|cloudwm|cloudwm-waf|negishim|accessibe|accessibeapp|acsbap|vollotech|mk-sense|allyable|shortaudition|spaceil|clear-map|segmanta|opinionstage|playbuzz|apester|qmerce|outbrain|taboola|taboolasyndication|googleoptimize|google-analytics|googletagservices|googletagmanager|googleadservices|googlesyndication|cloudflareinsights|chartbeat|scorecardresearch|serving-sys|exposebox|dynamicyield|coralogix|browsiprod|ip-api|petametrics|cooladata|hotjar|pusher|carto|fortvision|fortcdn|getsentry|trackjs|gamezhero|nick|nickjr|teennick|travelriskmap|sinclairstoryline|fresnobee|nbcchicago|magazina-il|raxcdn|pagewiz|pas-rahav|aniview|adnxs|sekindo)\.com\.?([\/\:]|$))^[a-zA-Z0-9\-]+\:\/+[^\/\:]+\.com\.?([\/\:]|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+\:\/+([^\/\:]+\.(il|com|net|org|gov|mil|edu|int|(ac|gov|nhs)\.uk|(google)|(google)\.(com?\.)?[a-zA-Z]{2,3})|[0-9\.]+|([^\/\:\.]+\.)*(omny\.fm|anchor\.fm|simplecast\.fm|castbox\.fm|github\.io|socket\.io|codepen\.io|polyfill\.io|embed\.ly|iframe\.ly|infogr\.am|t\.me|flourish\.studio|flourish\.rocks|uri\.sh|po\.st|plyr\.io|piano\.io|tg\.dev|periscope\.tv|pscp\.tv|vine\.co|popkey\.co|tenor\.co|redd\.it|ibb\.co|vgy\.me|postimg\.cc|imageshack\.us|prnt\.sc|imagesup\.co|weserv\.nl|telesco\.pe|powr\.io|pippa\.io|last\.fm|scdn\.co|adobe\.io|viafoura\.co|lmao\.ninja|disease\.sh|web\.app|twitch\.tv|rmbl\.ws|stories\.sc|vid\.me|spot\.im|spots\.im|inthegame\.io|cybercdn\.live|h-cdn\.co|minute\.ly|vttp\.co|tldw\.me|feeder\.co|del\.icio\.us|telegram\.me|yandex\.ru|dailymail\.co\.uk|dailystar\.co\.uk|bbc\.net\.uk|bbc\.co\.uk|cnn\.io|bit\.ly|goo\.gl|g\.co|youtu\.be|t\.co|fb\.me|m\.me|instagr\.am|wa\.me|amzn\.to|wp\.me|git\.io|docdro\.id|arcg\.is|ow\.ly|disq\.us|discord\.gg|tiny\.cc|ex\.co|jogo\.studio|nagishly\.co|user1st\.info|knesset\.tv|knesset\.live|walla\.cloud|103\.fm|nickjr\.tv|amagi\.tv|logidea\.info|zoomanalytics\.co|firstimpression\.io|rtk\.io|trb\.tv|ren\.tv|atom-data\.io|sentry\.io|outbid\.io))\.?([\/\:]|$))^[^\/\:\.]+\:\/+[^\/\:\.] - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+:\/+www\.(walla(news|shops|tours|art|print)|hamal|sheee)\.co\.il\.?(\/|:|$))^[a-zA-Z0-9\-]+:\/+([a-zA-Z0-9\-]+\.)+(walla(news|shops|tours|art|print)|hamal|sheee)\.co\.il\.?(\/|:|$) - regexFilter is not RE2-compatible: ^(?![a-zA-Z0-9\-]+:\/+(www\.(walla(news|shops|tours|art|print)|hamal)|(api-mail|dal|dcx|isc|iscwne|www)\.walla)\.co\.il\.?(\/|:|$))^[a-zA-Z0-9\-]+:\/+([a-zA-Z0-9\-]+\.)+(walla(news|shops|tours|art|print)?|hamal)\.co\.il\.?(\/|:|$) -CSS-generic: 5 plain CSS selectors -CSS-specific: 441 distinct filters - Combined into 320 distinct hostnames - Combined into 1 distinct entities -CSS-declarative: 5 distinct filters - Combined into 3 distinct hostnames - Combined into 1 distinct entities -Procedural-related distinct filters: 5 distinct combined selectors - Combined into 4 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'ita-0': - Fetching remote https://easylist-downloads.adblockplus.org/easylistitaly.txt -Input filter count: 3547 - Accepted filter count: 3545 - Rejected filter count: 0 -Output rule count: 3279 - Plain good: 3275 - - Maybe good (regexes): 4 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic: 363 plain CSS selectors -CSS-generic-high: 53 plain CSS selectors -CSS-specific: 2980 distinct filters - Combined into 3211 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 26 distinct combined selectors - Combined into 26 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'jpn-1': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/7.txt -Input filter count: 1891 - Accepted filter count: 1891 - Rejected filter count: 0 -Output rule count: 1311 - Plain good: 1267 - - Maybe good (regexes): 16 - redirect=: 23 - removeparams= (accepted/discarded): 0/1 - modifyHeaders=: 0 - Unsupported: 5 - regexFilter is not RE2-compatible: \/kyodopress_cms\/wp-content\/(themes\/kyodopress\/img_banner\/(?!bn_newspaper\.gif)|banners).* - regexFilter is not RE2-compatible: ^https:\/\/(?!www)[a-z]{3,}\.[a-z]{8,}\.com\/index\.php\?main_page=product_info(&stl=\d)?&(?:cPath|products_id)= - regexFilter is not RE2-compatible: ^https?:\/\/(?!www)[a-z]{3,5}\.[0-9a-z]{4,10}\.[a-z]{2,6}\/[a-z]{3,15}\/(?=[a-z]{0,9}[0-9A-Z])[0-9A-z]{10}\.html$ - regexFilter is not RE2-compatible: ^(?!.*(sharecast.ws|bunnycdn.ru|bootstrapcdn.com|cdn.ampproject.org|cloudflare.com|cdn.staticfile.org|disqus.com|disquscdn.com|dmca.com|ebacdn.com|facebook.net|fastlylb.net|fbcdn.net|fluidplayer.com|fontawesome.com|github.io|google.com|googleapis.com|googletagmanager.com|gstatic.com|jquery.com|jsdelivr.net|jwpcdn.com|jwplatform.com|polyfill.io|recaptcha.net|shrink.pe|twitter.com|ulogin.ru|unpkg.com|userapi.com|vidazoo.com|vk.com|yandex.|yastatic.net|ytimg.com|zencdn.net|player|youtube.com|cackle.me|googleoptimize.com|vuukle.com|chatango.com|twimg.com|google-analytics.com|hcaptcha.com|raincaptcha.com|media-imdb.com|blogger.com|hwcdn.net|instagram.com|wp.com|imgsmail.ru)).*$ - Unsupported regex-based removeParam: /^(cookie|ga_|u_)/ -CSS-generic: 110 plain CSS selectors -CSS-generic-high: 10 plain CSS selectors -CSS-specific: 5991 distinct filters - Combined into 4055 distinct hostnames - Combined into 7 distinct entities -CSS-declarative: 174 distinct filters - Combined into 151 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 875 distinct combined selectors - Combined into 840 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'kor-1': - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filter-uBlockOrigin.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-share/3rd_domains.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-share/1st_domains.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-share/general_elemhide.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-uBO/specific_ELEMHIDE.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-share/general_url.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-uBO/general_url.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-share/specific_URL.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-share/specific_ELEMHIDE.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-share/allowlist.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-share/extended_css_ELEMHIDE.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-share/extended_css_INJECTION.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-uBO/specific_REDIRECT.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-uBO/extended_css_ELEMHIDE.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-uBO/extended_css_INJECTION.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-uBO/scriptlets.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-share/javascript.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-uBO/javascript.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-uBO/antiadblock.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-share/removeparam.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-uBO/allowlist.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-share/specific_CSS.txt - Fetching remote https://cdn.jsdelivr.net/gh/List-KR/List-KR@master/filters-uBO/specific_CSS.txt -Input filter count: 1253 - Accepted filter count: 1247 - Rejected filter count: 0 -Output rule count: 896 - Pruning requestDomains: from 297 to 292 - Plain good: 728 - - Maybe good (regexes): 134 - redirect=: 21 - removeparams= (accepted/discarded): 1/0 - modifyHeaders=: 0 - Unsupported: 12 - regexFilter is not RE2-compatible: ^https:\/\/nstatic\.dcinside\.com\/dc\/event\/nft_gaejugi\/(?!nftcon) - regexFilter is not RE2-compatible: ^https?:\/\/img\.kidkids\.net\/banner\/upimage\/[A-Z]+(_|-)[A-Z0-9]+(_|-)(?!LOGO) - regexFilter is not RE2-compatible: ^https:\/\/image\.aladin\.co\.kr\/img\/banner\/flash\/welcome\/nav\/(?!181010)[0-9]+_tab - regexFilter is not RE2-compatible: ^https:\/\/static\.wixstatic\.com\/media\/[0-9a-z]{6}_[a-z0-9]{32}~(?!.+doc).+ - regexFilter is not RE2-compatible: ^https:\/\/thumb\.toomics\.com\/upload\/banner\/(?!main|cut) - Can't salvage rule with only entity-based domain= option: xn--h10b90b998c.* - Can't salvage rule with only entity-based domain= option: newtoki.* - regexFilter is not RE2-compatible: ^https:\/\/(www\.)?filetender\.com\/images\/(?!logo).+\.(jpg|png)$ - regexFilter is not RE2-compatible: ^https:\/\/(www\.)?ruru\.tv\/uploads\/[0-9]+\/((?!16682220461360)[0-9]+) - regexFilter is not RE2-compatible: ^https:\/\/today-sports\.io\/img\/.*(?=(evolution|banner|\.gif)) - regexFilter is not RE2-compatible: ^https:\/\/s[0-9]+\.sonagitv\.[a-z]+\/sonagi[0-9]*_media\/sites\/[0-9]+\/[0-9]+\/[0-9]+\/(?!(SSNGINDSALC|cropped|sonagitvlogo))[a-z0-9-]+\., Can't salvage rule with only entity-based domain= option: sonagitv.* - Unpatchable redirect filter: google-ima3.js -CSS-generic: 12 plain CSS selectors -CSS-generic-high: 67 plain CSS selectors -CSS-specific: 1194 distinct filters - Combined into 1308 distinct hostnames - Combined into 2 distinct entities -CSS-declarative: 170 distinct filters - Combined into 153 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 102 distinct combined selectors - Combined into 150 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'ltu-0': - Fetching remote https://raw.githubusercontent.com/EasyList-Lithuania/easylist_lithuania/master/easylistlithuania.txt -Input filter count: 568 - Accepted filter count: 568 - Rejected filter count: 0 -Output rule count: 523 - Plain good: 520 - - Maybe good (regexes): 1 - redirect=: 2 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic: 5 plain CSS selectors -CSS-generic-high: 5 plain CSS selectors -CSS-specific: 564 distinct filters - Combined into 320 distinct hostnames - Combined into 0 distinct entities -CSS-declarative: 7 distinct filters - Combined into 7 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 7 distinct combined selectors - Combined into 8 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'lva-0': - Fetching remote https://raw.githubusercontent.com/Latvian-List/adblock-latvian/master/lists/latvian-list.txt -Input filter count: 185 - Accepted filter count: 185 - Rejected filter count: 0 -Output rule count: 144 - Plain good: 144 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic-high: 2 plain CSS selectors -CSS-specific: 184 distinct filters - Combined into 62 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'mkd-0': - Fetching remote https://raw.githubusercontent.com/DeepSpaceHarbor/Macedonian-adBlock-Filters/master/Filters -Input filter count: 289 - Accepted filter count: 289 - Rejected filter count: 0 -Output rule count: 158 - Plain good: 157 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 1 - Invalid network filter in mkd-0: data:image/jpg;base64,/9j/4gIcSUNDX1BST0ZJTEUAAQEAAAIMbGNtcwIQAABtbnRyUkdCIFhZWiAH3AABABkAAwApADlhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApkZXNjAAAA/AAAAF5jcHJ0AAABXAAAAAt3dHB0AAABaAAAABRia3B0AAABfAAAABRyWFlaAAABkAAAABRnWFlaAAABpAAAABRiWFlaAAABuAAAABRyVFJDAAABzAAAAEBnVFJDAAABzAAAAEBiVFJDAAABzAAAAEBkZXNjAAAAAAAAAANjMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAEZCAABYWVogAAAAAAAA9tYAAQAAAADTLVhZWiAAAAAAAAADFgAAAzMAAAKkWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPY3VydgAAAAAAAAAaAAAAywHJA2MFkghrC/YQPxVRGzQh8SmQMhg7kkYFUXdd7WtwegWJsZp8rGm/fdPD6TD////gABBKRklGAAEBAABIAEgAAP/bAEMABwcHBwcHDAcHDBEMDAwRFxEREREXHhcXFxcXHiQeHh4eHh4kJCQkJCQkJCsrKysrKzIyMjIyODg4ODg4ODg4OP/bAEMBCQkJDg0OGQ0NGTsoISg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//CABEIAFoC2AMBIgACEQEDEQH/xAAbAAACAwEBAQAAAAAAAAAAAAAEBQACAwYBB//EABkBAQEBAQEBAAAAAAAAAAAAAAABAgMEBf/aAAwDAQACEAMQAAAB5TDDbPbKFXMN/aJeC4hQ0tnVGgZ+ufmeuEUl91F208swzhkoVi1yGV2lyL7gTFZbRcPPLrj74xVfm/siPRnsi/uUh/m0cN4mzpF61ns5K40liqrfyVR48NxUXUHecNcko6xX2yl8c02T+N6ivxl7Sar1KrPZA91iwRtVw3DtaWJLJfYEuB4Uu1LkXwgtffML0roC+k3MLNNMaXXZaQus9AVcM7yjmxOxWbnMwybhPuQvPZmGe64WZeMj+3hlTauNwrDffKY7+A9S/FE2G2mqlrWNz6uOAQ+08BNa+l8tKnnsrL60VNreW8kuZatoZWt5xuQG7TrEk6VlqcR50DI5I3rcedReuhs1UP0A+nN4dePucxLQrLelJeGPTc70q8yZh5NPIIXvn5PaFhLZ3WlCNECyZRK2kiSQkzzCHXNdhnSnrFeGK3CHcY0lZkj6y5R68+Y1KB2USTrmmusxrxsp+iIXzvLUsjNX0UqzQ/BcNHnjPJMVzKTDTqkVqVqw8jkD79Ccqzc0pAd0KROer0SOXLzaVjUiso7UFkcj7aWV2z1hh575wq9mBr1nQW5/3N6P3nczqAuZy3OtEVHQyac5TFbL1IXXN5W9eT30rLeJ50/MdOvNZE5mbxRvTSSFbSE8rmb+C5hmQ+izMm4LrrZCOo5Bhz30My3zclp+9mY2WsSXGl851zz/AFzSWnSW8y0x0v8AVvlRbFMZVbdXxI52gHLXO6K4TJGznivE+hC8TF7g351EctuRPjqcudidFrzOQ4U6YFqDbG/g7K1a953qE5HrkjDjwWtShuWaHpj89JYMpnQhZdzVkn130zYZX5YwYKvFJUF+dax5sg+zB34r5c8tsB+vYlnZVjkr6Lnem9nqQVKxuh8r+ZFka41nm1rSqzaigaMPEDjMNcQ2oYLGV6BZV2hiZXXz9KbCUDBIrD1xK/c0WM8t5Dmk3nC+Queh2APikD6bQNqTmWyH8Zp4VFxtpnLPfLMzz3GrOkTa5KklgQR9Y3C1oEkCF0BcgCSzteUJcOkoYXaV4aXYNNRAF1fm3P2fSE1nNITQ+m4i8ezZd6wmcAVaeCYtkTnaYPpMFQ5vp0yg60TSlo5VAau+Wa+P54jUYNEpi7N+X3DwRLK6IQejJjznoWUmXnQu+eLRvMdeWxsSZz3xgfX8l1y0JO5vJ72fzzrOmONgU3E+kIx1pvp6tRxas2tY5M9fYZZb4GVr+zVJoNc53tsZ742G3nvmucz0gpYLWwsaLCglWYPIxHJlq71hIoWP1OLm2vT5nelbZzenPjKPbxF0yt6uWuZ6xLFAH2+V08KMV/ect7YlCfM9AXNMlv0eEpPe/OtpElbeGVNamNdqAmG1F9cpmKlSQHyNi5038ReSOTdC9Mqc5m5KETlvsM02+aapIVagvY8h9JTlz0hnTCWZTb//xAAtEAACAgECBAYCAgMBAQAAAAABAgADBBESBRATIRQVICIxMjM0JTAjNUFCJP/aAAgBAQABBQLUCdSasZtgWacy4ENhi6s2gmkbtNTPdNGgEOk26zZpBpNgmyaCaTQza07z3CbjNGMO4Tc0G4z3yquyx9NABqcu7pJpNJpNJoJtE2rNqynDe+JwupVy8dsZ97CdUTqLN6zVZ7ZtE7zXSK24cmXSKFPNxFPaOsRoy7Yra8nGhQ6rprPiaGaTSCqxp4e2eGsnhbJ4a2Gq1Zq0YvFXcdDAs28ywENk9xmybYn25PE5mDv6B8QRdNbIn1X7PO2mLQ1zN5Yp6nC4H4WD1eGSm/h9c8dhwZ+GJZk8Otbq8MnV4ZOrwydXhk6vDJ1eGRTw1pW3Dqz5jizzHFmTlYFrdThc38KmvCZ/Ez+JmnCJ/EwVcOul1VlFiOVIIPI953U+8z3ibtZ3Ug68iNrDuDXNzie5oo2jkqliErWBmJLWJFS154a8RkuEKXKFuldmrZK6WFNJt05FgIbJqzQVwKBNJpyTmw1m0zaYDpG+F+eR+V+IARAWjaGDcIo7t3g+v4+G+gdhHOi+kKTFrA5loXjNu/py/wDJi6SptvqcRfcCrCdRp7nIGg9QXp0U1vdMe1KFtyN7WWNbOrY7oTTYL1YWnGybLErrOWParw2CbmMCGBBK6nsLI1Z9C+onv/4U6GE6QDUw/wBFn+r5j55WHvj0JYhxK1uHC6urXi1rUuHhlGwUpTwZNi0Ju8Ovjhh1a4uDXamQle67DRcf13focq315k6TqTu0Uaf0bhN81ZpaN1SFnDJZWwfqAeCC0U1bbKcYS3YahjViJT02yGmpmybRyxMVsmwXYmI3Eba7OVeHk2qcTJ3+XZcXDyN74eRWsGHlGHHyFsOBmmJiXG04OUAUlWHl2Lbi5FUTh+To1NqP4DLhRlPeaTQzSaTSWD+L5p9uT/amyhFOat0ys3rB8yq2DMqRfH6q+aOqc+qyDL/+5LWtl2Uq5gzlRrMunw/ru/QJ5D2lW3DloPVqJvm8zuZtm2UL/kDRBeLLEYHdSHsxbGNdmRWHssumrSquugM26Wtub0VsMDAJLHlxInxDMX4dh0qTW1uZRj492OkHD72i6Y58BcTiI6HExsmvIt/LfVbfRserDzMbItyPx2vi5fV4j+36rf8AWc0+3LaSQoHoLqIbNZ3MWowADnd3m2aTT1XfoactIjbT6Nwm+bzNSZpNs2zSdudFzGAzqs0sK6e7a2HvZa664X1jGN2h7mbub9PKx7FVbOWRV4x7dldGdeqjH0sw8erwhngbpemqDBt1yCMrMpreix7ld6aLnTIYU4q4uTpl2BmGNkzOyFsyupOrOtOpN5huMck8L7yorjo1JW+zINVniLpRda0S+13tyLlscm3HRkoF4auzB/LXjpSKbDZb4i6HQ2PfkbrbbGKFaFurNVmZ3spVaYmTkhsnJvS7K714yjHlv5LP0Ns051PC6ib5ry0m2aehmgQz3LA+so+fjkCJ2heEpGO2b0Z3Os01m3npK7rKuWoENkLE8gDNWhsM6jzVvSPnZNk2TZPZNoj+2LXvhp0itt5Ed7P9XjV9W263Fseza8vpPU2kTG+afy3ZISyux8qy2zGtfJVbkxO1m5MiUK1dxyZXebcmy7K31Lbfdf1Lbb1NtDhaziEvcPccv9jpqUqtNuXb+V/0IZ8zSJgZViWYWTUV4dmyvEvtlmLdSHqeo2UW0iqmy4vh5SLXjZdwsqsqL41y1qjmpandPLslhRTkJeEZlVGK6z2maLGv1YhQOmu/tq9bJy0HPqCGw8tIFm2M4EJJmk09WsXuOVj8kOq2fav6yxdDUY40Zu/C1dkhm5tFtsSNbYwDFYSRPc5TcnIMwVWZZ8Q5Nk11gbafGXzxeRPFZE8TkRrbLAhNcU6S3UubbCikqfmP+gZprzzf1qqPEYdHl6ZVn4cXvjWVL1syxrsbA0KYNeMrZiUa2Gu6sutttArGAgoGJbTiY7DTrU/Sof4QIyTKscTHNkNFrywrXMGxRabFEt0FhYCG2dzy0gWaQuohZmgSbZpz05kzSVfXl0u9olRlo91R7Rhqq/LrrMa2vZ5XlGeVZ88uzZ5dmwcO4hr5bmTy3NnluZPLc2eW5s8tzIeHZ8PC+ITyriE8p4hPKc6DhOfPKc+eVZ88qz4vCs2eW5s8tzY3C84zyrPnlWfBwy9ZkWrYfRbebUrzbKq/H1h6skeEOb1a78uy9GuL1U39GDPCTx42rxFUdeI1hsjL69VWQaq/HLZEymaxckCdb28smrrU4t3Qse6vSyzqtj66uWK3MzWTSBYFnYQ2TUmBdYEmnI9p8+j5gWaSpvdzYahToXGoU6GH4HzGTWbHEFbGKNsSt7JXiBeemsY1Ui7iJj22WFEMeuVvpLNuqnRCBzooa9toUGWvsXnp69IeSkqQdRydYqazasKCfUlQ09yyohaQ6GBxAw01m6XVVOejUDVw+tldRj5D6GN9oObchB6G9Dc2ifb0f9Hx/wCq/iz61/b04f4vRl/ms+tf2s+f+WfZfnmJi/gMMyvtyH9B+OQlXrf7J9ZR+GwDVCYORjxPkS78zfSf/8QAIxEAAgEEAgIDAQEAAAAAAAAAAAERAhASICEwAzEyQVEiQv/aAAgBAwEBPwHTEqF7GyR8EztJIqkOsnSUSSSZE6vaCCEQRpJJIxcGQ2PnVD0es6oi62QtPraet3m0bSST10si8Du7QQQQQR0eTl4lLyayPJRTjwVUpVcIj/I3l4x+nPsqp+4KXipKf55/T5UmCyPlTBT66ETtVutH0QmKleiEcHA4dsKfwwQkhwR0xeLO09S6UJWrq1oUiR5Hz0ySMRN0O3//xAAoEQACAgECBQQCAwAAAAAAAAAAAQIREhAhAyAwMVETIkBBBDIjQmH/2gAIAQIBAT8B5LEMoo7lFctFHFhKTOHwHe+tD2JZsgnW5RRiV0rMzMzZmxSt81a10FyR7aWOzEUCutIZ2EIXf4b0yoyLZXkczIj2604/ZYv8LSLIfC4m7xM0/wBiUI0Yq9ken/Vkp/xk3a37j4f3RGKjuyPt38jeUBRi5dj9o4i0svneq30j8KjAwoW2mJ6a+9PTj4MI+CXggitWug9U9juV8PiSxjaJTcnvpwOEnuyuTjSxVos/HXtvqSGtENkXp//EAEAQAAECBAEHCQUGBgMBAAAAAAEAAgMREiExEBMiMkFRoQQgMDNDYXGBohRAQpGxI2JygoPCJFJzwdHxU2Ph8P/aAAgBAQAGPwJW6Cyvz78yWXFY5cVisViscmKxQbNSGSlusVj0Gg22/YtMknuQDXTmrhX6eeWYVJUx0Wi0rBbFiFsWqVINPQ29yusOdJvmdyk50R/e2Ul23pXbeldt6VU0RfOSwicFg/gq3Z3gu29K7b0rtuC7b0rtvSu29KtnvSp0xHeMlg7gsH8EDEES26S7b0rtvSu29K7b0rt/Su39K7f0qmFEfDd/2SlwRhRMRkmOdI87RyyyyCvdShD5KTgQrNKmRJWupuYVitJdymOZbJf3ayvkkU4j44lJ8Je+cmiu1iC35HJLnyKsr5Jc+raUcZBUUyVIEhvVUNwmEGPMvH/6SrdEqEpYqp3yV9m5HNPmhLEKRVuZTDaT4Kl4kfev1v29BN0KK6+LMPookOiLEpOLP9IhznNbJtM8Zu2J0XlNVnUSbvTYgLgH6Iq2FCJHJA2+PcoVDXUPDST4otzcR0nSm3/S9lJtf6L2Z7jnyCZDAdxTXRiQXkhsu4JkOK37TCiHsH9ynR2tiMLSBJ/Qcl/P9csvcJBUtC/hdXcVU6/mg8Msq41DnFFzGSB2IvLQ071OMyY+6tD1f+LORMdnOlg0YlezMxQE5vG7AeeSpjLLN0aSu3iEYdFwq3NsMkwziEIJZpOwWpxCzVOluU6FZVw22X2wlNTDMVm3N0lqcQqXCRHP/W/b0GnnJ/dMgnCK1zQXVaBkmNhgtDL33pzYjNFxqsdqDYcPV1Z796EOKKmy0v8AKhvbMCGGiXghnA8UkkUneV7XTvt5SUMxOtYRJ/8AlVtE2smBLvTIkVtT22q7k6BDrNRBm87ug5NP7/1yzCn7hdCHBcAHb1/EH/C+8djcVWRpYyX2MnjcqeUgBu5GE27RaoqxJPeprwtzQ/4nfUqp2Jy0bGgSC0r0xJD5I8oi6kO/mo0tYkHyUV8UaNBEsk6Me8LksONi2rirFvzUaBhELZBNcWkBP8SoJgioBsrb00RxKUXgjEYKmnArkudsZEXRfSZznNO8uf8Arft6ay0lbKOh5L+f6+6GexTatJ3BSYLnFyvFDvK6zhcQrX8cl8k+a3aHEJzW4A5faILm3FwTgmcja4Oe58zLAJvIuTnRZrHeU7k4cA6qd06JFc2VJ245MW/NQeS1AvE9q1mjzTsy4eM9yEWPEFLfvIuG0zWchuAB75IQHuqeXTsZrRc0fmULk7CHFokT3lCqI0D8Sc5lxzMFgsFM/wDN+3Ixju0xWZ75LMwbAWWsnVHBpTWuNiQnAHaq34gpjHdpijDR8FnI+OxqqOwWWsoTjtRlNaabDfjExRYdiaB/KFmPiIm5BpKc1rrBQj3JoOvE+id4rk35/rzZHJbpXZLrHJit6uQ1Ug8/7N0stuZiscmPSWyW5g/q/tQGzapvq8lD5S34TdF4E57VcJ/4Cm+IThS033JsMyDReQVTq/JNjN8CvIqT7P3qTty1W/JNmjInFAxsG70XyKbG+JtivaX7AJeKc920IeKcocR+qxqDzvTvFcm/P9ctsgiMZY4XCaHt1jIX2rU4hGhuripxGyCpeJIOiCVSlCE5IuosO8KuGy3yUookVni3QO1Z6WjOXmnPAs3FBzG2N8QjCe24Ez4KYvLFFzcArjLRB+a3neVWxU71cdHbop5ZDnTUsn639kaTKeSnYtElScVbapt2KeJVjjkp2FTbkscMkwtcrXK1ypF6DXGclo5CXbVmybKpuKmVyb8/1yXy8m/CoEGcpxCmBmdqrAGEsVyr+qo7ThIfNe0RdSGwfNQYjsSXfVcoEUyFN053J3lzqDYpjXRaJNEhKahcmhOrcDjJP5B8NNLfEJw5QS0Z3+yj5hxdhis3FrLpXlKSDm4ezbcVE/ConlkwRbs8FoT8gtL1ZDUMVpSkUdgnksr9HboZqakpqXNdyaPZj9u4r7KUQbwQur4hdXxC6viFeHxC1OIWpxC6viFqcQtTiFqcQrQ+IXV8Qur4hXh8Qur4hdXxC6viF1fELq+IUzD4hanELq+IXV8Qur4hdXxCnymUJu8lBkK0Ngk3mw4curEkxjB1bqlnPZ2VTnPvUeNEAcXPnSs3DYIY2gJsM2ATIX8k+KdohwcJSKOahNYTaYQbFY2JTgSg9kFoIVeYbPeixrQJuqKfClZ8uCnFhted6zlIkG0S7lIQxdFrWgTylox2KT8Dipgqr4Rgg5q0kX87R6aXS2V1ZaIU3mZ5lUQqUES7yrmZWkphSKsrqYy921UtwGTv6aynlmFfJbJMZGuKsebN2O9SF5rSwVDTbvwU5cUfdB7h583y6MZR056I+PRO8Mn/xAAnEAEAAgIBAwMFAQEBAAAAAAABABEhMUEQUWFxgfAgkaGx0cHxMP/aAAgBAQABPyF3GPajOd0X0gDr5Zi+yMPQUmDEt0T0dDF3RjAZg5VF7bfQR0HjFfMs5hnRC7oYzQgbY87EeJqXI1v0gCwBjp2Xa0+DvL909TKd2U6T2Z4p4ot94xGYJ7qCUhIvJHkEA0TpvcnnlrkjwsacwuvVQ7jrYs0wjUCtdKHyl1O3XrIIuCHi4eml5mSjRKVLYd8pNoPaHJT1SDc/dKv6xLVvRhlrehcXdN4mXdlRallz0acwA102zOzjzw7pQh6tCcmWdFRcFunEcPpFYY6lbwuW4MZoTRMJ1PWXhrMXUAZTADljt+OEflMVVC2EvHBxymI/8T+oD/j/AFHOW9sZ4YeGHhj44eOHhhpELL9xEqwGHj+p/wAr+oSiiib2IWbIKcQ9Mk6QKkevzVLH10g41IG8QHZfQAp6CukBEUgM9NRHW95zRppcR7r6NbNs7r/YnGr2y09ZDM3kd8RBSHe4hQt+ZVJ9oNVBtuag4TIjPjlKdNmzsuqGkiI4Srhy9UWJ5ol5iwrvNfXfNMdRCxJYykA1dSjVElNlDTHeEiLf0n6S1Rp6FEuGk6Yjv9GOmv1NlnqB5lW2o79PqqVElsuTPio6bV9PWjfUBs5lV4JlZo0lWKlV2f8AhdVQLsc+8qtcvPvKZjO0qg91NP2YgCzOWI7TGIx6VzKt15VFS6DV0mNLrP6iPZh+Ii05mtDKjc9RLAHwuXkdpKY9HUqc6+rMqUvnuUL0qXEomppO0Kx9D00fRGwd+hNXtDyNpghXk1lHbTlmW3EMHlJXGwqhoW2sZGClGnvjIw3qEJVtsEVBNIrrlmo2g0wK3Aiel03hJGVIZRZVmDcLFMIMMrk7lS7hxwQ7WlhgooHI9sH1vTaRlW+zrVvcewmaU/8AwT5j2kHcjCvtEwlerYU+sqmXzhCe8BVVtu69YU7ZWhVhmyMU4jW1NzFzBdNuDCbw7Az94fAU1NHmX57ssYHmASpWvI+XMFe1O/leYdRZ5h55dAFxaVD9zh6l5SqPN1Pk/wDsrlb3JX31EvdyI/p6U4ESz/vGsmlZmvOpgqB8+ZsAeFP51FS07I/gZzzZy96h+2InhmxPxKP3hB/LCLBaI1/B+Y3RgJKm0YXi5eIAlUqVBh1yUPGG3j/RD6gdBaqnGdTueCWoKGXY0tBK0pGxGbdefKZ83ALtu6dmA3lDuQDhWQJZnEFdlPLnKimPNVWXr+4QxGvA2/dmXGwGlRVPnzKF2QFrwolkuX0uXMymdUw4GIu43kiEZ6+D6ktsTwRXWJ3IKBgU8TNWN8x2aKhs9puteqx74Fg9hcpyDKJwTN6c7NRuwuGFl9jSaH+zKZcrXpHvbBLE4hXWyJDueuj7EepeRfMuVL2+M4DEDuaw8R3qN54ENz6cPC/aVGlQI2+3QIIrL4MCwGQugDWYs3beDHMXIeYT8OXww0R8mUKnRwG5ZBSafCMJqUaqpnSjPKqJXz20eu4Kp7fofRiO+mr6DR1WXRc8o9am5ZxoKUFiM4eIbQrosHQVh2H0bwZ6A702KWYz0B+lHmJ4jw4nIgmEglOoUbGpTjihUFptZO5F1VeQLF2nM7PPrHBaHrgPbU0vrNAt3Vyhdxwzq+OZiBwdorO/PTwlrCU8r2L396ubgAHpcMdBDDWAUTZracFZZ2EEe7DSpqqrKI1noUWV6dBi/wAOUcPs6Hi4AKbvWdijwGHeFH5na/acthAPhLVYgmb2YAFSjpHPGFNZcx6kOjkbxJwLoPeiX7RpuUe0t0QTRA8KlfZAvLz9LqWn6nrMXvfll1Xp6RXNsGtywrZGO8xBxGiBeG34gNZy9DqNLQ/iH72AMiz/AEncqU4J8gQBRZthSqBaxDGamrKld7k9Lqcgz8QO0MAKUo/wIhkLDRKWyeI1zNphX8pH5z99P+UaRI4lh9qbllmFO5UHCAkrqy0aiy9dEsHEB6lP2/7BVeoidx+ZZ4S74qAYSTuX0Si1D94O3ELjqjgWe1AE5IDxDumzK596qb3HYx0+/lXBNyqBd0W5l+1M/XFJSKWrvpMFbMbKILVxlTqFJZzOR0laumfQRvm60qjtNlUBbeGAqzMGYitA6AHxuZcGC3lBgyTAVH4J1pVSyrG7fiASsSAHYjg+sUHSKUccNvfR2gBqiqXoOR8IsAnWHUow9j+zNxAx7w9FqMNnkE/P/wAhyfj5eCcnuHifm/3BFSUrMVXZ0WYM6Q/bKYLqiK43BYfz/wDZudarIU+8HXjmxPxDdog98Sk30uLuTOQ/cRNsjSfph9jxVA/eD2tLPBMRQ2DLcWAq79r1Kd0AYMfeKAH5j3eY6CmXomSnYMaOolXVKpi+3mbMkDFxNcaYVu3CeauGq6BeelhuI6z6ROsRt3BMWAJhsormChNTx9DXW4qe76GqtyofaZTr6YjpnL9ZYdmKnxHLKin06AGHLZAKES1VO0ur1SvaFDU5RUvJlmfcUprtADUUF7hGLKdRQZlAH4RW0QGpJ2YCQ7cFyxTHAjAJslOpe7RMVuVwElOiD0ocxVbFz0Cvdi4pGfk/8l3UXXwC/wCQYDEFzf4jsO3+onLS0MI5n14E/SEsWTbYziUWuA0RVOVliu8cbU3Rhha/XTPokYLbBiZKAvSuYMYgcL8oMx4OxZVyoUVU/FxL73KuMp/Ca2PzMiuWMD+WZ781/gghxeI3XIw8kKarvZv2lVDMo8cTbsR1qLsSoN6ICaTLMJxEYEm3S1xBTqrghDunbpVwBmxNB9JnZo8ksXRcRUWUbNkuvgvjaY5Q4tc/djT8/wCZ8n9Inq3y7ztn8eZ8f9J8v9JXr4PWfP8A0ny/0h8p/s1Pn+sTlt8+8eH5/WHxP9x4/n9Zyfn9Z2vj9Z83958/94V4Xy3Pj/pPm/pEsYHy3Pg/vPg/vHLC7AvsEJxzFuu8oNRIkSNwBQ8wJgoHveK/MDMByPdDh42NGZbsr3L6sNE7Pl7xqgGz1XG5inYgZFbWXUzdRWxXrCzw6XmAwBbybuIHuO71UOwcp7WlELStxlcFQZ1FgaYO43CNLqVKJgty9UtLtQ7PeYWo83MC/wBT3jr2pdFXsEKt1qUwhWDMOcQ9Q77FgiUIk7kp2wQJUaDMb9PQwnuH0XJKFmXNke77wbLIqSzInQczD0RS8YIqHqu/UeKxwajGFlSiI9f5EjRfKiX1GhMySU5nhcas/WVDNirM/XSsaG0AwrB0Z/lg6rwQ5OerGJKjDrEZeYKp1s702pA4iOyCwF1MR+0WEzmHWSzkRSIvfBM8aiL2TcRnUuZZ6Pqg8i6ahm1WeqVaMlsOknE2+iIxm3Q11nTX651R2mzoaPq3+rq9CdR00hpATqjtho6bEAU89G8/A6OvrPUemk0/8Bq6EbJ4clfbEwWNqNmh8wA47TJX8zG+8/XT/9oADAMBAAIAAwAAABDyQ3TrhZvCnY4/ZzKL8UBLHQF09mNmqlJH2919OV0q9hsgDXBs08dNcSo+ZX1dACbN7nnO7Z7zg64gNNjz97/vhwJpoUKzpF7RJdS4aBkywyDy5ELpMGBZXhiE/wDZDjTXeWn+U43jRCMt6t9YRghOXjX7Ab4ny8DCJjUevaiN0THj+DSnxxCFihzxmQVsnN6fKRIQ+8bQH82JD78WwTNN8J8k5yeaGW7pYCM3d9NoCslpTkKGXsgcbwyj9ACS3QoExBJ/rjz5K3SmsWN+pXFM/8QAHxEBAQEAAwEBAQEBAQAAAAAAAQARECExQSBRYXHw/9oACAEDAQE/EMC0tguxDHLuCwcCW9ZLOHt1ZbblsNtmzEjzrhsMMBI3rl1d5hyTe9gzsh9t/J/cDgzIDeB67lv8Rh9jrPWWttQaJPWxxnLxyXrjIy2R8t/HZkSY3sE9l7/GR+2Ps49k6sn8sztxs7Zl/wAjBLvG2228bbDLrggTjAsLT5dXU+8M8Ny1/OWFvGHU9upO+4FgHc+ECGwRq6cNRrggW8bbbbs/I59hB/420iEmh/Jb2Ov5Ki+nt2qcEYyHQBl2Cf8AV8zwJMGfL0Phu3hwHO22beuA9y5w9Wt64yCzLeAS/JM4H4beMB2SYhAMAEo7AHSTD17H0J794n+ZGMzqC7+wQQPbzgbeSR21ZsHdqyGM9SuCbeFyG8nu7T5+Xk7CeQSihbv4FdwTI/RyLIXB9wltlux3dF4//8QAIhEBAQEAAgIBBQEBAAAAAAAAAQARECExQSAwUWFxkaHR/9oACAECAQE/EN5XLN2LoRoukE6WLLJLOQwHgka8CyyeBu6cLC9omOHSPidmWnhjrhxI9WvRdmcDYJZykgz3gwk2xAwYc7w3nzuwzggmrV9yMdHwXqFh+G/B5hF8Eb0bGWc76noyyyw4/dlnGWWWWWWSRx4sJAEthHqFAPEtu3Dqyyz6KMOvcuvSUdSnqPa/BbbbeNtu7u7sbGyCwX9WkPtevzdyBdU0tb6POFquu8xlRpMRgBiMgD7Q0J/L936kP9iJjx9ryjwbv/LxOGHzHRg3gMAnhlttvwWyOCzh592BUnXSSBgdTfTuRXcu+meY9DbDMvwL8T+QMwdSjuQDQ93jj2fQWHdoe7ctukDMuNnz88nJE8twHAsPAA64OFWNL3CY/U7lgWXVnEmQ3j//xAAnEAEAAgIBAwMEAwEAAAAAAAABABEhMUFRYXEQgZGhscHwINHh8f/aAAgBAQABPxAvEdoRi7uzC208GJdvnoSkUHWs2lrOKKPEcGYfV9glqAPzClqXaQPg+J2T4iLwXcMAHrREX+Jbx9CcMPcR+k9VamQDHXUyOa6jcFXpaY92bVpOkSFkAV4GO1Xy1KGH8w4mvS4fiOlxboeCZtU7MIFc6ByynVXW5zKNlZlPCAOg8g1svxBiAgDgJiHRli0QaI3zfgf5MtrMHz80/wCxPM+7L9j8scGEwYLW2otZWutQasJpuD358FsaBxV2DsZv3+CIpqoQ7qrNxah7hgdKfMXNp5Inj7k6xhrtE2kPUYXwE7xhqpYSFWLMJ0fXFl/QlpopsYAwDwenbe3aVz39npQIY5D7wzhR0vPaZ7ZYekEFB+vpmlRkdmKC2YYVD89IojvtzA+k7uItZZ7QxlX5zKLSbFXzE6fAfm4bdbWn/EWBcvAv6jLSnkc/MaCjKt9tx647CrPJF0ubGql1Ri7ZRri+XMLgvuy6ruOCaQHfmVNGX0MxHHuP9Rb6HTRA5X4nDJvdD1eDvNIdw9L/AKJQjy5gAAaIgodMC5eVVzuQDN/hleaa0St6SWH5/wAT6x+8FPl/MPzIHZfqiRgLPKk4JrDpTvBnUOCq1X9pVG+slJ+r/aLeJzGBvFPj4ikEkozasItsAAVBwFz/AJP9p+7/AGn7v95/xP7T/g/2iv8AT/aUmH1aH3l8iaCT2EH3uAAMUARU2MK+aNAFXzaxe/1eY778/wCpv/b/ANRV92Ef09JsMbjA0cAfqGI5fSbE4R5Em/qwnUgFKCx9FOpmcG/F3DIye9R3t15uULq+TUDV7PDLCYeTpEvCWRkLdSC4CDIzLdXNP9ynbBqy/rLud6MUEpG27Xv6mxs+A6rK67zlofGX9xLt72LX3og6JtAfiUgnBNXxc6PyQftFoyqws+CZ9oGA7uLgU7aiwTUXNHaa82x65ce2PpM3Xs4jbBfdm9zQV9Jwu91ivbTwYIrlexKKh5lq0gFiMqW7eo2l0Qr0IFZXhOSUNjBMaUiKLNPqr6NzEO0zfGNyvs1KG8XmAUFdjGxLHXUwvEdHWVoxe6CSg55iCylHaz8vQUmBancLPGdcAz5gWzGNuvb+FxZM+a6nBMub99fEITBmXaW77AIbUqlHeZmZmVK9D2xblurC8rlr4WU5ZlduwvD6rIgs0zXoawcj8xAViouMWrXJsgGhXq2RUsVxdUBM63TL/N8wFFeQ4/e8rvm1QQ7bYPG5uq1Bz05byYYV3WcdJko5zV3iou+LVvAg1niK5Qtf5FKPemVxXBWqzK9jJrkj1hMC28tNPaEUzVDffxLALygNrQE29pnIKi72s+h8SynhYfeHEV7uCYi6OhM3h3YfLlFgiWiIOrWpRDNq+BgvmomKgtEaHYlG2WdkP4MPBsuPiEXBrmDYOxhut8EJDNuYFANE2+JotVdGK2HMclTNuMwL8H1mF+ekd8+0v7T7vXiW9yBjNoiS4H1/ajIiUsOMWrJzmBirvQFHoq641qaq0EpNYaarIBsmQ22s1AEo1g3ET6AWviKbsqu94b8C6vjDwIWrePogRkaMeuhQ8nmLqkOVSuW2Q3n4g7oBqV4knAOOuoAQQ9LZlKi1pK77UvXuFf2WUYVGkcIdDsuqbtzi/lSewKYt0fDXWUSiUSvUQX2Pw+gJmfHjOz1fApznU6DfmJfpfsQ67tcr6Je8/wAVAy1OpnoZn+9AtqlAEuICZMWG65+kGVilumZrO2t7ilYEBhzdDHmVWifhjtQ9okyCpI4DL2iToKisqpvJEoXOkO62q+kugCFgDV2Uypic2RXi0GZi0sWTqVVekYNrRo4aG/ufMd46zRU525TYCVquIqdo9AcB3Zrww6EoWJlhV4LFba8RMqwBsTIhbsNUGcdbL4ixtJN8WLh70yIFbEVmzmD5sYabxB4Q6ctvMfacB/dEa9Ai3JVYlmG8LXS34RbQdDecS/HMBKoabl6MXaHDJm40lDaPV5DGXB3GAEhQDvii/aWW8gl4UkQ5ACPxwEiprCm1vVVv2ikGaXWX4yj4CUYR6Q6P2nYloQhSWNxDrMbbp1ELZ/pLdJeWm77/AG9CZHvUe0IQszjCm/eL3yJNnMWgbgP4AQEkUbA33iDtoFl+UiNaZlolGeU6LQCgx9KvXKUW7CVguX6ENpebrGQj1a4OipVkusbhydaC1DM13uOh1ZhUq6gd11vmxoCZAKAuMo9wIwUwQvJabA4GeHm1KxAMZVQncJTrKXsljOwX2lujG3AQB6R8sJYbmcK1NkrxAKUljMAN7Oj6IJTkgGge38tOeCA3PdnBB2iNkvmO3Cbl1QwUvn9LhNS+i1MxJrNVqMZaiKsKwbDpTnnNkJcnmKeCiivMEU7bHksKrOO8LoRZZHIbTPDA7Foe1e29Bu2jEy0GAUNZPDV6YroBpiHoNBElVOX95i11Ig8OX3jTIYO+oZlHM6WYDAkERw7D2Avw9Y69i5yptWU4zLXbiZVACcFHB7/aIO2UbR2q+lv2hr0WX2nrmseDmOKpA6VUVjBy3L7siVDDk1Re+vovaIWqxyNMl5dqsQHDkPaIltUZGcVLiCAg9QPexv3jj9jaoRvtCAABAcZRxjhBoBY64+kodBx1ma7XcETLquFgz1v7wd3c7ZAXykGCQKm3IDcLCFo/wrhej6L938Pvvt6E5PDLMiHcYwg+cTA2PQyxcLh0Ny7MeCZ9B0ZfmUpfcxhBlCXvB/EOqB8XBbyUW0alBqU+haoV0C429oqwwwUusJVslygvvA5OWPnvmOkGyzI6fVxvE2I9oHRfMVoQ7RZwkZ3CbgBgljCg9LlQkpDYnDK3VEDtbyYxqGpZ0XTdmIhi8WD3v7kQtoA17e20cdIqlcAtn/YzbVS+ZU14NSjEDFh37zmyuhuchLA2i5WgBwXz3Yq2FqDhek/cRsandhsKs/RGaDQG6InsAO0UVW9bUIL9oDAjmU4RTjFIjxiEivqWyk0nD7PaHEUFe7bwffwRr5AM1lC7yL8QJAKdiqAb16EhWl5nd1CQrWxaaKrsdoAqJd6jrDRgFEGoFPLXiWlfvswaAOW6xE0aCE0KsukxSzBMl9o7vesNC8cY7sBTkAAC+wwtJDveBL8DthECmNXI1fSLqXjuKQp2sZ2EMYB5ZoH1Q65OoxVw/mKAYcqy0qRjtaUNthnPGBxjv8nwy6lWQtoin4SKzVEgNLKqdftFSRXZjBpOnRYJIbEYCqdR8RhCiV7ReoYDAD4lQTV1BaXWP3EP9dlzWK3bJ9YjFUji9h+KmCD/AJzClqO3o9J2/wCTFXTDDWKIdV+naByGExac1EXClVxfGJf0LLU+CFLYWGioPvXwy1h0LzsPxDsUINt5hMF63WPyftxT9oNCWFXUWcQBSrB2iG2eequYBQsIc7s9391BRgAGBxlDdJfR7I2zgdJoBUo6RHlxNBicnjpMKS9DMSYAOmJ5LLPEROvOEgDiVKj1aGMcwYktmm4jZsOpkjxWnXRgCC0fLr7fRAKvpTEEaHWKIO6qW0Sn6wdL8ihhVAcIJFOGOgYlizICj/mASIbd3fR6kZBwnQpl8n3TT5ebiljzuM0WIQkN0SDgstTi6UvvFUqbdrD7ZFDQvuzBJroYg+6GBimVMomDF2ESwzwzn73goyr5Zm5UqaTq1cH1lYS6stQroZh0YFA2W8EWdAcrzHAq8VTKEXzOkrqEGGIKjtGusooaT90LL0za3N+de8EZihYjAZF1z7y9Q9i+Raxe/kjvV1FMnXidyAIhP0vaLf8ApSV4yWCs8vWPyekoG78694RAYWJGCrLrzLWhiVvWzWL8dSGBOg8RKgwT7Z0P72l4UdORK2dSJnjcpjXilAKBTgIXaQAaq2uIqpF4TFutcv5jjuKOgYD4iKqaFWh+n/IMERLo/j/eIsRaXq5gcmHuJPpX2Sru0T1Puf1zGfpxOBTQQX+jlPYPxegAmgHWKPmSFcuXlYcgWQ51oGAGLUUFFhBvmo0kcXhHwXj9n4EJkZ7R+KaDZdLSSqE6WWWnCx5IVuFQrYacmGPsR0AO6gjESqsAbaR+kWsX4CLlwcqWDSJ2TD7QxWI6ZfF2GNpU54JqxS6q71zVQBp0iGVMFtyOpkuEHWLHNiHFXHBSsroWmrlEx7gr3blWbSwaWiBayOehHOB/ESOADmVx7KfR4/uUo1ZDnsMFPrQ0q43/AMgWyk2mXVfpKSF0qgiWb9KZSxyzjBUSWg8s3ZUXZUdtxLaV7zQEQ51CbaxzORB01EymngjuIRuVmmiXDvKiQHzGoJfAZUqAW/lJc0KUsvmWZsy9olOwBPcWwJQYdnZiU6tDpFBXJcpxlIfF6hAsCrF9EGB6Md+KPApqdkdDj4jZTbs4iSdo65WyLwUFHSRi1KjyvLKmahOr6LhNUDtEFiDwKaiNLCk6O5aEB1YNLAhXQ7qIW1YqN9iYRjzD4juh6WR+yl/yO1QRL2O+IUILTdce7DhetSc3uJjbXY9GN1Zk2xSB2rgj9X2DZHaKVLyswF3SqDMA9AjFq+gaJTqCH9fmCxJVLbdXelFPrhCqC6Ls7N1LRApD6ozSMi4LNJ3wfBAWXUek09c19OsoIuKNDAPYA9pjYEDYs2hzE2QQuY2l9CJ2LGjLBEM1XtHYMNBfVLdGOdEfguLNBsfN38EY7McdVj5+JSDWZ1zquvPxHYYCuJdALjL40OirVhtrfe4SN4ymbEsr2ynIhwbgLFC4SEjbi8TdNpuuCKLNQ03GslHxFgkCm/w4+kzFkCBtT7SvnQPV48wIJsgUOThA+7B9ibHwk19fQyy+C7nLFrRe8Oi5x0p3B80QlPEJnCnQSjsqbHcaQgZi10crB031lJuKBa0RXSdZntmU7dejQnWDbHencrAay/EyDnMoDob8S0MI36VGrQsnn4GV/YDqdJfXSBl47ycMevnNUOHAx1CzC8ccrOvDLEkIxWL0vsPDUAdD095284d2Z/uSwq2YqjAQocqSvLyQiUwvMLfphpKvDmg4ueBbmbvT5y7aGPR81kki8Lrt3Db2gmhFtG13XMCUP4APTSwqhRt+IiqF22KkdKRAiZCEIG/qzHh91Is0DdF/SMaESNpqzZBsKWNxFW/rvGOmwLbyPEpu8MBtqyPXq0gt1fMqzcAB4CNwMCg7FC/iz3ZQShFba4CGiNtzMd8MqeLRbuODvcQZAlYDV07lctScq97xR9IKCFQ5HSHnFBKoOI4AaGxOIsAuHdzCkUvdjj3LIRkNgZLo7ZuFA+ugqVmEET7nhwSxrBvF2wg7HNfl3+ZlIKF5wAfiDNv1jOAmwgOItxg7w1hfdjVs9o/0J0tZYl0RaNnsDrKCghWWSqInoxwnUiBbQdZmEwN9z+HVyrI+ppzfSbgchXMJnJodoAJY6YGoBDQXah6KtPJZhmb1dGWxLcrbMry9vWWtgcuh5Y+RFiIHzt+nrvWQ7rUrJOOvxs/WGEHFOfsfN+Ii58L9jpCmnOS9xUQBkOSCB04LxCAFTSXhStXuophtt59ukaEb7mLY5sNMAZ00+Ox3YUQFA4I6guU0Pfr7RVVVXd+iuG3rwQLst1fRIIPRfS3KZestecsDXL06wQtj606MNnWUi4ODrBKDXeHKLdOGPE2bOsApYXfWWgFdTIwzYKni7bPOpWCOBjuOTYwoJ7sxAjwLcarBblmPJdn/AF7wO3AGV8BmEkUVmkLPtA0zVWa1vvBsKwOLuYtiTdlT1L9AMenl4jV31huAshMThNPRr8zj0mbk1hxNPmfW/wAeXn8z6chPcjfejbeZ9P6dZz6/ouh6PpZQYNPuwEafDN+Z9AQCoNkA29Z9nPpJw+fxPoJXsMlrlt36dPiJ9v8AdnSff/iY+rd4nKPPpfQH8P79CbvafdT+pXYct+CEVfETzF1Zf26lRywjpZfMs8pTPO5icNseI3e735Q9K/74aPE//9k=$domain=reporter.mk -CSS-generic: 2 plain CSS selectors -CSS-specific: 426 distinct filters - Combined into 114 distinct hostnames - Combined into 0 distinct entities -CSS-declarative: 2 distinct filters - Combined into 2 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'nld-0': - Fetching remote https://easydutch-ubo.github.io/EasyDutch/EasyDutch.txt - Fetching remote https://easydutch-ubo.github.io/EasyDutch/EasyDutch/Block_General.txt - Fetching remote https://easydutch-ubo.github.io/EasyDutch/EasyDutch/Block_first_party_Server.txt - Fetching remote https://easydutch-ubo.github.io/EasyDutch/EasyDutch/Block_third_party_Server.txt - Fetching remote https://easydutch-ubo.github.io/EasyDutch/EasyDutch/Block_Resources.txt - Fetching remote https://easydutch-ubo.github.io/EasyDutch/EasyDutch/Block_Whitelist.txt - Fetching remote https://easydutch-ubo.github.io/EasyDutch/EasyDutch/Hide_General.txt - Fetching remote https://easydutch-ubo.github.io/EasyDutch/EasyDutch/Hide_Specific.txt - Fetching remote https://easydutch-ubo.github.io/EasyDutch/EasyDutch/Hide_Whitelist.txt - Fetching remote https://easydutch-ubo.github.io/EasyDutch/EasyDutch/Anti-Adblock.txt - Fetching remote https://easydutch-ubo.github.io/EasyDutch/EasyDutch/No_uBlock_Filters.txt -Input filter count: 734 - Accepted filter count: 733 - Rejected filter count: 0 -Output rule count: 626 - Plain good: 615 - - Maybe good (regexes): 6 - redirect=: 2 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 3 - FilterStrictParty: Strict partyness strict3p not supported - regexFilter is not RE2-compatible: https\:\/\/nieuwsfiets\.nu\/wp-content\/uploads\/.*\/.*(?:banner-(?!mis|tip).*|\.gif) - Can't salvage rule with only entity-based domain= option: allestoringen.* -CSS-generic: 14 plain CSS selectors -CSS-generic-high: 1 plain CSS selectors -CSS-specific: 956 distinct filters - Combined into 994 distinct hostnames - Combined into 1 distinct entities -CSS-declarative: 11 distinct filters - Combined into 10 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 244 distinct combined selectors - Combined into 221 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'nor-0': - Fetching remote https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianList.txt - Fetching remote https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianExperimentalList%20alternate%20versions/AntiAdblockEntries.txt - Fetching remote https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianExperimentalList%20alternate%20versions/NordicFilters-NotFirefox.txt - Fetching remote https://raw.githubusercontent.com/DandelionSprout/adfilt/master/NorwegianExperimentalList%20alternate%20versions/NordicFilters-NotBrave.txt -Input filter count: 1400 - Accepted filter count: 1400 - Rejected filter count: 0 -Output rule count: 505 - Plain good: 459 - - Maybe good (regexes): 4 - redirect=: 5 - removeparams= (accepted/discarded): 25/4 - modifyHeaders=: 1 - Unsupported: 11 - Can't salvage rule with only entity-based domain= option: eniro.* - Can't salvage rule with only entity-based domain= option: eniro.*|proff.* - Can't salvage rule with only entity-based domain= option: eurosport.* - Can't salvage rule with only entity-based domain= option: discoveryplus.* - Can't salvage rule with only entity-based domain= option: discoveryplus.* - Can't salvage rule with only entity-based domain= option: discoveryplus.* - Can't salvage rule with only entity-based domain= option: discoveryplus.* - Unsupported regex-based removeParam: /^rs\d/ - Unsupported regex-based removeParam: /^source=partnerads$/ - Unsupported regex-based removeParam: /^source=tradedoubler$/ - Unsupported regex-based removeParam: /^amp;/ -CSS-generic: 132 plain CSS selectors -CSS-generic-high: 28 plain CSS selectors -CSS-specific: 1127 distinct filters - Combined into 580 distinct hostnames - Combined into 13 distinct entities -CSS-declarative: 48 distinct filters - Combined into 117 distinct hostnames - Combined into 1 distinct entities -Procedural-related distinct filters: 92 distinct combined selectors - Combined into 80 distinct hostnames - Combined into 2 distinct entities -============================ -Listset for 'pol-0': - Fetching remote https://raw.githubusercontent.com/MajkiIT/polish-ads-filter/master/polish-adblock-filters/adblock.txt - Fetching remote https://raw.githubusercontent.com/olegwukr/polish-privacy-filters/master/anti-adblock.txt - Fetching remote https://raw.githubusercontent.com/MajkiIT/polish-ads-filter/master/polish-adblock-filters/adblock_ublock.txt - Fetching remote https://raw.githubusercontent.com/olegwukr/polish-privacy-filters/master/anti-adblock-suplement.txt -Input filter count: 1409 - Accepted filter count: 1408 - Rejected filter count: 1 -Output rule count: 1046 - Plain good: 967 - - Maybe good (regexes): 43 - redirect=: 27 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 9 - regexFilter is not RE2-compatible: \/[0-9a-zA-Z]{5,7}\_(?!adaptiveresize)[a-z]{12,17}\_[0-9]{3,3}\x[0-9]{3,3}\.jpg$ - regexFilter is not RE2-compatible: ^https:\/\/eku24.net\/images\/slajdy\/(?!zyczenia)[a-z]{3,10}\/[a-zA-Z0-9_-]{10,50}\.jpg - regexFilter is not RE2-compatible: ^https:\/\/(?!horrortube)(?!filman.cc)(?!horlol.pl)[a-z.0-9]{3,15}\.[a-z]{2,3}\/ - regexFilter is not RE2-compatible: https?:\/\/naekranie\.pl\/wp-content\/uploads\/[0-9]{4,4}\/[0-9]{2,2}\/(?!jpg)[0-9a-z]{7,10}$ - regexFilter is not RE2-compatible: https?:\/\/(?!(poczta|bc))[a-z.]{3,15}\.wp\.pl\/.{20,} - regexFilter is not RE2-compatible: ^http:\/\/((?!192\.168)(?!10\.)(?!172\.16)(?!172\.17)(?!172\.18)(?!172\.19)(?!172\.2)(?!172\.30)(?!172\.31)([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\/[a-zA-Z0-9]{30,} - regexFilter is not RE2-compatible: ^(http|https):\/\/www\.portel\.pl\/(?!pasaz)[-a-z0-9A-Z_%$&+=[\].]{1,200}\/[-a-z0-9A-Z_%$&+=[\]/.]{2,200}.(html|htm) - regexFilter is not RE2-compatible: ^(http|https):\/\/(?!www.speedvid)(?!streamcherry.com)(?!vshare)(?!vidoza)(?!www.youtube)[a-zA-Z0-9\W]{5,10}.[a-z]{2,20}\/(?!anime)[\w\W\d]{5,20}\/[a-z]{5,20}\/ - Can't salvage rule with only entity-based domain= option: trojmiasto.* -CSS-generic: 63 plain CSS selectors -CSS-generic-high: 48 plain CSS selectors -CSS-specific: 4214 distinct filters - Combined into 3231 distinct hostnames - Combined into 0 distinct entities -CSS-declarative: 131 distinct filters - Combined into 182 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 96 distinct combined selectors - Combined into 95 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'rou-1': - Fetching remote https://road.adblock.ro/lista.txt -No valid content for undefined -Input filter count: 0 - Accepted filter count: 0 - Rejected filter count: 0 -Output rule count: 0 - Plain good: 0 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -============================ -Listset for 'rus-0': - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/RuAdList-uBO.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/adservers.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/first_level.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/general_block.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/general_hide.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/popup.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/specific_antisocial.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/specific_block.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/specific_hide.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/specific_special.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/thirdparty.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/advblock/whitelist.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/css-fixes-experimental.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/js-fixes-experimental.txt - Fetching remote https://raw.githubusercontent.com/easylist/ruadlist/master/AWRL-non-sync.txt -Input filter count: 17309 - Accepted filter count: 17299 - Rejected filter count: 8 -Output rule count: 5832 - Pruning requestDomains: from 6634 to 6633 - Plain good: 5745 - - Maybe good (regexes): 21 - redirect=: 16 - removeparams= (accepted/discarded): 15/2 - modifyHeaders=: 29 - Unsupported: 6 - regexFilter is not RE2-compatible: ^(?!.*(24liveblog.com|24liveplus.com|acint.net|addthis.com|addthisedge.com|akamai.net|akamaiedge.net|alloha.tv|ampproject.org|anycomment.io|apester.com|api-ssl.bitly.com|api.corr.life|api.here.com|api.sypexgeo.net|app.hoversignal.com|appsmail.ru|bam.nr-data.net|blogger.com|bootstrapcdn.com|cackle.me|cdn.ampproject.org|cdn.iframe.ly|cdn.rawgit.com|cdnstats.ru|cdnvideo.ru|chartbeat.com|chatango.com|chatbro.com|chimpstatic.com|cloudflare.com|cloudflare.net|cloudfront.net|cloudfunctions.net|code.createjs.com|columbus.te.ua|cultserv.ru|disqus.com|disquscdn.com|dmca.com|documentcloud.org|each.im|ebacdn.com|edgecastcdn.net|edgecdn.ru|ellinagraypel.com|embed.ex.co|embed.widgetpack.com|embedstorage.net|eurosolidarity.org|facebook.com|facebook.net|fastly.net|fastlylb.net|fbcdn.net|fbvkcdn.com|feonet.net|fluidplayer.com|fontawesome.com|fonts.w.tools|freecurrencyrates.com|fwcdn1.com|fwdcdn.com|gcdn.co|getsitecontrol.com|gismeteo.ru|github.io|gitlab.io|google-analytics.com|google.com|googleadservices.com|googleapis.com|googleoptimize.com|googletagmanager.com|googletagservices.com|gravatar.com|gravitec.media|gravitec.net|gstatic.com|hcaptcha.com|hupso.com|hwcdn.net|hypercomments.com|ibytedtos.com|imgsmail.ru|imgur.com|informers.ukr.net|instagram.com|intensedebate.com|intercom.io|intercomcdn.com|intravideo.net|issuu.com|ivideon.com|jivosite.com|jquery.com|js-agent.newrelic.com|jsdelivr.net|jsonip.com|jwpcdn.com|jwplatform.com|keycaptcha.com|kin-x.com|kinogram.best|kinohod.ru|kinoplayer.co|kinotreiler.com|kitbit.net|kodik-add.com|kodikapi.com|libria.fun|licdn.com|likebtn.com|linkedin.com|lp4.io|mail.ru|mailchimp.com|mapbox.com|media-imdb.com|media.reformal.ru|mediator.media|meteobar.com|meteonova.ru|mirtesen.ru|netdna-cdn.com|ngenix.net|nuipogoda.ru|odnaknopka.ru|odnoklassniki.ru|ok.ru|oneall.com|onesignal.com|onthe.io|parastorage.com|phnx.click|piktochart.com|pinterest.com|pixars.org|platformcraft.ru|playbuzz.com|player|player.panda.video|pljs.ru|plrjs.com|pluso.ru|plyr.io|polldaddy.com|polyfill.io|pv.pjtsu.com|quiz.ink|raincaptcha.com|readymag.com|recaptcha.net|relap.io|ren.tv|renteres.ru|rumer.club|s5o.ru|securedtouch.com|selcdn.net|sendpulse.com|sentry-cdn.com|shareaholic.com|shareaholic.net|sharethis.com|shrink.pe|sinoptik.ua|source.mmi.bemobile.ua|sporcle.com|sportradar.com|sportrecs.com|sports.ru|stackpathcdn.com|static.addtoany.com|statically.io|streamvid.club|telegram.im|telegram.org|tenews.org.ua|tenews.te.ua|tiktok.com|tilda.ws|tildacdn.com|tns-counter.ru|tolstoycomments.com|traq.li|trbcdn.net|trbna.com|ttrace.ru|ttwstatic.com|tumblr.com|tvget.ru|tvsok.ru|twimg.com|twitter.com|typekit.net|uanews.org.ua|unpkg.com|uptolike.com|userapi.com|usocial.pro|uweb.ru|vicomi.com|vidazoo.com|videocdn.tv|videoplayers.club|viglink.com|viqeo.tv|vk.com|vkontakte.ru|vuukle.com|webflow.com|weblium.com|weblium.site|widget.speechki.org|widget.vp.ru|widgets.getpocket.com|world-weather.ru|wp.com|yabber.cloud|yandex.ru|yandex.st|yastatic.net|yohoho.cc|yohoho.online|yoomoney.ru|yourwebsite.life|youtube-nocookie.com|youtube.com|ytimg.com|zencdn.net)).*$ - regexFilter is not RE2-compatible: ^(?!.*(24liveblog.com|24liveplus.com|acint.net|addthis.com|addthisedge.com|akamai.net|akamaiedge.net|alloha.tv|ampproject.org|anycomment.io|apester.com|api-ssl.bitly.com|api.corr.life|api.here.com|api.sypexgeo.net|app.hoversignal.com|appsmail.ru|bam.nr-data.net|blogger.com|bootstrapcdn.com|cackle.me|cdn.ampproject.org|cdn.iframe.ly|cdn.rawgit.com|cdnstats.ru|cdnvideo.ru|chartbeat.com|chatango.com|chatbro.com|chimpstatic.com|cloudflare.com|cloudflare.net|cloudfront.net|cloudfunctions.net|code.createjs.com|columbus.te.ua|cultserv.ru|disqus.com|disquscdn.com|dmca.com|documentcloud.org|each.im|ebacdn.com|edgecastcdn.net|edgecdn.ru|ellinagraypel.com|embed.ex.co|embed.widgetpack.com|embedstorage.net|eurosolidarity.org|facebook.com|facebook.net|fastly.net|fastlylb.net|fbcdn.net|fbvkcdn.com|feonet.net|fluidplayer.com|fontawesome.com|fonts.w.tools|freecurrencyrates.com|fwcdn1.com|fwdcdn.com|gcdn.co|getsitecontrol.com|gismeteo.ru|github.io|gitlab.io|google-analytics.com|google.com|googleadservices.com|googleapis.com|googleoptimize.com|googletagmanager.com|googletagservices.com|gravatar.com|gravitec.media|gravitec.net|gstatic.com|hcaptcha.com|hupso.com|hwcdn.net|hypercomments.com|ibytedtos.com|imgsmail.ru|imgur.com|informers.ukr.net|instagram.com|intensedebate.com|intercom.io|intercomcdn.com|intravideo.net|issuu.com|ivideon.com|jivosite.com|jquery.com|js-agent.newrelic.com|jsdelivr.net|jsonip.com|jwpcdn.com|jwplatform.com|keycaptcha.com|kin-x.com|kinogram.best|kinohod.ru|kinoplayer.co|kinotreiler.com|kitbit.net|kodik-add.com|kodikapi.com|libria.fun|licdn.com|likebtn.com|linkedin.com|lp4.io|mail.ru|mailchimp.com|mapbox.com|media-imdb.com|media.reformal.ru|mediator.media|meteobar.com|meteonova.ru|mirtesen.ru|netdna-cdn.com|ngenix.net|nuipogoda.ru|odnaknopka.ru|odnoklassniki.ru|ok.ru|oneall.com|onesignal.com|onthe.io|parastorage.com|phnx.click|piktochart.com|pinterest.com|pixars.org|platformcraft.ru|playbuzz.com|player|player.panda.video|pljs.ru|plrjs.com|pluso.ru|plyr.io|polldaddy.com|polyfill.io|pv.pjtsu.com|quiz.ink|raincaptcha.com|readymag.com|recaptcha.net|relap.io|ren.tv|renteres.ru|rumer.club|s5o.ru|securedtouch.com|selcdn.net|sendpulse.com|sentry-cdn.com|shareaholic.com|shareaholic.net|sharethis.com|shrink.pe|sinoptik.ua|source.mmi.bemobile.ua|sporcle.com|sportradar.com|sportrecs.com|sports.ru|stackpathcdn.com|static.addtoany.com|statically.io|streamvid.club|telegram.im|telegram.org|tenews.org.ua|tenews.te.ua|tiktok.com|tilda.ws|tildacdn.com|tns-counter.ru|tolstoycomments.com|traq.li|trbcdn.net|trbna.com|ttrace.ru|ttwstatic.com|tumblr.com|tvget.ru|tvsok.ru|twimg.com|twitter.com|typekit.net|uanews.org.ua|unpkg.com|uptolike.com|userapi.com|usocial.pro|uweb.ru|vicomi.com|vidazoo.com|videocdn.tv|videoplayers.club|viglink.com|viqeo.tv|vk.com|vkontakte.ru|vuukle.com|webflow.com|weblium.com|weblium.site|widget.speechki.org|widget.vp.ru|widgets.getpocket.com|world-weather.ru|wp.com|yabber.cloud|yandex.ru|yandex.st|yastatic.net|yohoho.cc|yohoho.online|yoomoney.ru|yourwebsite.life|youtube-nocookie.com|youtube.com|ytimg.com|zencdn.net)).*$ - regexFilter is not RE2-compatible: ^(?!.*(spac.me)).*$ - regexFilter is not RE2-compatible: ^(?!.*(24liveblog.com|24liveplus.com|acint.net|addthis.com|addthisedge.com|akamai.net|akamaiedge.net|alloha.tv|ampproject.org|anycomment.io|apester.com|api-ssl.bitly.com|api.corr.life|api.here.com|api.sypexgeo.net|app.hoversignal.com|appsmail.ru|bam.nr-data.net|blogger.com|bootstrapcdn.com|cackle.me|cdn.ampproject.org|cdn.iframe.ly|cdn.rawgit.com|cdnstats.ru|cdnvideo.ru|chartbeat.com|chatango.com|chatbro.com|chimpstatic.com|cloudflare.com|cloudflare.net|cloudfront.net|cloudfunctions.net|code.createjs.com|columbus.te.ua|cultserv.ru|disqus.com|disquscdn.com|dmca.com|documentcloud.org|each.im|ebacdn.com|edgecastcdn.net|edgecdn.ru|ellinagraypel.com|embed.ex.co|embed.widgetpack.com|embedstorage.net|eurosolidarity.org|facebook.com|facebook.net|fastly.net|fastlylb.net|fbcdn.net|fbvkcdn.com|feonet.net|fluidplayer.com|fontawesome.com|fonts.w.tools|freecurrencyrates.com|fwcdn1.com|fwdcdn.com|gcdn.co|getsitecontrol.com|gismeteo.ru|github.io|gitlab.io|google-analytics.com|google.com|googleadservices.com|googleapis.com|googleoptimize.com|googletagmanager.com|googletagservices.com|gravatar.com|gravitec.media|gravitec.net|gstatic.com|hcaptcha.com|hupso.com|hwcdn.net|hypercomments.com|ibytedtos.com|imgsmail.ru|imgur.com|informers.ukr.net|instagram.com|intensedebate.com|intercom.io|intercomcdn.com|intravideo.net|issuu.com|ivideon.com|jivosite.com|jquery.com|js-agent.newrelic.com|jsdelivr.net|jsonip.com|jwpcdn.com|jwplatform.com|keycaptcha.com|kin-x.com|kinogram.best|kinohod.ru|kinoplayer.co|kinotreiler.com|kitbit.net|kodik-add.com|kodikapi.com|libria.fun|licdn.com|likebtn.com|linkedin.com|lp4.io|mail.ru|mailchimp.com|mapbox.com|media-imdb.com|media.reformal.ru|mediator.media|meteobar.com|meteonova.ru|mirtesen.ru|netdna-cdn.com|ngenix.net|nuipogoda.ru|odnaknopka.ru|odnoklassniki.ru|ok.ru|oneall.com|onesignal.com|onthe.io|parastorage.com|phnx.click|piktochart.com|pinterest.com|pixars.org|platformcraft.ru|playbuzz.com|player|player.panda.video|pljs.ru|plrjs.com|pluso.ru|plyr.io|polldaddy.com|polyfill.io|pv.pjtsu.com|quiz.ink|raincaptcha.com|readymag.com|recaptcha.net|relap.io|ren.tv|renteres.ru|rumer.club|s5o.ru|securedtouch.com|selcdn.net|sendpulse.com|sentry-cdn.com|shareaholic.com|shareaholic.net|sharethis.com|shrink.pe|sinoptik.ua|source.mmi.bemobile.ua|sporcle.com|sportradar.com|sportrecs.com|sports.ru|stackpathcdn.com|static.addtoany.com|statically.io|streamvid.club|telegram.im|telegram.org|tenews.org.ua|tenews.te.ua|tiktok.com|tilda.ws|tildacdn.com|tns-counter.ru|tolstoycomments.com|traq.li|trbcdn.net|trbna.com|ttrace.ru|ttwstatic.com|tumblr.com|tvget.ru|tvsok.ru|twimg.com|twitter.com|typekit.net|uanews.org.ua|unpkg.com|uptolike.com|userapi.com|usocial.pro|uweb.ru|vicomi.com|vidazoo.com|videocdn.tv|videoplayers.club|viglink.com|viqeo.tv|vk.com|vkontakte.ru|vuukle.com|webflow.com|weblium.com|weblium.site|widget.speechki.org|widget.vp.ru|widgets.getpocket.com|world-weather.ru|wp.com|yabber.cloud|yandex.ru|yandex.st|yastatic.net|yohoho.cc|yohoho.online|yoomoney.ru|yourwebsite.life|youtube-nocookie.com|youtube.com|ytimg.com|zencdn.net)).*$ - Unsupported modifier exception - Unsupported modifier exception -CSS-generic: 318 plain CSS selectors -CSS-generic-high: 461 plain CSS selectors -CSS-specific: 9772 distinct filters - Combined into 7075 distinct hostnames - Combined into 0 distinct entities -CSS-declarative: 904 distinct filters - Combined into 876 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 271 distinct combined selectors - Combined into 336 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'spa-0': - Fetching remote https://easylist-downloads.adblockplus.org/easylistspanish.txt -Input filter count: 1115 - Accepted filter count: 1115 - Rejected filter count: 0 -Output rule count: 642 - Plain good: 634 - - Maybe good (regexes): 8 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic: 243 plain CSS selectors -CSS-generic-high: 15 plain CSS selectors -CSS-specific: 1469 distinct filters - Combined into 1198 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 26 distinct combined selectors - Combined into 25 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'spa-1': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/9.txt -Input filter count: 1393 - Accepted filter count: 1387 - Rejected filter count: 0 -Output rule count: 958 - Plain good: 921 - Salvaged rule by ignoring 1 entity-based domain= option: pelisplushd.net|cuevana3.* - Maybe good (regexes): 6 - redirect=: 27 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 4 - Can't salvage rule with only entity-based domain= option: netcine.* - Can't salvage rule with only entity-based domain= option: netcine.* - regexFilter is not RE2-compatible: ^(?!.*(sharecast.ws|bunnycdn.ru|bootstrapcdn.com|cdn.ampproject.org|cloudflare.com|cdn.staticfile.org|disqus.com|disquscdn.com|dmca.com|ebacdn.com|facebook.net|fastlylb.net|fbcdn.net|fluidplayer.com|fontawesome.com|github.io|google.com|googleapis.com|googletagmanager.com|gstatic.com|jquery.com|jsdelivr.net|jwpcdn.com|jwplatform.com|polyfill.io|recaptcha.net|shrink.pe|twitter.com|ulogin.ru|unpkg.com|userapi.com|vidazoo.com|vk.com|yandex.|yastatic.net|ytimg.com|zencdn.net|player|youtube.com|cackle.me|googleoptimize.com|vuukle.com|chatango.com|twimg.com|google-analytics.com|hcaptcha.com|raincaptcha.com|media-imdb.com|blogger.com|hwcdn.net|instagram.com|wp.com|imgsmail.ru)).*$ - Can't salvage rule with only entity-based domain= option: anitube.* -CSS-generic: 84 plain CSS selectors -CSS-specific: 2526 distinct filters - Combined into 1464 distinct hostnames - Combined into 6 distinct entities -CSS-declarative: 99 distinct filters - Combined into 149 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 70 distinct combined selectors - Combined into 65 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'svn-0': - Fetching remote https://raw.githubusercontent.com/betterwebleon/slovenian-list/master/filters.txt -Input filter count: 148 - Accepted filter count: 148 - Rejected filter count: 0 -Output rule count: 100 - Plain good: 100 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic: 4 plain CSS selectors -CSS-specific: 332 distinct filters - Combined into 148 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 2 distinct combined selectors - Combined into 2 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'swe-1': - Fetching remote https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/master/Frellwits-Swedish-Filter.txt - Fetching remote https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/master/Swedish/swe-ubo-filters.txt - Fetching remote https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/master/Swedish/chromium.txt - Fetching remote https://raw.githubusercontent.com/lassekongo83/Frellwits-filter-lists/master/Swedish/not_mobile.txt -Input filter count: 1663 - Accepted filter count: 1663 - Rejected filter count: 0 -Output rule count: 1241 - Plain good: 1219 - - Maybe good (regexes): 2 - redirect=: 10 - removeparams= (accepted/discarded): 5/3 - modifyHeaders=: 2 - Unsupported: 3 - Unsupported regex-based removeParam: /^ap/ - Unsupported regex-based removeParam: /^browser/ - Unsupported regex-based removeParam: /^utm_/ -CSS-generic: 271 plain CSS selectors -CSS-generic-high: 44 plain CSS selectors -CSS-specific: 661 distinct filters - Combined into 1130 distinct hostnames - Combined into 1 distinct entities -CSS-declarative: 79 distinct filters - Combined into 211 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 374 distinct combined selectors - Combined into 324 distinct hostnames - Combined into 1 distinct entities -============================ -Listset for 'tha-0': - Fetching remote https://raw.githubusercontent.com/easylist-thailand/easylist-thailand/master/subscription/easylist-thailand.txt - Fetching remote https://raw.githubusercontent.com/easylist-thailand/easylist-thailand/master/subscription/ublock.txt -Input filter count: 760 - Accepted filter count: 760 - Rejected filter count: 0 -Output rule count: 750 - Plain good: 746 - - Maybe good (regexes): 2 - redirect=: 2 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic-high: 5 plain CSS selectors -CSS-specific: 614 distinct filters - Combined into 166 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 14 distinct combined selectors - Combined into 11 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'tur-0': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/13.txt -Input filter count: 1779 - Accepted filter count: 1778 - Rejected filter count: 0 -Output rule count: 1338 - Plain good: 1297 - Salvaged rule by ignoring 1 entity-based domain= option: ajans32.com|asyadiziizle.com|balfilmizle1.com|birasyadizi.com|buyuktorbali.com|dizilost.com|duzcetv.com|erotikfilmtube.com|erotikizlefilm.com|ertehaber.com|filmjr1.com|filmsezonu.com|haber32.com.tr|haberant.com|jokerfilmizle.com|kozfilm.com|malatyamegahaber.com|medya32.com|sexfilmleriizle.com|sinemangoo.org|technopat.net|unyenethaber.com|zerotikk.com|dizicaps.* - Salvaged rule by ignoring 1 entity-based domain= option: fullhdfilm.pro|fullhdfilmizle5.* - Salvaged rule by ignoring 1 entity-based domain= option: turkcealtyazi.org|filmmakinesi.* - Salvaged rule by ignoring 1 entity-based domain= option: cdn.diziyou.co|geyvemedya.com|hdfilmcehennemi2.* - Salvaged rule by ignoring 1 entity-based domain= option: forum.donanimhaber.com|mp3indirdur.mobi|setfilmizle.* - Maybe good (regexes): 14 - redirect=: 17 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 10 - Can't salvage rule with only entity-based domain= option: filmizletv.* - Can't salvage rule with only entity-based domain= option: fullhdfilmizle5.* - Can't salvage rule with only entity-based domain= option: jetfilmizle.* - Can't salvage rule with only entity-based domain= option: siyahfilmizle.* - Can't salvage rule with only entity-based domain= option: fullhdfilmizlesene.* - Can't salvage rule with only entity-based domain= option: filmmakinesi.* - regexFilter is not RE2-compatible: yenihaberden.com\/d\/other\/(?!yeni-haber-youtube) - Can't salvage rule with only entity-based domain= option: yabancidizi.* - regexFilter is not RE2-compatible: ^(?!.*(sharecast.ws|bunnycdn.ru|bootstrapcdn.com|cdn.ampproject.org|cloudflare.com|cdn.staticfile.org|disqus.com|disquscdn.com|dmca.com|ebacdn.com|facebook.net|fastlylb.net|fbcdn.net|fluidplayer.com|fontawesome.com|github.io|google.com|googleapis.com|googletagmanager.com|gstatic.com|jquery.com|jsdelivr.net|jwpcdn.com|jwplatform.com|polyfill.io|recaptcha.net|shrink.pe|twitter.com|ulogin.ru|unpkg.com|userapi.com|vidazoo.com|vk.com|yandex.|yastatic.net|ytimg.com|zencdn.net|player|youtube.com|cackle.me|googleoptimize.com|vuukle.com|chatango.com|twimg.com|google-analytics.com|hcaptcha.com|raincaptcha.com|media-imdb.com|blogger.com|hwcdn.net|instagram.com|wp.com|imgsmail.ru)).*$ - Can't salvage rule with only entity-based domain= option: filmizletv.* -CSS-generic: 146 plain CSS selectors -CSS-generic-high: 60 plain CSS selectors -CSS-specific: 3395 distinct filters - Combined into 2763 distinct hostnames - Combined into 40 distinct entities -CSS-declarative: 169 distinct filters - Combined into 558 distinct hostnames - Combined into 22 distinct entities -Procedural-related distinct filters: 159 distinct combined selectors - Combined into 128 distinct hostnames - Combined into 3 distinct entities -============================ -Listset for 'vie-1': - Fetching remote https://raw.githubusercontent.com/abpvn/abpvn/master/filter/abpvn_ublock.txt -Input filter count: 567 - Accepted filter count: 567 - Rejected filter count: 0 -Output rule count: 467 - Plain good: 455 - - Maybe good (regexes): 4 - redirect=: 5 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 3 - Unsupported: 0 - -CSS-generic: 10 plain CSS selectors -CSS-generic-high: 4 plain CSS selectors -CSS-specific: 769 distinct filters - Combined into 439 distinct hostnames - Combined into 0 distinct entities -CSS-declarative: 4 distinct filters - Combined into 14 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 4 distinct combined selectors - Combined into 3 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'block-lan': - Fetching remote https://ublockorigin.github.io/uAssets/filters/lan-block.txt -Input filter count: 48 - Accepted filter count: 48 - Rejected filter count: 0 -Output rule count: 12 - Plain good: 5 - - Maybe good (regexes): 7 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -============================ -Listset for 'dpollock-0': - Fetching remote https://someonewhocares.org/hosts/hosts -Input filter count: 11543 - Accepted filter count: 11542 - Rejected filter count: 0 -Output rule count: 1 - Pruning requestDomains: from 11542 to 9296 - Plain good: 1 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -============================ -Listset for 'adguard-spyware-url': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/17.txt -Input filter count: 1186 - Accepted filter count: 1183 - Rejected filter count: 0 -Output rule count: 448 - Plain good: 0 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 367/81 - modifyHeaders=: 0 - Unsupported: 81 - Unsupported regex-based removeParam: /^cm_mmc/ - Unsupported regex-based removeParam: /^__s=[A-Za-z0-9]{6\,}/ - Unsupported regex-based removeParam: /^via%3D/ - Unsupported regex-based removeParam: /ga[ct]id/ - Unsupported regex-based removeParam: /param[0-9]{1}|utm_si|matchtype|device|creative|keyword|placement|adposition|campaignid|adgroupid|feeditemid|targetid|loc_|searchtype|network|search_pos|cat_pos|block|position/ - Unsupported regex-based removeParam: /pfx|adj/ - Unsupported regex-based removeParam: /^event_callback_/ - Unsupported regex-based removeParam: /elq/ - Unsupported regex-based removeParam: /utm_/ - Unsupported regex-based removeParam: /web_only|_branch_referrer/ - Unsupported regex-based removeParam: /premiumVisit|utm_compaign/ - Unsupported regex-based removeParam: /utm_partner_id|frommail/ - Unsupported regex-based removeParam: /^(udid|DeviceID|ver|appbuild|vendor|model|device_name|device_type|instanceid|device_year|connection_class|appsflyerid)/ - Unsupported regex-based removeParam: /^cd\d+/ - Unsupported regex-based removeParam: /^subid/ - Unsupported regex-based removeParam: /^mkt_tok/ - Unsupported regex-based removeParam: /fx_(source|medium|campaign)/ - Unsupported regex-based removeParam: /^ref_/ - Unsupported regex-based removeParam: /^cx_/ - Unsupported regex-based removeParam: /^pickup_list_click/ - Unsupported regex-based removeParam: /distributorid|wfr|ifr|share_relation/ - Unsupported regex-based removeParam: /cUrl|ref/ - Unsupported regex-based removeParam: /topicPageSponsorship|^itm_/ - Unsupported regex-based removeParam: /^utm_/ - Unsupported regex-based removeParam: /^trk/ - Unsupported regex-based removeParam: /^utm_cid/ - Unsupported regex-based removeParam: /entries/ - Unsupported regex-based removeParam: /Version/ - Unsupported regex-based removeParam: /^at_custom/ - Unsupported regex-based removeParam: /mcorgid|mid|ts/ - Unsupported regex-based removeParam: /^dc_trk_/ - Unsupported regex-based removeParam: /^(ppref|ref|pid)=/ - Unsupported regex-based removeParam: /^subid/ - Unsupported regex-based removeParam: /^(_requestid|reff)=/ - Unsupported regex-based removeParam: /^affExtParam/ - Unsupported regex-based removeParam: /^otracker/ - Unsupported regex-based removeParam: /spm=|scm=|from=|keyori=|sugg=|search=|mp=|c=|^abtest|^abbucket|pos=|themeID=|algArgs=|clickTrackInfo=|acm=|item_id=|version=|up_id=|pvid=/ - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported modifier exception - Unsupported regex-based removeParam: /^\/_ui\/desktop\/common\/js\/uiAnalytics\// - Unsupported regex-based removeParam: /_ui\/shared\/common\/js\/analytics\/with-intersection-track.js/ - Unsupported regex-based removeParam: /_ui\/shared\/common\/js\/InappCommunicationManager.js/ - Unsupported regex-based removeParam: /_ui\/shared\/common\/js\/util\/jquery.analytics-utils.js/ - Unsupported regex-based removeParam: /^(device|country|path)=/ - Unsupported regex-based removeParam: /cdt|ref/ - Unsupported regex-based removeParam: ~/^(primer|subset_id)=/ - Unsupported regex-based removeParam: /tour|campaign/ - Unsupported modifier exception -CSS-specific: 1 distinct filters - Combined into 3 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'annoyances-cookies': - Fetching remote https://ublockorigin.github.io/uAssets/thirdparties/easylist-cookies.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/annoyances-cookies.txt -Input filter count: 2000 - Accepted filter count: 1997 - Rejected filter count: 0 -Output rule count: 1691 - Plain good: 1690 - - Maybe good (regexes): 1 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic: 16939 plain CSS selectors -CSS-generic-high: 351 plain CSS selectors -CSS-specific: 5385 distinct filters - Combined into 16378 distinct hostnames - Combined into 1 distinct entities -CSS-declarative: 66 distinct filters - Combined into 5469 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 7 distinct combined selectors - Combined into 17 distinct hostnames - Combined into 0 distinct entities -============================ -Listset for 'annoyances-overlays': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/19.txt - Fetching remote https://ublockorigin.github.io/uAssets/filters/annoyances-others.txt -Input filter count: 2483 - Accepted filter count: 2481 - Rejected filter count: 0 -Output rule count: 1520 - Pruning requestDomains: from 530 to 529 - Plain good: 1454 - - Maybe good (regexes): 3 - redirect=: 52 - removeparams= (accepted/discarded): 1/0 - modifyHeaders=: 6 - Unsupported: 4 - Can't salvage rule with only entity-based domain= option: gmx.* - regexFilter is not RE2-compatible: ^https:\/\/[0-9a-z]{7,25}\.com\/v2(?:\/0\/)?(?=[0-9a-z_-]{0,84}[A-Z])(?=[a-zA-Z_-]{0,84}[0-9])[0-9a-zA-Z_-]{54,85}(#\?v=[0-9a-f]{32})?$ - regexFilter is not RE2-compatible: ^https:\/\/[0-9a-z]{7,25}\.com\/v2(?:\/0\/)?(?=[0-9a-z_-]{0,84}[A-Z])(?=[a-zA-Z_-]{0,84}[0-9])[0-9a-zA-Z_-]{54,85}(#\?v=[0-9a-f]{32})?$ - regexFilter is not RE2-compatible: ^https:\/\/[0-9a-z]{7,25}\.com\/v2(?:\/0\/)?(?=[0-9a-z_-]{0,84}[A-Z])(?=[a-zA-Z_-]{0,84}[0-9])[0-9a-zA-Z_-]{54,85}(#\?v=[0-9a-f]{32})?$ -CSS-generic: 35 plain CSS selectors -CSS-generic-high: 3 plain CSS selectors -CSS-specific: 10701 distinct filters - Combined into 10527 distinct hostnames - Combined into 68 distinct entities -CSS-declarative: 610 distinct filters - Combined into 2227 distinct hostnames - Combined into 25 distinct entities -Procedural-related distinct filters: 377 distinct combined selectors - Combined into 758 distinct hostnames - Combined into 7 distinct entities -============================ -Listset for 'annoyances-social': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/4.txt -Input filter count: 643 - Accepted filter count: 643 - Rejected filter count: 0 -Output rule count: 544 - Plain good: 541 - - Maybe good (regexes): 0 - redirect=: 1 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 2 - regexFilter is not RE2-compatible: \/icons_addtoany\/(?!a2a|bookmark|print)[a-z]+ - Can't salvage rule with only entity-based domain= option: freelancer.* -CSS-generic: 753 plain CSS selectors -CSS-generic-high: 86 plain CSS selectors -CSS-specific: 10807 distinct filters - Combined into 11984 distinct hostnames - Combined into 63 distinct entities -CSS-declarative: 115 distinct filters - Combined into 204 distinct hostnames - Combined into 7 distinct entities -Procedural-related distinct filters: 514 distinct combined selectors - Combined into 563 distinct hostnames - Combined into 4 distinct entities -============================ -Listset for 'annoyances-widgets': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/22.txt -Input filter count: 665 - Accepted filter count: 665 - Rejected filter count: 0 -Output rule count: 432 - Plain good: 432 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic: 25 plain CSS selectors -CSS-generic-high: 7 plain CSS selectors -CSS-specific: 1014 distinct filters - Combined into 981 distinct hostnames - Combined into 2 distinct entities -CSS-declarative: 15 distinct filters - Combined into 14 distinct hostnames - Combined into 0 distinct entities -Procedural-related distinct filters: 73 distinct combined selectors - Combined into 54 distinct hostnames - Combined into 1 distinct entities -============================ -Listset for 'annoyances-others': - Fetching remote https://filters.adtidy.org/extension/ublock/filters/21.txt -Input filter count: 427 - Accepted filter count: 427 - Rejected filter count: 0 -Output rule count: 398 - Plain good: 393 - - Maybe good (regexes): 2 - redirect=: 1 - removeparams= (accepted/discarded): 2/0 - modifyHeaders=: 0 - Unsupported: 0 - -CSS-generic: 6 plain CSS selectors -CSS-specific: 3598 distinct filters - Combined into 3352 distinct hostnames - Combined into 33 distinct entities -CSS-declarative: 391 distinct filters - Combined into 937 distinct hostnames - Combined into 5 distinct entities -Procedural-related distinct filters: 169 distinct combined selectors - Combined into 144 distinct hostnames - Combined into 3 distinct entities -============================ -Listset for 'stevenblack-hosts': - Fetching remote https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts -Input filter count: 210426 - Accepted filter count: 210426 - Rejected filter count: 0 -Output rule count: 1 - Pruning requestDomains: from 210426 to 108459 - Plain good: 1 - - Maybe good (regexes): 0 - redirect=: 0 - removeparams= (accepted/discarded): 0/0 - modifyHeaders=: 0 - Unsupported: 0 - From a4d319437a25de6b98cc4dcec58f1a14ad310d63 Mon Sep 17 00:00:00 2001 From: daylight Date: Fri, 1 Nov 2024 21:01:06 +0300 Subject: [PATCH 420/553] Delete .gitmodules --- .gitmodules | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29bb2d1d..0000000000000 From 12817eee57751cefb59646d7cb5cc28d3d3bc37b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 4 Nov 2024 10:12:25 -0500 Subject: [PATCH 421/553] Squashed commit of the following: commit a4d319437a25de6b98cc4dcec58f1a14ad310d63 Author: daylight Date: Fri Nov 1 21:01:06 2024 +0300 Delete .gitmodules commit 57b7d9814851e504f9c9f179a1bd594ded8184a7 Author: daylight Date: Fri Nov 1 17:47:50 2024 +0300 Delete dist/mv3/log.txt commit c936a72bb3030c821243c34720fba4327af58631 Author: daylight Date: Fri Nov 1 17:47:16 2024 +0300 Update dist/README.md commit b5aaec47b38b584deaa0e3b6351b0f5a8f1f286f Author: daylight Date: Fri Nov 1 17:46:53 2024 +0300 Update release head commit be2da15508c0c34bb5e6319a32e7c06522a923a7 Author: daylight Date: Fri Nov 1 17:46:37 2024 +0300 Update links in readme commit 3019dfc37a5eb8acc52d55fb1b5f218be6a30694 Author: daylight Date: Fri Nov 1 17:46:16 2024 +0300 Update contributing guide commit 3b9333dbd8e69e8a2eecdb77113082caa307e0ad Author: daylight Date: Fri Nov 1 17:45:53 2024 +0300 Update CI commit 2831a0d0fddf3c9b397addda91c4a6d4ae3b2b50 Author: daylight Date: Fri Nov 1 17:45:31 2024 +0300 Update config Revert "Update CI" This reverts commit 3b9333dbd8e69e8a2eecdb77113082caa307e0ad. --- .github/workflows/main.yml | 76 ++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 41 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 503c7ac54d9e8..5ce7af1212a4f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,13 +1,15 @@ name: uBO release on: - workflow_dispatch: create: branches: master permissions: contents: read +# I used the following project as template to get started: +# https://github.com/dessant/search-by-image/blob/master/.github/workflows/ci.yml + jobs: build: permissions: @@ -16,81 +18,73 @@ jobs: runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/') steps: - - name: Checkout repository + - name: Clone repository uses: actions/checkout@v4 with: persist-credentials: false - - - name: Checkout uAssets repository + - name: Clone uAssets run: | tools/pull-assets.sh - + # https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html - name: Get release information id: release_info run: | - echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV - + echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} - name: Assemble release notes run: | > release.body.txt grep -m1 -B10000 -- "----------" CHANGELOG.md >> release.body.txt - sed -e 's/%version%/'"$VERSION"'/g' RELEASE.HEAD.md >> release.body.txt - - - name: Build MV2 packages - run: | - tools/make-chromium.sh $VERSION - tools/make-firefox.sh $VERSION - tools/make-thunderbird.sh $VERSION - tools/make-npm.sh $VERSION - + sed -e 's/%version%/${{ steps.release_info.outputs.VERSION }}/g' RELEASE.HEAD.md >> release.body.txt - name: Create GitHub release id: create_release - uses: softprops/action-gh-release@v2 + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ github.token }} with: - tag_name: ${{ env.VERSION }} - release_name: ${{ env.VERSION }} + tag_name: ${{ steps.release_info.outputs.VERSION }} + release_name: ${{ steps.release_info.outputs.VERSION }} draft: true prerelease: true body_path: release.body.txt + - name: Build MV2 packages + run: | + tools/make-chromium.sh ${{ steps.release_info.outputs.VERSION }} + tools/make-firefox.sh ${{ steps.release_info.outputs.VERSION }} + tools/make-thunderbird.sh ${{ steps.release_info.outputs.VERSION }} + tools/make-npm.sh ${{ steps.release_info.outputs.VERSION }} + - name: Upload Chromium package + uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Upload Chromium package - uses: softprops/action-gh-release@v2 with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ env.VERSION }}.chromium.zip - asset_name: uBlock0_${{ env.VERSION }}.chromium.zip + asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.chromium.zip + asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.chromium.zip asset_content_type: application/octet-stream + - name: Upload Firefox package + uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Upload Firefox package - uses: softprops/action-gh-release@v2 with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ env.VERSION }}.firefox.xpi - asset_name: uBlock0_${{ env.VERSION }}.firefox.xpi + asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.firefox.xpi + asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.firefox.xpi asset_content_type: application/octet-stream + - name: Upload Thunderbird package + uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Upload Thunderbird package - uses: softprops/action-gh-release@v2 with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ env.VERSION }}.thunderbird.xpi - asset_name: uBlock0_${{ env.VERSION }}.thunderbird.xpi + asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.thunderbird.xpi + asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.thunderbird.xpi asset_content_type: application/octet-stream + - name: Upload NodeJS package + uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Upload NodeJS package - uses: softprops/action-gh-release@v2 with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ env.VERSION }}.npm.tgz - asset_name: uBlock0_${{ env.VERSION }}.npm.tgz + asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.npm.tgz + asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.npm.tgz asset_content_type: application/octet-stream - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 54ed02e3020cb8a8faa02b5b882dfa140f1add7f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 5 Nov 2024 09:25:01 -0500 Subject: [PATCH 422/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.cy.txt | 4 +-- platform/mv3/description/webstore.ko.txt | 2 +- .../mv3/extension/_locales/cy/messages.json | 6 ++-- .../mv3/extension/_locales/ko/messages.json | 36 +++++++++---------- src/_locales/cs/messages.json | 2 +- src/_locales/fi/messages.json | 2 +- src/_locales/ka/messages.json | 2 +- src/_locales/ko/messages.json | 4 +-- src/_locales/zh_CN/messages.json | 2 +- 9 files changed, 30 insertions(+), 30 deletions(-) diff --git a/platform/mv3/description/webstore.cy.txt b/platform/mv3/description/webstore.cy.txt index 7669a5939f98c..dfc59430e5ecf 100644 --- a/platform/mv3/description/webstore.cy.txt +++ b/platform/mv3/description/webstore.cy.txt @@ -1,6 +1,6 @@ -uBO Lite (uBOL) is a *permission-less* MV3-based content blocker. +uBO Lite (uBOL) yw blocwr cynnwys MV3 sy'n gweithredu heb ganiatâd safonol. -The default ruleset corresponds to uBlock Origin's default filterset: +Mae'r set reolau ddiofyn yn cyfateb i set hidlo diofyn uBlock Origin: - uBlock Origin's built-in filter lists - EasyList diff --git a/platform/mv3/description/webstore.ko.txt b/platform/mv3/description/webstore.ko.txt index 37bf49d9252ff..2d064281a7cc0 100644 --- a/platform/mv3/description/webstore.ko.txt +++ b/platform/mv3/description/webstore.ko.txt @@ -7,7 +7,7 @@ uBO Lite(uBOL)는 *적은 권한을 요구하는* MV3 기반 콘텐츠 차단기 - EasyPrivacy - Peter Lowe’s Ad and tracking server list -You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +설정 페이지에서 규칙 목록을 더 활성화할 수 있습니다. 팝업 창의 _Cogs_ 아이콘을 누르세요. uBOL은 완전히 선언적이라 필터링 중 영구적으로 실행되는 uBOL 프로세스를 필요로 하지 않으며, CSS/JS 주입 기반 콘텐츠 필터링이 확장 프로그램이 아닌 브라우저 자체에서 더욱 안정적으로 동작합니다. 즉 uBOL 자체는 콘텐츠 차단을 하는 동안 CPU/메모리 리소스를 소비하지 않습니다. uBOL 서비스워커 프로세스는 사용자가 팝업 창이나 설정을 열었을 _때에만_ 동작합니다. diff --git a/platform/mv3/extension/_locales/cy/messages.json b/platform/mv3/extension/_locales/cy/messages.json index 21ac20da0cddb..5a445929a8b0d 100644 --- a/platform/mv3/extension/_locales/cy/messages.json +++ b/platform/mv3/extension/_locales/cy/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Rhoi gwybod am broblem ar y wefan hon", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -48,7 +48,7 @@ "description": "Label to be used to hide popup panel sections" }, "3pGroupDefault": { - "message": "Default", + "message": "Diofyn", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { @@ -104,7 +104,7 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Adrodd nam ar hidlydd", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { diff --git a/platform/mv3/extension/_locales/ko/messages.json b/platform/mv3/extension/_locales/ko/messages.json index edd5e747c28d7..af43131206324 100644 --- a/platform/mv3/extension/_locales/ko/messages.json +++ b/platform/mv3/extension/_locales/ko/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "이 사이트의 이슈를 신고하기", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "필터 이슈 신고", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "특정 웹사이트에서 발생하는 필터 이슈를 uBlockOrigin/uAssets 이슈 트래커에 신고할 수 있습니다. GitHub 계정이 필요합니다.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "봉사자들이 중복 신고로 인해 부담을 겪지 않도록, 해당 이슈가 이미 신고되지는 않았는지 확인해주시기 바랍니다.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "유사한 신고 탐색", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "웹페이지 주소:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "웹페이지가…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- 주제 선택 --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "광고나 광고 흔적을 보여줍니다", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "오버레이나 기타 성가신 요소를 보여줍니다", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "uBO Lite 사용을 감지합니다", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "개인정보 보호 관련 이슈가 있습니다", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "uBO Lite를 켜면 깨집니다", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "원치 않는 탭이나 창을 엽니다", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "악성코드, 피싱으로 유도합니다", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "웹페이지를 \"NSFW\" (“Not Safe For Work”)로 분류", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "새 신고 생성", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { @@ -216,7 +216,7 @@ "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[hostnames only]\nexample.com\ngames.example\n...", + "message": "[호스트 이름만 작성]\nexample.com\ngames.example\n...", "description": "Default text for in edit field" }, "behaviorSectionLabel": { diff --git a/src/_locales/cs/messages.json b/src/_locales/cs/messages.json index e583814b5d1f1..f2c26a6c8ae31 100644 --- a/src/_locales/cs/messages.json +++ b/src/_locales/cs/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Zablokovaná stránka vás chce přesměrovat na jiný web. Pokud se rozhodnete pokračovat, přejdete přímo na: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/fi/messages.json b/src/_locales/fi/messages.json index cb3290d859c46..dbdc0638b3e7f 100644 --- a/src/_locales/fi/messages.json +++ b/src/_locales/fi/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Estetty sivu ohjautuu eri sivustolle. Jos jatkat, siirryt suoraan osoitteeseen {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/ka/messages.json b/src/_locales/ka/messages.json index 7655d2857e9dc..b95c3d428376d 100644 --- a/src/_locales/ka/messages.json +++ b/src/_locales/ka/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "ეს შეზღუდული გვერდი ცდილობს სხვა საიტზე გადაყვანას. თუ განაგრძობთ, პირდაპირ გაიხსნება: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/ko/messages.json b/src/_locales/ko/messages.json index c0e354ef7f31e..c3cb5cea26b5f 100644 --- a/src/_locales/ko/messages.json +++ b/src/_locales/ko/messages.json @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "악성코드, 피싱으로 유도합니다", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "차단된 페이지에서 다른 사이트로 이동하려 합니다. 계속하시면, {{url}} 주소로 바로 이동합니다.", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json index cfec9ea169c09..651c4224d6862 100644 --- a/src/_locales/zh_CN/messages.json +++ b/src/_locales/zh_CN/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "被屏蔽的网页想重定向到另一个网站。如果您选择继续,将直接导航到:{{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { From e164250feab9b1da5e9d32d57fcfa00fb9dd8789 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 5 Nov 2024 09:26:23 -0500 Subject: [PATCH 423/553] Comment --- assets/resources/run-at.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/assets/resources/run-at.js b/assets/resources/run-at.js index f9971155ae91b..1119699e50c02 100644 --- a/assets/resources/run-at.js +++ b/assets/resources/run-at.js @@ -26,7 +26,23 @@ import { safeSelf } from './safe-self.js'; /* eslint no-prototype-builtins: 0 */ -/******************************************************************************/ +/** + * @helperScriptlet run-at.fn + * + * @description + * Execute a function at a specific page-load milestone. + * + * @param fn + * The function to call. + * + * @param when + * An identifier which tells when the function should be executed. + * See . + * + * @example + * `runAt(( ) => { start(); }, 'interactive')` + * + * */ export function runAt(fn, when) { const intFromReadyState = state => { From 652f1787878ba434c3a65287afcd84082c409397 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 5 Nov 2024 09:27:11 -0500 Subject: [PATCH 424/553] New revision for stable release --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 77c1ed4ee7b33..84c7d0bad2dae 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.60.1.105 \ No newline at end of file +1.61.0 \ No newline at end of file From e613282698167feda708e62a44b65d44dd528f06 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 7 Nov 2024 10:23:34 -0500 Subject: [PATCH 425/553] Improve `set-cookie` scriptlet Allow negative integer as valid value. Related issue: https://github.com/gorhill/uBlock/pull/3927 Additionally, move cookie-related scriptlets/helpers into its own source code file. --- .../resources/{set-attr.js => attribute.js} | 104 ++++ assets/resources/cookie.js | 410 +++++++++++++++ assets/resources/scriptlets.js | 472 ++---------------- 3 files changed, 545 insertions(+), 441 deletions(-) rename assets/resources/{set-attr.js => attribute.js} (62%) create mode 100644 assets/resources/cookie.js diff --git a/assets/resources/set-attr.js b/assets/resources/attribute.js similarity index 62% rename from assets/resources/set-attr.js rename to assets/resources/attribute.js index cb90b51fae153..511c8eafa8f3c 100644 --- a/assets/resources/set-attr.js +++ b/assets/resources/attribute.js @@ -198,4 +198,108 @@ trustedSetAttr.details = { world: 'ISOLATED', }; +/** + * @scriptlet remove-attr + * + * @description + * Remove one or more attributes from a set of elements. + * + * @param attribute + * The name of the attribute(s) to remove. This can be a list of space- + * separated attribute names. + * + * @param [selector] + * Optional. A CSS selector for the elements to target. Default to + * `[attribute]`, or `[attribute1],[attribute2],...` if more than one + * attribute name is specified. + * + * @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. + * */ + +export function removeAttr( + rawToken = '', + rawSelector = '', + behavior = '' +) { + if ( typeof rawToken !== 'string' ) { return; } + if ( rawToken === '' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('remove-attr', rawToken, rawSelector, behavior); + const tokens = rawToken.split(/\s*\|\s*/); + const selector = tokens + .map(a => `${rawSelector}[${CSS.escape(a)}]`) + .join(','); + 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 = safe.onIdle(( ) => { + timerId = undefined; + rmattr(); + }, { timeout: 17 }); + }; + const rmattr = ( ) => { + if ( timerId !== undefined ) { + safe.offIdle(timerId); + timerId = undefined; + } + 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(ex) { + } + }; + 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 ( let j = 0; j < removedNodes.length && skip; j++ ) { + if ( removedNodes[j].nodeType === 1 ) { skip = false; break; } + } + } + if ( skip ) { return; } + asap ? rmattr() : rmattrAsync(); + }; + const start = ( ) => { + rmattr(); + if ( /\bstay\b/.test(behavior) === false ) { return; } + const observer = new MutationObserver(mutationHandler); + observer.observe(document, { + attributes: true, + attributeFilter: tokens, + childList: true, + subtree: true, + }); + }; + runAt(( ) => { start(); }, behavior.split(/\s+/)); +} +removeAttr.details = { + name: 'remove-attr.js', + aliases: [ + 'ra.js', + ], + dependencies: [ + runAt, + safeSelf, + ], +}; + /******************************************************************************/ diff --git a/assets/resources/cookie.js b/assets/resources/cookie.js new file mode 100644 index 0000000000000..6d344ad04eff0 --- /dev/null +++ b/assets/resources/cookie.js @@ -0,0 +1,410 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2019-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 + + The scriptlets below are meant to be injected only into a + web page context. +*/ + +import { safeSelf } from './safe-self.js'; + +/******************************************************************************/ + +export function getSafeCookieValuesFn() { + return [ + 'accept', 'reject', + 'accepted', 'rejected', 'notaccepted', + 'allow', 'disallow', 'deny', + 'allowed', 'denied', + 'approved', 'disapproved', + 'checked', 'unchecked', + 'dismiss', 'dismissed', + 'enable', 'disable', + 'enabled', 'disabled', + 'essential', 'nonessential', + 'forbidden', 'forever', + 'hide', 'hidden', + 'necessary', 'required', + 'ok', + 'on', 'off', + 'true', 't', 'false', 'f', + 'yes', 'y', 'no', 'n', + ]; +} +getSafeCookieValuesFn.details = { + name: 'get-safe-cookie-values.fn', +}; + +/******************************************************************************/ + +export function getAllCookiesFn() { + return document.cookie.split(/\s*;\s*/).map(s => { + const pos = s.indexOf('='); + if ( pos === 0 ) { return; } + if ( pos === -1 ) { return `${s.trim()}=`; } + const key = s.slice(0, pos).trim(); + const value = s.slice(pos+1).trim(); + return { key, value }; + }).filter(s => s !== undefined); +} +getAllCookiesFn.details = { + name: 'get-all-cookies.fn', +}; + +/******************************************************************************/ + +export function getCookieFn( + name = '' +) { + for ( const s of document.cookie.split(/\s*;\s*/) ) { + const pos = s.indexOf('='); + if ( pos === -1 ) { continue; } + if ( s.slice(0, pos) !== name ) { continue; } + return s.slice(pos+1).trim(); + } +} +getCookieFn.details = { + name: 'get-cookie.fn', +}; + +/******************************************************************************/ + +export function setCookieFn( + trusted = false, + name = '', + value = '', + expires = '', + path = '', + options = {}, +) { + // https://datatracker.ietf.org/doc/html/rfc2616#section-2.2 + // https://github.com/uBlockOrigin/uBlock-issues/issues/2777 + if ( trusted === false && /[^!#$%&'*+\-.0-9A-Z[\]^_`a-z|~]/.test(name) ) { + name = encodeURIComponent(name); + } + // https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1 + // The characters [",] are given a pass from the RFC requirements because + // apparently browsers do not follow the RFC to the letter. + if ( /[^ -:<-[\]-~]/.test(value) ) { + value = encodeURIComponent(value); + } + + const cookieBefore = getCookieFn(name); + if ( cookieBefore !== undefined && options.dontOverwrite ) { return; } + if ( cookieBefore === value && options.reload ) { return; } + + const cookieParts = [ name, '=', value ]; + if ( expires !== '' ) { + cookieParts.push('; expires=', expires); + } + + if ( path === '' ) { path = '/'; } + else if ( path === 'none' ) { path = ''; } + if ( path !== '' && path !== '/' ) { return; } + if ( path === '/' ) { + cookieParts.push('; path=/'); + } + + if ( trusted ) { + if ( options.domain ) { + cookieParts.push(`; domain=${options.domain}`); + } + cookieParts.push('; Secure'); + } else if ( /^__(Host|Secure)-/.test(name) ) { + cookieParts.push('; Secure'); + } + + try { + document.cookie = cookieParts.join(''); + } catch(_) { + } + + const done = getCookieFn(name) === value; + if ( done && options.reload ) { + window.location.reload(); + } + + return done; +} +setCookieFn.details = { + name: 'set-cookie.fn', + dependencies: [ + 'get-cookie.fn', + ], +}; + +/** + * @scriptlet set-cookie + * + * @description + * Set a cookie to a safe value. + * + * @param name + * The name of the cookie to set. + * + * @param value + * The value of the cookie to set. Must be a safe value. Unsafe values will be + * ignored and no cookie will be set. See getSafeCookieValuesFn() helper above. + * + * @param [path] + * Optional. The path of the cookie to set. Default to `/`. + * + * Reference: + * https://github.com/AdguardTeam/Scriptlets/blob/master/src/scriptlets/set-cookie.js + * */ + +export function setCookie( + name = '', + value = '', + path = '' +) { + if ( name === '' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('set-cookie', name, value, path); + const normalized = value.toLowerCase(); + const match = /^("?)(.+)\1$/.exec(normalized); + const unquoted = match && match[2] || normalized; + const validValues = getSafeCookieValuesFn(); + if ( validValues.includes(unquoted) === false ) { + if ( /^-?\d+$/.test(unquoted) === false ) { return; } + const n = parseInt(value, 10) || 0; + if ( n < -32767 || n > 32767 ) { return; } + } + + const done = setCookieFn( + false, + name, + value, + '', + path, + safe.getExtraArgs(Array.from(arguments), 3) + ); + + if ( done ) { + safe.uboLog(logPrefix, 'Done'); + } +} +setCookie.details = { + name: 'set-cookie.js', + world: 'ISOLATED', + dependencies: [ + 'get-safe-cookie-values.fn', + 'safe-self.fn', + 'set-cookie.fn', + ], +}; + +// For compatibility with AdGuard +export function setCookieReload(name, value, path, ...args) { + setCookie(name, value, path, 'reload', '1', ...args); +} +setCookieReload.details = { + name: 'set-cookie-reload.js', + world: 'ISOLATED', + dependencies: [ + 'set-cookie.js', + ], +}; + +/** + * @trustedScriptlet trusted-set-cookie + * + * @description + * Set a cookie to any value. This scriptlet can be used only from a trusted + * source. + * + * @param name + * The name of the cookie to set. + * + * @param value + * The value of the cookie to set. Must be a safe value. Unsafe values will be + * ignored and no cookie will be set. See getSafeCookieValuesFn() helper above. + * + * @param [offsetExpiresSec] + * Optional. The path of the cookie to set. Default to `/`. + * + * @param [path] + * Optional. The path of the cookie to set. Default to `/`. + * + * Reference: + * https://github.com/AdguardTeam/Scriptlets/blob/master/src/scriptlets/set-cookie.js + * */ + +export function trustedSetCookie( + name = '', + value = '', + offsetExpiresSec = '', + path = '' +) { + if ( name === '' ) { return; } + + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('set-cookie', name, value, path); + const time = new Date(); + + if ( value.includes('$now$') ) { + value = value.replaceAll('$now$', time.getTime()); + } + if ( value.includes('$currentDate$') ) { + value = value.replaceAll('$currentDate$', time.toUTCString()); + } + if ( value.includes('$currentISODate$') ) { + value = value.replaceAll('$currentISODate$', time.toISOString()); + } + + let expires = ''; + if ( offsetExpiresSec !== '' ) { + if ( offsetExpiresSec === '1day' ) { + time.setDate(time.getDate() + 1); + } else if ( offsetExpiresSec === '1year' ) { + time.setFullYear(time.getFullYear() + 1); + } else { + if ( /^\d+$/.test(offsetExpiresSec) === false ) { return; } + time.setSeconds(time.getSeconds() + parseInt(offsetExpiresSec, 10)); + } + expires = time.toUTCString(); + } + + const done = setCookieFn( + true, + name, + value, + expires, + path, + safeSelf().getExtraArgs(Array.from(arguments), 4) + ); + + if ( done ) { + safe.uboLog(logPrefix, 'Done'); + } +} +trustedSetCookie.details = { + name: 'trusted-set-cookie.js', + requiresTrust: true, + world: 'ISOLATED', + dependencies: [ + 'safe-self.fn', + 'set-cookie.fn', + ], +}; + +// For compatibility with AdGuard +export function trustedSetCookieReload(name, value, offsetExpiresSec, path, ...args) { + trustedSetCookie(name, value, offsetExpiresSec, path, 'reload', '1', ...args); +} +trustedSetCookieReload.details = { + name: 'trusted-set-cookie-reload.js', + requiresTrust: true, + world: 'ISOLATED', + dependencies: [ + 'trusted-set-cookie.js', + ], +}; + +/** + * @scriptlet remove-cookie + * + * @description + * Removes current site cookies specified by name. The removal operation occurs + * immediately when the scriptlet is injected, then when the page is unloaded. + * + * @param needle + * A string or a regex matching the name of the cookie(s) to remove. + * + * @param ['when', token] + * Vararg, optional. The parameter following 'when' tells when extra removal + * operations should take place. + * - `scroll`: when the page is scrolled + * - `keydown`: when a keyboard touch is pressed + * + * */ + +export function removeCookie( + needle = '' +) { + if ( typeof needle !== 'string' ) { return; } + const safe = safeSelf(); + const reName = safe.patternToRegex(needle); + const extraArgs = safe.getExtraArgs(Array.from(arguments), 1); + const throttle = (fn, ms = 500) => { + if ( throttle.timer !== undefined ) { return; } + throttle.timer = setTimeout(( ) => { + throttle.timer = undefined; + fn(); + }, ms); + }; + const remove = ( ) => { + document.cookie.split(';').forEach(cookieStr => { + const pos = cookieStr.indexOf('='); + if ( pos === -1 ) { return; } + const cookieName = cookieStr.slice(0, pos).trim(); + if ( reName.test(cookieName) === false ) { return; } + const part1 = cookieName + '='; + const part2a = '; domain=' + document.location.hostname; + const part2b = '; domain=.' + document.location.hostname; + let part2c, part2d; + const domain = document.domain; + if ( domain ) { + if ( domain !== document.location.hostname ) { + part2c = '; domain=.' + domain; + } + if ( domain.startsWith('www.') ) { + part2d = '; domain=' + domain.replace('www', ''); + } + } + const part3 = '; path=/'; + const part4 = '; Max-Age=-1000; expires=Thu, 01 Jan 1970 00:00:00 GMT'; + document.cookie = part1 + part4; + document.cookie = part1 + part2a + part4; + document.cookie = part1 + part2b + part4; + document.cookie = part1 + part3 + part4; + document.cookie = part1 + part2a + part3 + part4; + document.cookie = part1 + part2b + part3 + part4; + if ( part2c !== undefined ) { + document.cookie = part1 + part2c + part3 + part4; + } + if ( part2d !== undefined ) { + document.cookie = part1 + part2d + part3 + part4; + } + }); + }; + remove(); + window.addEventListener('beforeunload', remove); + if ( typeof extraArgs.when !== 'string' ) { return; } + const supportedEventTypes = [ 'scroll', 'keydown' ]; + const eventTypes = extraArgs.when.split(/\s/); + for ( const type of eventTypes ) { + if ( supportedEventTypes.includes(type) === false ) { continue; } + document.addEventListener(type, ( ) => { + throttle(remove); + }, { passive: true }); + } +} +removeCookie.details = { + name: 'remove-cookie.js', + aliases: [ + 'cookie-remover.js', + ], + world: 'ISOLATED', + dependencies: [ + 'safe-self.fn', + ], +}; + +/******************************************************************************/ diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index ba08824916705..8b70e48a5aac6 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -22,7 +22,25 @@ web page context. */ -import { setAttr, setAttrFn, trustedSetAttr } from './set-attr.js'; +import { + getAllCookiesFn, + getCookieFn, + getSafeCookieValuesFn, + removeCookie, + setCookie, + setCookieFn, + setCookieReload, + trustedSetCookie, + trustedSetCookieReload, +} from './cookie.js'; + +import { + removeAttr, + setAttr, + setAttrFn, + trustedSetAttr, +} from './attribute.js'; + import { runAt } from './run-at.js'; import { safeSelf } from './safe-self.js'; @@ -53,10 +71,22 @@ const registerScriptlet = fn => { }; registerScriptlet(safeSelf); + +registerScriptlet(removeAttr); registerScriptlet(setAttrFn); registerScriptlet(setAttr); registerScriptlet(trustedSetAttr); +registerScriptlet(getAllCookiesFn); +registerScriptlet(getCookieFn); +registerScriptlet(getSafeCookieValuesFn); +registerScriptlet(removeCookie); +registerScriptlet(setCookie); +registerScriptlet(setCookieFn); +registerScriptlet(setCookieReload); +registerScriptlet(trustedSetCookie); +registerScriptlet(trustedSetCookieReload); + /******************************************************************************* Helper functions @@ -793,51 +823,6 @@ function objectFindOwnerFn( /******************************************************************************/ -builtinScriptlets.push({ - name: 'get-safe-cookie-values.fn', - fn: getSafeCookieValuesFn, -}); -function getSafeCookieValuesFn() { - return [ - 'accept', 'reject', - 'accepted', 'rejected', 'notaccepted', - 'allow', 'disallow', 'deny', - 'allowed', 'denied', - 'approved', 'disapproved', - 'checked', 'unchecked', - 'dismiss', 'dismissed', - 'enable', 'disable', - 'enabled', 'disabled', - 'essential', 'nonessential', - 'forbidden', 'forever', - 'hide', 'hidden', - 'necessary', 'required', - 'ok', - 'on', 'off', - 'true', 't', 'false', 'f', - 'yes', 'y', 'no', 'n', - ]; -} - -/******************************************************************************/ - -builtinScriptlets.push({ - name: 'get-all-cookies.fn', - fn: getAllCookiesFn, -}); -function getAllCookiesFn() { - return document.cookie.split(/\s*;\s*/).map(s => { - const pos = s.indexOf('='); - if ( pos === 0 ) { return; } - if ( pos === -1 ) { return `${s.trim()}=`; } - const key = s.slice(0, pos).trim(); - const value = s.slice(pos+1).trim(); - return { key, value }; - }).filter(s => s !== undefined); -} - -/******************************************************************************/ - builtinScriptlets.push({ name: 'get-all-local-storage.fn', fn: getAllLocalStorageFn, @@ -855,90 +840,6 @@ function getAllLocalStorageFn(which = 'localStorage') { /******************************************************************************/ -builtinScriptlets.push({ - name: 'get-cookie.fn', - fn: getCookieFn, -}); -function getCookieFn( - name = '' -) { - for ( const s of document.cookie.split(/\s*;\s*/) ) { - const pos = s.indexOf('='); - if ( pos === -1 ) { continue; } - if ( s.slice(0, pos) !== name ) { continue; } - return s.slice(pos+1).trim(); - } -} - -/******************************************************************************/ - -builtinScriptlets.push({ - name: 'set-cookie.fn', - fn: setCookieFn, - dependencies: [ - 'get-cookie.fn', - ], -}); -function setCookieFn( - trusted = false, - name = '', - value = '', - expires = '', - path = '', - options = {}, -) { - // https://datatracker.ietf.org/doc/html/rfc2616#section-2.2 - // https://github.com/uBlockOrigin/uBlock-issues/issues/2777 - if ( trusted === false && /[^!#$%&'*+\-.0-9A-Z[\]^_`a-z|~]/.test(name) ) { - name = encodeURIComponent(name); - } - // https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1 - // The characters [",] are given a pass from the RFC requirements because - // apparently browsers do not follow the RFC to the letter. - if ( /[^ -:<-[\]-~]/.test(value) ) { - value = encodeURIComponent(value); - } - - const cookieBefore = getCookieFn(name); - if ( cookieBefore !== undefined && options.dontOverwrite ) { return; } - if ( cookieBefore === value && options.reload ) { return; } - - const cookieParts = [ name, '=', value ]; - if ( expires !== '' ) { - cookieParts.push('; expires=', expires); - } - - if ( path === '' ) { path = '/'; } - else if ( path === 'none' ) { path = ''; } - if ( path !== '' && path !== '/' ) { return; } - if ( path === '/' ) { - cookieParts.push('; path=/'); - } - - if ( trusted ) { - if ( options.domain ) { - cookieParts.push(`; domain=${options.domain}`); - } - cookieParts.push('; Secure'); - } else if ( /^__(Host|Secure)-/.test(name) ) { - cookieParts.push('; Secure'); - } - - try { - document.cookie = cookieParts.join(''); - } catch(_) { - } - - const done = getCookieFn(name) === value; - if ( done && options.reload ) { - window.location.reload(); - } - - return done; -} - -/******************************************************************************/ - builtinScriptlets.push({ name: 'set-local-storage-item.fn', fn: setLocalStorageItemFn, @@ -2347,91 +2248,6 @@ function preventRefresh( /******************************************************************************/ -builtinScriptlets.push({ - name: 'remove-attr.js', - aliases: [ - 'ra.js', - ], - fn: removeAttr, - dependencies: [ - 'run-at.fn', - 'safe-self.fn', - ], -}); -function removeAttr( - rawToken = '', - rawSelector = '', - behavior = '' -) { - if ( typeof rawToken !== 'string' ) { return; } - if ( rawToken === '' ) { return; } - const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('remove-attr', rawToken, rawSelector, behavior); - const tokens = rawToken.split(/\s*\|\s*/); - const selector = tokens - .map(a => `${rawSelector}[${CSS.escape(a)}]`) - .join(','); - 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 = safe.onIdle(( ) => { - timerId = undefined; - rmattr(); - }, { timeout: 17 }); - }; - const rmattr = ( ) => { - if ( timerId !== undefined ) { - safe.offIdle(timerId); - timerId = undefined; - } - 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(ex) { - } - }; - 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 ( let j = 0; j < removedNodes.length && skip; j++ ) { - if ( removedNodes[j].nodeType === 1 ) { skip = false; break; } - } - } - if ( skip ) { return; } - asap ? rmattr() : rmattrAsync(); - }; - const start = ( ) => { - rmattr(); - if ( /\bstay\b/.test(behavior) === false ) { return; } - const observer = new MutationObserver(mutationHandler); - observer.observe(document, { - attributes: true, - attributeFilter: tokens, - childList: true, - subtree: true, - }); - }; - runAt(( ) => { start(); }, behavior.split(/\s+/)); -} - -/******************************************************************************/ - builtinScriptlets.push({ name: 'remove-class.js', aliases: [ @@ -3090,82 +2906,6 @@ function disableNewtabLinks() { /******************************************************************************/ -builtinScriptlets.push({ - name: 'remove-cookie.js', - aliases: [ - 'cookie-remover.js', - ], - fn: cookieRemover, - world: 'ISOLATED', - dependencies: [ - 'safe-self.fn', - ], -}); -// https://github.com/NanoAdblocker/NanoFilters/issues/149 -function cookieRemover( - needle = '' -) { - if ( typeof needle !== 'string' ) { return; } - const safe = safeSelf(); - const reName = safe.patternToRegex(needle); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 1); - const throttle = (fn, ms = 500) => { - if ( throttle.timer !== undefined ) { return; } - throttle.timer = setTimeout(( ) => { - throttle.timer = undefined; - fn(); - }, ms); - }; - const removeCookie = ( ) => { - document.cookie.split(';').forEach(cookieStr => { - const pos = cookieStr.indexOf('='); - if ( pos === -1 ) { return; } - const cookieName = cookieStr.slice(0, pos).trim(); - if ( reName.test(cookieName) === false ) { return; } - const part1 = cookieName + '='; - const part2a = '; domain=' + document.location.hostname; - const part2b = '; domain=.' + document.location.hostname; - let part2c, part2d; - const domain = document.domain; - if ( domain ) { - if ( domain !== document.location.hostname ) { - part2c = '; domain=.' + domain; - } - if ( domain.startsWith('www.') ) { - part2d = '; domain=' + domain.replace('www', ''); - } - } - const part3 = '; path=/'; - const part4 = '; Max-Age=-1000; expires=Thu, 01 Jan 1970 00:00:00 GMT'; - document.cookie = part1 + part4; - document.cookie = part1 + part2a + part4; - document.cookie = part1 + part2b + part4; - document.cookie = part1 + part3 + part4; - document.cookie = part1 + part2a + part3 + part4; - document.cookie = part1 + part2b + part3 + part4; - if ( part2c !== undefined ) { - document.cookie = part1 + part2c + part3 + part4; - } - if ( part2d !== undefined ) { - document.cookie = part1 + part2d + part3 + part4; - } - }); - }; - removeCookie(); - window.addEventListener('beforeunload', removeCookie); - if ( typeof extraArgs.when !== 'string' ) { return; } - const supportedEventTypes = [ 'scroll', 'keydown' ]; - const eventTypes = extraArgs.when.split(/\s/); - for ( const type of eventTypes ) { - if ( supportedEventTypes.includes(type) === false ) { continue; } - document.addEventListener(type, ( ) => { - throttle(removeCookie); - }, { passive: true }); - } -} - -/******************************************************************************/ - builtinScriptlets.push({ name: 'xml-prune.js', fn: xmlPrune, @@ -3827,72 +3567,6 @@ function removeNodeText( replaceNodeTextFn(nodeName, '', '', 'includes', includes || '', ...extraArgs); } -/******************************************************************************* - * - * set-cookie.js - * - * Set specified cookie to a specific value. - * - * Reference: - * https://github.com/AdguardTeam/Scriptlets/blob/master/src/scriptlets/set-cookie.js - * - **/ - -builtinScriptlets.push({ - name: 'set-cookie.js', - fn: setCookie, - world: 'ISOLATED', - dependencies: [ - 'get-safe-cookie-values.fn', - 'safe-self.fn', - 'set-cookie.fn', - ], -}); -function setCookie( - name = '', - value = '', - path = '' -) { - if ( name === '' ) { return; } - const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('set-cookie', name, value, path); - const normalized = value.toLowerCase(); - const match = /^("?)(.+)\1$/.exec(normalized); - const unquoted = match && match[2] || normalized; - const validValues = getSafeCookieValuesFn(); - if ( validValues.includes(unquoted) === false ) { - if ( /^\d+$/.test(unquoted) === false ) { return; } - const n = parseInt(value, 10); - if ( n > 32767 ) { return; } - } - - const done = setCookieFn( - false, - name, - value, - '', - path, - safe.getExtraArgs(Array.from(arguments), 3) - ); - - if ( done ) { - safe.uboLog(logPrefix, 'Done'); - } -} - -// For compatibility with AdGuard -builtinScriptlets.push({ - name: 'set-cookie-reload.js', - fn: setCookieReload, - world: 'ISOLATED', - dependencies: [ - 'set-cookie.js', - ], -}); -function setCookieReload(name, value, path, ...args) { - setCookie(name, value, path, 'reload', '1', ...args); -} - /******************************************************************************* * * set-local-storage-item.js @@ -4155,90 +3829,6 @@ function trustedSetConstant( setConstantFn(true, ...args); } -/******************************************************************************* - * - * trusted-set-cookie.js - * - * Set specified cookie to an arbitrary value. - * - * Reference: - * https://github.com/AdguardTeam/Scriptlets/blob/master/src/scriptlets/trusted-set-cookie.js#L23 - * - **/ - -builtinScriptlets.push({ - name: 'trusted-set-cookie.js', - requiresTrust: true, - fn: trustedSetCookie, - world: 'ISOLATED', - dependencies: [ - 'safe-self.fn', - 'set-cookie.fn', - ], -}); -function trustedSetCookie( - name = '', - value = '', - offsetExpiresSec = '', - path = '' -) { - if ( name === '' ) { return; } - - const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('set-cookie', name, value, path); - const time = new Date(); - - if ( value.includes('$now$') ) { - value = value.replaceAll('$now$', time.getTime()); - } - if ( value.includes('$currentDate$') ) { - value = value.replaceAll('$currentDate$', time.toUTCString()); - } - if ( value.includes('$currentISODate$') ) { - value = value.replaceAll('$currentISODate$', time.toISOString()); - } - - let expires = ''; - if ( offsetExpiresSec !== '' ) { - if ( offsetExpiresSec === '1day' ) { - time.setDate(time.getDate() + 1); - } else if ( offsetExpiresSec === '1year' ) { - time.setFullYear(time.getFullYear() + 1); - } else { - if ( /^\d+$/.test(offsetExpiresSec) === false ) { return; } - time.setSeconds(time.getSeconds() + parseInt(offsetExpiresSec, 10)); - } - expires = time.toUTCString(); - } - - const done = setCookieFn( - true, - name, - value, - expires, - path, - safeSelf().getExtraArgs(Array.from(arguments), 4) - ); - - if ( done ) { - safe.uboLog(logPrefix, 'Done'); - } -} - -// For compatibility with AdGuard -builtinScriptlets.push({ - name: 'trusted-set-cookie-reload.js', - requiresTrust: true, - fn: trustedSetCookieReload, - world: 'ISOLATED', - dependencies: [ - 'trusted-set-cookie.js', - ], -}); -function trustedSetCookieReload(name, value, offsetExpiresSec, path, ...args) { - trustedSetCookie(name, value, offsetExpiresSec, path, 'reload', '1', ...args); -} - /******************************************************************************* * * trusted-set-local-storage-item.js From f90ccb7c6229830216b55a8bae2330dee8e04fc0 Mon Sep 17 00:00:00 2001 From: Sander Lepik Date: Thu, 7 Nov 2024 17:27:26 +0200 Subject: [PATCH 426/553] Move Estonian list away from .php extension (#3926) --- assets/assets.dev.json | 4 ++-- assets/assets.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/assets.dev.json b/assets/assets.dev.json index 9c7accc0c3fea..f776738c10eb9 100644 --- a/assets/assets.dev.json +++ b/assets/assets.dev.json @@ -584,8 +584,8 @@ "title": "🇪🇪ee: Eesti saitidele kohandatud filter", "tags": "ads estonian", "lang": "et", - "contentURL": "https://adblock.ee/list.php", - "supportURL": "https://adblock.ee/" + "contentURL": "https://adblock.ee/list.txt", + "supportURL": "https://adblock.ee" }, "FIN-0": { "content": "filters", diff --git a/assets/assets.json b/assets/assets.json index 8b0e79f39cdd5..76967068a6e99 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -584,8 +584,8 @@ "title": "🇪🇪ee: Eesti saitidele kohandatud filter", "tags": "ads estonian", "lang": "et", - "contentURL": "https://adblock.ee/list.php", - "supportURL": "https://adblock.ee/" + "contentURL": "https://adblock.ee/list.txt", + "supportURL": "https://adblock.ee" }, "FIN-0": { "content": "filters", From e854c4752bd8db3631c26e5dcb7a0c95b41a3c07 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 7 Nov 2024 11:59:57 -0500 Subject: [PATCH 427/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 84c7d0bad2dae..4e9a7a74d7d84 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.0 \ No newline at end of file +1.61.1.0 \ No newline at end of file From 34eed9abef96baffa70c4b2a62db0513d7dd73d1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 7 Nov 2024 12:09:41 -0500 Subject: [PATCH 428/553] Update changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d62d815d12a4..033673f3cdaca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +- [Improve `set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/e613282698) + +---------- + +# 1.61.0 + +## Fixes / changes + - [Improve `prevent-refresh` scriptlet](https://github.com/gorhill/uBlock/commit/8884f259c1) - [Improve `googlesyndication_adsbygoogle.js` scriptlet](https://github.com/gorhill/uBlock/commit/f645e8f0d2) - [Offer ability to skip redirects in strict-blocked page](https://github.com/gorhill/uBlock/commit/20b54185fa) From fd60f54a5f23179639b409f059704a6b587a1413 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 7 Nov 2024 12:15:43 -0500 Subject: [PATCH 429/553] 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 a34746cba91dc..62d26e1c496c5 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.60.1.105", + "version": "1.61.1.0", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.60.1rc5/uBlock0_1.60.1rc5.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.1b0/uBlock0_1.61.1b0.firefox.signed.xpi" } ] } From 41616df866f5f87dfc0787479376f268e9722b29 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 8 Nov 2024 08:32:19 -0500 Subject: [PATCH 430/553] Improve `trusted-suppress-native-method` scriptlet Add `debug` as disposition option: if the `how` parameter is `debug`, the scriptlet will trigger a `debugger` statement and the target method won't be suppressed. Useful to find out how the method is being called by page code. To be used for investigation purpose only. --- assets/resources/scriptlets.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 8b70e48a5aac6..900f9423952e0 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -4432,13 +4432,10 @@ function trustedSuppressNativeMethod( safe.uboLog(logPrefix, `Arguments:\n${callArgs.join('\n')}`); return context.reflect(); } - if ( callArgs.length < signatureArgs.length ) { - return context.reflect(); - } for ( let i = 0; i < signatureArgs.length; i++ ) { const signatureArg = signatureArgs[i]; if ( signatureArg === undefined ) { continue; } - const targetArg = callArgs[i]; + const targetArg = i < callArgs.length ? callArgs[i] : undefined; if ( signatureArg.type === 'exact' ) { if ( targetArg !== signatureArg.value ) { return context.reflect(); @@ -4450,6 +4447,10 @@ function trustedSuppressNativeMethod( } } } + if ( how === 'debug' ) { + debugger; // eslint-disable-line no-debugger + return context.reflect(); + } safe.uboLog(logPrefix, `Suppressed:\n${callArgs.join('\n')}`); if ( how === 'abort' ) { throw new ReferenceError(); From ce4908b3415317cff1ab6dfc7d8c90478cdbbcdf Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 8 Nov 2024 08:48:07 -0500 Subject: [PATCH 431/553] Improve `prevent-xhr` scriptlet --- assets/resources/scriptlets.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 900f9423952e0..1218d0dd73e80 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -1345,11 +1345,11 @@ function preventXhrFn( 'content-type': '', 'content-length': '', }, + url: haystack.url, props: { response: { value: '' }, responseText: { value: '' }, responseXML: { value: null }, - responseURL: { value: haystack.url }, }, }); xhrInstances.set(this, xhrDetails); @@ -1405,6 +1405,7 @@ function preventXhrFn( xhrDetails.headers['content-length'] = `${xhrDetails.props.response.value}`.length; Object.defineProperties(xhrDetails.xhr, { readyState: { value: 4 }, + responseURL: { value: xhrDetails.url }, status: { value: 200 }, statusText: { value: 'OK' }, }); @@ -1414,6 +1415,7 @@ function preventXhrFn( Promise.resolve(xhrText).then(( ) => xhrDetails).then(details => { Object.defineProperties(details.xhr, { readyState: { value: 1, configurable: true }, + responseURL: { value: xhrDetails.url }, }); safeDispatchEvent(details.xhr, 'readystatechange'); return details; From e5a088738dd7aeb7b84df6766ae036de76f82000 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 8 Nov 2024 11:22:31 -0500 Subject: [PATCH 432/553] Keep moving related scriptlets into separate files --- assets/resources/attribute.js | 17 +- assets/resources/base.js | 40 ++++ assets/resources/cookie.js | 55 +++--- assets/resources/localstorage.js | 237 +++++++++++++++++++++++ assets/resources/run-at.js | 22 ++- assets/resources/safe-self.js | 6 +- assets/resources/scriptlets.js | 312 ++----------------------------- src/js/redirect-engine.js | 2 + 8 files changed, 351 insertions(+), 340 deletions(-) create mode 100644 assets/resources/base.js create mode 100644 assets/resources/localstorage.js diff --git a/assets/resources/attribute.js b/assets/resources/attribute.js index 511c8eafa8f3c..0c50daf879003 100644 --- a/assets/resources/attribute.js +++ b/assets/resources/attribute.js @@ -22,6 +22,7 @@ web page context. */ +import { registerScriptlet } from './base.js'; import { runAt } from './run-at.js'; import { safeSelf } from './safe-self.js'; @@ -95,13 +96,13 @@ export function setAttrFn( }; runAt(( ) => { start(); }, 'idle'); } -setAttrFn.details = { +registerScriptlet(setAttrFn, { name: 'set-attr.fn', dependencies: [ runAt, safeSelf, ], -}; +}); /** * @scriptlet set-attr @@ -149,14 +150,14 @@ export function setAttr( setAttrFn(logPrefix, selector, attr, value); } -setAttr.details = { +registerScriptlet(setAttr, { name: 'set-attr.js', dependencies: [ safeSelf, setAttrFn, ], world: 'ISOLATED', -}; +}); /** * @trustedScriptlet trusted-set-attr @@ -188,7 +189,7 @@ export function trustedSetAttr( const logPrefix = safe.makeLogPrefix('trusted-set-attr', selector, attr, value); setAttrFn(logPrefix, selector, attr, value); } -trustedSetAttr.details = { +registerScriptlet(trustedSetAttr, { name: 'trusted-set-attr.js', requiresTrust: true, dependencies: [ @@ -196,7 +197,7 @@ trustedSetAttr.details = { setAttrFn, ], world: 'ISOLATED', -}; +}); /** * @scriptlet remove-attr @@ -291,7 +292,7 @@ export function removeAttr( }; runAt(( ) => { start(); }, behavior.split(/\s+/)); } -removeAttr.details = { +registerScriptlet(removeAttr, { name: 'remove-attr.js', aliases: [ 'ra.js', @@ -300,6 +301,6 @@ removeAttr.details = { runAt, safeSelf, ], -}; +}); /******************************************************************************/ diff --git a/assets/resources/base.js b/assets/resources/base.js new file mode 100644 index 0000000000000..dc677b7cb794c --- /dev/null +++ b/assets/resources/base.js @@ -0,0 +1,40 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2019-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 + + The scriptlets below are meant to be injected only into a + web page context. +*/ + +export const registeredScriptlets = []; + +export const registerScriptlet = (fn, details) => { + if ( typeof details !== 'object' ) { + throw new ReferenceError('Missing scriptlet details'); + } + details.fn = fn; + fn.details = details; + if ( Array.isArray(details.dependencies) ) { + details.dependencies.forEach((fn, i, array) => { + if ( typeof fn !== 'function' ) { return; } + array[i] = fn.details.name; + }); + } + registeredScriptlets.push(details); +}; diff --git a/assets/resources/cookie.js b/assets/resources/cookie.js index 6d344ad04eff0..1be419121f5b5 100644 --- a/assets/resources/cookie.js +++ b/assets/resources/cookie.js @@ -22,6 +22,7 @@ web page context. */ +import { registerScriptlet } from './base.js'; import { safeSelf } from './safe-self.js'; /******************************************************************************/ @@ -47,9 +48,9 @@ export function getSafeCookieValuesFn() { 'yes', 'y', 'no', 'n', ]; } -getSafeCookieValuesFn.details = { +registerScriptlet(getSafeCookieValuesFn, { name: 'get-safe-cookie-values.fn', -}; +}); /******************************************************************************/ @@ -63,9 +64,9 @@ export function getAllCookiesFn() { return { key, value }; }).filter(s => s !== undefined); } -getAllCookiesFn.details = { +registerScriptlet(getAllCookiesFn, { name: 'get-all-cookies.fn', -}; +}); /******************************************************************************/ @@ -79,9 +80,9 @@ export function getCookieFn( return s.slice(pos+1).trim(); } } -getCookieFn.details = { +registerScriptlet(getCookieFn, { name: 'get-cookie.fn', -}; +}); /******************************************************************************/ @@ -142,12 +143,12 @@ export function setCookieFn( return done; } -setCookieFn.details = { +registerScriptlet(setCookieFn, { name: 'set-cookie.fn', dependencies: [ - 'get-cookie.fn', + getCookieFn, ], -}; +}); /** * @scriptlet set-cookie @@ -200,27 +201,27 @@ export function setCookie( safe.uboLog(logPrefix, 'Done'); } } -setCookie.details = { +registerScriptlet(setCookie, { name: 'set-cookie.js', world: 'ISOLATED', dependencies: [ - 'get-safe-cookie-values.fn', - 'safe-self.fn', - 'set-cookie.fn', + getSafeCookieValuesFn, + safeSelf, + setCookieFn, ], -}; +}); // For compatibility with AdGuard export function setCookieReload(name, value, path, ...args) { setCookie(name, value, path, 'reload', '1', ...args); } -setCookieReload.details = { +registerScriptlet(setCookieReload, { name: 'set-cookie-reload.js', world: 'ISOLATED', dependencies: [ - 'set-cookie.js', + setCookie, ], -}; +}); /** * @trustedScriptlet trusted-set-cookie @@ -294,28 +295,28 @@ export function trustedSetCookie( safe.uboLog(logPrefix, 'Done'); } } -trustedSetCookie.details = { +registerScriptlet(trustedSetCookie, { name: 'trusted-set-cookie.js', requiresTrust: true, world: 'ISOLATED', dependencies: [ - 'safe-self.fn', - 'set-cookie.fn', + safeSelf, + setCookieFn, ], -}; +}); // For compatibility with AdGuard export function trustedSetCookieReload(name, value, offsetExpiresSec, path, ...args) { trustedSetCookie(name, value, offsetExpiresSec, path, 'reload', '1', ...args); } -trustedSetCookieReload.details = { +registerScriptlet(trustedSetCookieReload, { name: 'trusted-set-cookie-reload.js', requiresTrust: true, world: 'ISOLATED', dependencies: [ - 'trusted-set-cookie.js', + trustedSetCookie, ], -}; +}); /** * @scriptlet remove-cookie @@ -396,15 +397,15 @@ export function removeCookie( }, { passive: true }); } } -removeCookie.details = { +registerScriptlet(removeCookie, { name: 'remove-cookie.js', aliases: [ 'cookie-remover.js', ], world: 'ISOLATED', dependencies: [ - 'safe-self.fn', + safeSelf, ], -}; +}); /******************************************************************************/ diff --git a/assets/resources/localstorage.js b/assets/resources/localstorage.js new file mode 100644 index 0000000000000..6ea13df73a49e --- /dev/null +++ b/assets/resources/localstorage.js @@ -0,0 +1,237 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2019-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 + + The scriptlets below are meant to be injected only into a + web page context. +*/ + +import { getSafeCookieValuesFn } from './cookie.js'; +import { registerScriptlet } from './base.js'; +import { safeSelf } from './safe-self.js'; + +/******************************************************************************/ + +export function getAllLocalStorageFn(which = 'localStorage') { + const storage = self[which]; + const out = []; + for ( let i = 0; i < storage.length; i++ ) { + const key = storage.key(i); + const value = storage.getItem(key); + return { key, value }; + } + return out; +} +registerScriptlet(getAllLocalStorageFn, { + name: 'get-all-local-storage.fn', +}); + +/******************************************************************************/ + +export function setLocalStorageItemFn( + which = 'local', + trusted = false, + key = '', + value = '', +) { + if ( key === '' ) { return; } + + // For increased compatibility with AdGuard + if ( value === 'emptyArr' ) { + value = '[]'; + } else if ( value === 'emptyObj' ) { + value = '{}'; + } + + const trustedValues = [ + '', + 'undefined', 'null', + '{}', '[]', '""', + '$remove$', + ...getSafeCookieValuesFn(), + ]; + + if ( trusted ) { + if ( value.includes('$now$') ) { + value = value.replaceAll('$now$', Date.now()); + } + if ( value.includes('$currentDate$') ) { + value = value.replaceAll('$currentDate$', `${Date()}`); + } + if ( value.includes('$currentISODate$') ) { + value = value.replaceAll('$currentISODate$', (new Date()).toISOString()); + } + } else { + const normalized = value.toLowerCase(); + const match = /^("?)(.+)\1$/.exec(normalized); + const unquoted = match && match[2] || normalized; + if ( trustedValues.includes(unquoted) === false ) { + if ( /^-?\d+$/.test(unquoted) === false ) { return; } + const n = parseInt(unquoted, 10) || 0; + if ( n < -32767 || n > 32767 ) { return; } + } + } + + try { + const storage = self[`${which}Storage`]; + if ( value === '$remove$' ) { + const safe = safeSelf(); + const pattern = safe.patternToRegex(key, undefined, true ); + const toRemove = []; + for ( let i = 0, n = storage.length; i < n; i++ ) { + const key = storage.key(i); + if ( pattern.test(key) ) { toRemove.push(key); } + } + for ( const key of toRemove ) { + storage.removeItem(key); + } + } else { + storage.setItem(key, `${value}`); + } + } catch(ex) { + } +} +registerScriptlet(setLocalStorageItemFn, { + name: 'set-local-storage-item.fn', + dependencies: [ + getSafeCookieValuesFn, + safeSelf, + ], +}); + +/******************************************************************************/ + +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 + * set-session-storage-item.js + * + * Set a local/session storage entry to a specific, allowed value. + * + * Reference: + * https://github.com/AdguardTeam/Scriptlets/blob/master/src/scriptlets/set-local-storage-item.js + * https://github.com/AdguardTeam/Scriptlets/blob/master/src/scriptlets/set-session-storage-item.js + * + **/ + +export function setLocalStorageItem(key = '', value = '') { + setLocalStorageItemFn('local', false, key, value); +} +registerScriptlet(setLocalStorageItem, { + name: 'set-local-storage-item.js', + world: 'ISOLATED', + dependencies: [ + setLocalStorageItemFn, + ], +}); + +export function setSessionStorageItem(key = '', value = '') { + setLocalStorageItemFn('session', false, key, value); +} +registerScriptlet(setSessionStorageItem, { + name: 'set-session-storage-item.js', + world: 'ISOLATED', + dependencies: [ + setLocalStorageItemFn, + ], +}); + +/******************************************************************************* + * + * trusted-set-local-storage-item.js + * + * Set a local storage entry to an arbitrary value. + * + * Reference: + * https://github.com/AdguardTeam/Scriptlets/blob/master/src/scriptlets/trusted-set-local-storage-item.js + * + **/ + +export function trustedSetLocalStorageItem(key = '', value = '') { + setLocalStorageItemFn('local', true, key, value); +} +registerScriptlet(trustedSetLocalStorageItem, { + name: 'trusted-set-local-storage-item.js', + requiresTrust: true, + world: 'ISOLATED', + dependencies: [ + setLocalStorageItemFn, + ], +}); + +export function trustedSetSessionStorageItem(key = '', value = '') { + setLocalStorageItemFn('session', true, key, value); +} +registerScriptlet(trustedSetSessionStorageItem, { + name: 'trusted-set-session-storage-item.js', + requiresTrust: true, + world: 'ISOLATED', + dependencies: [ + setLocalStorageItemFn, + ], +}); diff --git a/assets/resources/run-at.js b/assets/resources/run-at.js index 1119699e50c02..0a7dfb5e4dbe5 100644 --- a/assets/resources/run-at.js +++ b/assets/resources/run-at.js @@ -22,6 +22,7 @@ web page context. */ +import { registerScriptlet } from './base.js'; import { safeSelf } from './safe-self.js'; /* eslint no-prototype-builtins: 0 */ @@ -72,9 +73,26 @@ export function runAt(fn, when) { const args = [ 'readystatechange', onStateChange, { capture: true } ]; safe.addEventListener.apply(document, args); } -runAt.details = { +registerScriptlet(runAt, { name: 'run-at.fn', dependencies: [ safeSelf, ], -}; +}); + +/******************************************************************************/ + +function runAtHtmlElementFn(fn) { + if ( document.documentElement ) { + fn(); + return; + } + const observer = new MutationObserver(( ) => { + observer.disconnect(); + fn(); + }); + observer.observe(document, { childList: true }); +} +registerScriptlet(runAtHtmlElementFn, { + name: 'run-at-html-element.fn', +}); diff --git a/assets/resources/safe-self.js b/assets/resources/safe-self.js index 33f3201e7550e..bad9eece359ae 100644 --- a/assets/resources/safe-self.js +++ b/assets/resources/safe-self.js @@ -22,6 +22,8 @@ web page context. */ +import { registerScriptlet } from './base.js'; + /******************************************************************************/ // Externally added to the private namespace in which scriptlets execute. @@ -213,6 +215,6 @@ export function safeSelf() { } return safe; } -safeSelf.details = { +registerScriptlet(safeSelf, { name: 'safe-self.fn', -}; +}); diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 1218d0dd73e80..531959e23de66 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -22,70 +22,24 @@ web page context. */ -import { - getAllCookiesFn, - getCookieFn, - getSafeCookieValuesFn, - removeCookie, - setCookie, - setCookieFn, - setCookieReload, - trustedSetCookie, - trustedSetCookieReload, -} from './cookie.js'; - -import { - removeAttr, - setAttr, - setAttrFn, - trustedSetAttr, -} from './attribute.js'; - +import './attribute.js'; +import './cookie.js'; +import './localstorage.js'; +import './run-at.js'; +import './safe-self.js'; + +import { getAllCookiesFn } from './cookie.js'; +import { getAllLocalStorageFn } from './localstorage.js'; +import { registeredScriptlets } from './base.js'; import { runAt } from './run-at.js'; import { safeSelf } from './safe-self.js'; -/* eslint no-prototype-builtins: 0 */ - // Externally added to the private namespace in which scriptlets execute. /* global scriptletGlobals */ -export const builtinScriptlets = []; - -/******************************************************************************/ +/* eslint no-prototype-builtins: 0 */ -// Register scriptlets declared in other files. - -const registerScriptlet = fn => { - const details = fn.details; - if ( typeof details !== 'object' ) { - throw new ReferenceError('Unknown scriptlet function'); - } - details.fn = fn; - if ( Array.isArray(details.dependencies) ) { - details.dependencies.forEach((fn, i, array) => { - if ( typeof fn !== 'function' ) { return; } - array[i] = fn.details.name; - }); - } - builtinScriptlets.push(details); -}; - -registerScriptlet(safeSelf); - -registerScriptlet(removeAttr); -registerScriptlet(setAttrFn); -registerScriptlet(setAttr); -registerScriptlet(trustedSetAttr); - -registerScriptlet(getAllCookiesFn); -registerScriptlet(getCookieFn); -registerScriptlet(getSafeCookieValuesFn); -registerScriptlet(removeCookie); -registerScriptlet(setCookie); -registerScriptlet(setCookieFn); -registerScriptlet(setCookieReload); -registerScriptlet(trustedSetCookie); -registerScriptlet(trustedSetCookieReload); +export const builtinScriptlets = registeredScriptlets; /******************************************************************************* @@ -141,34 +95,6 @@ function shouldDebug(details) { /******************************************************************************/ -builtinScriptlets.push({ - name: 'run-at.fn', - fn: runAt, - dependencies: [ - 'safe-self.fn', - ], -}); - -/******************************************************************************/ - -builtinScriptlets.push({ - name: 'run-at-html-element.fn', - fn: runAtHtmlElementFn, -}); -function runAtHtmlElementFn(fn) { - if ( document.documentElement ) { - fn(); - return; - } - const observer = new MutationObserver(( ) => { - observer.disconnect(); - fn(); - }); - observer.observe(document, { childList: true }); -} - -/******************************************************************************/ - // Reference: // https://github.com/AdguardTeam/Scriptlets/blob/master/wiki/about-scriptlets.md#prevent-xhr // @@ -823,97 +749,6 @@ function objectFindOwnerFn( /******************************************************************************/ -builtinScriptlets.push({ - name: 'get-all-local-storage.fn', - fn: getAllLocalStorageFn, -}); -function getAllLocalStorageFn(which = 'localStorage') { - const storage = self[which]; - const out = []; - for ( let i = 0; i < storage.length; i++ ) { - const key = storage.key(i); - const value = storage.getItem(key); - return { key, value }; - } - return out; -} - -/******************************************************************************/ - -builtinScriptlets.push({ - name: 'set-local-storage-item.fn', - fn: setLocalStorageItemFn, - dependencies: [ - 'get-safe-cookie-values.fn', - 'safe-self.fn', - ], -}); -function setLocalStorageItemFn( - which = 'local', - trusted = false, - key = '', - value = '', -) { - if ( key === '' ) { return; } - - // For increased compatibility with AdGuard - if ( value === 'emptyArr' ) { - value = '[]'; - } else if ( value === 'emptyObj' ) { - value = '{}'; - } - - const trustedValues = [ - '', - 'undefined', 'null', - '{}', '[]', '""', - '$remove$', - ...getSafeCookieValuesFn(), - ]; - - if ( trusted ) { - if ( value.includes('$now$') ) { - value = value.replaceAll('$now$', Date.now()); - } - if ( value.includes('$currentDate$') ) { - value = value.replaceAll('$currentDate$', `${Date()}`); - } - if ( value.includes('$currentISODate$') ) { - value = value.replaceAll('$currentISODate$', (new Date()).toISOString()); - } - } else { - const normalized = value.toLowerCase(); - const match = /^("?)(.+)\1$/.exec(normalized); - const unquoted = match && match[2] || normalized; - if ( trustedValues.includes(unquoted) === false ) { - if ( /^\d+$/.test(unquoted) === false ) { return; } - const n = parseInt(unquoted, 10); - if ( n > 32767 ) { return; } - } - } - - try { - const storage = self[`${which}Storage`]; - if ( value === '$remove$' ) { - const safe = safeSelf(); - const pattern = safe.patternToRegex(key, undefined, true ); - const toRemove = []; - for ( let i = 0, n = storage.length; i < n; i++ ) { - const key = storage.key(i); - if ( pattern.test(key) ) { toRemove.push(key); } - } - for ( const key of toRemove ) { - storage.removeItem(key); - } - } else { - storage.setItem(key, `${value}`); - } - } catch(ex) { - } -} - -/******************************************************************************/ - builtinScriptlets.push({ name: 'matches-stack-trace.fn', fn: matchesStackTrace, @@ -3569,43 +3404,6 @@ function removeNodeText( replaceNodeTextFn(nodeName, '', '', 'includes', includes || '', ...extraArgs); } -/******************************************************************************* - * - * set-local-storage-item.js - * set-session-storage-item.js - * - * Set a local/session storage entry to a specific, allowed value. - * - * Reference: - * https://github.com/AdguardTeam/Scriptlets/blob/master/src/scriptlets/set-local-storage-item.js - * https://github.com/AdguardTeam/Scriptlets/blob/master/src/scriptlets/set-session-storage-item.js - * - **/ - -builtinScriptlets.push({ - name: 'set-local-storage-item.js', - fn: setLocalStorageItem, - world: 'ISOLATED', - dependencies: [ - 'set-local-storage-item.fn', - ], -}); -function setLocalStorageItem(key = '', value = '') { - setLocalStorageItemFn('local', false, key, value); -} - -builtinScriptlets.push({ - name: 'set-session-storage-item.js', - fn: setSessionStorageItem, - world: 'ISOLATED', - dependencies: [ - 'set-local-storage-item.fn', - ], -}); -function setSessionStorageItem(key = '', value = '') { - setLocalStorageItemFn('session', false, key, value); -} - /******************************************************************************* * * @scriptlet prevent-canvas @@ -3693,57 +3491,6 @@ function multiup() { document.addEventListener('click', handler, { capture: true }); } -/******************************************************************************/ - -builtinScriptlets.push({ - name: 'remove-cache-storage-item.js', - fn: removeCacheStorageItem, - world: 'ISOLATED', - dependencies: [ - 'safe-self.fn', - ], -}); -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}`); - }); - } - }); - }); - } - }); -} /******************************************************************************* @@ -3831,43 +3578,6 @@ function trustedSetConstant( setConstantFn(true, ...args); } -/******************************************************************************* - * - * trusted-set-local-storage-item.js - * - * Set a local storage entry to an arbitrary value. - * - * Reference: - * https://github.com/AdguardTeam/Scriptlets/blob/master/src/scriptlets/trusted-set-local-storage-item.js - * - **/ - -builtinScriptlets.push({ - name: 'trusted-set-local-storage-item.js', - requiresTrust: true, - fn: trustedSetLocalStorageItem, - world: 'ISOLATED', - dependencies: [ - 'set-local-storage-item.fn', - ], -}); -function trustedSetLocalStorageItem(key = '', value = '') { - setLocalStorageItemFn('local', true, key, value); -} - -builtinScriptlets.push({ - name: 'trusted-set-session-storage-item.js', - requiresTrust: true, - fn: trustedSetSessionStorageItem, - world: 'ISOLATED', - dependencies: [ - 'set-local-storage-item.fn', - ], -}); -function trustedSetSessionStorageItem(key = '', value = '') { - setLocalStorageItemFn('session', true, key, value); -} - /******************************************************************************* * * trusted-replace-fetch-response.js diff --git a/src/js/redirect-engine.js b/src/js/redirect-engine.js index 1edb37624c582..f16b73ca0765f 100644 --- a/src/js/redirect-engine.js +++ b/src/js/redirect-engine.js @@ -333,6 +333,8 @@ class RedirectEngine { } } this.modifyTime = Date.now(); + }).catch(reason => { + console.error(reason); }), ]; From 93e2d7f1436ed537d160433d3a4ad5cea80933f7 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 8 Nov 2024 11:25:56 -0500 Subject: [PATCH 433/553] Update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 033673f3cdaca..065ac0936ea71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +- [Keep moving related scriptlets into separate files](https://github.com/gorhill/uBlock/commit/e5a088738d) +- [Improve `prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/ce4908b341) +- [Improve `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/41616df866) - [Improve `set-cookie` scriptlet](https://github.com/gorhill/uBlock/commit/e613282698) ---------- From dc81a39a996e9f9b1b78f3a3e444d136a8068832 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 8 Nov 2024 11:26:13 -0500 Subject: [PATCH 434/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 4e9a7a74d7d84..1c77daac69716 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.1.0 \ No newline at end of file +1.61.1.1 \ No newline at end of file From 689ffbe7d3b791e0e8100379f3b3d028b3d1491d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 8 Nov 2024 12:07:30 -0500 Subject: [PATCH 435/553] Address workflow warnings --- .github/workflows/main.yml | 57 +++++++++----------------------------- 1 file changed, 13 insertions(+), 44 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5ce7af1212a4f..f70f3fbe57096 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,6 +25,12 @@ jobs: - name: Clone uAssets run: | tools/pull-assets.sh + - name: Build MV2 packages + run: | + tools/make-chromium.sh ${{ steps.release_info.outputs.VERSION }} + tools/make-firefox.sh ${{ steps.release_info.outputs.VERSION }} + tools/make-thunderbird.sh ${{ steps.release_info.outputs.VERSION }} + tools/make-npm.sh ${{ steps.release_info.outputs.VERSION }} # https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html - name: Get release information id: release_info @@ -37,54 +43,17 @@ jobs: sed -e 's/%version%/${{ steps.release_info.outputs.VERSION }}/g' RELEASE.HEAD.md >> release.body.txt - name: Create GitHub release id: create_release - uses: actions/create-release@v1 + uses: softprops/action-gh-release@v2 env: GITHUB_TOKEN: ${{ github.token }} with: tag_name: ${{ steps.release_info.outputs.VERSION }} - release_name: ${{ steps.release_info.outputs.VERSION }} + name: ${{ steps.release_info.outputs.VERSION }} draft: true prerelease: true body_path: release.body.txt - - name: Build MV2 packages - run: | - tools/make-chromium.sh ${{ steps.release_info.outputs.VERSION }} - tools/make-firefox.sh ${{ steps.release_info.outputs.VERSION }} - tools/make-thunderbird.sh ${{ steps.release_info.outputs.VERSION }} - tools/make-npm.sh ${{ steps.release_info.outputs.VERSION }} - - name: Upload Chromium package - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.chromium.zip - asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.chromium.zip - asset_content_type: application/octet-stream - - name: Upload Firefox package - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.firefox.xpi - asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.firefox.xpi - asset_content_type: application/octet-stream - - name: Upload Thunderbird package - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.thunderbird.xpi - asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.thunderbird.xpi - asset_content_type: application/octet-stream - - name: Upload NodeJS package - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.npm.tgz - asset_name: uBlock0_${{ steps.release_info.outputs.VERSION }}.npm.tgz - asset_content_type: application/octet-stream + files: | + dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.chromium.zip + dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.firefox.xpi + dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.thunderbird.xpi + dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.npm.tgz From 74d8be96d25143959a6d8bbcd55b4ac04de63bfd Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 8 Nov 2024 12:17:27 -0500 Subject: [PATCH 436/553] Fix more workflow warnings; fix steps order --- .github/workflows/main.yml | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f70f3fbe57096..1d34c0242d012 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -7,9 +7,6 @@ on: permissions: contents: read -# I used the following project as template to get started: -# https://github.com/dessant/search-by-image/blob/master/.github/workflows/ci.yml - jobs: build: permissions: @@ -25,35 +22,33 @@ jobs: - name: Clone uAssets run: | tools/pull-assets.sh - - name: Build MV2 packages - run: | - tools/make-chromium.sh ${{ steps.release_info.outputs.VERSION }} - tools/make-firefox.sh ${{ steps.release_info.outputs.VERSION }} - tools/make-thunderbird.sh ${{ steps.release_info.outputs.VERSION }} - tools/make-npm.sh ${{ steps.release_info.outputs.VERSION }} - # https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html - name: Get release information - id: release_info run: | - echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} + echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV + - name: Build MV2 packages + run: | + tools/make-chromium.sh ${{ env.VERSION }} + tools/make-firefox.sh ${{ env.VERSION }} + tools/make-thunderbird.sh ${{ env.VERSION }} + tools/make-npm.sh ${{ env.VERSION }} - name: Assemble release notes run: | > release.body.txt grep -m1 -B10000 -- "----------" CHANGELOG.md >> release.body.txt - sed -e 's/%version%/${{ steps.release_info.outputs.VERSION }}/g' RELEASE.HEAD.md >> release.body.txt + sed -e 's/%version%/${{ env.VERSION }}/g' 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: ${{ steps.release_info.outputs.VERSION }} - name: ${{ steps.release_info.outputs.VERSION }} + tag_name: ${{ env.VERSION }} + name: ${{ env.VERSION }} draft: true prerelease: true body_path: release.body.txt files: | - dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.chromium.zip - dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.firefox.xpi - dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.thunderbird.xpi - dist/build/uBlock0_${{ steps.release_info.outputs.VERSION }}.npm.tgz + dist/build/uBlock0_${{ env.VERSION }}.chromium.zip + dist/build/uBlock0_${{ env.VERSION }}.firefox.xpi + dist/build/uBlock0_${{ env.VERSION }}.thunderbird.xpi + dist/build/uBlock0_${{ env.VERSION }}.npm.tgz From 74921a0f270537e1bb86c529d85f34cf240b104d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 8 Nov 2024 12:26:24 -0500 Subject: [PATCH 437/553] 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 62d26e1c496c5..1d32fd31a1b9e 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.1.0", + "version": "1.61.1.1", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.1b0/uBlock0_1.61.1b0.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.1b1/uBlock0_1.61.1b1.firefox.signed.xpi" } ] } From 15dae359f7e9e75c49a86bad8a05ec3f7add3c35 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 11 Nov 2024 13:20:54 -0500 Subject: [PATCH 438/553] [mv3] Add support to add/remove rulesets through policies Related discussion: https://github.com/uBlockOrigin/uBOL-home/discussions/35#discussioncomment-11157444 New policy setting: `rulesets` Type: array Type of array items: string Each item in the list is a list id (as seen in `rulesets/ruleset-details.json`), prefixed with either `+` to enable the ruleset, or `-` to disable the ruleset. Users will not be able to enable or disable rulesets present in the `rulesets` policy. Disabled rulesets will not appear in the dashboard. Use `-*` to remove all non-default rulesets, except for those added using `+[ruleset_id]`. Additionally, some work has been done to properly handle policy changes in a non-blocking and deferred manner, as I observed that it often takes long for calls to `storage.manage.get` to resolve. This potentailly takes care of the following issue: https://github.com/uBlockOrigin/uBOL-home/issues/174 --- Makefile | 11 +- platform/mv3/extension/css/settings.css | 8 ++ platform/mv3/extension/js/admin.js | 121 +++++++++++++++++++ platform/mv3/extension/js/background.js | 107 ++++++---------- platform/mv3/extension/js/config.js | 81 +++++++++++++ platform/mv3/extension/js/mode-manager.js | 53 ++++---- platform/mv3/extension/js/ruleset-manager.js | 37 ++++-- platform/mv3/extension/js/settings.js | 38 +++++- platform/mv3/extension/js/utils.js | 3 +- platform/mv3/extension/managed_storage.json | 6 + 10 files changed, 352 insertions(+), 113 deletions(-) create mode 100644 platform/mv3/extension/js/admin.js create mode 100644 platform/mv3/extension/js/config.js diff --git a/Makefile b/Makefile index 194a3af43af08..b308dc4be1e0b 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,8 @@ # https://stackoverflow.com/a/6273809 run_options := $(filter-out $@,$(MAKECMDGOALS)) -.PHONY: all clean cleanassets test lint chromium opera firefox npm dig mv3 mv3-quick \ +.PHONY: all clean cleanassets test lint chromium opera firefox npm dig \ + mv3 mv3-quick mv3-chromium mv3-firefox \ compare maxcost medcost mincost modifiers record wasm sources := $(wildcard assets/* assets/*/* dist/version src/* src/*/* src/*/*/* src/*/*/*/*) @@ -55,12 +56,16 @@ dig: dist/build/uBlock0.dig dig-snfe: dig cd dist/build/uBlock0.dig && npm run snfe $(run_options) -mv3-chromium: tools/make-mv3.sh $(sources) $(platform) +dist/build/uBOLite.chromium: tools/make-mv3.sh $(sources) $(platform) tools/make-mv3.sh chromium -mv3-firefox: tools/make-mv3.sh $(sources) $(platform) +mv3-chromium: dist/build/uBOLite.chromium + +dist/build/uBOLite.firefox: tools/make-mv3.sh $(sources) $(platform) tools/make-mv3.sh firefox +mv3-firefox: dist/build/uBOLite.firefox + mv3-quick: tools/make-mv3.sh $(sources) $(platform) tools/make-mv3.sh quick diff --git a/platform/mv3/extension/css/settings.css b/platform/mv3/extension/css/settings.css index b81e79a5256e2..3de13560cc4f1 100644 --- a/platform/mv3/extension/css/settings.css +++ b/platform/mv3/extension/css/settings.css @@ -114,11 +114,19 @@ h3[data-i18n="filteringMode0Name"]::first-letter { .groupEntry:not([data-groupkey="user"]) .listEntry:not(.isDefault).unused { display: none; } + +.listEntry.fromAdmin:has(input[disabled]:not(:checked)) { + display: none; + } .listEntry > * { margin-left: 0; margin-right: 0; unicode-bidi: embed; } +.listEntry .checkbox:has(input[disabled]), +.listEntry .checkbox:has(input[disabled]) ~ span { + filter: var(--checkbox-disabled-filter); + } .listEntry .listname { white-space: nowrap; } diff --git a/platform/mv3/extension/js/admin.js b/platform/mv3/extension/js/admin.js new file mode 100644 index 0000000000000..8a6b91fb77765 --- /dev/null +++ b/platform/mv3/extension/js/admin.js @@ -0,0 +1,121 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2022-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 { + adminRead, + localRead, localWrite, + sessionRead, sessionWrite, +} from './ext.js'; + +import { + enableRulesets, + getRulesetDetails, +} from './ruleset-manager.js'; + +import { + getTrustedSites, + readFilteringModeDetails, +} from './mode-manager.js'; + +import { broadcastMessage } from './utils.js'; +import { dnr } from './ext.js'; +import { registerInjectables } from './scripting-manager.js'; +import { rulesetConfig } from './config.js'; +import { ubolLog } from './debug.js'; + +/******************************************************************************/ + +const adminSettings = { + keys: new Set(), + timer: undefined, + change(key) { + this.keys.add(key); + if ( this.timer !== undefined ) { return; } + this.timer = self.setTimeout(( ) => { + this.timer = undefined; + this.process(); + }, 127); + }, + async process() { + if ( this.keys.has('rulesets') ) { + ubolLog('admin setting "rulesets" changed'); + await enableRulesets(rulesetConfig.enabledRulesets); + await registerInjectables(); + const results = await Promise.all([ + getAdminRulesets(), + dnr.getEnabledRulesets(), + ]); + const [ adminRulesets, enabledRulesets ] = results; + broadcastMessage({ adminRulesets, enabledRulesets }); + } + if ( this.keys.has('noFiltering') ) { + ubolLog('admin setting "noFiltering" changed'); + await readFilteringModeDetails(true); + const trustedSites = await getTrustedSites(); + broadcastMessage({ trustedSites: Array.from(trustedSites) }); + } + this.keys.clear(); + } +}; + +/******************************************************************************/ + +export async function getAdminRulesets() { + const adminList = await adminReadEx('rulesets'); + const adminRulesets = new Set(Array.isArray(adminList) && adminList || []); + if ( adminRulesets.has('-*') ) { + adminRulesets.delete('-*'); + const rulesetDetails = await getRulesetDetails(); + for ( const ruleset of rulesetDetails.values() ) { + if ( ruleset.enabled ) { continue; } + if ( adminRulesets.has(`+${ruleset.id}`) ) { continue; } + adminRulesets.add(`-${ruleset.id}`); + } + } + return Array.from(adminRulesets); +} + +/******************************************************************************/ + +export async function adminReadEx(key) { + let cacheValue; + const session = await sessionRead(`admin_${key}`); + if ( session ) { + cacheValue = session.data; + } else { + const local = await localRead(`admin_${key}`); + if ( local ) { + cacheValue = local.data; + } + } + adminRead(key).then(async value => { + const adminKey = `admin_${key}`; + await Promise.all([ + sessionWrite(adminKey, { data: value }), + localWrite(adminKey, { data: value }), + ]); + if ( JSON.stringify(value) === JSON.stringify(cacheValue) ) { return; } + adminSettings.change(key); + }); + return cacheValue; +} + +/******************************************************************************/ diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index 791625d2a1c92..ea8c9f608c1ce 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -19,105 +19,63 @@ Home: https://github.com/gorhill/uBlock */ +import { + MODE_BASIC, + MODE_OPTIMAL, + getDefaultFilteringMode, + getFilteringMode, + getTrustedSites, + setDefaultFilteringMode, + setFilteringMode, + setTrustedSites, + syncWithBrowserPermissions, +} from './mode-manager.js'; + import { adminRead, browser, dnr, localRead, localWrite, runtime, - sessionRead, sessionWrite, windows, } from './ext.js'; import { - defaultRulesetsFromLanguage, enableRulesets, getEnabledRulesetsDetails, getRulesetDetails, updateDynamicRules, } from './ruleset-manager.js'; -import { - MODE_BASIC, - MODE_OPTIMAL, - getDefaultFilteringMode, - getFilteringMode, - getTrustedSites, - setDefaultFilteringMode, - setFilteringMode, - setTrustedSites, - syncWithBrowserPermissions, -} from './mode-manager.js'; - import { getMatchedRules, isSideloaded, ubolLog, } from './debug.js'; +import { + loadRulesetConfig, + process, + rulesetConfig, + saveRulesetConfig, +} from './config.js'; + import { broadcastMessage } from './utils.js'; +import { getAdminRulesets } from './admin.js'; import { registerInjectables } from './scripting-manager.js'; /******************************************************************************/ -const rulesetConfig = { - version: '', - enabledRulesets: [ 'default' ], - autoReload: true, - showBlockedCount: true, -}; - const UBOL_ORIGIN = runtime.getURL('').replace(/\/$/, ''); const canShowBlockedCount = typeof dnr.setExtensionActionOptions === 'function'; -let firstRun = false; -let wakeupRun = false; - /******************************************************************************/ function getCurrentVersion() { return runtime.getManifest().version; } -async function loadRulesetConfig() { - let data = await sessionRead('rulesetConfig'); - if ( data ) { - rulesetConfig.version = data.version; - rulesetConfig.enabledRulesets = data.enabledRulesets; - rulesetConfig.autoReload = typeof data.autoReload === 'boolean' - ? data.autoReload - : true; - rulesetConfig.showBlockedCount = typeof data.showBlockedCount === 'boolean' - ? data.showBlockedCount - : true; - wakeupRun = true; - return; - } - data = await localRead('rulesetConfig'); - if ( data ) { - rulesetConfig.version = data.version; - rulesetConfig.enabledRulesets = data.enabledRulesets; - rulesetConfig.autoReload = typeof data.autoReload === 'boolean' - ? data.autoReload - : true; - rulesetConfig.showBlockedCount = typeof data.showBlockedCount === 'boolean' - ? data.showBlockedCount - : true; - sessionWrite('rulesetConfig', rulesetConfig); - return; - } - rulesetConfig.enabledRulesets = await defaultRulesetsFromLanguage(); - sessionWrite('rulesetConfig', rulesetConfig); - localWrite('rulesetConfig', rulesetConfig); - firstRun = true; -} - -async function saveRulesetConfig() { - sessionWrite('rulesetConfig', rulesetConfig); - return localWrite('rulesetConfig', rulesetConfig); -} - /******************************************************************************/ async function hasGreatPowers(origin) { @@ -216,7 +174,9 @@ function onMessage(request, sender, callback) { }).then(( ) => { registerInjectables(); callback(); - broadcastMessage({ enabledRulesets: rulesetConfig.enabledRulesets }); + return dnr.getEnabledRulesets(); + }).then(enabledRulesets => { + broadcastMessage({ enabledRulesets }); }); return true; } @@ -227,25 +187,28 @@ function onMessage(request, sender, callback) { getTrustedSites(), getRulesetDetails(), dnr.getEnabledRulesets(), + getAdminRulesets(), ]).then(results => { const [ defaultFilteringMode, trustedSites, rulesetDetails, enabledRulesets, + adminRulesets, ] = results; callback({ defaultFilteringMode, trustedSites: Array.from(trustedSites), enabledRulesets, + adminRulesets, maxNumberOfEnabledRulesets: dnr.MAX_NUMBER_OF_ENABLED_STATIC_RULESETS, rulesetDetails: Array.from(rulesetDetails.values()), autoReload: rulesetConfig.autoReload, showBlockedCount: rulesetConfig.showBlockedCount, canShowBlockedCount, - firstRun, + firstRun: process.firstRun, }); - firstRun = false; + process.firstRun = false; }); return true; } @@ -367,6 +330,8 @@ function onMessage(request, sender, callback) { default: break; } + + return false; } /******************************************************************************/ @@ -374,12 +339,12 @@ function onMessage(request, sender, callback) { async function start() { await loadRulesetConfig(); - if ( wakeupRun === false ) { + if ( process.wakeupRun === false ) { await enableRulesets(rulesetConfig.enabledRulesets); } // We need to update the regex rules only when ruleset version changes. - if ( wakeupRun === false ) { + if ( process.wakeupRun === false ) { const currentVersion = getCurrentVersion(); if ( currentVersion !== rulesetConfig.version ) { ubolLog(`Version change: ${rulesetConfig.version} => ${currentVersion}`); @@ -396,7 +361,7 @@ async function start() { // Unsure whether the browser remembers correctly registered css/scripts // after we quit the browser. For now uBOL will check unconditionally at // launch time whether content css/scripts are properly registered. - if ( wakeupRun === false || permissionsChanged ) { + if ( process.wakeupRun === false || permissionsChanged ) { registerInjectables(); const enabledRulesets = await dnr.getEnabledRulesets(); @@ -409,7 +374,7 @@ async function start() { // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/declarativeNetRequest // Firefox API does not support `dnr.setExtensionActionOptions` - if ( wakeupRun === false && canShowBlockedCount ) { + if ( process.wakeupRun === false && canShowBlockedCount ) { dnr.setExtensionActionOptions({ displayActionCountAsBadgeText: rulesetConfig.showBlockedCount, }); @@ -421,7 +386,7 @@ async function start() { ( ) => { onPermissionsRemoved(); } ); - if ( firstRun ) { + if ( process.firstRun ) { const enableOptimal = await hasOmnipotence(); if ( enableOptimal ) { const afterLevel = await setDefaultFilteringMode(MODE_OPTIMAL); @@ -434,7 +399,7 @@ async function start() { if ( disableFirstRunPage !== true ) { runtime.openOptionsPage(); } else { - firstRun = false; + process.firstRun = false; } } } diff --git a/platform/mv3/extension/js/config.js b/platform/mv3/extension/js/config.js new file mode 100644 index 0000000000000..bb74a4416c551 --- /dev/null +++ b/platform/mv3/extension/js/config.js @@ -0,0 +1,81 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2022-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 { + localRead, localWrite, + sessionRead, sessionWrite, +} from './ext.js'; + +import { defaultRulesetsFromLanguage } from './ruleset-manager.js'; + +/******************************************************************************/ + +export const rulesetConfig = { + version: '', + enabledRulesets: [ 'default' ], + autoReload: true, + showBlockedCount: true, +}; + +export const process = { + firstRun: false, + wakeupRun: false, +}; + +/******************************************************************************/ + +export async function loadRulesetConfig() { + const sessionData = await sessionRead('rulesetConfig'); + if ( sessionData ) { + rulesetConfig.version = sessionData.version; + rulesetConfig.enabledRulesets = sessionData.enabledRulesets; + rulesetConfig.autoReload = typeof sessionData.autoReload === 'boolean' + ? sessionData.autoReload + : true; + rulesetConfig.showBlockedCount = typeof sessionData.showBlockedCount === 'boolean' + ? sessionData.showBlockedCount + : true; + process.wakeupRun = true; + return; + } + const localData = await localRead('rulesetConfig'); + if ( localData ) { + rulesetConfig.version = localData.version; + rulesetConfig.enabledRulesets = localData.enabledRulesets; + rulesetConfig.autoReload = typeof localData.autoReload === 'boolean' + ? localData.autoReload + : true; + rulesetConfig.showBlockedCount = typeof localData.showBlockedCount === 'boolean' + ? localData.showBlockedCount + : true; + sessionWrite('rulesetConfig', rulesetConfig); + return; + } + rulesetConfig.enabledRulesets = await defaultRulesetsFromLanguage(); + sessionWrite('rulesetConfig', rulesetConfig); + localWrite('rulesetConfig', rulesetConfig); + process.firstRun = true; +} + +export async function saveRulesetConfig() { + sessionWrite('rulesetConfig', rulesetConfig); + return localWrite('rulesetConfig', rulesetConfig); +} diff --git a/platform/mv3/extension/js/mode-manager.js b/platform/mv3/extension/js/mode-manager.js index c3b9a01bb877b..335c8da166d73 100644 --- a/platform/mv3/extension/js/mode-manager.js +++ b/platform/mv3/extension/js/mode-manager.js @@ -24,14 +24,6 @@ import { getDynamicRules, } from './ruleset-manager.js'; -import { - adminRead, - browser, - dnr, - localRead, localRemove, localWrite, - sessionRead, sessionWrite, -} from './ext.js'; - import { broadcastMessage, hostnamesFromMatches, @@ -39,6 +31,15 @@ import { toBroaderHostname, } from './utils.js'; +import { + browser, + dnr, + localRead, localWrite, + sessionRead, sessionWrite, +} from './ext.js'; + +import { adminReadEx } from './admin.js'; + /******************************************************************************/ // 0: no filtering @@ -224,38 +225,40 @@ function applyFilteringMode(filteringModes, hostname, afterLevel) { /******************************************************************************/ -async function readFilteringModeDetails() { - if ( readFilteringModeDetails.cache ) { - return readFilteringModeDetails.cache; - } - const sessionModes = await sessionRead('filteringModeDetails'); - if ( sessionModes instanceof Object ) { - readFilteringModeDetails.cache = unserializeModeDetails(sessionModes); - return readFilteringModeDetails.cache; +export async function readFilteringModeDetails(bypassCache = false) { + if ( bypassCache === false ) { + if ( readFilteringModeDetails.cache ) { + return readFilteringModeDetails.cache; + } + const sessionModes = await sessionRead('filteringModeDetails'); + if ( sessionModes instanceof Object ) { + readFilteringModeDetails.cache = unserializeModeDetails(sessionModes); + return readFilteringModeDetails.cache; + } } let [ userModes, adminNoFiltering ] = await Promise.all([ localRead('filteringModeDetails'), - localRead('adminNoFiltering'), + adminReadEx('noFiltering'), ]); if ( userModes === undefined ) { userModes = { basic: [ 'all-urls' ] }; } userModes = unserializeModeDetails(userModes); if ( Array.isArray(adminNoFiltering) ) { + if ( adminNoFiltering.includes('-*') ) { + userModes.none.clear(); + } for ( const hn of adminNoFiltering ) { - applyFilteringMode(userModes, hn, 0); + if ( hn.charAt(0) === '-' ) { + userModes.none.delete(hn.slice(1)); + } else { + applyFilteringMode(userModes, hn, 0); + } } } filteringModesToDNR(userModes); sessionWrite('filteringModeDetails', serializeModeDetails(userModes)); readFilteringModeDetails.cache = userModes; - adminRead('noFiltering').then(results => { - if ( results ) { - localWrite('adminNoFiltering', results); - } else { - localRemove('adminNoFiltering'); - } - }); return userModes; } diff --git a/platform/mv3/extension/js/ruleset-manager.js b/platform/mv3/extension/js/ruleset-manager.js index 7f7c6e1eefd2b..d19a9f28e9d65 100644 --- a/platform/mv3/extension/js/ruleset-manager.js +++ b/platform/mv3/extension/js/ruleset-manager.js @@ -19,8 +19,14 @@ Home: https://github.com/gorhill/uBlock */ -import { browser, dnr, i18n } from './ext.js'; +import { + browser, + dnr, + i18n, +} from './ext.js'; + import { fetchJSON } from './fetch.js'; +import { getAdminRulesets } from './admin.js'; import { ubolLog } from './debug.js'; /******************************************************************************/ @@ -460,7 +466,22 @@ async function defaultRulesetsFromLanguage() { async function enableRulesets(ids) { const afterIds = new Set(ids); - const beforeIds = new Set(await dnr.getEnabledRulesets()); + const [ beforeIds, adminIds, rulesetDetails ] = await Promise.all([ + dnr.getEnabledRulesets().then(ids => new Set(ids)), + getAdminRulesets(), + getRulesetDetails(), + ]); + + for ( const token of adminIds ) { + const c0 = token.charAt(0); + const id = token.slice(1); + if ( c0 === '+' ) { + afterIds.add(id); + } else if ( c0 === '-' ) { + afterIds.delete(id); + } + } + const enableRulesetSet = new Set(); const disableRulesetSet = new Set(); for ( const id of afterIds ) { @@ -472,13 +493,8 @@ async function enableRulesets(ids) { disableRulesetSet.add(id); } - if ( enableRulesetSet.size === 0 && disableRulesetSet.size === 0 ) { - return; - } - // Be sure the rulesets to enable/disable do exist in the current version, // otherwise the API throws. - const rulesetDetails = await getRulesetDetails(); for ( const id of enableRulesetSet ) { if ( rulesetDetails.has(id) ) { continue; } enableRulesetSet.delete(id); @@ -487,6 +503,11 @@ async function enableRulesets(ids) { if ( rulesetDetails.has(id) ) { continue; } disableRulesetSet.delete(id); } + + if ( enableRulesetSet.size === 0 && disableRulesetSet.size === 0 ) { + return; + } + const enableRulesetIds = Array.from(enableRulesetSet); const disableRulesetIds = Array.from(disableRulesetSet); @@ -497,7 +518,7 @@ async function enableRulesets(ids) { ubolLog(`Disable ruleset: ${disableRulesetIds}`); } await dnr.updateEnabledRulesets({ enableRulesetIds, disableRulesetIds }); - + return updateDynamicRules(); } diff --git a/platform/mv3/extension/js/settings.js b/platform/mv3/extension/js/settings.js index c916c46577f96..a970430f33118 100644 --- a/platform/mv3/extension/js/settings.js +++ b/platform/mv3/extension/js/settings.js @@ -40,6 +40,18 @@ function hashFromIterable(iter) { return Array.from(iter).sort().join('\n'); } +function isAdminRuleset(listkey) { + const { adminRulesets = [] } = cachedRulesetData; + for ( const id of adminRulesets ) { + const pos = id.indexOf(listkey); + if ( pos === 0 ) { return true; } + if ( pos !== 1 ) { continue; } + const c = id.charAt(0); + if ( c === '+' || c === '-' ) { return true; } + } + return false; +} + /******************************************************************************/ function rulesetStats(rulesetId) { @@ -94,10 +106,13 @@ function renderFilterLists() { li.title = listStatsTemplate .replace('{{ruleCount}}', renderNumber(stats.ruleCount)) .replace('{{filterCount}}', renderNumber(stats.filterCount)); + const fromAdmin = isAdminRuleset(ruleset.id); + dom.cl.toggle(li, 'fromAdmin', fromAdmin); + const disabled = stats.ruleCount === 0 || fromAdmin; dom.attr( - qs$(li, '.input.checkbox'), + qs$(li, '.input.checkbox input'), 'disabled', - stats.ruleCount === 0 ? '' : null + disabled ? '' : null ); dom.cl.remove(li, 'discard'); return li; @@ -358,7 +373,9 @@ async function applyEnabledRulesets() { const checked = qs$(liEntry, 'input[type="checkbox"]:checked') !== null; dom.cl.toggle(liEntry, 'checked', checked); if ( checked === false ) { continue; } - enabledRulesets.push(liEntry.dataset.listkey); + const { listkey } = liEntry.dataset; + if ( isAdminRuleset(listkey) ) { continue; } + enabledRulesets.push(listkey); } await sendMessage({ @@ -433,9 +450,12 @@ localRead('hideUnusedFilterLists').then(value => { /******************************************************************************/ -const bc = new self.BroadcastChannel('uBOL'); +function listen() { + const bc = new self.BroadcastChannel('uBOL'); + bc.onmessage = listen.onmessage; +} -bc.onmessage = ev => { +listen.onmessage = ev => { const message = ev.data; if ( message instanceof Object === false ) { return; } const local = cachedRulesetData; @@ -477,6 +497,13 @@ bc.onmessage = ev => { } } + if ( message.adminRulesets !== undefined ) { + if ( hashFromIterable(message.adminRulesets) !== hashFromIterable(local.adminRulesets) ) { + local.adminRulesets = message.adminRulesets; + render = true; + } + } + if ( message.enabledRulesets !== undefined ) { if ( hashFromIterable(message.enabledRulesets) !== hashFromIterable(local.enabledRulesets) ) { local.enabledRulesets = message.enabledRulesets; @@ -503,6 +530,7 @@ sendMessage({ renderWidgets(); } catch(ex) { } + listen(); }).catch(reason => { console.trace(reason); }); diff --git a/platform/mv3/extension/js/utils.js b/platform/mv3/extension/js/utils.js index cdfc98b25d12d..b32104f946062 100644 --- a/platform/mv3/extension/js/utils.js +++ b/platform/mv3/extension/js/utils.js @@ -115,7 +115,7 @@ const hostnamesFromMatches = origins => { /******************************************************************************/ -export const broadcastMessage = message => { +const broadcastMessage = message => { const bc = new self.BroadcastChannel('uBOL'); bc.postMessage(message); }; @@ -123,6 +123,7 @@ export const broadcastMessage = message => { /******************************************************************************/ export { + broadcastMessage, parsedURLromOrigin, toBroaderHostname, isDescendantHostname, diff --git a/platform/mv3/extension/managed_storage.json b/platform/mv3/extension/managed_storage.json index 8571f59dbaef4..5d645fb03ea92 100644 --- a/platform/mv3/extension/managed_storage.json +++ b/platform/mv3/extension/managed_storage.json @@ -10,6 +10,12 @@ "disableFirstRunPage": { "title": "Disable first run page", "type": "boolean" + }, + "rulesets": { + "title": "Rulesets to add/remove", + "description": "Prefix a ruleset id with '+' to add, or '-' to remove. Use '-*' to disable all non-default lists.", + "type": "array", + "items": { "type": "string" } } } } From 335d947c100e2543b84ab2f1385e8b2ee5458b9a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 11 Nov 2024 15:08:10 -0500 Subject: [PATCH 439/553] Fix potential infinite async loop Related issue: https://bugzilla.mozilla.org/show_bug.cgi?id=1929326 As identified by @Rob--W: https://bugzilla.mozilla.org/show_bug.cgi?id=1929326#c9 Truncated or otherwise corrupted asset content in extension storage could lead to infinite async loop causing high CPU usage in uBO and its workers. Likely related to the issue of the asset content returned as `undefined`: https://github.com/gorhill/uBlock/blob/652f1787878ba434c3a65287afcd84082c409397/src/js/cachestorage.js#L98 --- src/js/assets.js | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/js/assets.js b/src/js/assets.js index e1bc4e616a3ea..4f02700f8c46e 100644 --- a/src/js/assets.js +++ b/src/js/assets.js @@ -19,18 +19,15 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - -/******************************************************************************/ +import * as sfp from './static-filtering-parser.js'; -import µb from './background.js'; import { broadcast } from './broadcast.js'; import cacheStorage from './cachestorage.js'; -import { ubolog } from './console.js'; import { i18n$ } from './i18n.js'; import logger from './logger.js'; -import * as sfp from './static-filtering-parser.js'; -import { orphanizeString, } from './text-utils.js'; +import { orphanizeString } from './text-utils.js'; +import { ubolog } from './console.js'; +import µb from './background.js'; /******************************************************************************/ @@ -50,6 +47,9 @@ let remoteServerFriendly = false; /******************************************************************************/ +const hasOwnProperty = (o, p) => + Object.prototype.hasOwnProperty.call(o, p); + const stringIsNotEmpty = s => typeof s === 'string' && s !== ''; const parseExpires = s => { @@ -107,8 +107,8 @@ const resourceTimeFromXhr = xhr => { const resourceTimeFromParts = (parts, time) => { const goodParts = parts.filter(part => typeof part === 'object'); - return goodParts.reduce((acc, part) => - ((part.resourceTime || 0) > acc ? part.resourceTime : acc), + return goodParts.reduce( + (acc, part) => ((part.resourceTime || 0) > acc ? part.resourceTime : acc), time ); }; @@ -246,6 +246,7 @@ const fireNotification = function(topic, details) { assets.fetch = function(url, options = {}) { return new Promise((resolve, reject) => { // Start of executor + /* eslint-disable indent */ const timeoutAfter = µb.hiddenSettings.assetFetchTimeout || 30; const xhr = new XMLHttpRequest(); @@ -322,6 +323,7 @@ assets.fetch = function(url, options = {}) { onErrorEvent.call(xhr); } + /* eslint-enable indent */ // End of executor }); }; @@ -733,7 +735,7 @@ async function assetCacheRead(assetKey, updateReadTime = false) { } if ( bin instanceof Object === false ) { return reportBack(''); } - if ( bin.hasOwnProperty(internalKey) === false ) { return reportBack(''); } + if ( hasOwnProperty(bin, internalKey) === false ) { return reportBack(''); } const entry = assetCacheRegistry[assetKey]; if ( entry === undefined ) { return reportBack(''); } @@ -1277,7 +1279,9 @@ async function diffUpdater() { if ( data.status === 'needtext' ) { ubolog('Diff updater: need text for', data.assetKey); assetCacheRead(data.assetKey).then(result => { - data.text = result.content; + // https://bugzilla.mozilla.org/show_bug.cgi?id=1929326#c9 + // Must never be set to undefined! + data.text = result.content || ''; data.status = undefined; checkAndCorrectDiffPath(data); bc.postMessage(data); From 52d21b8df9e22d05938095701e74b7ff1b66c67f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 11 Nov 2024 15:21:16 -0500 Subject: [PATCH 440/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 065ac0936ea71..cb2966fe2e030 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Fix potential infinite async loop](https://github.com/gorhill/uBlock/commit/335d947c10) (issue found by @Rob--W) - [Keep moving related scriptlets into separate files](https://github.com/gorhill/uBlock/commit/e5a088738d) - [Improve `prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/ce4908b341) - [Improve `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/41616df866) From 7ccb4c6314f8161a05f3ff997ad75a8cd2220bfb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 11 Nov 2024 15:21:41 -0500 Subject: [PATCH 441/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 1c77daac69716..c7aa7422abb56 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.1.1 \ No newline at end of file +1.61.1.2 \ No newline at end of file From d325dcd19268ff430516258bb133bbdfe155a7c7 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 11 Nov 2024 15:45:32 -0500 Subject: [PATCH 442/553] 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 1d32fd31a1b9e..4206cc148d91d 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.1.1", + "version": "1.61.1.2", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.1b1/uBlock0_1.61.1b1.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.1b2/uBlock0_1.61.1b2.firefox.signed.xpi" } ] } From 2e745f9bfb2cf7e5e241160b2a20edf5edfcad92 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 13 Nov 2024 09:10:51 -0500 Subject: [PATCH 443/553] [mv3] Remove obsolete Firefox-only workaround in scriptlet template Related bugzilla issue: https://bugzilla.mozilla.org/show_bug.cgi?id=1736575 The issue was fixed months ago. The removed code block is causing uBOL to be flagged as "including remotely hosted code". To be clear, the removed obsolete code block was not related to executing remote code. The referenced code was in the file itself, not remote, and this was a workaround for when Firefox was not supporting injecting script in the `MAIN` world. The issue was fixed months ago in Firefox, so there is no point for the workaround. --- platform/mv3/scriptlets/scriptlet.template.js | 40 +------------------ 1 file changed, 1 insertion(+), 39 deletions(-) diff --git a/platform/mv3/scriptlets/scriptlet.template.js b/platform/mv3/scriptlets/scriptlet.template.js index 9ce165d094d8e..19560c8aedbef 100644 --- a/platform/mv3/scriptlets/scriptlet.template.js +++ b/platform/mv3/scriptlets/scriptlet.template.js @@ -21,7 +21,6 @@ */ /* eslint-disable indent */ -/* global cloneInto */ // ruleset: $rulesetId$ @@ -136,44 +135,7 @@ argsList.length = 0; /******************************************************************************/ -// Inject code - -// https://bugzilla.mozilla.org/show_bug.cgi?id=1736575 -// 'MAIN' world not yet supported in Firefox, so we inject the code into -// 'MAIN' ourself when environment in Firefox. - -const targetWorld = '$world$'; - -// Not Firefox -if ( typeof wrappedJSObject !== 'object' || targetWorld === 'ISOLATED' ) { - return uBOL_$scriptletName$(); -} - -// Firefox -{ - const page = self.wrappedJSObject; - let script, url; - try { - page.uBOL_$scriptletName$ = cloneInto([ - [ '(', uBOL_$scriptletName$.toString(), ')();' ], - { type: 'text/javascript; charset=utf-8' }, - ], self); - const blob = new page.Blob(...page.uBOL_$scriptletName$); - url = page.URL.createObjectURL(blob); - const doc = page.document; - script = doc.createElement('script'); - script.async = false; - script.src = url; - (doc.head || doc.documentElement || doc).append(script); - } catch (ex) { - console.error(ex); - } - if ( url ) { - if ( script ) { script.remove(); } - page.URL.revokeObjectURL(url); - } - delete page.uBOL_$scriptletName$; -} +uBOL_$scriptletName$(); /******************************************************************************/ From ff5fc61753e979323556b35efb0d5d90546faf55 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 14 Nov 2024 10:24:50 -0500 Subject: [PATCH 444/553] Add support for EasyList `{ remove: true }` cosmetic filter syntax Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3451 --- src/js/static-filtering-parser.js | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index 1cc4b5a8db9dd..f49b0bfe7208d 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -3345,10 +3345,13 @@ class ExtSelectorCompiler { // We have an Adguard/ABP cosmetic filter if and only if the // character is `$`, `%` or `?`, otherwise it's not a cosmetic // filter. - // Adguard's style injection: translate to uBO's format. - if ( compileOptions.adgStyleSyntax === true ) { - raw = this.translateAdguardCSSInjectionFilter(raw); - if ( raw === '' ) { return false; } + // Adguard/EasyList style injection: translate to uBO's format. + if ( this.isStyleInjectionFilter(raw) ) { + const translated = this.translateStyleInjectionFilter(raw); + if ( translated === undefined ) { return false; } + raw = translated; + } else if ( compileOptions.adgStyleSyntax === true ) { + return false; } // Normalize AdGuard's attribute-based procedural operators. @@ -3884,9 +3887,14 @@ class ExtSelectorCompiler { return true; } - translateAdguardCSSInjectionFilter(suffix) { - const matches = /^(.*)\s*\{([^}]+)\}\s*$/.exec(suffix); - if ( matches === null ) { return ''; } + isStyleInjectionFilter(selector) { + const len = selector.length; + return len !== 0 && selector.charCodeAt(len-1) === 0x7D /* } */; + } + + translateStyleInjectionFilter(raw) { + const matches = /^(.+)\s*\{([^}]+)\}$/.exec(raw); + if ( matches === null ) { return; } const selector = matches[1].trim(); const style = matches[2].trim(); // Special style directive `remove: true` is converted into a From 4c299bfca91c85bce73b7a17672050594d0b3d29 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 14 Nov 2024 10:32:15 -0500 Subject: [PATCH 445/553] Better handle unexpected conditions when deserializing For example, when deserialzing from corrupted storage. --- src/js/s14e-serializer.js | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/js/s14e-serializer.js b/src/js/s14e-serializer.js index 98f0d9cc20982..8b1850f136fe9 100644 --- a/src/js/s14e-serializer.js +++ b/src/js/s14e-serializer.js @@ -1097,32 +1097,36 @@ export const serialize = (data, options = {}) => { return ratio <= 0.85 ? t : s; }; -export const deserialize = s => { - if ( s.startsWith(MAGICLZ4PREFIX) ) { - refCounter = 1; - readStr = s; - readEnd = s.length; - readPtr = MAGICLZ4PREFIX.length; - const lz4 = _deserialize(); - readRefs.clear(); - readStr = ''; - const lz4Util = new LZ4BlockJS(); - const uint8ArrayAfter = lz4Util.decode(lz4.data, 0, lz4.size); - s = textCodec.decode(new Uint8Array(uint8ArrayAfter)); - } - if ( s.startsWith(MAGICPREFIX) === false ) { return; } +const deserializeById = (blockid, s) => { refCounter = 1; readStr = s; readEnd = s.length; - readPtr = MAGICPREFIX.length; + readPtr = blockid.length; const data = _deserialize(); readRefs.clear(); readStr = ''; - uint8Input = null; if ( readPtr === FAILMARK ) { return; } return data; }; +export const deserialize = s => { + if ( s.startsWith(MAGICLZ4PREFIX) ) { + const lz4 = deserializeById(MAGICLZ4PREFIX, s); + if ( lz4 ) { + const lz4Util = new LZ4BlockJS(); + const uint8ArrayAfter = lz4Util.decode(lz4.data, 0, lz4.size); + if ( uint8ArrayAfter ) { + s = textCodec.decode(new Uint8Array(uint8ArrayAfter)); + } + } + } + const data = s.startsWith(MAGICPREFIX) + ? deserializeById(MAGICPREFIX, s) + : undefined; + uint8Input = null; + return data; +}; + export const isSerialized = s => typeof s === 'string' && (s.startsWith(MAGICLZ4PREFIX) || s.startsWith(MAGICPREFIX)); From b709a56ce66cfd502f9120ed3843fe5190058280 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 14 Nov 2024 10:35:01 -0500 Subject: [PATCH 446/553] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb2966fe2e030..9bd7090450386 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- [Better handle unexpected conditions when deserializing](https://github.com/gorhill/uBlock/commit/4c299bfca9) +- [Add support for EasyList `{ remove: true }` cosmetic filter syntax](https://github.com/gorhill/uBlock/commit/ff5fc61753) - [Fix potential infinite async loop](https://github.com/gorhill/uBlock/commit/335d947c10) (issue found by @Rob--W) - [Keep moving related scriptlets into separate files](https://github.com/gorhill/uBlock/commit/e5a088738d) - [Improve `prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/ce4908b341) From 3066386d0e3bc15299fa114db8364ec83405de5f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 14 Nov 2024 10:35:21 -0500 Subject: [PATCH 447/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index c7aa7422abb56..c530652b600c5 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.1.2 \ No newline at end of file +1.61.1.3 \ No newline at end of file From 2e66d7bd557e7638c9e5ade165ba8086d6cf2ffb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 14 Nov 2024 10:40:55 -0500 Subject: [PATCH 448/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/si/messages.json | 86 ++++---- .../extension/_locales/zh_TW/messages.json | 20 +- src/_locales/ar/messages.json | 2 +- src/_locales/br_FR/messages.json | 2 +- src/_locales/si/messages.json | 200 +++++++++--------- src/_locales/vi/messages.json | 28 +-- 6 files changed, 169 insertions(+), 169 deletions(-) diff --git a/platform/mv3/extension/_locales/si/messages.json b/platform/mv3/extension/_locales/si/messages.json index 2fa20d00c50e6..559224a0ca335 100644 --- a/platform/mv3/extension/_locales/si/messages.json +++ b/platform/mv3/extension/_locales/si/messages.json @@ -4,15 +4,15 @@ "description": "extension name." }, "extShortDesc": { - "message": "A permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "අවසර අනවශ්‍ය අන්තර්ගත අවහිරකය. ස්ථාපනය කළ වහාම දැන්වීම්, ලුහුබැඳීම්, කැණීම් සහ තවත් දෑ අවහිර කරයි.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { - "message": "{{ruleCount}} rules, converted from {{filterCount}} network filters", + "message": "නීති {{ruleCount}} ක් ජාල පෙරහන් {{filterCount}} කින් හරවා ඇත", "description": "Appears aside each filter list in the _3rd-party filters_ pane" }, "dashboardName": { - "message": "uBO Lite — Dashboard", + "message": "uBO Lite - උපකරණ පුවරුව", "description": "English: uBO Lite — Dashboard" }, "settingsPageName": { @@ -20,91 +20,91 @@ "description": "appears as tab name in dashboard" }, "aboutPageName": { - "message": "පිළිබඳව", + "message": "පිළිබඳ", "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "රහස්‍යතා ප්‍රතිපත්තිය", "description": "Link to privacy policy on GitHub (English)" }, "popupFilteringModeLabel": { - "message": "filtering mode", + "message": "පෙරීමේ ප්‍රකාරය", "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "මෙම අඩවියේ ගැටලුවක් වාර්තා කරන්න", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { - "message": "Open the dashboard", + "message": "උපකරණ පුවරුව අරින්න", "description": "English: Click to open the dashboard" }, "popupMoreButton": { - "message": "More", + "message": "තව", "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "අඩුවෙන්", "description": "Label to be used to hide popup panel sections" }, "3pGroupDefault": { - "message": "Default", + "message": "පෙරනිමි", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAds": { - "message": "Ads", + "message": "දැන්වීම්", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupPrivacy": { - "message": "Privacy", + "message": "පෞද්ගලිකත්‍වය", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "ද්වේශාංග වසම්", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "පීඩාකාරී", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { - "message": "Miscellaneous", + "message": "වෙනත්", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupRegions": { - "message": "Regions, languages", + "message": "කලාපීය, භාෂා", "description": "Header for a ruleset section in 'Filter lists pane'" }, "aboutChangelog": { - "message": "Changelog", + "message": "වෙනස්කම් සටහන", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "මූලාශ්‍ර කේත (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "දායකයින්", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "මූලාශ්‍ර කේත", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "පරිවර්තන", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "පෙරහන් ලැයිස්තු", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "බාහිර පරායත්ත (GPLv3-අනුකූල):", "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "පෙරහන් ගැටලු වාර්තා කරන්න", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { @@ -116,19 +116,19 @@ "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "සමාන වාර්තා සොයන්න", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "අඩවියේ ලිපිනය:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "වියමන පිටුව…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- නිවේශිතයක් තෝරන්න --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { @@ -140,7 +140,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "uBO Lite අනාවරණය කරයි", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { @@ -152,7 +152,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "අනවශ්‍ය පටිති හෝ කවුළු අරියි", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { @@ -164,11 +164,11 @@ "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "නව වාර්තාවක් සාදන්න", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { - "message": "Welcome", + "message": "සාදරයෙන් පිළිගනිමු", "description": "The header text for the welcome message section" }, "firstRunDescription": { @@ -176,7 +176,7 @@ "description": "Descriptive text shown at first install time only " }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "පෙරනිමි පෙරීමේ ප්‍රකාරය", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { @@ -184,19 +184,19 @@ "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "පෙරීමක් නැත", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "මූලික", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "ප්‍රශස්ත", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "සම්පූර්ණ", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { @@ -212,23 +212,23 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of websites for which no filtering will take place.", + "message": "පෙරීමක් නොවන අඩවි ලැයිස්තුව.", "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[hostnames only]\nexample.com\ngames.example\n...", + "message": "[සත්කාරක පමණි]\nexample.com\ngames.example\n...", "description": "Default text for in edit field" }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "හැසිරීම", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "පෙරීමේ ප්‍රකාරය වෙනස් වූ විට පිටුව ස්වයංක්‍රීයව යළි පූරණය කරන්න", "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { - "message": "Show the number of blocked requests on the toolbar icon", + "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 d3eec22438c34..d497e91c6be01 100644 --- a/platform/mv3/extension/_locales/zh_TW/messages.json +++ b/platform/mv3/extension/_locales/zh_TW/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "一個無須任何權限的內容阻擋器。安裝即可阻擋廣告、追蹤器、挖礦程式等網頁內容。", + "message": "無須權限的內容阻擋器。安裝即可阻擋廣告、追蹤器、挖礦程式等網頁內容。", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "回報此網站的問題", + "message": "回報網站問題", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -100,19 +100,19 @@ "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "外部相依套件(與 GPLv3 相容):", + "message": "外部依存套件(相容 GPLv3):", "description": "Shown in the About pane" }, "supportS6H": { - "message": "回報過濾規則的問題", + "message": "回報過濾規則問題", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "回報至特定網站的過濾器問題至 uBlockOrigin/uAssets 議題追蹤器需要 GitHub 帳號。", + "message": "回報特定網站的過濾器問題至 uBlockOrigin/uAssets 議題追蹤器需要 GitHub 帳號。", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "為免給志願者帶來額外負擔,請先檢查問題有沒有被回報過,避免重複回報。", + "message": "為免給志願者帶來額外負擔,請先檢查問題是否被回報過,以免重複。", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { @@ -136,15 +136,15 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "含有覆蓋物或其他滋擾物", + "message": "有覆蓋物或其他滋擾物", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "偵測 uBO Lite", + "message": "偵測到 uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "有隱私權相關問題", + "message": "有隱私權問題", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { @@ -172,7 +172,7 @@ "description": "The header text for the welcome message section" }, "firstRunDescription": { - "message": "您剛安裝了 uBO Lite。您可以在此處選擇要在所有網站上使用的預設過濾模式。\n\n預設情況下將會選取基礎模式,因為其不需要讀取與變更資料的權限。若您信任 uBO Lite,您可以給予其讀取並變更在所有網站上資料的廣泛權限,以便為所有網站啟用更進階的過濾功能。", + "message": "您剛安裝了 uBO Lite。您可以在此處選擇會套用在所有網站上的預設過濾模式。\n\n預設情況下,將會使用基礎模式,因為其不需要讀取與變更資料的權限。若您信任 uBO Lite,您可以給予其讀取並變更在所有網站上資料的廣泛權限,以便為所有網站啟用更進階的過濾功能。", "description": "Descriptive text shown at first install time only " }, "defaultFilteringModeSectionLabel": { diff --git a/src/_locales/ar/messages.json b/src/_locales/ar/messages.json index ac025f2060466..3d1023f561df5 100644 --- a/src/_locales/ar/messages.json +++ b/src/_locales/ar/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "الصفحة المحظورة تريد إعادة توجيهك إلى موقع آخر. إذا اخترت المتابعة، فسوف تنتقل مباشرة إلى: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/br_FR/messages.json b/src/_locales/br_FR/messages.json index d0a4f82abff8a..abddf0af58f94 100644 --- a/src/_locales/br_FR/messages.json +++ b/src/_locales/br_FR/messages.json @@ -12,7 +12,7 @@ "description": "English: uBlock₀ — Dashboard" }, "dashboardUnsavedWarning": { - "message": "Diwallit! Kemmoù zo ha n'ho peus enrollet anezho", + "message": "Diwallit! Kemmoù zo ha n'ho peus ket enrollet", "description": "A warning in the dashboard when navigating away from unsaved changes" }, "dashboardUnsavedWarningStay": { diff --git a/src/_locales/si/messages.json b/src/_locales/si/messages.json index cd39d0ddcaa1a..eeafed6f67220 100644 --- a/src/_locales/si/messages.json +++ b/src/_locales/si/messages.json @@ -12,11 +12,11 @@ "description": "English: uBlock₀ — Dashboard" }, "dashboardUnsavedWarning": { - "message": "Warning! You have unsaved changes", + "message": "අවවාදයයි! ඔබ නොසුරැකි වෙනස්කම් ඇත", "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": { @@ -28,7 +28,7 @@ "description": "appears as tab name in dashboard" }, "3pPageName": { - "message": "Filter lists", + "message": "පෙරහන් ලැයිස්තු", "description": "appears as tab name in dashboard" }, "1pPageName": { @@ -52,11 +52,11 @@ "description": "Title for the logger window" }, "aboutPageName": { - "message": "පිළිබඳව", + "message": "පිළිබඳ", "description": "appears as tab name in dashboard" }, "supportPageName": { - "message": "Support", + "message": "සහාය", "description": "appears as tab name in dashboard" }, "assetViewerPageName": { @@ -64,7 +64,7 @@ "description": "Title for the asset viewer page" }, "advancedSettingsPageName": { - "message": "වැඩිදුර සැකසුම්", + "message": "සංකීර්ණ සැකසුම්", "description": "Title for the advanced settings page" }, "popupPowerSwitchInfo": { @@ -92,7 +92,7 @@ "description": "Example: 15 (13%)" }, "popupBlockedSinceInstallPrompt": { - "message": "since install", + "message": "ස්ථාපනයේ සිට", "description": "English: since install" }, "popupOr": { @@ -100,11 +100,11 @@ "description": "English: or" }, "popupBlockedOnThisPage_v2": { - "message": "මෙම පිටුවේ අවහිර කළ", + "message": "මෙම පිටුවේ අවහිර", "description": "For the new mobile-friendly popup design" }, "popupBlockedSinceInstall_v2": { - "message": "ස්ථාපනයෙන් පසු අවහිර කළ", + "message": "ස්ථාපනයෙන් පසු අවහිර", "description": "For the new mobile-friendly popup design" }, "popupDomainsConnected_v2": { @@ -112,7 +112,7 @@ "description": "For the new mobile-friendly popup design" }, "popupTipDashboard": { - "message": "උපකරණපුවරුව විවෘත කරන්න", + "message": "උපකරණ පුවරුව අරින්න", "description": "English: Click to open the dashboard" }, "popupTipZapper": { @@ -128,7 +128,7 @@ "description": "Tooltip used for the logger icon in the panel" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "මෙම අඩවියේ ගැටලුවක් වාර්තා කරන්න", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipNoPopups": { @@ -180,19 +180,19 @@ "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoScripting1": { - "message": "Click to disable JavaScript on this site", + "message": "මෙම අඩවියේ ජාවාස්ක්‍රිප්ට් අබල කිරීමට ඔබන්න", "description": "Tooltip for the no-scripting per-site switch" }, "popupTipNoScripting2": { - "message": "Click to no longer disable JavaScript on this site", + "message": "මෙම අඩවියේ තවදුරටත් ජාවාස්ක්‍රිප්ට් අබල නොකිරීමට ඔබන්න", "description": "Tooltip for the no-scripting per-site switch" }, "popupNoPopups_v2": { - "message": "Pop-up windows", + "message": "උත්පතන කවුළු", "description": "Caption for the no-popups per-site switch" }, "popupNoLargeMedia_v2": { - "message": "Large media elements", + "message": "විශාල මාධ්‍ය අංග", "description": "Caption for the no-large-media per-site switch" }, "popupNoCosmeticFiltering_v2": { @@ -200,11 +200,11 @@ "description": "Caption for the no-cosmetic-filtering per-site switch" }, "popupNoRemoteFonts_v2": { - "message": "දුරස්ථ මුද්‍රණඅකුරු", + "message": "දුරස්ථ රුවකුරු", "description": "Caption for the no-remote-fonts per-site switch" }, "popupNoScripting_v2": { - "message": "JavaScript", + "message": "ජාවාස්ක්‍රිප්ට්", "description": "Caption for the no-scripting per-site switch" }, "popupMoreButton_v2": { @@ -212,7 +212,7 @@ "description": "Label to be used to show popup panel sections" }, "popupLessButton_v2": { - "message": "Less", + "message": "අඩුවෙන්", "description": "Label to be used to hide popup panel sections" }, "popupTipGlobalRules": { @@ -236,31 +236,31 @@ "description": "" }, "popupImageRulePrompt": { - "message": "images", + "message": "රූප", "description": "" }, "popup3pAnyRulePrompt": { - "message": "තෙවන-පාර්ශවීය", + "message": "තෙවන පාර්ශ්ව", "description": "" }, "popup3pPassiveRulePrompt": { - "message": "3rd-party CSS/images", + "message": "තෙවන පාර්ශ්ව CSS/රූප", "description": "" }, "popupInlineScriptRulePrompt": { - "message": "inline scripts", + "message": "එක්තල අත්පත්", "description": "" }, "popup1pScriptRulePrompt": { - "message": "1st-party scripts", + "message": "පළමු පාර්ශ්ව අත්පත්", "description": "" }, "popup3pScriptRulePrompt": { - "message": "3rd-party scripts", + "message": "තෙවන පාර්ශ්ව අත්පත්", "description": "" }, "popup3pFrameRulePrompt": { - "message": "3rd-party frames", + "message": "තෙවන පාර්ශ්ව රාමු", "description": "" }, "popupHitDomainCountPrompt": { @@ -276,11 +276,11 @@ "description": "Example of use: Version 1.26.4" }, "popup3pScriptFilter": { - "message": "script", + "message": "අත්පත", "description": "Appears as an option to filter out firewall rows" }, "popup3pFrameFilter": { - "message": "frame", + "message": "රාමුව", "description": "Appears as an option to filter out firewall rows" }, "pickerCreate": { @@ -308,11 +308,11 @@ "description": "English: Cosmetic filters" }, "pickerCosmeticFiltersHint": { - "message": "Click, Ctrl-click", + "message": "ඔබන්න, Ctrl-ඔබන්න", "description": "English: Click, Ctrl-click" }, "pickerContextMenuEntry": { - "message": "Block element…", + "message": "අංග අවහිර කරන්න", "description": "An entry in the browser's contextual menu" }, "settingsCollapseBlockedPrompt": { @@ -320,7 +320,7 @@ "description": "English: Hide placeholders of blocked elements" }, "settingsIconBadgePrompt": { - "message": "Show the number of blocked requests on the icon", + "message": "නිරූපකයේ අවහිර කළ ඉල්ලීම් ගණන පෙන්වන්න", "description": "English: Show the number of blocked requests on the icon" }, "settingsTooltipsPrompt": { @@ -328,7 +328,7 @@ "description": "A checkbox in the Settings pane" }, "settingsContextMenuPrompt": { - "message": "Make use of context menu where appropriate", + "message": "සුදුසු අවස්ථා වල දී සන්දර්භ වට්ටෝරුව භාවිතා කරන්න", "description": "English: Make use of context menu where appropriate" }, "settingsColorBlindPrompt": { @@ -336,11 +336,11 @@ "description": "English: Color-blind friendly" }, "settingsAppearance": { - "message": "Appearance", + "message": "පෙනුම", "description": "Section for controlling user interface appearance" }, "settingsThemeLabel": { - "message": "Theme", + "message": "තේමාව", "description": "Label for checkbox to enable a custom dark theme" }, "settingsThemeAccent0Label": { @@ -352,7 +352,7 @@ "description": "" }, "settingsAdvancedUserPrompt": { - "message": "I am an advanced user", + "message": "මම ප්‍රගත පරිශ්‍රීලකයෙකි", "description": "Checkbox to let user access advanced, technical features" }, "settingsPrefetchingDisabledPrompt": { @@ -360,7 +360,7 @@ "description": "English: " }, "settingsHyperlinkAuditingDisabledPrompt": { - "message": "Disable hyperlink auditing", + "message": "අතිසබැඳි විගණනය අබල කරන්න", "description": "English: " }, "settingsWebRTCIPAddressHiddenPrompt": { @@ -380,19 +380,19 @@ "description": "" }, "settingsNoLargeMediaPrompt": { - "message": "Block media elements larger than {{input}} KB", + "message": "කි.බ. {{input}} කට වඩා විශාල මාධ්‍ය අංග අවහිර කරන්න", "description": "" }, "settingsNoRemoteFontsPrompt": { - "message": "දුරස්ථ මුද්‍රණඅකුරු බ්ලොක් කරන්න", + "message": "දුරස්ථ රුවකුරු අවහිර කරන්න", "description": "" }, "settingsNoScriptingPrompt": { - "message": "Disable JavaScript", + "message": "ජාවාස්ක්‍රිප්ට් අබල කරන්න", "description": "The default state for the per-site no-scripting switch" }, "settingsNoCSPReportsPrompt": { - "message": "අ.ආ.ප්‍ර.(සීඑස්පී) වාර්තා අවහිරකරන්න", + "message": "අ.ආ.ප්‍ර. (CSP) වාර්තා අවහිර කරන්න", "description": "background information: https://github.com/gorhill/uBlock/issues/3150" }, "settingsUncloakCnamePrompt": { @@ -400,23 +400,23 @@ "description": "background information: https://github.com/uBlockOrigin/uBlock-issues/issues/1513" }, "settingsAdvanced": { - "message": "Advanced", + "message": "සංකීර්ණ", "description": "Section for controlling advanced-user settings" }, "settingsAdvancedSynopsis": { - "message": "Features suitable only for technical users", + "message": "තාක්‍ෂණික පරිශ්‍රීලකයින්ට පමණක් සුදුසු විශේෂාංග", "description": "Description of section controlling advanced-user settings" }, "settingsAdvancedUserSettings": { - "message": "වැඩිදුර සැකසුම්", + "message": "සංකීර්ණ සැකසුම්", "description": "For the tooltip of a link which gives access to advanced settings" }, "settingsLastRestorePrompt": { - "message": "Last restore:", + "message": "අවසාන ප්‍රත්‍යර්පණය:", "description": "English: Last restore:" }, "settingsLastBackupPrompt": { - "message": "Last backup:", + "message": "අවසාන උපස්ථය:", "description": "English: Last backup:" }, "3pListsOfBlockedHostsPrompt": { @@ -432,7 +432,7 @@ "description": "A checkbox in the _3rd-party filters_ pane" }, "3pUpdateNow": { - "message": "දැන් යාවත්කාල කරන්න", + "message": "යාවත්කාල කරන්න", "description": "A button in the in the _3rd-party filters_ pane" }, "3pPurgeAll": { @@ -460,7 +460,7 @@ "description": "A checkbox in the 'Filter lists' pane" }, "3pListsOfBlockedHostsHeader": { - "message": "Lists of blocked hosts", + "message": "අවහිර කළ සත්කාරක", "description": "English: Lists of blocked hosts" }, "3pApplyChanges": { @@ -468,7 +468,7 @@ "description": "English: Apply changes" }, "3pGroupDefault": { - "message": "Built-in", + "message": "තිළෑලි", "description": "Filter lists section name" }, "3pGroupAds": { @@ -476,7 +476,7 @@ "description": "Filter lists section name" }, "3pGroupPrivacy": { - "message": "පෞද්ගලිකත්වය", + "message": "පෞද්ගලිකත්‍වය", "description": "Filter lists section name" }, "3pGroupMalware": { @@ -488,7 +488,7 @@ "description": "Filter lists section name" }, "3pGroupCookies": { - "message": "Cookie notices", + "message": "දත්තකඩ දැන්වීම්", "description": "Filter lists section name" }, "3pGroupAnnoyances": { @@ -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": { @@ -520,7 +520,7 @@ "description": "used as a tooltip for the out-of-date icon beside a list" }, "3pViewContent": { - "message": "view content", + "message": "අන්තර්ගතය බලන්න", "description": "used as a tooltip for eye icon beside a list" }, "3pLastUpdate": { @@ -552,7 +552,7 @@ "description": "Button in the 'My filters' pane" }, "1pExport": { - "message": "නිර්යාත", + "message": "නිර්යාත කරන්න...", "description": "Button in the 'My filters' pane" }, "1pExportFilename": { @@ -572,7 +572,7 @@ "description": "header" }, "rulesRevert": { - "message": "Revert", + "message": "ප්‍රතිවර්තනය", "description": "This will remove all temporary rules" }, "rulesCommit": { @@ -588,11 +588,11 @@ "description": "Will save manually-edited content and exit manual-edit mode" }, "rulesEditDiscard": { - "message": "Discard", + "message": "ඉවතලන්න", "description": "Will discard manually-edited content and exit manual-edit mode" }, "rulesImport": { - "message": "ගොනුවකින් ඇතුල් කරන්න...", + "message": "ගොනුවකින් ආයාත කරන්න...", "description": "" }, "rulesExport": { @@ -600,7 +600,7 @@ "description": "Button in the 'My rules' pane" }, "rulesDefaultFileName": { - "message": "මගේ-ස්ථිර-නීති_{{datetime}}.txt", + "message": "මාගේ-ublock-ගතික-නීති_{{datetime}}.txt", "description": "default file name to use" }, "rulesHint": { @@ -612,7 +612,7 @@ "description": "English: dynamic rule syntax and full documentation." }, "rulesSort": { - "message": "Sort:", + "message": "වර්ගනය:", "description": "English: label for sort option." }, "rulesSortByType": { @@ -620,7 +620,7 @@ "description": "English: a sort option for list of rules." }, "rulesSortBySource": { - "message": "Source", + "message": "මූලාශ්‍රය", "description": "English: a sort option for list of rules." }, "rulesSortByDestination": { @@ -636,11 +636,11 @@ "description": "Button in the 'Trusted sites' pane" }, "whitelistExport": { - "message": "නිර්යාත", + "message": "නිර්යාත…", "description": "Button in the 'Trusted sites' pane" }, "whitelistExportFilename": { - "message": "මට-විශ්වාස-වෙබ්-අඩවි_{{datetime}}.txt", + "message": "මාගේ-ublock-විශ්වාසදායී-අඩවි_{{datetime}}.txt", "description": "The default filename to use for import/export purpose" }, "whitelistApply": { @@ -724,23 +724,23 @@ "description": "A keyword in the built-in row filtering expression: all items corresponding to uBO doing something (blocked, allowed, redirected, etc.)" }, "loggerRowFiltererBuiltinBlocked": { - "message": "blocked", + "message": "අවහිරයි", "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltinAllowed": { - "message": "allowed", + "message": "ඉඩදුන්", "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltinModified": { - "message": "modified", + "message": "සංශෝධිත", "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltin1p": { - "message": "ප්‍රථම-පාර්ශවීය", + "message": "පළමු පාර්ශ්ව", "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltin3p": { - "message": "තෙවන-පාර්ශවීය", + "message": "තෙවන පාර්ශ්ව", "description": "A keyword in the built-in row filtering expression" }, "loggerEntryDetailsHeader": { @@ -752,7 +752,7 @@ "description": "Label to identify a filter field" }, "loggerEntryDetailsFilterList": { - "message": "Filter list", + "message": "පෙරහන් ලැයිස්තුව", "description": "Label to identify a filter list field" }, "loggerEntryDetailsRule": { @@ -760,11 +760,11 @@ "description": "Label to identify a rule field" }, "loggerEntryDetailsContext": { - "message": "Context", + "message": "සන්දර්භය", "description": "Label to identify a context field (typically a hostname)" }, "loggerEntryDetailsRootContext": { - "message": "Root context", + "message": "මූල සන්දර්භය", "description": "Label to identify a root context field (typically a hostname)" }, "loggerEntryDetailsPartyness": { @@ -784,7 +784,7 @@ "description": "Small header to identify the dynamic URL filtering section" }, "loggerURLFilteringContextLabel": { - "message": "Context:", + "message": "සන්දර්භය:", "description": "Label for the context selector" }, "loggerURLFilteringTypeLabel": { @@ -792,7 +792,7 @@ "description": "Label for the type selector" }, "loggerStaticFilteringHeader": { - "message": "Static filter", + "message": "ස්ථිතික පෙරහන", "description": "Small header to identify the static filtering section" }, "loggerStaticFilteringSentence": { @@ -804,7 +804,7 @@ "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartAllow": { - "message": "ඉඩදෙන්න", + "message": "ඉඩ දෙන්න", "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartType": { @@ -816,7 +816,7 @@ "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartOrigin": { - "message": "from “{{origin}}”", + "message": "“{{origin}}” වෙතින්", "description": "Used in the static filtering wizard" }, "loggerStaticFilteringSentencePartAnyOrigin": { @@ -896,19 +896,19 @@ "description": "Label for radio-button to pick export text format" }, "supportOpenButton": { - "message": "Open", + "message": "අරින්න", "description": "Text for button which open an external webpage in Support pane" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "නව වාර්තාවක් සාදන්න", "description": "Text for button which open an external webpage in Support pane" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "සමාන වාර්තා සොයන්න", "description": "A clickable link in the filter issue reporter section" }, "supportS1H": { - "message": "Documentation", + "message": "ප්‍රලේඛනය", "description": "Header of 'Documentation' section in Support pane" }, "supportS1P1": { @@ -916,7 +916,7 @@ "description": "First paragraph of 'Documentation' section in Support pane" }, "supportS2H": { - "message": "Questions and support", + "message": "ප්‍රශ්න සහ සහාය", "description": "Header of 'Questions and support' section in Support pane" }, "supportS2P1": { @@ -940,7 +940,7 @@ "description": "Third paragraph of 'Filter issues' section in Support pane" }, "supportS4H": { - "message": "Bug report", + "message": "දෝෂ වාර්තාව", "description": "Header of 'Bug report' section in Support pane" }, "supportS4P1": { @@ -980,7 +980,7 @@ "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The web page…", + "message": "වියමන පිටුව…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { @@ -1032,11 +1032,11 @@ "description": "Link to privacy policy on GitHub (English)" }, "aboutChangelog": { - "message": "Changelog", + "message": "වෙනස්කම් සටහන", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "මූලාශ්‍ර කේත (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { @@ -1044,7 +1044,7 @@ "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "මූලාශ්‍ර කේත", "description": "Link text to source code repo" }, "aboutTranslations": { @@ -1052,7 +1052,7 @@ "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "පෙරහන් ලැයිස්තු", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { @@ -1076,11 +1076,11 @@ "description": "English: my-ublock-backup_{{datetime}}.txt" }, "aboutRestoreDataButton": { - "message": "ගොනුවකින් ප්‍රත්‍යර්පණය කරන්න...", + "message": "ගොනුවකින් ප්‍රත්‍යර්පණය කරන්න", "description": "English: Restore from file..." }, "aboutResetDataButton": { - "message": "Reset to default settings…", + "message": "සැකසුම් පෙරනිමියට සකසන්න", "description": "English: Reset to default settings..." }, "aboutRestoreDataConfirm": { @@ -1124,7 +1124,7 @@ "description": "English: {{value}} hours ago" }, "elapsedOneDayAgo": { - "message": "දිනකට පෙර", + "message": "දවසකට පෙර", "description": "English: a day ago" }, "elapsedManyDaysAgo": { @@ -1140,11 +1140,11 @@ "description": "Firefox/Fennec-specific: Show Logger" }, "fennecMenuItemBlockingOff": { - "message": "off", + "message": "අක්‍රියයි", "description": "Firefox-specific: appears as 'uBlock₀ (off)'" }, "docblockedTitle": { - "message": "Page blocked", + "message": "පිටුව අවහිරයි", "description": "Used as a title for the document-blocked page" }, "docblockedPrompt1": { @@ -1160,7 +1160,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": "Found in:", + "message": "මෙහි හමු විය:", "description": "English: List of filter list names follows" }, "docblockedBack": { @@ -1184,7 +1184,7 @@ "description": "English: Temporarily" }, "docblockedDisablePermanent": { - "message": "සදාකාලිකව", + "message": "සදහටම", "description": "English: Permanently" }, "docblockedDisable": { @@ -1204,7 +1204,7 @@ "description": "tooltip" }, "cloudPullAndMerge": { - "message": "මේඝ ආචයනයෙන් ආයාත කර වත්මන් සැකසුම් සමඟ සංයුක්ත කරන්න", + "message": "මේඝ ආචයනයෙන් ආයාත කර වත්මන් සැකසුම් වලට ඒකාබද්ධ කරන්න", "description": "tooltip" }, "cloudNoData": { @@ -1216,11 +1216,11 @@ "description": "used as a prompt for the user to provide a custom device name" }, "advancedSettingsWarning": { - "message": "Warning! Change these advanced settings at your own risk.", + "message": "අවවාදයයි! මෙම සංකීර්ණ සැකසුම් සංශෝධනයේ අවදානම ඔබ සතුයි.", "description": "A warning to users at the top of 'Advanced settings' page" }, "genericSubmit": { - "message": "Submit", + "message": "යොමන්න", "description": "for generic 'Submit' buttons" }, "genericApplyChanges": { @@ -1228,7 +1228,7 @@ "description": "for generic 'Apply changes' buttons" }, "genericRevert": { - "message": "Revert", + "message": "ප්‍රතිවර්තනය", "description": "for generic 'Revert' buttons" }, "genericBytes": { @@ -1248,11 +1248,11 @@ "description": "A context menu entry, present when large media elements have been blocked on the current site" }, "contextMenuViewSource": { - "message": "View source code…", + "message": "මූලාශ්‍ර කේත බලන්න…", "description": "A context menu entry, to view the source code of the target resource" }, "shortcutCapturePlaceholder": { - "message": "Type a shortcut", + "message": "කෙටිමඟක් ලියන්න", "description": "Placeholder string for input field used to capture a keyboard shortcut" }, "genericMergeViewScrollLock": { @@ -1260,11 +1260,11 @@ "description": "Tooltip for the button used to lock scrolling between the views in the 'My rules' pane" }, "genericCopyToClipboard": { - "message": "පසුරුපුවරුවට පිටපත් කරන්න", + "message": "පසුරු පුවරුවට පිටපතක්", "description": "Label for buttons used to copy something to the clipboard" }, "genericSelectAll": { - "message": "Select all", + "message": "සියල්ල තෝරන්න", "description": "Label for buttons used to select all text in editor" }, "toggleCosmeticFiltering": { @@ -1280,7 +1280,7 @@ "description": "Label for keyboard shortcut used to relax blocking mode" }, "storageUsed": { - "message": "Storage used: {{value}} {{unit}}", + "message": "ආචයනය භාවිතය: {{value}} {{unit}}", "description": " In Setting pane, renders as (example): Storage used: 13.2 MB" }, "KB": { @@ -1300,7 +1300,7 @@ "description": "Message used in frame placeholders" }, "linterMainReport": { - "message": "Errors: {{count}}", + "message": "දෝෂ: {{count}}", "description": "Summary of number of errors as reported by the linter " }, "unprocessedRequestTooltip": { diff --git a/src/_locales/vi/messages.json b/src/_locales/vi/messages.json index 4b6559af68124..bfea4310a0f38 100644 --- a/src/_locales/vi/messages.json +++ b/src/_locales/vi/messages.json @@ -140,7 +140,7 @@ "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups2": { - "message": "Nhấn để bỏ chặn tất cả cửa sổ bật lên trên trang này", + "message": "Nhấp để bỏ chặn tất cả cửa sổ bật lên trên trang này", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoLargeMedia": { @@ -480,7 +480,7 @@ "description": "Filter lists section name" }, "3pGroupMalware": { - "message": "Bảo mật, bảo vệ khỏi phần mềm nguy hiểm", + "message": "Bảo mật, bảo vệ khỏi phần mềm độc hại", "description": "Filter lists section name" }, "3pGroupSocial": { @@ -628,7 +628,7 @@ "description": "English: a sort option for list of rules." }, "whitelistPrompt": { - "message": "Các chỉ thị trang web đáng tin cậy ra lệnh trên đó các trang web uBlock Origin sẽ bị vô hiệu hóa. Một mục nhập cho mỗi dòng. Chỉ thị không hợp lệ sẽ được âm thầm bỏ qua và nhận xét ra.", + "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.", "description": "A concise description of the 'Trusted sites' pane." }, "whitelistImport": { @@ -640,7 +640,7 @@ "description": "Button in the 'Trusted sites' pane" }, "whitelistExportFilename": { - "message": "my-ublock-whitelist_{{datetime}}.txt", + "message": "my-ublock-trusted-sites_{{datetime}}.txt", "description": "The default filename to use for import/export purpose" }, "whitelistApply": { @@ -844,11 +844,11 @@ "description": "Logger setting: A sentence to describe the purpose of the settings below" }, "loggerSettingPerEntryMaxAge": { - "message": "Bảo tồn các mục từ {{input}} phút trước", + "message": "Giữ lại các mục từ {{input}} phút trước", "description": "A logger setting" }, "loggerSettingPerTabMaxLoads": { - "message": "Bảo tồn nhiều nhất {{input}} trang được tải trên mỗi thẻ", + "message": "Giữ lại nhiều nhất {{input}} trang được tải trên mỗi thẻ", "description": "A logger setting" }, "loggerSettingPerTabMaxEntries": { @@ -928,7 +928,7 @@ "description": "Header of 'Filter issues' section in Support pane" }, "supportS3P1": { - "message": "Cần tài khoản GitHub: Báo cáo lỗi bộ lọc với tên miền cụ thể cho uBlock Origin tại đây. ", + "message": "Báo cáo lỗi bộ lọc với tên miền cụ thể cho uBlockOrigin/uAssets issue tracker. Cần tài khoản GitHub ", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS3P2": { @@ -944,7 +944,7 @@ "description": "Header of 'Bug report' section in Support pane" }, "supportS4P1": { - "message": "Cần tài khoản GitHub: Báo cáo lỗi bộ lọc với tên miền cụ thể cho uBlock Origin tại đây. ", + "message": "Báo cáo lỗi cho uBlock Origin cho uBlockOrigin/uBlock-issue issue tracker. Cần tài khoản GitHub ", "description": "First paragraph of 'Bug report' section in Support pane" }, "supportS5H": { @@ -968,7 +968,7 @@ "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S1": { - "message": "Danh sách bộ lọc được cập nhật hàng ngày. Đảm bảo vấn đề của bạn chưa được giải quyết trong danh sách bộ lọc gần đây nhất.", + "message": "Danh sách bộ lọc được cập nhật hàng ngày. Hãy đảm bảo vấn đề của bạn chưa được giải quyết trong danh sách bộ lọc gần đây nhất.", "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S2": { @@ -984,7 +984,7 @@ "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "--Chọn một lỗi--", + "message": "-- Chọn một lỗi --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { @@ -1100,7 +1100,7 @@ "description": "English: Network error: {{msg}}" }, "subscriberConfirm": { - "message": "uBlock₀: Thêm URL dưới đây vào bộ lọc tuỳ biến của bạn?\n\nTên: \"{{title}}\"\nURL: {{url}}", + "message": "Thêm URL dưới đây vào bộ lọc tuỳ biến của bạn?\n\nTên: \"{{title}}\"\nURL: {{url}}", "description": "No longer used" }, "subscribeButton": { @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Trang đã chặn muốn chuyển hướng sang trang khác. Nếu đồng ý, bạn sẽ được chuyển hướng sang {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { @@ -1248,7 +1248,7 @@ "description": "A context menu entry, present when large media elements have been blocked on the current site" }, "contextMenuViewSource": { - "message": "Xem mã nguồn", + "message": "Xem mã nguồn...", "description": "A context menu entry, to view the source code of the target resource" }, "shortcutCapturePlaceholder": { @@ -1280,7 +1280,7 @@ "description": "Label for keyboard shortcut used to relax blocking mode" }, "storageUsed": { - "message": "Bộ nhớ đã dùng: {{value}} byte", + "message": "Bộ nhớ đã dùng: {{value}} {{unit}}", "description": " In Setting pane, renders as (example): Storage used: 13.2 MB" }, "KB": { From 7fcd2a51be94a5b5de432a43a4cf54b73e084ae4 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 14 Nov 2024 10:51:21 -0500 Subject: [PATCH 449/553] 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 4206cc148d91d..757609c27b914 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.1.2", + "version": "1.61.1.3", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.1b2/uBlock0_1.61.1b2.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.1b3/uBlock0_1.61.1b3.firefox.signed.xpi" } ] } From 947602d4fe46ec832d3f95ee3a65633fc4113f44 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 15 Nov 2024 10:01:29 -0500 Subject: [PATCH 450/553] [mv3] Slightly mitigate DNR flaw re. `removeparam` filters Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/140 This will allow more specific `removeparam` filters to override generic ones. This doesn't fix the related issue but should help more specific `removeparam` filters to be applied. Related webextensions issue: https://github.com/w3c/webextensions/issues/468 --- src/js/static-net-filtering.js | 36 ++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 71b67e30c6a21..bc14d71dbbdb0 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -4452,22 +4452,23 @@ StaticNetFilteringEngine.prototype.dnrFromCompiled = function(op, context, ...ar } // Priority: - // Block: 1 (default priority) - // Redirect: 2-9 - // Excepted redirect: 12-19 - // Allow: 20 - // Block important: 30 - // Redirect important: 32-39 + // Removeparam: 1-4 + // Block: 10 (default priority) + // Redirect: 11-19 + // Excepted redirect: 21-29 + // Allow: 30 + // Block important: 40 + // Redirect important: 41-49 const realms = new Map([ - [ BLOCK_REALM, { type: 'block', priority: 0 } ], - [ ALLOW_REALM, { type: 'allow', priority: 20 } ], - [ REDIRECT_REALM, { type: 'redirect', priority: 2 } ], + [ BLOCK_REALM, { type: 'block', priority: 10 } ], + [ ALLOW_REALM, { type: 'allow', priority: 30 } ], + [ REDIRECT_REALM, { type: 'redirect', priority: 11 } ], [ REMOVEPARAM_REALM, { type: 'removeparam', priority: 0 } ], [ CSP_REALM, { type: 'csp', priority: 0 } ], [ PERMISSIONS_REALM, { type: 'permissions', priority: 0 } ], [ URLTRANSFORM_REALM, { type: 'uritransform', priority: 0 } ], - [ HEADERS_REALM, { type: 'block', priority: 0 } ], + [ HEADERS_REALM, { type: 'block', priority: 10 } ], [ URLSKIP_REALM, { type: 'urlskip', priority: 0 } ], ]); const partyness = new Map([ @@ -4605,7 +4606,7 @@ StaticNetFilteringEngine.prototype.dnrFromCompiled = function(op, context, ...ar if ( token !== '' ) { const match = /:(\d+)$/.exec(token); if ( match !== null ) { - rule.priority = Math.min(rule.priority + parseInt(match[1], 10), 9); + rule.priority += Math.min(rule.priority + parseInt(match[1], 10), 9); token = token.slice(0, match.index); } } @@ -4623,7 +4624,7 @@ StaticNetFilteringEngine.prototype.dnrFromCompiled = function(op, context, ...ar } break; } - case 'removeparam': + case 'removeparam': { rule.action.type = 'redirect'; if ( rule.__modifierValue === '|' ) { rule.__modifierValue = ''; @@ -4657,10 +4658,21 @@ StaticNetFilteringEngine.prototype.dnrFromCompiled = function(op, context, ...ar 'xmlhttprequest', ]; } + // https://github.com/uBlockOrigin/uBOL-home/issues/140 + // Mitigate until DNR API flaw is addressed by browser vendors + let priority = rule.priority || 1; + if ( rule.condition.urlFilter !== undefined ) { priority += 1; } + if ( rule.condition.regexFilter !== undefined ) { priority += 1; } + if ( rule.condition.initiatorDomains !== undefined ) { priority += 1; } + if ( rule.condition.requestDomains !== undefined ) { priority += 1; } + if ( priority !== 1 ) { + rule.priority = priority; + } if ( rule.__modifierAction === ALLOW_REALM ) { dnrAddRuleError(rule, `Unsupported removeparam exception: ${rule.__modifierValue}`); } break; + } case 'uritransform': { dnrAddRuleError(rule, `Incompatible with DNR: uritransform=${rule.__modifierValue}`); break; From c8174d60320cedb8a22afedae2a3acddac9c8bf1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 16 Nov 2024 08:10:25 -0500 Subject: [PATCH 451/553] Improve `trusted-set-attr` scriptlet Related feedback: https://github.com/gorhill/uBlock/commit/11ca4a39239478e35605ec072fca140ac4c70d3b#commitcomment-149148167 --- assets/resources/attribute.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/assets/resources/attribute.js b/assets/resources/attribute.js index 0c50daf879003..7873183de16b4 100644 --- a/assets/resources/attribute.js +++ b/assets/resources/attribute.js @@ -29,6 +29,7 @@ import { safeSelf } from './safe-self.js'; /******************************************************************************/ export function setAttrFn( + trusted = false, logPrefix, selector = '', attr = '', @@ -38,7 +39,7 @@ export function setAttrFn( if ( attr === '' ) { return; } const safe = safeSelf(); - const copyFrom = /^\[.+\]$/.test(value) + const copyFrom = trusted === false && /^\[.+\]$/.test(value) ? value.slice(1, -1) : ''; @@ -148,7 +149,7 @@ export function setAttr( } } - setAttrFn(logPrefix, selector, attr, value); + setAttrFn(false, logPrefix, selector, attr, value); } registerScriptlet(setAttr, { name: 'set-attr.js', @@ -187,7 +188,7 @@ export function trustedSetAttr( ) { const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('trusted-set-attr', selector, attr, value); - setAttrFn(logPrefix, selector, attr, value); + setAttrFn(true, logPrefix, selector, attr, value); } registerScriptlet(trustedSetAttr, { name: 'trusted-set-attr.js', From 5f5e3d730fabe0e98e2f9931ad3c36113b7b9893 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 16 Nov 2024 09:26:09 -0500 Subject: [PATCH 452/553] Improve `spoof-css` scriptlet Added special properties to spoof output of getBoundingClientRect(). --- assets/resources/run-at.js | 2 +- assets/resources/scriptlets.js | 118 +---------------------- assets/resources/spoof-css.js | 166 +++++++++++++++++++++++++++++++++ 3 files changed, 170 insertions(+), 116 deletions(-) create mode 100644 assets/resources/spoof-css.js diff --git a/assets/resources/run-at.js b/assets/resources/run-at.js index 0a7dfb5e4dbe5..65e1be534dd5a 100644 --- a/assets/resources/run-at.js +++ b/assets/resources/run-at.js @@ -82,7 +82,7 @@ registerScriptlet(runAt, { /******************************************************************************/ -function runAtHtmlElementFn(fn) { +export function runAtHtmlElementFn(fn) { if ( document.documentElement ) { fn(); return; diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 531959e23de66..46c31b6dc4e13 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -27,11 +27,13 @@ import './cookie.js'; import './localstorage.js'; import './run-at.js'; import './safe-self.js'; +import './spoof-css.js'; + +import { runAt, runAtHtmlElementFn } from './run-at.js'; import { getAllCookiesFn } from './cookie.js'; import { getAllLocalStorageFn } from './localstorage.js'; import { registeredScriptlets } from './base.js'; -import { runAt } from './run-at.js'; import { safeSelf } from './safe-self.js'; // Externally added to the private namespace in which scriptlets execute. @@ -3269,120 +3271,6 @@ function callNothrow( }); } - -/******************************************************************************/ - -builtinScriptlets.push({ - name: 'spoof-css.js', - fn: spoofCSS, - dependencies: [ - 'safe-self.fn', - ], -}); -function spoofCSS( - selector, - ...args -) { - if ( typeof selector !== 'string' ) { return; } - if ( selector === '' ) { return; } - const toCamelCase = s => s.replace(/-[a-z]/g, s => s.charAt(1).toUpperCase()); - const propToValueMap = new Map(); - for ( let i = 0; i < args.length; i += 2 ) { - if ( typeof args[i+0] !== 'string' ) { break; } - if ( args[i+0] === '' ) { break; } - if ( typeof args[i+1] !== 'string' ) { break; } - propToValueMap.set(toCamelCase(args[i+0]), args[i+1]); - } - const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('spoof-css', selector, ...args); - const canDebug = scriptletGlobals.canDebug; - const shouldDebug = canDebug && propToValueMap.get('debug') || 0; - const instanceProperties = [ 'cssText', 'length', 'parentRule' ]; - const spoofStyle = (prop, real) => { - const normalProp = toCamelCase(prop); - const shouldSpoof = propToValueMap.has(normalProp); - const value = shouldSpoof ? propToValueMap.get(normalProp) : real; - if ( shouldSpoof ) { - safe.uboLog(logPrefix, `Spoofing ${prop} to ${value}`); - } - return value; - }; - const cloackFunc = (fn, thisArg, name) => { - const trap = fn.bind(thisArg); - Object.defineProperty(trap, 'name', { value: name }); - Object.defineProperty(trap, 'toString', { - value: ( ) => `function ${name}() { [native code] }` - }); - return trap; - }; - self.getComputedStyle = new Proxy(self.getComputedStyle, { - apply: function(target, thisArg, args) { - // eslint-disable-next-line no-debugger - if ( shouldDebug !== 0 ) { debugger; } - const style = Reflect.apply(target, thisArg, args); - const targetElements = new WeakSet(document.querySelectorAll(selector)); - if ( targetElements.has(args[0]) === false ) { return style; } - const proxiedStyle = new Proxy(style, { - get(target, prop) { - if ( typeof target[prop] === 'function' ) { - if ( prop === 'getPropertyValue' ) { - return cloackFunc(function getPropertyValue(prop) { - return spoofStyle(prop, target[prop]); - }, target, 'getPropertyValue'); - } - return cloackFunc(target[prop], target, prop); - } - if ( instanceProperties.includes(prop) ) { - return Reflect.get(target, prop); - } - return spoofStyle(prop, Reflect.get(target, prop)); - }, - getOwnPropertyDescriptor(target, prop) { - if ( propToValueMap.has(prop) ) { - return { - configurable: true, - enumerable: true, - value: propToValueMap.get(prop), - writable: true, - }; - } - return Reflect.getOwnPropertyDescriptor(target, prop); - }, - }); - return proxiedStyle; - }, - get(target, prop) { - if ( prop === 'toString' ) { - return target.toString.bind(target); - } - return Reflect.get(target, prop); - }, - }); - Element.prototype.getBoundingClientRect = new Proxy(Element.prototype.getBoundingClientRect, { - apply: function(target, thisArg, args) { - // eslint-disable-next-line no-debugger - if ( shouldDebug !== 0 ) { debugger; } - const rect = Reflect.apply(target, thisArg, args); - const targetElements = new WeakSet(document.querySelectorAll(selector)); - if ( targetElements.has(thisArg) === false ) { return rect; } - let { height, width } = rect; - if ( propToValueMap.has('width') ) { - width = parseFloat(propToValueMap.get('width')); - } - if ( propToValueMap.has('height') ) { - height = parseFloat(propToValueMap.get('height')); - } - return new self.DOMRect(rect.x, rect.y, width, height); - }, - get(target, prop) { - if ( prop === 'toString' ) { - return target.toString.bind(target); - } - return Reflect.get(target, prop); - }, - }); -} - /******************************************************************************/ builtinScriptlets.push({ diff --git a/assets/resources/spoof-css.js b/assets/resources/spoof-css.js new file mode 100644 index 0000000000000..431c6f96b4d60 --- /dev/null +++ b/assets/resources/spoof-css.js @@ -0,0 +1,166 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2019-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 + + The scriptlets below are meant to be injected only into a + web page context. +*/ + +import { registerScriptlet } from './base.js'; +import { safeSelf } from './safe-self.js'; + +/** + * @scriptlet spoof-css.js + * + * @description + * Spoof the value of CSS properties. + * + * @param selector + * A CSS selector for the element(s) to target. + * + * @param [property, value, ...] + * A list of property-value pairs of the style properties to spoof to the + * specified values. +* + * */ + +export function spoofCSS( + selector, + ...args +) { + if ( typeof selector !== 'string' ) { return; } + if ( selector === '' ) { return; } + const toCamelCase = s => s.replace(/-[a-z]/g, s => s.charAt(1).toUpperCase()); + const propToValueMap = new Map(); + const privatePropToValueMap = new Map(); + for ( let i = 0; i < args.length; i += 2 ) { + const prop = toCamelCase(args[i+0]); + if ( typeof prop !== 'string' ) { break; } + if ( prop === '' ) { break; } + const value = args[i+1]; + if ( typeof value !== 'string' ) { break; } + if ( prop.charCodeAt(0) === 0x5F /* _ */ ) { + privatePropToValueMap.set(prop, value); + } else { + propToValueMap.set(toCamelCase(prop), value); + } + } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('spoof-css', selector, ...args); + const instanceProperties = [ 'cssText', 'length', 'parentRule' ]; + const spoofStyle = (prop, real) => { + const normalProp = toCamelCase(prop); + const shouldSpoof = propToValueMap.has(normalProp); + const value = shouldSpoof ? propToValueMap.get(normalProp) : real; + if ( shouldSpoof ) { + safe.uboLog(logPrefix, `Spoofing ${prop} to ${value}`); + } + return value; + }; + const cloackFunc = (fn, thisArg, name) => { + const trap = fn.bind(thisArg); + Object.defineProperty(trap, 'name', { value: name }); + Object.defineProperty(trap, 'toString', { + value: ( ) => `function ${name}() { [native code] }` + }); + return trap; + }; + self.getComputedStyle = new Proxy(self.getComputedStyle, { + apply: function(target, thisArg, args) { + // eslint-disable-next-line no-debugger + if ( privatePropToValueMap.has('_debug') ) { debugger; } + const style = Reflect.apply(target, thisArg, args); + const targetElements = new WeakSet(document.querySelectorAll(selector)); + if ( targetElements.has(args[0]) === false ) { return style; } + const proxiedStyle = new Proxy(style, { + get(target, prop) { + if ( typeof target[prop] === 'function' ) { + if ( prop === 'getPropertyValue' ) { + return cloackFunc(function getPropertyValue(prop) { + return spoofStyle(prop, target[prop]); + }, target, 'getPropertyValue'); + } + return cloackFunc(target[prop], target, prop); + } + if ( instanceProperties.includes(prop) ) { + return Reflect.get(target, prop); + } + return spoofStyle(prop, Reflect.get(target, prop)); + }, + getOwnPropertyDescriptor(target, prop) { + if ( propToValueMap.has(prop) ) { + return { + configurable: true, + enumerable: true, + value: propToValueMap.get(prop), + writable: true, + }; + } + return Reflect.getOwnPropertyDescriptor(target, prop); + }, + }); + return proxiedStyle; + }, + get(target, prop) { + if ( prop === 'toString' ) { + return target.toString.bind(target); + } + return Reflect.get(target, prop); + }, + }); + Element.prototype.getBoundingClientRect = new Proxy(Element.prototype.getBoundingClientRect, { + apply: function(target, thisArg, args) { + // eslint-disable-next-line no-debugger + if ( privatePropToValueMap.has('_debug') ) { debugger; } + const rect = Reflect.apply(target, thisArg, args); + const targetElements = new WeakSet(document.querySelectorAll(selector)); + if ( targetElements.has(thisArg) === false ) { return rect; } + let { x, y, height, width } = rect; + if ( privatePropToValueMap.has('_rectx') ) { + x = parseFloat(privatePropToValueMap.get('_rectx')); + } + if ( privatePropToValueMap.has('_recty') ) { + y = parseFloat(privatePropToValueMap.get('_recty')); + } + if ( privatePropToValueMap.has('_rectw') ) { + width = parseFloat(privatePropToValueMap.get('_rectw')); + } else if ( propToValueMap.has('width') ) { + width = parseFloat(propToValueMap.get('width')); + } + if ( privatePropToValueMap.has('_recth') ) { + height = parseFloat(privatePropToValueMap.get('_recth')); + } else if ( propToValueMap.has('height') ) { + height = parseFloat(propToValueMap.get('height')); + } + return new self.DOMRect(x, y, width, height); + }, + get(target, prop) { + if ( prop === 'toString' ) { + return target.toString.bind(target); + } + return Reflect.get(target, prop); + }, + }); +} +registerScriptlet(spoofCSS, { + name: 'spoof-css.js', + dependencies: [ + safeSelf, + ], +}); From edf4f52fe5cfd017a93313e0b0899489158d6992 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 16 Nov 2024 09:31:02 -0500 Subject: [PATCH 453/553] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bd7090450386..2482e13d7ffa4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- [Improve `spoof-css` scriptlet](https://github.com/gorhill/uBlock/commit/5f5e3d730f) +- [Improve `trusted-set-attr` scriptlet](https://github.com/gorhill/uBlock/commit/c8174d6032) - [Better handle unexpected conditions when deserializing](https://github.com/gorhill/uBlock/commit/4c299bfca9) - [Add support for EasyList `{ remove: true }` cosmetic filter syntax](https://github.com/gorhill/uBlock/commit/ff5fc61753) - [Fix potential infinite async loop](https://github.com/gorhill/uBlock/commit/335d947c10) (issue found by @Rob--W) From f8bd9a10073154bde006eaba61c1ae034a63e1ed Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 16 Nov 2024 09:31:29 -0500 Subject: [PATCH 454/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index c530652b600c5..060bb16eff91d 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.1.3 \ No newline at end of file +1.61.1.4 \ No newline at end of file From 442331136cbdbeb06dece0dafa881491d1335edc Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 16 Nov 2024 09:50:51 -0500 Subject: [PATCH 455/553] 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 757609c27b914..89febecae6472 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.1.3", + "version": "1.61.1.4", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.1b3/uBlock0_1.61.1b3.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.1b4/uBlock0_1.61.1b4.firefox.signed.xpi" } ] } From 51edb13a0699efe3e9c05004594b1fcbd54b15ed Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 16 Nov 2024 09:54:19 -0500 Subject: [PATCH 456/553] Minor code review --- assets/resources/spoof-css.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/assets/resources/spoof-css.js b/assets/resources/spoof-css.js index 431c6f96b4d60..32b51acf407c0 100644 --- a/assets/resources/spoof-css.js +++ b/assets/resources/spoof-css.js @@ -51,14 +51,13 @@ export function spoofCSS( const privatePropToValueMap = new Map(); for ( let i = 0; i < args.length; i += 2 ) { const prop = toCamelCase(args[i+0]); - if ( typeof prop !== 'string' ) { break; } if ( prop === '' ) { break; } const value = args[i+1]; if ( typeof value !== 'string' ) { break; } if ( prop.charCodeAt(0) === 0x5F /* _ */ ) { privatePropToValueMap.set(prop, value); } else { - propToValueMap.set(toCamelCase(prop), value); + propToValueMap.set(prop, value); } } const safe = safeSelf(); From b4a5b411b57906780ecd14c717cf438c2b179a32 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 16 Nov 2024 12:01:30 -0500 Subject: [PATCH 457/553] Add "RU AdList: Counters" to stock list Shouldn't be enabled by default, to conform it's working as intended. Related discussion: https://github.com/uBlockOrigin/uBOL-home/discussions/37#discussioncomment-9629942 --- assets/assets.dev.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/assets/assets.dev.json b/assets/assets.dev.json index f776738c10eb9..a51bc714c3933 100644 --- a/assets/assets.dev.json +++ b/assets/assets.dev.json @@ -826,6 +826,7 @@ "RUS-0": { "content": "filters", "group": "regions", + "parent": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", "off": true, "title": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek", @@ -839,6 +840,22 @@ "supportURL": "https://forums.lanik.us/viewforum.php?f=102", "instructionURL": "https://forums.lanik.us/viewtopic.php?f=102&t=22512" }, + "RUS-1": { + "content": "filters", + "group": "regions", + "parent": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", + "off": true, + "title": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList: Counters", + "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek be kk tt ru uk uz", + "contentURL": "https://raw.githubusercontent.com/easylist/ruadlist/master/cntblock.txt", + "cdnURLs": [ + "https://cdn.jsdelivr.net/gh/easylist/ruadlist@master/cntblock.txt", + "https://cdn.statically.io/gh/easylist/ruadlist/master/cntblock.txt", + "https://raw.githubusercontent.com/easylist/ruadlist/master/cntblock.txt" + ], + "supportURL": "https://forums.lanik.us/viewforum.php?f=102", + "instructionURL": "https://forums.lanik.us/viewtopic.php?f=102&t=22512" + }, "spa-0": { "content": "filters", "group": "regions", From ae4754415c9a01f18d3219972ef35b959536891f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 17 Nov 2024 17:27:27 -0500 Subject: [PATCH 458/553] [mv3] Re-work dashboard: move list of rulesets in its own pane Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/229 Add "Filter lists" pane in dashboard The DNR API now supports enabling 50 static rulesets put of a maximum of 100 (instead of 10 out of 50 originally). Thus given the potentially growing number of static rulesets, the available stock rulesets has been moved to its own pane, with the following improvements: - Support sublists - Support search Aditionally, "RU AdList: Counter" has been added as a stock ruleset. Other changes: - Do not re-evaluate regexes which failed validation - Better reduce `removeparam` rules --- platform/mv3/extension/css/dashboard.css | 2 + platform/mv3/extension/css/settings.css | 103 ++--- platform/mv3/extension/dashboard.html | 54 ++- platform/mv3/extension/js/filter-lists.js | 402 +++++++++++++++++++ platform/mv3/extension/js/ruleset-manager.js | 6 + platform/mv3/extension/js/settings.js | 298 +------------- platform/mv3/make-rulesets.js | 109 ++--- src/js/static-dnr-filtering.js | 2 +- tools/make-mv3.sh | 2 +- 9 files changed, 566 insertions(+), 412 deletions(-) create mode 100644 platform/mv3/extension/js/filter-lists.js diff --git a/platform/mv3/extension/css/dashboard.css b/platform/mv3/extension/css/dashboard.css index 6506c22722aca..454a799874fee 100644 --- a/platform/mv3/extension/css/dashboard.css +++ b/platform/mv3/extension/css/dashboard.css @@ -33,6 +33,7 @@ } body[data-pane="settings"] #dashboard-nav .tabButton[data-pane="settings"], +body[data-pane="rulesets"] #dashboard-nav .tabButton[data-pane="rulesets"], body[data-pane="about"] #dashboard-nav .tabButton[data-pane="about"] { background-color: var(--dashboard-tab-active-surface); border-bottom: 3px solid var(--dashboard-tab-active-ink); @@ -44,6 +45,7 @@ body > section { display: none; } body[data-pane="settings"] > section[data-pane="settings"], +body[data-pane="rulesets"] > section[data-pane="rulesets"], body[data-pane="about"] > section[data-pane="about"] { display: block; } diff --git a/platform/mv3/extension/css/settings.css b/platform/mv3/extension/css/settings.css index 3de13560cc4f1..da6e13a1aaf2f 100644 --- a/platform/mv3/extension/css/settings.css +++ b/platform/mv3/extension/css/settings.css @@ -79,92 +79,101 @@ h3[data-i18n="filteringMode0Name"]::first-letter { } #lists { - margin: 0.5em 0 0 0; - padding: 0; + padding-block-end: 8rem; } -.groupEntry:not([data-groupkey="user"]) .geDetails::before { - color: var(--ink-3); - content: '\2212'; - font-family: monospace; - font-size: large; - margin-inline-end: 0.25em; - -webkit-margin-end: 0.25em; - } -.groupEntry.hideUnused:not([data-groupkey="user"]) .geDetails::before { - content: '+'; +.listEntry { + display: flex; + flex-direction: column; } -.groupEntry { - margin: 0.5em 0; +.listEntry[data-nodeid] > .detailbar .listExpander { + cursor: pointer; + top: 2px; } -.groupEntry .geDetails { +.listEntry[data-role="rootnode"] > .detailbar, +.listEntry[data-nodeid] > .detailbar .count { cursor: pointer; } -.groupEntry .geName { +.listEntry[data-role="rootnode"] > .detailbar > *:not(.listExpander) { pointer-events: none; } -.groupEntry .geCount { +.listEntry .detailbar .count { + align-self: flex-end; color: var(--ink-3); - font-size: 90%; + font-size: small; pointer-events: none; } .listEntries { - margin-inline-start: 0.6em; - -webkit-margin-start: 0.6em; + display: flex; + flex-direction: column; + } +.listEntry:not([data-role="rootnode"]) > .listEntries { + margin-inline-start: var(--checkbox-size); } -.groupEntry:not([data-groupkey="user"]) .listEntry:not(.isDefault).unused { +.listEntry.hideUnused > .listEntries > .listEntry:not(.isDefault):has(> .detailbar input:not(:checked)) { display: none; } - .listEntry.fromAdmin:has(input[disabled]:not(:checked)) { display: none; } .listEntry > * { - margin-left: 0; - margin-right: 0; unicode-bidi: embed; } +.listEntry h3 { + display: inline-block; + margin: 0; + } +.listEntry > .detailbar { + align-items: center; + display: inline-flex; + margin: calc(var(--default-gap-xsmall) / 2 + var(--default-gap-xxsmall) / 2) 0; + white-space: nowrap; + } +.listEntry > .detailbar > *:not(:first-child) { + margin-inline-start: var(--default-gap-xxsmall); + } +.listEntry[data-nodeid="default"] > .detailbar > .listExpander { + display: none; + } +.listEntry > .detailbar > .listExpander svg { + transform: rotate(180deg); + transform-origin: 50%; + } +.listEntry.hideUnused > .detailbar > .listExpander svg { + transform: rotate(90deg); + } .listEntry .checkbox:has(input[disabled]), .listEntry .checkbox:has(input[disabled]) ~ span { filter: var(--checkbox-disabled-filter); } -.listEntry .listname { - white-space: nowrap; - } .listEntry a, .listEntry .fa-icon { color: var(--info0-ink); fill: var(--info0-ink); - display: none; font-size: 120%; - margin: 0 0.2em 0 0; } .listEntry .fa-icon:hover { transform: scale(1.25); } -.listEntry .content { - display: inline-flex; - } -.listEntry a.towiki { - display: inline-flex; - } -.listEntry.support a.support { - display: inline-flex; - } -.listEntry.mustread a.mustread { - color: var(--info1-ink); - fill: var(--info1-ink); - display: inline-flex; - } -.listEntry .status { - cursor: default; +.listEntry .iconbar a.support[href="#"] { display: none; -} + } -body.noMoreRuleset .listEntry:not(.checked) { +body.noMoreRuleset .listEntry:has(> .detailbar input:not(:checked)) { opacity: 0.5; pointer-events: none; } +#lists.searchMode > .listEntries .listEntries, +#lists.searchMode > .listEntries .listEntry.searchMatch { + display: flex !important; + } +#lists.searchMode > .listEntries .listEntry { + display: none; + } +#lists.searchMode > .listEntries .listExpander { + visibility: hidden; + } + /* touch-screen devices */ :root.mobile .listEntry .fa-icon { font-size: 120%; diff --git a/platform/mv3/extension/dashboard.html b/platform/mv3/extension/dashboard.html index 1cf7582050951..73dd72ac0fece 100644 --- a/platform/mv3/extension/dashboard.html +++ b/platform/mv3/extension/dashboard.html @@ -21,6 +21,7 @@
@@ -95,29 +96,14 @@

- + + +
-

-
-

-
-
-
-
-
- -
-
-
-
-
- +

+
search
+
@@ -146,6 +132,32 @@

+
+
+
+ + + home + + +
+ + +
diff --git a/platform/mv3/extension/js/filter-lists.js b/platform/mv3/extension/js/filter-lists.js new file mode 100644 index 0000000000000..a52dcb433c846 --- /dev/null +++ b/platform/mv3/extension/js/filter-lists.js @@ -0,0 +1,402 @@ +/******************************************************************************* + + uBlock Origin Lite - a comprehensive, MV3-compliant content blocker + Copyright (C) 2014-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 { dom, qs$, qsa$ } from './dom.js'; +import { i18n, i18n$ } from './i18n.js'; +import { localRead, localWrite, sendMessage } from './ext.js'; + +/******************************************************************************/ + +export const rulesetMap = new Map(); + +let cachedRulesetData = {}; +let hideUnusedSet = new Set([ 'regions' ]); + +/******************************************************************************/ + +function renderNumber(value) { + return value.toLocaleString(); +} + +function renderRuleCounts() { + let rulesetCount = 0; + let filterCount = 0; + let ruleCount = 0; + for ( const liEntry of qsa$('#lists .listEntry[data-role="leaf"][data-rulesetid]') ) { + if ( qs$(liEntry, 'input[type="checkbox"]:checked') === null ) { continue; } + rulesetCount += 1; + const stats = rulesetStats(liEntry.dataset.rulesetid); + if ( stats === undefined ) { continue; } + ruleCount += stats.ruleCount; + filterCount += stats.filterCount; + } + dom.text('#listsOfBlockedHostsPrompt', i18n$('perRulesetStats') + .replace('{{ruleCount}}', ruleCount.toLocaleString()) + .replace('{{filterCount}}', filterCount.toLocaleString()) + ); + + dom.cl.toggle(dom.body, 'noMoreRuleset', + rulesetCount === cachedRulesetData.maxNumberOfEnabledRulesets + ); +} + +/******************************************************************************/ + +function updateNodes(listEntries) { + listEntries = listEntries || qs$('#lists'); + for ( const listEntry of qsa$(listEntries, '.listEntry[data-nodeid]') ) { + const totalCount = qsa$(listEntry, '.listEntry[data-rulesetid] input').length; + const checkedCount = qsa$(listEntry, '.listEntry[data-rulesetid] input:checked').length; + dom.text(qs$(listEntry, '.detailbar .count'), `${checkedCount}/${totalCount}`); + const checkbox = qs$(listEntry, ':scope > .detailbar .checkbox'); + if ( checkbox === null ) { continue; } + dom.prop(qs$(checkbox, 'input'), 'checked', checkedCount !== 0); + dom.cl.toggle(checkbox, 'partial', + checkedCount !== 0 && checkedCount !== totalCount + ); + } +} + +/******************************************************************************/ + +function rulesetStats(rulesetId) { + const hasOmnipotence = cachedRulesetData.defaultFilteringMode > 1; + const rulesetDetails = rulesetMap.get(rulesetId); + if ( rulesetDetails === undefined ) { return; } + const { rules, filters } = rulesetDetails; + let ruleCount = rules.plain + rules.regex; + if ( hasOmnipotence ) { + ruleCount += rules.removeparam + rules.redirect + rules.modifyHeaders; + } + const filterCount = filters.accepted; + return { ruleCount, filterCount }; +} + +/******************************************************************************/ + +function isAdminRuleset(listkey) { + const { adminRulesets = [] } = cachedRulesetData; + for ( const id of adminRulesets ) { + const pos = id.indexOf(listkey); + if ( pos === 0 ) { return true; } + if ( pos !== 1 ) { continue; } + const c = id.charAt(0); + if ( c === '+' || c === '-' ) { return true; } + } + return false; +} + +/******************************************************************************/ + +export function renderFilterLists(rulesetData) { + cachedRulesetData = rulesetData; + const { enabledRulesets, rulesetDetails } = cachedRulesetData; + + const shouldUpdate = rulesetMap.size !== 0; + + rulesetDetails.forEach(rule => rulesetMap.set(rule.id, rule)); + + const listStatsTemplate = i18n$('perRulesetStats'); + + const initializeListEntry = (ruleset, listEntry) => { + const on = enabledRulesets.includes(ruleset.id); + dom.prop(qs$(listEntry, ':scope > .detailbar input'), 'checked', on); + if ( ruleset.homeURL ) { + dom.attr(qs$(listEntry, 'a.support'), 'href', ruleset.homeURL); + } + dom.cl.toggle(listEntry, 'isDefault', ruleset.id === 'default'); + const stats = rulesetStats(ruleset.id); + listEntry.title = listStatsTemplate + .replace('{{ruleCount}}', renderNumber(stats.ruleCount)) + .replace('{{filterCount}}', renderNumber(stats.filterCount)); + const fromAdmin = isAdminRuleset(ruleset.id); + dom.cl.toggle(listEntry, 'fromAdmin', fromAdmin); + const disabled = stats.ruleCount === 0 || fromAdmin; + dom.attr( + qs$(listEntry, '.input.checkbox input'), + 'disabled', + disabled ? '' : null + ); + return listEntry; + }; + + // Update already rendered DOM lists + if ( shouldUpdate ) { + for ( const listEntry of qsa$('#lists .listEntry[data-rulesetid]') ) { + const rulesetid = listEntry.dataset.rulesetid; + const ruleset = rulesetMap.get(rulesetid); + initializeListEntry(ruleset, listEntry); + } + updateNodes(); + renderRuleCounts(); + return; + } + + const createListEntry = (listDetails, depth) => { + if ( listDetails.lists === undefined ) { + return dom.clone('#templates .listEntry[data-role="leaf"]'); + } + if ( depth !== 0 ) { + return dom.clone('#templates .listEntry[data-role="node"]'); + } + return dom.clone('#templates .listEntry[data-role="rootnode"]'); + }; + + const createListEntries = (parentkey, listTree, depth = 0) => { + const listEntries = dom.clone('#templates .listEntries'); + const treeEntries = Object.entries(listTree); + if ( depth !== 0 ) { + const reEmojis = /\p{Emoji}+/gu; + treeEntries.sort((a ,b) => { + const ap = a[1].preferred === true; + const bp = b[1].preferred === true; + if ( ap !== bp ) { return ap ? -1 : 1; } + const as = (a[1].title || a[0]).replace(reEmojis, ''); + const bs = (b[1].title || b[0]).replace(reEmojis, ''); + return as.localeCompare(bs); + }); + } + for ( const [ listkey, listDetails ] of treeEntries ) { + const listEntry = createListEntry(listDetails, depth); + if ( listDetails.lists === undefined ) { + listEntry.dataset.rulesetid = listkey; + } else { + listEntry.dataset.nodeid = listkey; + dom.cl.toggle(listEntry, 'hideUnused', hideUnusedSet.has(listkey)); + } + qs$(listEntry, ':scope > .detailbar .listname').append( + i18n.patchUnicodeFlags(listDetails.name) + ); + if ( listDetails.lists !== undefined ) { + listEntry.append(createListEntries(listkey, listDetails.lists, depth+1)); + dom.cl.toggle(listEntry, 'expanded', true/*listIsExpanded(listkey)*/); + //updateListNode(listEntry); + } else { + initializeListEntry(listDetails, listEntry); + } + listEntries.append(listEntry); + } + return listEntries; + }; + + // Visually split the filter lists in groups + const groups = new Map([ + [ + 'default', + rulesetDetails.filter(ruleset => + ruleset.id === 'default' + ), + ], [ + 'annoyances', + rulesetDetails.filter(ruleset => + ruleset.group === 'annoyances' + ), + ], [ + 'misc', + rulesetDetails.filter(ruleset => + ruleset.id !== 'default' && + ruleset.group === undefined && + typeof ruleset.lang !== 'string' + ), + ], [ + 'regions', + rulesetDetails.filter(ruleset => + ruleset.group === 'regions' + ), + ], + ]); + + dom.cl.toggle(dom.body, 'hideUnused', mustHideUnusedLists('*')); + + // Build list tree + const listTree = {}; + const groupNames = new Map(); + for ( const [ groupKey, groupRulesets ] of groups ) { + let groupName = groupNames.get(groupKey); + if ( groupName === undefined ) { + groupName = i18n$('3pGroup' + groupKey.charAt(0).toUpperCase() + groupKey.slice(1)); + groupNames.set(groupKey, groupName); + } + const groupDetails = { + name: groupName, + lists: {}, + }; + listTree[groupKey] = groupDetails; + for ( const ruleset of groupRulesets ) { + if ( ruleset.parent !== undefined ) { + let lists = groupDetails.lists; + for ( const parent of ruleset.parent.split('|') ) { + if ( lists[parent] === undefined ) { + lists[parent] = { name: parent, lists: {} }; + } + lists = lists[parent].lists; + } + lists[ruleset.id] = ruleset; + } else { + groupDetails.lists[ruleset.id] = ruleset; + } + } + } + // Move lonely sublist to list level + const promoteLonelySublist = (parent, depth = 0) => { + if ( Boolean(parent.lists) === false ) { return parent; } + const childKeys = Object.keys(parent.lists); + for ( const childKey of childKeys ) { + const child = promoteLonelySublist(parent.lists[childKey], depth + 1); + if ( child === parent.lists[childKey] ) { continue; } + parent.lists[child.id] = child; + delete parent.lists[childKey]; + } + if ( depth === 0 ) { return parent; } + if ( childKeys.length > 1 ) { return parent; } + return parent.lists[childKeys[0]] + }; + for ( const key of Object.keys(listTree) ) { + promoteLonelySublist(listTree[key]); + } + const listEntries = createListEntries('root', listTree); + + updateNodes(listEntries); + + dom.clear('#lists'); + qs$('#lists').append(listEntries); + + renderRuleCounts(); +} + +/******************************************************************************/ + +// Collapsing of unused lists. + +function mustHideUnusedLists(which) { + const hideAll = hideUnusedSet.has('*'); + if ( which === '*' ) { return hideAll; } + return hideUnusedSet.has(which) !== hideAll; +} + +function toggleHideUnusedLists(which) { + const doesHideAll = hideUnusedSet.has('*'); + if ( which === '*' ) { + const mustHide = doesHideAll === false; + hideUnusedSet.clear(); + if ( mustHide ) { + hideUnusedSet.add(which); + } + dom.cl.toggle('#lists', 'hideUnused', mustHide); + dom.cl.toggle('.listEntry[data-nodeid]', 'hideUnused', mustHide); + } else { + const doesHide = hideUnusedSet.has(which); + if ( doesHide ) { + hideUnusedSet.delete(which); + } else { + hideUnusedSet.add(which); + } + const mustHide = doesHide === doesHideAll; + const groupSelector = `.listEntry[data-nodeid="${which}"]`; + dom.cl.toggle(groupSelector, 'hideUnused', mustHide); + } + + localWrite('hideUnusedFilterLists', Array.from(hideUnusedSet)); +} + +dom.on('#lists', 'click', '.listEntry[data-nodeid] > .detailbar, .listExpander', ev => { + toggleHideUnusedLists( + dom.attr(ev.target.closest('[data-nodeid]'), 'data-nodeid') + ); +}); + +// Initialize from saved state. +localRead('hideUnusedFilterLists').then(value => { + if ( Array.isArray(value) === false ) { return; } + hideUnusedSet = new Set(value); + for ( const listEntry of qsa$('[data-nodeid]') ) { + dom.cl.toggle(listEntry, 'hideUnused', + hideUnusedSet.has(listEntry.dataset.nodeid) + ); + } +}); + +/******************************************************************************/ + +const searchFilterLists = ( ) => { + const pattern = dom.prop('.searchfield input', 'value') || ''; + dom.cl.toggle('#lists', 'searchMode', pattern !== ''); + if ( pattern === '' ) { return; } + const re = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i'); + for ( const listEntry of qsa$('#lists [data-role="leaf"]') ) { + const rulesetid = listEntry.dataset.rulesetid; + const rulesetDetails = rulesetMap.get(rulesetid); + if ( rulesetDetails === undefined ) { continue; } + let haystack = perListHaystack.get(rulesetDetails); + if ( haystack === undefined ) { + haystack = [ + rulesetDetails.name, + listEntry.dataset.nodeid, + rulesetDetails.tags || '', + ].join(' ').trim(); + perListHaystack.set(rulesetDetails, haystack); + } + dom.cl.toggle(listEntry, 'searchMatch', re.test(haystack)); + } + for ( const listEntry of qsa$('#lists .listEntry:not([data-role="leaf"])') ) { + dom.cl.toggle(listEntry, 'searchMatch', + qs$(listEntry, '.listEntries .listEntry.searchMatch') !== null + ); + } +}; + +const perListHaystack = new WeakMap(); + +dom.on('.searchfield input', 'input', searchFilterLists); + +/******************************************************************************/ + +async function applyEnabledRulesets() { + const enabledRulesets = []; + for ( const liEntry of qsa$('#lists .listEntry[data-role="leaf"][data-rulesetid]') ) { + const checked = qs$(liEntry, 'input[type="checkbox"]:checked') !== null; + if ( checked === false ) { continue; } + const { rulesetid } = liEntry.dataset; + if ( dom.cl.has(liEntry, 'fromAdmin') ) { continue; } + enabledRulesets.push(rulesetid); + } + + await sendMessage({ + what: 'applyRulesets', + enabledRulesets, + }); +} + +dom.on('#lists', 'change', '.listEntry input[type="checkbox"]', ev => { + const input = ev.target; + const listEntry = input.closest('.listEntry'); + if ( listEntry === null ) { return; } + if ( listEntry.dataset.nodeid !== undefined ) { + let checkAll = input.checked || + dom.cl.has(qs$(listEntry, ':scope > .detailbar .checkbox'), 'partial'); + for ( const input of qsa$(listEntry, '.listEntries input') ) { + input.checked = checkAll; + } + } + renderRuleCounts(); + updateNodes(); + applyEnabledRulesets(); +}); diff --git a/platform/mv3/extension/js/ruleset-manager.js b/platform/mv3/extension/js/ruleset-manager.js index d19a9f28e9d65..f7d811e7d87bd 100644 --- a/platform/mv3/extension/js/ruleset-manager.js +++ b/platform/mv3/extension/js/ruleset-manager.js @@ -101,9 +101,14 @@ async function pruneInvalidRegexRules(realm, rulesIn) { toCheck.push(true); continue; } + if ( pruneInvalidRegexRules.invalidRegexes.has(regex) ) { + toCheck.push(false); + continue; + } toCheck.push( dnr.isRegexSupported({ regex, isCaseSensitive }).then(result => { if ( result.isSupported ) { return true; } + pruneInvalidRegexRules.invalidRegexes.add(regex); rejectedRegexRules.push(`\t${regex} ${result.reason}`); return false; }) @@ -122,6 +127,7 @@ async function pruneInvalidRegexRules(realm, rulesIn) { return rulesIn.filter((v, i) => isValid[i]); } +pruneInvalidRegexRules.invalidRegexes = new Set(); /******************************************************************************/ diff --git a/platform/mv3/extension/js/settings.js b/platform/mv3/extension/js/settings.js index a970430f33118..81f55d03cc416 100644 --- a/platform/mv3/extension/js/settings.js +++ b/platform/mv3/extension/js/settings.js @@ -19,201 +19,21 @@ Home: https://github.com/gorhill/uBlock */ -import { browser, localRead, localWrite, sendMessage } from './ext.js'; -import { dom, qs$, qsa$ } from './dom.js'; -import { i18n, i18n$ } from './i18n.js'; +import { browser, sendMessage } from './ext.js'; +import { dom, qs$ } from './dom.js'; import punycode from './punycode.js'; +import { renderFilterLists } from './filter-lists.js'; /******************************************************************************/ -const rulesetMap = new Map(); let cachedRulesetData = {}; -let hideUnusedSet = new Set([ 'regions' ]); /******************************************************************************/ -function renderNumber(value) { - return value.toLocaleString(); -} - function hashFromIterable(iter) { return Array.from(iter).sort().join('\n'); } -function isAdminRuleset(listkey) { - const { adminRulesets = [] } = cachedRulesetData; - for ( const id of adminRulesets ) { - const pos = id.indexOf(listkey); - if ( pos === 0 ) { return true; } - if ( pos !== 1 ) { continue; } - const c = id.charAt(0); - if ( c === '+' || c === '-' ) { return true; } - } - return false; -} - -/******************************************************************************/ - -function rulesetStats(rulesetId) { - const hasOmnipotence = cachedRulesetData.defaultFilteringMode > 1; - const rulesetDetails = rulesetMap.get(rulesetId); - if ( rulesetDetails === undefined ) { return; } - const { rules, filters } = rulesetDetails; - let ruleCount = rules.plain + rules.regex; - if ( hasOmnipotence ) { - ruleCount += rules.removeparam + rules.redirect + rules.modifyHeaders; - } - const filterCount = filters.accepted; - return { ruleCount, filterCount }; -} - -/******************************************************************************/ - -function renderFilterLists() { - const { enabledRulesets, rulesetDetails } = cachedRulesetData; - const listGroupTemplate = qs$('#templates .groupEntry'); - const listEntryTemplate = qs$('#templates .listEntry'); - const listStatsTemplate = i18n$('perRulesetStats'); - const groupNames = new Map([ [ 'user', '' ] ]); - - const liFromListEntry = function(ruleset, li, hideUnused) { - if ( !li ) { - li = dom.clone(listEntryTemplate); - } - const on = enabledRulesets.includes(ruleset.id); - dom.cl.toggle(li, 'checked', on); - dom.cl.toggle(li, 'unused', hideUnused && !on); - qs$(li, 'input[type="checkbox"]').checked = on; - if ( dom.attr(li, 'data-listkey') !== ruleset.id ) { - dom.attr(li, 'data-listkey', ruleset.id); - qs$(li, '.listname').append(i18n.patchUnicodeFlags(ruleset.name)); - dom.cl.remove(li, 'toRemove'); - if ( ruleset.homeURL ) { - dom.cl.add(li, 'support'); - dom.attr(qs$(li, 'a.support'), 'href', ruleset.homeURL); - } else { - dom.cl.remove(li, 'support'); - } - if ( ruleset.instructionURL ) { - dom.cl.add(li, 'mustread'); - dom.attr(qs$(li, 'a.mustread'), 'href', ruleset.instructionURL); - } else { - dom.cl.remove(li, 'mustread'); - } - dom.cl.toggle(li, 'isDefault', ruleset.id === 'default'); - } - const stats = rulesetStats(ruleset.id); - li.title = listStatsTemplate - .replace('{{ruleCount}}', renderNumber(stats.ruleCount)) - .replace('{{filterCount}}', renderNumber(stats.filterCount)); - const fromAdmin = isAdminRuleset(ruleset.id); - dom.cl.toggle(li, 'fromAdmin', fromAdmin); - const disabled = stats.ruleCount === 0 || fromAdmin; - dom.attr( - qs$(li, '.input.checkbox input'), - 'disabled', - disabled ? '' : null - ); - dom.cl.remove(li, 'discard'); - return li; - }; - - const listEntryCountFromGroup = function(groupRulesets) { - if ( Array.isArray(groupRulesets) === false ) { return ''; } - let count = 0, - total = 0; - for ( const ruleset of groupRulesets ) { - if ( enabledRulesets.includes(ruleset.id) ) { - count += 1; - } - total += 1; - } - return total !== 0 ? - `(${count.toLocaleString()}/${total.toLocaleString()})` : - ''; - }; - - const liFromListGroup = function(groupKey, groupRulesets) { - let liGroup = qs$(`#lists > .groupEntry[data-groupkey="${groupKey}"]`); - if ( liGroup === null ) { - liGroup = dom.clone(listGroupTemplate); - let groupName = groupNames.get(groupKey); - if ( groupName === undefined ) { - groupName = i18n$('3pGroup' + groupKey.charAt(0).toUpperCase() + groupKey.slice(1)); - groupNames.set(groupKey, groupName); - } - if ( groupName !== '' ) { - dom.text(qs$(liGroup, '.geName'), groupName); - } - } - if ( qs$(liGroup, '.geName:empty') === null ) { - dom.text( - qs$(liGroup, '.geCount'), - listEntryCountFromGroup(groupRulesets) - ); - } - const hideUnused = mustHideUnusedLists(groupKey); - dom.cl.toggle(liGroup, 'hideUnused', hideUnused); - const ulGroup = qs$(liGroup, '.listEntries'); - if ( !groupRulesets ) { return liGroup; } - groupRulesets.sort(function(a, b) { - return (a.name || '').localeCompare(b.name || ''); - }); - for ( let i = 0; i < groupRulesets.length; i++ ) { - const liEntry = liFromListEntry( - groupRulesets[i], - ulGroup.children[i], - hideUnused - ); - if ( liEntry.parentElement === null ) { - ulGroup.appendChild(liEntry); - } - } - return liGroup; - }; - - // Visually split the filter lists in groups - const ulLists = qs$('#lists'); - const groups = new Map([ - [ - 'default', - rulesetDetails.filter(ruleset => - ruleset.id === 'default' - ), - ], - [ - 'annoyances', - rulesetDetails.filter(ruleset => - ruleset.group === 'annoyances' - ), - ], - [ - 'misc', - rulesetDetails.filter(ruleset => - ruleset.id !== 'default' && - ruleset.group === undefined && - typeof ruleset.lang !== 'string' - ), - ], - [ - 'regions', - rulesetDetails.filter(ruleset => - typeof ruleset.lang === 'string' - ), - ], - ]); - - dom.cl.toggle(dom.body, 'hideUnused', mustHideUnusedLists('*')); - - for ( const [ groupKey, groupRulesets ] of groups ) { - const liGroup = liFromListGroup(groupKey, groupRulesets); - dom.attr(liGroup, 'data-groupkey', groupKey); - if ( liGroup.parentElement === null ) { - ulLists.appendChild(liGroup); - } - } -} - /******************************************************************************/ function renderWidgets() { @@ -235,27 +55,6 @@ function renderWidgets() { dom.attr(input, 'disabled', ''); } } - - // Compute total counts - let rulesetCount = 0; - let filterCount = 0; - let ruleCount = 0; - for ( const liEntry of qsa$('#lists .listEntry[data-listkey]') ) { - if ( qs$(liEntry, 'input[type="checkbox"]:checked') === null ) { continue; } - rulesetCount += 1; - const stats = rulesetStats(liEntry.dataset.listkey); - if ( stats === undefined ) { continue; } - ruleCount += stats.ruleCount; - filterCount += stats.filterCount; - } - dom.text('#listsOfBlockedHostsPrompt', i18n$('perRulesetStats') - .replace('{{ruleCount}}', ruleCount.toLocaleString()) - .replace('{{filterCount}}', filterCount.toLocaleString()) - ); - - dom.cl.toggle(dom.body, 'noMoreRuleset', - rulesetCount === cachedRulesetData.maxNumberOfEnabledRulesets - ); } /******************************************************************************/ @@ -300,7 +99,7 @@ async function onFilteringModeChange(ev) { default: break; } - renderFilterLists(); + renderFilterLists(cachedRulesetData); renderWidgets(); } @@ -367,89 +166,6 @@ self.addEventListener('beforeunload', changeTrustedSites); /******************************************************************************/ -async function applyEnabledRulesets() { - const enabledRulesets = []; - for ( const liEntry of qsa$('#lists .listEntry[data-listkey]') ) { - const checked = qs$(liEntry, 'input[type="checkbox"]:checked') !== null; - dom.cl.toggle(liEntry, 'checked', checked); - if ( checked === false ) { continue; } - const { listkey } = liEntry.dataset; - if ( isAdminRuleset(listkey) ) { continue; } - enabledRulesets.push(listkey); - } - - await sendMessage({ - what: 'applyRulesets', - enabledRulesets, - }); - - renderWidgets(); -} - -dom.on('#lists', 'change', '.listEntry input[type="checkbox"]', ( ) => { - applyEnabledRulesets(); -}); - -/******************************************************************************/ - -// Collapsing of unused lists. - -function mustHideUnusedLists(which) { - const hideAll = hideUnusedSet.has('*'); - if ( which === '*' ) { return hideAll; } - return hideUnusedSet.has(which) !== hideAll; -} - -function toggleHideUnusedLists(which) { - const doesHideAll = hideUnusedSet.has('*'); - let groupSelector; - let mustHide; - if ( which === '*' ) { - mustHide = doesHideAll === false; - groupSelector = ''; - hideUnusedSet.clear(); - if ( mustHide ) { - hideUnusedSet.add(which); - } - dom.cl.toggle(dom.body, 'hideUnused', mustHide); - dom.cl.toggle('.groupEntry[data-groupkey]', 'hideUnused', mustHide); - } else { - const doesHide = hideUnusedSet.has(which); - if ( doesHide ) { - hideUnusedSet.delete(which); - } else { - hideUnusedSet.add(which); - } - mustHide = doesHide === doesHideAll; - groupSelector = `.groupEntry[data-groupkey="${which}"]`; - dom.cl.toggle(groupSelector, 'hideUnused', mustHide); - } - - for ( const elem of qsa$(`#lists ${groupSelector} .listEntry[data-listkey] input[type="checkbox"]:not(:checked)`) ) { - dom.cl.toggle( - elem.closest('.listEntry[data-listkey]'), - 'unused', - mustHide - ); - } - - localWrite('hideUnusedFilterLists', Array.from(hideUnusedSet)); -} - -dom.on('#lists', 'click', '.groupEntry[data-groupkey] > .geDetails', ev => { - toggleHideUnusedLists( - dom.attr(ev.target.closest('[data-groupkey]'), 'data-groupkey') - ); -}); - -// Initialize from saved state. -localRead('hideUnusedFilterLists').then(value => { - if ( Array.isArray(value) === false ) { return; } - hideUnusedSet = new Set(value); -}); - -/******************************************************************************/ - function listen() { const bc = new self.BroadcastChannel('uBOL'); bc.onmessage = listen.onmessage; @@ -512,7 +228,7 @@ listen.onmessage = ev => { } if ( render === false ) { return; } - renderFilterLists(); + renderFilterLists(cachedRulesetData); renderWidgets(); }; @@ -523,10 +239,8 @@ sendMessage({ }).then(data => { if ( !data ) { return; } cachedRulesetData = data; - rulesetMap.clear(); - cachedRulesetData.rulesetDetails.forEach(rule => rulesetMap.set(rule.id, rule)); try { - renderFilterLists(); + renderFilterLists(cachedRulesetData); renderWidgets(); } catch(ex) { } diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index 09719101055b4..501af6f706aaf 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -1068,8 +1068,10 @@ async function rulesetFromURLs(assetDetails) { id: assetDetails.id, name: assetDetails.name, group: assetDetails.group, + parent: assetDetails.parent, enabled: assetDetails.enabled, lang: assetDetails.lang, + tags: assetDetails.tags, homeURL: assetDetails.homeURL, filters: { total: results.network.filterCount, @@ -1121,7 +1123,7 @@ async function main() { // Get assets.json content const assets = await fs.readFile( - `./assets.json`, + `./assets.dev.json`, { encoding: 'utf8' } ).then(text => JSON.parse(text) @@ -1155,55 +1157,6 @@ async function main() { ], }); - // Regional rulesets - const excludedLists = [ - 'ara-0', - 'EST-0', - ]; - // Merge lists which have same target languages - const langToListsMap = new Map(); - for ( const [ id, asset ] of Object.entries(assets) ) { - if ( asset.content !== 'filters' ) { continue; } - if ( asset.off !== true ) { continue; } - if ( typeof asset.lang !== 'string' ) { continue; } - if ( excludedLists.includes(id) ) { continue; } - let ids = langToListsMap.get(asset.lang); - if ( ids === undefined ) { - langToListsMap.set(asset.lang, ids = []); - } - ids.push(id); - } - for ( const ids of langToListsMap.values() ) { - const urls = []; - for ( const id of ids ) { - const asset = assets[id]; - const contentURL = Array.isArray(asset.contentURL) - ? asset.contentURL[0] - : asset.contentURL; - urls.push(contentURL); - } - const id = ids[0]; - const asset = assets[id]; - await rulesetFromURLs({ - id: id.toLowerCase(), - lang: asset.lang, - name: asset.title, - enabled: false, - urls, - homeURL: asset.supportURL, - }); - } - - await rulesetFromURLs({ - id: 'est-0', - group: 'regions', - lang: 'et', - name: '🇪🇪ee: Eesti saitidele kohandatud filter', - enabled: false, - urls: [ 'https://ubol-et.adblock.ee/list.txt' ], - homeURL: 'https://github.com/sander85/uBOL-et', - }); - // Handpicked rulesets from assets.json const handpicked = [ 'block-lan', @@ -1290,6 +1243,62 @@ async function main() { homeURL: 'https://github.com/StevenBlack/hosts#readme', }); + // Regional rulesets + const excludedLists = [ + 'ara-0', + 'EST-0', + ]; + // Merge lists which have same target languages + const langToListsMap = new Map(); + for ( const [ id, asset ] of Object.entries(assets) ) { + if ( asset.content !== 'filters' ) { continue; } + if ( asset.off !== true ) { continue; } + if ( asset.group !== 'regions' ) { continue; } + if ( excludedLists.includes(id) ) { continue; } + // Not all "regions" lists have a set language + const bundleId = asset.lang || + createHash('sha256').update(randomBytes(16)).digest('hex').slice(0,16); + let ids = langToListsMap.get(bundleId); + if ( ids === undefined ) { + langToListsMap.set(bundleId, ids = []); + } + ids.push(id); + } + for ( const ids of langToListsMap.values() ) { + const urls = []; + for ( const id of ids ) { + const asset = assets[id]; + const contentURL = Array.isArray(asset.contentURL) + ? asset.contentURL[0] + : asset.contentURL; + urls.push(contentURL); + } + const id = ids[0]; + const asset = assets[id]; + const rulesetDetails = { + id: id.toLowerCase(), + group: 'regions', + parent: asset.parent, + lang: asset.lang, + name: asset.title, + tags: asset.tags, + enabled: false, + urls, + homeURL: asset.supportURL, + }; + await rulesetFromURLs(rulesetDetails); + } + + await rulesetFromURLs({ + id: 'est-0', + group: 'regions', + lang: 'et', + name: '🇪🇪ee: Eesti saitidele kohandatud filter', + enabled: false, + urls: [ 'https://ubol-et.adblock.ee/list.txt' ], + homeURL: 'https://github.com/sander85/uBOL-et', + }); + writeFile( `${rulesetDir}/ruleset-details.json`, `${JSON.stringify(rulesetDetails, null, 1)}\n` diff --git a/src/js/static-dnr-filtering.js b/src/js/static-dnr-filtering.js index 2e87695bf593f..d3e7732a6771f 100644 --- a/src/js/static-dnr-filtering.js +++ b/src/js/static-dnr-filtering.js @@ -440,9 +440,9 @@ function finalizeRuleset(context, network) { } }; mergeRules(rulesetMap, 'resourceTypes'); + mergeRules(rulesetMap, 'removeParams'); mergeRules(rulesetMap, 'initiatorDomains'); mergeRules(rulesetMap, 'requestDomains'); - mergeRules(rulesetMap, 'removeParams'); mergeRules(rulesetMap, 'responseHeaders'); // Patch id diff --git a/tools/make-mv3.sh b/tools/make-mv3.sh index 3bb3c9ce4ae67..58a0505314968 100755 --- a/tools/make-mv3.sh +++ b/tools/make-mv3.sh @@ -108,7 +108,7 @@ if [ "$QUICK" != "yes" ]; then cp platform/mv3/*.js "$TMPDIR"/ cp platform/mv3/*.mjs "$TMPDIR"/ cp platform/mv3/extension/js/utils.js "$TMPDIR"/js/ - cp "$UBO_DIR"/assets/assets.json "$TMPDIR"/ + cp "$UBO_DIR"/assets/assets.dev.json "$TMPDIR"/ cp "$UBO_DIR"/assets/resources/*.js "$TMPDIR"/ cp -R platform/mv3/scriptlets "$TMPDIR"/ mkdir -p "$TMPDIR"/web_accessible_resources From d7c6b4199223e8e9015739d1a5400880271e1798 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 18 Nov 2024 10:16:01 -0500 Subject: [PATCH 459/553] [mv3] Code review re. re-worked dashboard Related commit: https://github.com/gorhill/uBlock/commit/ae4754415c9a01f18d3219972ef35b959536891f Fine-tuned visuals; fixed sublist quirks related to admin-selected lists. --- .../mv3/extension/_locales/en/messages.json | 4 ++ .../mv3/extension/css/dashboard-common.css | 1 + platform/mv3/extension/css/dashboard.css | 5 +- platform/mv3/extension/css/settings.css | 26 +++---- platform/mv3/extension/dashboard.html | 2 +- platform/mv3/extension/js/filter-lists.js | 72 +++++++++++-------- 6 files changed, 64 insertions(+), 46 deletions(-) diff --git a/platform/mv3/extension/_locales/en/messages.json b/platform/mv3/extension/_locales/en/messages.json index f8c4b376c59a3..60cc95401447c 100644 --- a/platform/mv3/extension/_locales/en/messages.json +++ b/platform/mv3/extension/_locales/en/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/css/dashboard-common.css b/platform/mv3/extension/css/dashboard-common.css index 8621d08704053..7abaeb5664dd0 100644 --- a/platform/mv3/extension/css/dashboard-common.css +++ b/platform/mv3/extension/css/dashboard-common.css @@ -3,6 +3,7 @@ body { box-sizing: border-box; display: flex; flex-direction: column; + max-height: 100vh; padding: 0 var(--default-gap-xxsmall); } body > * { diff --git a/platform/mv3/extension/css/dashboard.css b/platform/mv3/extension/css/dashboard.css index 454a799874fee..b7aa5adeee110 100644 --- a/platform/mv3/extension/css/dashboard.css +++ b/platform/mv3/extension/css/dashboard.css @@ -7,9 +7,6 @@ flex-wrap: wrap; overflow-x: hidden; padding: 0; - position: sticky; - top: 0; - z-index: 100; } .tabButton { background-color: transparent; @@ -43,6 +40,8 @@ body[data-pane="about"] #dashboard-nav .tabButton[data-pane="about"] { body > section { display: none; + overflow: auto; + padding-bottom: 8rem; } body[data-pane="settings"] > section[data-pane="settings"], body[data-pane="rulesets"] > section[data-pane="rulesets"], diff --git a/platform/mv3/extension/css/settings.css b/platform/mv3/extension/css/settings.css index da6e13a1aaf2f..fb5ba91517ab1 100644 --- a/platform/mv3/extension/css/settings.css +++ b/platform/mv3/extension/css/settings.css @@ -1,12 +1,3 @@ -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } - } -legend { - color: var(--ink-3); - font-size: var(--font-size-smaller); - padding: var(--default-gap-xxsmall); - } body .firstRun { display: none; } @@ -78,8 +69,19 @@ h3[data-i18n="filteringMode0Name"]::first-letter { width: 100%; } -#lists { - padding-block-end: 8rem; +section[data-pane="rulesets"] > div:first-of-type { + background-color: var(--surface-1); + flex-shrink: 0; + padding: 1em 0; + position: sticky; + top: 0; + z-index: 10; + } +section[data-pane="rulesets"] > div:first-of-type > p:first-of-type { + margin-top: 0; + } +section[data-pane="rulesets"] > div:first-of-type > p:last-of-type { + margin-bottom: 0; } .listEntry { display: flex; @@ -112,7 +114,7 @@ h3[data-i18n="filteringMode0Name"]::first-letter { .listEntry.hideUnused > .listEntries > .listEntry:not(.isDefault):has(> .detailbar input:not(:checked)) { display: none; } -.listEntry.fromAdmin:has(input[disabled]:not(:checked)) { +.listEntry.fromAdmin:has(> .detailbar input[disabled]:not(:checked)) { display: none; } .listEntry > * { diff --git a/platform/mv3/extension/dashboard.html b/platform/mv3/extension/dashboard.html index 73dd72ac0fece..2169031eb4b1c 100644 --- a/platform/mv3/extension/dashboard.html +++ b/platform/mv3/extension/dashboard.html @@ -101,8 +101,8 @@

+

-
search
diff --git a/platform/mv3/extension/js/filter-lists.js b/platform/mv3/extension/js/filter-lists.js index a52dcb433c846..c48f3e357e045 100644 --- a/platform/mv3/extension/js/filter-lists.js +++ b/platform/mv3/extension/js/filter-lists.js @@ -36,7 +36,9 @@ function renderNumber(value) { return value.toLocaleString(); } -function renderRuleCounts() { +/******************************************************************************/ + +function renderTotalRuleCounts() { let rulesetCount = 0; let filterCount = 0; let ruleCount = 0; @@ -49,8 +51,8 @@ function renderRuleCounts() { filterCount += stats.filterCount; } dom.text('#listsOfBlockedHostsPrompt', i18n$('perRulesetStats') - .replace('{{ruleCount}}', ruleCount.toLocaleString()) - .replace('{{filterCount}}', filterCount.toLocaleString()) + .replace('{{ruleCount}}', renderNumber(ruleCount)) + .replace('{{filterCount}}', renderNumber(filterCount)) ); dom.cl.toggle(dom.body, 'noMoreRuleset', @@ -62,16 +64,26 @@ function renderRuleCounts() { function updateNodes(listEntries) { listEntries = listEntries || qs$('#lists'); + const sublistSelector = '.listEntry[data-rulesetid] > .detailbar input'; + const checkedSublistSelector = `${sublistSelector}:checked`; + const adminSublistSelector = '.listEntry.fromAdmin[data-rulesetid] > .detailbar input'; for ( const listEntry of qsa$(listEntries, '.listEntry[data-nodeid]') ) { - const totalCount = qsa$(listEntry, '.listEntry[data-rulesetid] input').length; - const checkedCount = qsa$(listEntry, '.listEntry[data-rulesetid] input:checked').length; - dom.text(qs$(listEntry, '.detailbar .count'), `${checkedCount}/${totalCount}`); - const checkbox = qs$(listEntry, ':scope > .detailbar .checkbox'); - if ( checkbox === null ) { continue; } - dom.prop(qs$(checkbox, 'input'), 'checked', checkedCount !== 0); - dom.cl.toggle(checkbox, 'partial', + const countElem = qs$(listEntry, ':scope > .detailbar .count'); + if ( countElem === null ) { continue; } + const totalCount = qsa$(listEntry, sublistSelector).length; + const checkedCount = qsa$(listEntry, checkedSublistSelector).length; + dom.text(countElem, `${checkedCount}/${totalCount}`); + const checkboxElem = qs$(listEntry, ':scope > .detailbar .checkbox'); + if ( checkboxElem === null ) { continue; } + const checkboxInput = qs$(checkboxElem, 'input'); + dom.prop(checkboxInput, 'checked', checkedCount !== 0); + dom.cl.toggle(checkboxElem, 'partial', checkedCount !== 0 && checkedCount !== totalCount ); + const adminCount = qsa$(listEntry, adminSublistSelector).length; + const fromAdmin = adminCount === totalCount; + dom.cl.toggle(listEntry, 'fromAdmin', fromAdmin); + dom.attr(checkboxInput, 'disabled', fromAdmin ? '' : null); } } @@ -124,6 +136,7 @@ export function renderFilterLists(rulesetData) { } dom.cl.toggle(listEntry, 'isDefault', ruleset.id === 'default'); const stats = rulesetStats(ruleset.id); + if ( stats === undefined ) { return; } listEntry.title = listStatsTemplate .replace('{{ruleCount}}', renderNumber(stats.ruleCount)) .replace('{{filterCount}}', renderNumber(stats.filterCount)); @@ -135,7 +148,6 @@ export function renderFilterLists(rulesetData) { 'disabled', disabled ? '' : null ); - return listEntry; }; // Update already rendered DOM lists @@ -146,7 +158,7 @@ export function renderFilterLists(rulesetData) { initializeListEntry(ruleset, listEntry); } updateNodes(); - renderRuleCounts(); + renderTotalRuleCounts(); return; } @@ -229,20 +241,17 @@ export function renderFilterLists(rulesetData) { // Build list tree const listTree = {}; const groupNames = new Map(); - for ( const [ groupKey, groupRulesets ] of groups ) { - let groupName = groupNames.get(groupKey); - if ( groupName === undefined ) { - groupName = i18n$('3pGroup' + groupKey.charAt(0).toUpperCase() + groupKey.slice(1)); - groupNames.set(groupKey, groupName); + for ( const [ nodeid, rulesets ] of groups ) { + let name = groupNames.get(nodeid); + if ( name === undefined ) { + name = i18n$(`3pGroup${nodeid.charAt(0).toUpperCase()}${nodeid.slice(1)}`); + groupNames.set(nodeid, name); } - const groupDetails = { - name: groupName, - lists: {}, - }; - listTree[groupKey] = groupDetails; - for ( const ruleset of groupRulesets ) { + const details = { name, lists: {} }; + listTree[nodeid] = details; + for ( const ruleset of rulesets ) { if ( ruleset.parent !== undefined ) { - let lists = groupDetails.lists; + let lists = details.lists; for ( const parent of ruleset.parent.split('|') ) { if ( lists[parent] === undefined ) { lists[parent] = { name: parent, lists: {} }; @@ -251,11 +260,11 @@ export function renderFilterLists(rulesetData) { } lists[ruleset.id] = ruleset; } else { - groupDetails.lists[ruleset.id] = ruleset; + details.lists[ruleset.id] = ruleset; } } } - // Move lonely sublist to list level + // Replace composite list with only one sublist with sublist itself const promoteLonelySublist = (parent, depth = 0) => { if ( Boolean(parent.lists) === false ) { return parent; } const childKeys = Object.keys(parent.lists); @@ -279,7 +288,7 @@ export function renderFilterLists(rulesetData) { dom.clear('#lists'); qs$('#lists').append(listEntries); - renderRuleCounts(); + renderTotalRuleCounts(); } /******************************************************************************/ @@ -337,11 +346,12 @@ localRead('hideUnusedFilterLists').then(value => { /******************************************************************************/ const searchFilterLists = ( ) => { - const pattern = dom.prop('.searchfield input', 'value') || ''; + const pattern = dom.prop('#findInLists', 'value') || ''; dom.cl.toggle('#lists', 'searchMode', pattern !== ''); if ( pattern === '' ) { return; } const re = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i'); for ( const listEntry of qsa$('#lists [data-role="leaf"]') ) { + if ( dom.cl.has(listEntry, 'fromAdmin') ) { continue; } const rulesetid = listEntry.dataset.rulesetid; const rulesetDetails = rulesetMap.get(rulesetid); if ( rulesetDetails === undefined ) { continue; } @@ -365,7 +375,7 @@ const searchFilterLists = ( ) => { const perListHaystack = new WeakMap(); -dom.on('.searchfield input', 'input', searchFilterLists); +dom.on('#findInLists', 'input', searchFilterLists); /******************************************************************************/ @@ -379,6 +389,8 @@ async function applyEnabledRulesets() { enabledRulesets.push(rulesetid); } + if ( enabledRulesets.length === 0 ) { return; } + await sendMessage({ what: 'applyRulesets', enabledRulesets, @@ -396,7 +408,7 @@ dom.on('#lists', 'change', '.listEntry input[type="checkbox"]', ev => { input.checked = checkAll; } } - renderRuleCounts(); updateNodes(); + renderTotalRuleCounts(); applyEnabledRulesets(); }); From c95b08d76015380ec419105598bcec767ac43b74 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 18 Nov 2024 10:24:08 -0500 Subject: [PATCH 460/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.ja.txt | 8 ++++---- platform/mv3/extension/_locales/ja/messages.json | 2 +- src/_locales/zh_TW/messages.json | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/platform/mv3/description/webstore.ja.txt b/platform/mv3/description/webstore.ja.txt index 4271d4a7d3562..7a3068b6be7f7 100644 --- a/platform/mv3/description/webstore.ja.txt +++ b/platform/mv3/description/webstore.ja.txt @@ -1,8 +1,8 @@ uBO Lite (uBOL) は権限を必要としない MV3 ベースのコンテンツブロッカーです。 -デフォルトのルールセットは以下の通り。uBlock Origin のデフォルトフィルターセットと同じです。 +デフォルトのルールセットは以下の通りです。uBlock Origin のデフォルトフィルターセットと同じです。 -- uBlock Origin の内製フィルターリスト +- uBlock Origin の内蔵フィルターリスト - EasyList - EasyPrivacy - Peter Lowe’s Ad and tracking server list @@ -11,13 +11,13 @@ uBO Lite (uBOL) は権限を必要としない MV3 ベースのコンテンツ uBOL は完全に宣言的です。つまり、フィルタリングを行うための恒久的な uBOL プロセスは必要なく、CSS/JS インジェクション ベースのコンテンツフィルタリングは拡張機能ではなくブラウザによって、確実に実行されます。 これは uBOL がコンテンツブロッキングの際に CPU、メモリを消費しないことを意味します。uBOL のサービス ワーカーは ポップアップ パネルや設定ページでのみ必要とされます。 -uBOL はインストール時に広範な「データの読み取りと変更」の権限を要求しません。したがって uBlock Origin やその他の、インストール時に広範な「データの読み取りと変更」の権限を要求するコンテンツ ブロッカーに比べて、行えることが制限されています。 +uBOL はインストール時に広範な「データの読み取りと変更」の権限を要求しません。したがって uBlock Origin やその他の、インストール時に広範な「データの読み取りと変更」の権限を要求するコンテンツブロッカーに比べて、行えることが制限されています。 しかし、ユーザーの選んだ特定のサイトに対する拡張権限を「明示的に」付与すれば、そのサイト上で整形フィルターやスクリプトレットの挿入を用いた優れたフィルタリングを行うことができます。 特定のサイトで拡張された権限を付与するには、ポップアップ パネルを開いて、「最適」や「完全」のようなより高いフィルタリングモードを選択します。 -ブラウザは、現在のサイトで拡張機能によってリクエストされた追加の権限を付与することによってもたらされる影響について警告します。承認または拒否することができます。 +ブラウザーは、現在のサイトで拡張機能によってリクエストされた追加の権限を付与することによってもたらされる影響について警告します。承認または拒否することができます。 現在のサイトでの uBOL のリクエストを承認すると、現在のサイトにより良いフィルターを適用できるようになります。 diff --git a/platform/mv3/extension/_locales/ja/messages.json b/platform/mv3/extension/_locales/ja/messages.json index 0bbb9a0e36c06..a45ed763e734e 100644 --- a/platform/mv3/extension/_locales/ja/messages.json +++ b/platform/mv3/extension/_locales/ja/messages.json @@ -172,7 +172,7 @@ "description": "The header text for the welcome message section" }, "firstRunDescription": { - "message": "uBO Lite のインストールが完了しました。すべてのサイトに適用するデフォルトのフィルタリングモードを選んでください。\n\nデフォルトでは、データの読み書きの権限が必要ない基本モードが選択されています。 uBO Lite を信用してもらえるなら、データの読み書きや変更の権限を許可してもらえればすべてのサイトに対してより詳細なフィルタリングを有効化できます。", + "message": "uBO Lite のインストールが完了しました。すべてのサイトに適用するデフォルトのフィルタリングモードを選んでください。\n\nデフォルトでは、データの読み書きの権限が必要ない基本モードが選択されています。 uBO Lite を信用する場合は、データの読み書きや変更の権限を許可して、すべてのサイトに対してより高度なフィルタリングを有効化できます。", "description": "Descriptive text shown at first install time only " }, "defaultFilteringModeSectionLabel": { diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json index 14e980968ced6..05ec46212f2d8 100644 --- a/src/_locales/zh_TW/messages.json +++ b/src/_locales/zh_TW/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "終於有一款高效能的封鎖工具。對 CPU 和記憶體的佔用極低。", + "message": "終於,有款僅佔用少量 CPU 及記憶體的高效率阻擋器。", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { @@ -136,11 +136,11 @@ "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups1": { - "message": "點擊以阻擋此網站的所有彈出式視窗", + "message": "點擊以封鎖此網站的所有彈出式視窗", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups2": { - "message": "點擊以停止阻擋此網站的所有彈出式視窗", + "message": "點擊以解除封鎖此網站的所有彈出式視窗", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoLargeMedia": { @@ -152,7 +152,7 @@ "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia2": { - "message": "點擊以停止封鎖此網站的大型媒體元素", + "message": "點擊以解除封鎖此網站的大型媒體元素", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoCosmeticFiltering": { From 17e0a35650175afa6a000528eb0d86e93fa972b5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 18 Nov 2024 10:25:46 -0500 Subject: [PATCH 461/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/extension/_locales/ar/messages.json | 4 ++++ platform/mv3/extension/_locales/az/messages.json | 4 ++++ platform/mv3/extension/_locales/be/messages.json | 4 ++++ platform/mv3/extension/_locales/bg/messages.json | 4 ++++ platform/mv3/extension/_locales/bn/messages.json | 4 ++++ platform/mv3/extension/_locales/br_FR/messages.json | 4 ++++ platform/mv3/extension/_locales/bs/messages.json | 4 ++++ platform/mv3/extension/_locales/ca/messages.json | 4 ++++ platform/mv3/extension/_locales/cs/messages.json | 4 ++++ platform/mv3/extension/_locales/cv/messages.json | 4 ++++ platform/mv3/extension/_locales/cy/messages.json | 4 ++++ platform/mv3/extension/_locales/da/messages.json | 4 ++++ platform/mv3/extension/_locales/de/messages.json | 4 ++++ platform/mv3/extension/_locales/el/messages.json | 4 ++++ platform/mv3/extension/_locales/en_GB/messages.json | 4 ++++ platform/mv3/extension/_locales/eo/messages.json | 4 ++++ platform/mv3/extension/_locales/es/messages.json | 4 ++++ platform/mv3/extension/_locales/et/messages.json | 4 ++++ platform/mv3/extension/_locales/eu/messages.json | 4 ++++ platform/mv3/extension/_locales/fa/messages.json | 4 ++++ platform/mv3/extension/_locales/fi/messages.json | 4 ++++ platform/mv3/extension/_locales/fil/messages.json | 4 ++++ platform/mv3/extension/_locales/fr/messages.json | 4 ++++ platform/mv3/extension/_locales/fy/messages.json | 4 ++++ platform/mv3/extension/_locales/gl/messages.json | 4 ++++ platform/mv3/extension/_locales/gu/messages.json | 4 ++++ platform/mv3/extension/_locales/he/messages.json | 4 ++++ platform/mv3/extension/_locales/hi/messages.json | 4 ++++ platform/mv3/extension/_locales/hr/messages.json | 4 ++++ platform/mv3/extension/_locales/hu/messages.json | 4 ++++ platform/mv3/extension/_locales/hy/messages.json | 4 ++++ platform/mv3/extension/_locales/id/messages.json | 4 ++++ platform/mv3/extension/_locales/it/messages.json | 4 ++++ platform/mv3/extension/_locales/ja/messages.json | 4 ++++ platform/mv3/extension/_locales/ka/messages.json | 4 ++++ platform/mv3/extension/_locales/kk/messages.json | 4 ++++ platform/mv3/extension/_locales/kn/messages.json | 4 ++++ platform/mv3/extension/_locales/ko/messages.json | 4 ++++ platform/mv3/extension/_locales/lt/messages.json | 4 ++++ platform/mv3/extension/_locales/lv/messages.json | 4 ++++ platform/mv3/extension/_locales/mk/messages.json | 4 ++++ platform/mv3/extension/_locales/ml/messages.json | 4 ++++ platform/mv3/extension/_locales/mr/messages.json | 4 ++++ platform/mv3/extension/_locales/ms/messages.json | 4 ++++ platform/mv3/extension/_locales/nb/messages.json | 4 ++++ platform/mv3/extension/_locales/nl/messages.json | 4 ++++ platform/mv3/extension/_locales/oc/messages.json | 4 ++++ platform/mv3/extension/_locales/pa/messages.json | 4 ++++ platform/mv3/extension/_locales/pl/messages.json | 4 ++++ platform/mv3/extension/_locales/pt_BR/messages.json | 4 ++++ platform/mv3/extension/_locales/pt_PT/messages.json | 4 ++++ platform/mv3/extension/_locales/ro/messages.json | 4 ++++ platform/mv3/extension/_locales/ru/messages.json | 4 ++++ platform/mv3/extension/_locales/si/messages.json | 4 ++++ platform/mv3/extension/_locales/sk/messages.json | 4 ++++ platform/mv3/extension/_locales/sl/messages.json | 4 ++++ platform/mv3/extension/_locales/so/messages.json | 4 ++++ platform/mv3/extension/_locales/sq/messages.json | 4 ++++ platform/mv3/extension/_locales/sr/messages.json | 4 ++++ platform/mv3/extension/_locales/sv/messages.json | 4 ++++ platform/mv3/extension/_locales/sw/messages.json | 4 ++++ platform/mv3/extension/_locales/ta/messages.json | 4 ++++ platform/mv3/extension/_locales/te/messages.json | 4 ++++ platform/mv3/extension/_locales/th/messages.json | 4 ++++ platform/mv3/extension/_locales/tr/messages.json | 4 ++++ platform/mv3/extension/_locales/uk/messages.json | 4 ++++ platform/mv3/extension/_locales/ur/messages.json | 4 ++++ platform/mv3/extension/_locales/vi/messages.json | 4 ++++ platform/mv3/extension/_locales/zh_CN/messages.json | 4 ++++ platform/mv3/extension/_locales/zh_TW/messages.json | 4 ++++ 70 files changed, 280 insertions(+) diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index 76d422b078854..34bb05e35cad7 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "إظهار عدد الطلبات المحظورة على أيقونة شريط الأدوات", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/az/messages.json b/platform/mv3/extension/_locales/az/messages.json index 7c769e3f935dd..b573b25e394cf 100644 --- a/platform/mv3/extension/_locales/az/messages.json +++ b/platform/mv3/extension/_locales/az/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/be/messages.json b/platform/mv3/extension/_locales/be/messages.json index ee5a133da0542..5453c7b967e9e 100644 --- a/platform/mv3/extension/_locales/be/messages.json +++ b/platform/mv3/extension/_locales/be/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Паказваць колькасць заблакаваных запытаў на значку панэлі інструментаў", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index 51df9ca15e460..0a1fcef9b5dcf 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Показване на брояч в иконката за блокираните заявки", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/bn/messages.json b/platform/mv3/extension/_locales/bn/messages.json index d080906856e76..f2593fc516db7 100644 --- a/platform/mv3/extension/_locales/bn/messages.json +++ b/platform/mv3/extension/_locales/bn/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "কতগুলো অনুরোধ ব্লক করা হয়েছে তা টুলবার আইকনে দেখাও", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index 38d5e7715ba5a..5c3cb4830a02c 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Diskouez an niver a rekedoù bet stanket war arouez ar varrenn-ostilhoù", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/bs/messages.json b/platform/mv3/extension/_locales/bs/messages.json index 178795ae3117a..43466580b2805 100644 --- a/platform/mv3/extension/_locales/bs/messages.json +++ b/platform/mv3/extension/_locales/bs/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Prikažite broj blokiranih zahtjeva na ikoni trake sa alatkama", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/ca/messages.json b/platform/mv3/extension/_locales/ca/messages.json index f307f31ca115a..8c9860785ad04 100644 --- a/platform/mv3/extension/_locales/ca/messages.json +++ b/platform/mv3/extension/_locales/ca/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Mostra el nombre de sol·licituds blocades a la icona de la barra d'eines", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/cs/messages.json b/platform/mv3/extension/_locales/cs/messages.json index fb24661d25a84..059ba02b198e6 100644 --- a/platform/mv3/extension/_locales/cs/messages.json +++ b/platform/mv3/extension/_locales/cs/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Zobrazit počet blokovaných požadavků u ikony v panelu nástrojů", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/cv/messages.json b/platform/mv3/extension/_locales/cv/messages.json index c5f77c667a506..001ac9feaf606 100644 --- a/platform/mv3/extension/_locales/cv/messages.json +++ b/platform/mv3/extension/_locales/cv/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/cy/messages.json b/platform/mv3/extension/_locales/cy/messages.json index 5a445929a8b0d..bae4fc9205771 100644 --- a/platform/mv3/extension/_locales/cy/messages.json +++ b/platform/mv3/extension/_locales/cy/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/da/messages.json b/platform/mv3/extension/_locales/da/messages.json index 8a8c760677c92..5ca16cd167912 100644 --- a/platform/mv3/extension/_locales/da/messages.json +++ b/platform/mv3/extension/_locales/da/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Vis antallet af blokerede forespørgsler på værktøjsbjælkeikonet", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index a2504f952ed9e..b1a7d4fd1544f 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Anzahl der blockierten Anfragen auf dem Symbol in der Symbolleiste anzeigen", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index 7020c8b4c1e5c..b1941281a3299 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Εμφάνιση του αριθμού των αποκλεισμένων αιτημάτων στο εικονίδιο της γραμμής εργαλείων", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/en_GB/messages.json b/platform/mv3/extension/_locales/en_GB/messages.json index f1d2e99626386..ee80a063a5e79 100644 --- a/platform/mv3/extension/_locales/en_GB/messages.json +++ b/platform/mv3/extension/_locales/en_GB/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/eo/messages.json b/platform/mv3/extension/_locales/eo/messages.json index 786ace6c3fa7c..ec68394744eac 100644 --- a/platform/mv3/extension/_locales/eo/messages.json +++ b/platform/mv3/extension/_locales/eo/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 0232f371a0065..5c649d305bba1 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Mostrar el número de peticiones bloqueadas en el icono de la barra de herramientas", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/et/messages.json b/platform/mv3/extension/_locales/et/messages.json index ae248a7b0fc5f..ad7b35ced04c1 100644 --- a/platform/mv3/extension/_locales/et/messages.json +++ b/platform/mv3/extension/_locales/et/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Kuva tööriistariba ikoonil blokeeritud elementide arv", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/eu/messages.json b/platform/mv3/extension/_locales/eu/messages.json index a6dedc46b7d0d..a477239fc0fbe 100644 --- a/platform/mv3/extension/_locales/eu/messages.json +++ b/platform/mv3/extension/_locales/eu/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Tresna-barraren ikonoan blokeatutako eskaeren kopurua erakutsi", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/fa/messages.json b/platform/mv3/extension/_locales/fa/messages.json index 7f4e9782db8fb..cfdb831610f5d 100644 --- a/platform/mv3/extension/_locales/fa/messages.json +++ b/platform/mv3/extension/_locales/fa/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/fi/messages.json b/platform/mv3/extension/_locales/fi/messages.json index 4db333e85b415..0daddc50f5a53 100644 --- a/platform/mv3/extension/_locales/fi/messages.json +++ b/platform/mv3/extension/_locales/fi/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Näytä estettyjen pyyntöjen määrä työkalupalkin kuvakkeessa", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/fil/messages.json b/platform/mv3/extension/_locales/fil/messages.json index 8f81e02a64ea5..6450bb8f60597 100644 --- a/platform/mv3/extension/_locales/fil/messages.json +++ b/platform/mv3/extension/_locales/fil/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/fr/messages.json b/platform/mv3/extension/_locales/fr/messages.json index c18dccbeac544..cd8af002f5622 100644 --- a/platform/mv3/extension/_locales/fr/messages.json +++ b/platform/mv3/extension/_locales/fr/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Afficher le nombre de requêtes bloquées sur l'icône", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/fy/messages.json b/platform/mv3/extension/_locales/fy/messages.json index ac1895fd5da09..a6c66a520a936 100644 --- a/platform/mv3/extension/_locales/fy/messages.json +++ b/platform/mv3/extension/_locales/fy/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "It tal blokkearre oanfragen op it arkbalkepiktogram toane", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/gl/messages.json b/platform/mv3/extension/_locales/gl/messages.json index 59833de63f371..f45f9f240ed25 100644 --- a/platform/mv3/extension/_locales/gl/messages.json +++ b/platform/mv3/extension/_locales/gl/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Mostrar na icona da barra o número de peticións bloqueadas", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/gu/messages.json b/platform/mv3/extension/_locales/gu/messages.json index c5f77c667a506..001ac9feaf606 100644 --- a/platform/mv3/extension/_locales/gu/messages.json +++ b/platform/mv3/extension/_locales/gu/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/he/messages.json b/platform/mv3/extension/_locales/he/messages.json index 6dfbf8126ed13..2a49c7d181309 100644 --- a/platform/mv3/extension/_locales/he/messages.json +++ b/platform/mv3/extension/_locales/he/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "הצגת מספר הבקשות החסומות על הסמל", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/hi/messages.json b/platform/mv3/extension/_locales/hi/messages.json index 2a9dae26b6814..710ac407d6515 100644 --- a/platform/mv3/extension/_locales/hi/messages.json +++ b/platform/mv3/extension/_locales/hi/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "टूलबार आइकन पर अवरुद्ध अनुरोधों की संख्या दिखाएं", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/hr/messages.json b/platform/mv3/extension/_locales/hr/messages.json index 1834c868831d6..ce1be00206e5a 100644 --- a/platform/mv3/extension/_locales/hr/messages.json +++ b/platform/mv3/extension/_locales/hr/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Prikaži broj blokiranih zahtjeva na ikoni alatne trake", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index 987469483ed27..3ba4ccdcace10 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Blokkolt kérések számának megjelenítése az eszköztárikonon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/hy/messages.json b/platform/mv3/extension/_locales/hy/messages.json index a0cf19fa06bd7..9f6b7e347715e 100644 --- a/platform/mv3/extension/_locales/hy/messages.json +++ b/platform/mv3/extension/_locales/hy/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Ցուցադրել արգելափակված հայտերի քանակը գործիքների վահանակին", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/id/messages.json b/platform/mv3/extension/_locales/id/messages.json index 806263ff961c1..90b49987c904e 100644 --- a/platform/mv3/extension/_locales/id/messages.json +++ b/platform/mv3/extension/_locales/id/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Tampilkan jumlah permintaan yang diblokir pada ikon toolbar", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index 35bbc6c0ecb63..d2221f3c53620 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Mostra il numero delle richieste bloccate sull'icona nella barra degli strumenti", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/ja/messages.json b/platform/mv3/extension/_locales/ja/messages.json index a45ed763e734e..0efa9bd95eb7b 100644 --- a/platform/mv3/extension/_locales/ja/messages.json +++ b/platform/mv3/extension/_locales/ja/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "ブロックしたリクエストの数をツールバーのアイコンに表示", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/ka/messages.json b/platform/mv3/extension/_locales/ka/messages.json index 3f64b336305e0..0f95d40652fc8 100644 --- a/platform/mv3/extension/_locales/ka/messages.json +++ b/platform/mv3/extension/_locales/ka/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "აჩვენეთ დაბლოკილი მოთხოვნების რაოდენობა ხელსაწყოთა ზოლის ხატულაზე", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/kk/messages.json b/platform/mv3/extension/_locales/kk/messages.json index c5f77c667a506..001ac9feaf606 100644 --- a/platform/mv3/extension/_locales/kk/messages.json +++ b/platform/mv3/extension/_locales/kk/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/kn/messages.json b/platform/mv3/extension/_locales/kn/messages.json index 7ff919c228737..7b349ff0a0c16 100644 --- a/platform/mv3/extension/_locales/kn/messages.json +++ b/platform/mv3/extension/_locales/kn/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/ko/messages.json b/platform/mv3/extension/_locales/ko/messages.json index af43131206324..a5125f5ad676d 100644 --- a/platform/mv3/extension/_locales/ko/messages.json +++ b/platform/mv3/extension/_locales/ko/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "차단된 요청 개수를 도구 모음 아이콘에 표시", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/lt/messages.json b/platform/mv3/extension/_locales/lt/messages.json index d810f531ed358..7e7ae212faeef 100644 --- a/platform/mv3/extension/_locales/lt/messages.json +++ b/platform/mv3/extension/_locales/lt/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/lv/messages.json b/platform/mv3/extension/_locales/lv/messages.json index 810d5a0eab97b..03dd849089d62 100644 --- a/platform/mv3/extension/_locales/lv/messages.json +++ b/platform/mv3/extension/_locales/lv/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Rādīt aizturēto pieprasījumu skaitu rīkjoslas ikonā", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/mk/messages.json b/platform/mv3/extension/_locales/mk/messages.json index 06f558231a77c..60186c0844080 100644 --- a/platform/mv3/extension/_locales/mk/messages.json +++ b/platform/mv3/extension/_locales/mk/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/ml/messages.json b/platform/mv3/extension/_locales/ml/messages.json index a80d375c23054..0862924b4fa66 100644 --- a/platform/mv3/extension/_locales/ml/messages.json +++ b/platform/mv3/extension/_locales/ml/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/mr/messages.json b/platform/mv3/extension/_locales/mr/messages.json index c5f77c667a506..001ac9feaf606 100644 --- a/platform/mv3/extension/_locales/mr/messages.json +++ b/platform/mv3/extension/_locales/mr/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/ms/messages.json b/platform/mv3/extension/_locales/ms/messages.json index 6b015e7a9b1a6..853c8ce344b05 100644 --- a/platform/mv3/extension/_locales/ms/messages.json +++ b/platform/mv3/extension/_locales/ms/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Tunjukkan bilangan permintaan yang disekat pada ikon bar alat", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/nb/messages.json b/platform/mv3/extension/_locales/nb/messages.json index 4fd7bd3d1135c..a977e85326f83 100644 --- a/platform/mv3/extension/_locales/nb/messages.json +++ b/platform/mv3/extension/_locales/nb/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Vis antall blokkerte forespørsler på verktøylinjeikonet", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/nl/messages.json b/platform/mv3/extension/_locales/nl/messages.json index 07f45e9c4b0bb..50908b9723445 100644 --- a/platform/mv3/extension/_locales/nl/messages.json +++ b/platform/mv3/extension/_locales/nl/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Het aantal geblokkeerde aanvragen op het werkbalkpictogram tonen", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/oc/messages.json b/platform/mv3/extension/_locales/oc/messages.json index c5f77c667a506..001ac9feaf606 100644 --- a/platform/mv3/extension/_locales/oc/messages.json +++ b/platform/mv3/extension/_locales/oc/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/pa/messages.json b/platform/mv3/extension/_locales/pa/messages.json index 6858a0393cc7a..f8ce344bc6e10 100644 --- a/platform/mv3/extension/_locales/pa/messages.json +++ b/platform/mv3/extension/_locales/pa/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/pl/messages.json b/platform/mv3/extension/_locales/pl/messages.json index 5ecb3940621c0..57f1a9b193782 100644 --- a/platform/mv3/extension/_locales/pl/messages.json +++ b/platform/mv3/extension/_locales/pl/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Wyświetlaj liczbę zablokowanych żądań na ikonie paska narzędzi", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index 66f46188de874..c13d3d63d6551 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Mostrar o número de requisições bloqueadas no ícone da barra de ferramentas", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index f73c906c6560b..b15553d53cfff 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Mostra o número de pedidos bloqueados no ícone da barra de ferramentas", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/ro/messages.json b/platform/mv3/extension/_locales/ro/messages.json index 38939b3439529..0b6384fb5a384 100644 --- a/platform/mv3/extension/_locales/ro/messages.json +++ b/platform/mv3/extension/_locales/ro/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Arată numărul cererilor blocate pe simbolul extensiei", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/ru/messages.json b/platform/mv3/extension/_locales/ru/messages.json index e54dcead462a5..ed4dea09eb30f 100644 --- a/platform/mv3/extension/_locales/ru/messages.json +++ b/platform/mv3/extension/_locales/ru/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Показывать количество заблокированных запросов на иконке в панели инструментов", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/si/messages.json b/platform/mv3/extension/_locales/si/messages.json index 559224a0ca335..cf5b4f4413db1 100644 --- a/platform/mv3/extension/_locales/si/messages.json +++ b/platform/mv3/extension/_locales/si/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "මෙවලම් තීරු නිරූපකයේ අවහිර කළ ඉල්ලීම් ගණන පෙන්වන්න", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/sk/messages.json b/platform/mv3/extension/_locales/sk/messages.json index 3354d50d4de24..f319ffdd19382 100644 --- a/platform/mv3/extension/_locales/sk/messages.json +++ b/platform/mv3/extension/_locales/sk/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Zobraziť počet zablokovaných požiadaviek na ikone rozšírenia", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/sl/messages.json b/platform/mv3/extension/_locales/sl/messages.json index c5f77c667a506..001ac9feaf606 100644 --- a/platform/mv3/extension/_locales/sl/messages.json +++ b/platform/mv3/extension/_locales/sl/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/so/messages.json b/platform/mv3/extension/_locales/so/messages.json index c5f77c667a506..001ac9feaf606 100644 --- a/platform/mv3/extension/_locales/so/messages.json +++ b/platform/mv3/extension/_locales/so/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index 464f49455b042..da316b303a8ef 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Shfaq numrin e kërkesave të bllokuara në ikonën e instrumenteve", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/sr/messages.json b/platform/mv3/extension/_locales/sr/messages.json index b994f245dc511..19357465d89a6 100644 --- a/platform/mv3/extension/_locales/sr/messages.json +++ b/platform/mv3/extension/_locales/sr/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Прикажи број блокираних захтева на иконици на траци алата", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/sv/messages.json b/platform/mv3/extension/_locales/sv/messages.json index 7ef1749a8cd68..064f191794f75 100644 --- a/platform/mv3/extension/_locales/sv/messages.json +++ b/platform/mv3/extension/_locales/sv/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Visa antalet blockerade förfrågningar på verktygsfältsikonen", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/sw/messages.json b/platform/mv3/extension/_locales/sw/messages.json index c5f77c667a506..001ac9feaf606 100644 --- a/platform/mv3/extension/_locales/sw/messages.json +++ b/platform/mv3/extension/_locales/sw/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/ta/messages.json b/platform/mv3/extension/_locales/ta/messages.json index c5f77c667a506..001ac9feaf606 100644 --- a/platform/mv3/extension/_locales/ta/messages.json +++ b/platform/mv3/extension/_locales/ta/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/te/messages.json b/platform/mv3/extension/_locales/te/messages.json index dd2b1d19054ca..7a1cb67fa6a3b 100644 --- a/platform/mv3/extension/_locales/te/messages.json +++ b/platform/mv3/extension/_locales/te/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/th/messages.json b/platform/mv3/extension/_locales/th/messages.json index 9905daf714b4e..dd77461de48e0 100644 --- a/platform/mv3/extension/_locales/th/messages.json +++ b/platform/mv3/extension/_locales/th/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "แสดงจำนวนคำขอที่ถูกปิดกั้นบนไอคอนแถบเครื่องมือ", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/tr/messages.json b/platform/mv3/extension/_locales/tr/messages.json index 175effdcc1ad9..8699c2d9fc150 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Engellenen isteklerin sayısını araç çubuğu simgesinde göster", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index 5e5e47e002990..876a289449f94 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Показувати кількість заблокованих запитів на піктограмі панелі інструментів", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/ur/messages.json b/platform/mv3/extension/_locales/ur/messages.json index 4832e6feffc16..0af9983ebe907 100644 --- a/platform/mv3/extension/_locales/ur/messages.json +++ b/platform/mv3/extension/_locales/ur/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "ٹول بار کے آئیکن پر بلاک شدہ درخواستوں کی تعداد دکھائیں۔", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/vi/messages.json b/platform/mv3/extension/_locales/vi/messages.json index 306b1b1f46992..5826504b1cea4 100644 --- a/platform/mv3/extension/_locales/vi/messages.json +++ b/platform/mv3/extension/_locales/vi/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "Hiện số lượng yêu cầu bị chặn trên biểu tượng thanh công cụ", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/zh_CN/messages.json b/platform/mv3/extension/_locales/zh_CN/messages.json index bcc72a5fc3f9b..def4c6ac4a4c9 100644 --- a/platform/mv3/extension/_locales/zh_CN/messages.json +++ b/platform/mv3/extension/_locales/zh_CN/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "在工具栏图标上显示拦截请求数", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/zh_TW/messages.json b/platform/mv3/extension/_locales/zh_TW/messages.json index d497e91c6be01..7657061ef5404 100644 --- a/platform/mv3/extension/_locales/zh_TW/messages.json +++ b/platform/mv3/extension/_locales/zh_TW/messages.json @@ -230,5 +230,9 @@ "showBlockedCountLabel": { "message": "在工具列圖示上顯示被阻擋的連線請求的數量", "description": "Label for a checkbox in the options page" + }, + "findListsPlaceholder": { + "message": "Find lists", + "description": "Placeholder for the input field used to find lists" } } From f9ce06977d57bd579db0549149a4b8bf4d0141c3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 18 Nov 2024 14:05:19 -0500 Subject: [PATCH 462/553] [mv3] Fix `removeparam` potentially causing invalid DNR rules --- src/js/static-net-filtering.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index bc14d71dbbdb0..7e7e8bd5f2cae 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -4652,11 +4652,13 @@ StaticNetFilteringEngine.prototype.dnrFromCompiled = function(op, context, ...ar }; } if ( rule.condition.resourceTypes === undefined ) { - rule.condition.resourceTypes = [ - 'main_frame', - 'sub_frame', - 'xmlhttprequest', - ]; + if ( rule.condition.excludedResourceTypes === undefined ) { + rule.condition.resourceTypes = [ + 'main_frame', + 'sub_frame', + 'xmlhttprequest', + ]; + } } // https://github.com/uBlockOrigin/uBOL-home/issues/140 // Mitigate until DNR API flaw is addressed by browser vendors From 114acacd2e4104d2ab51a31d20fdd4a24eb526bb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 18 Nov 2024 14:08:30 -0500 Subject: [PATCH 463/553] [mv3] Batch changes thru dashboard UI to reduce worker's workload --- platform/mv3/extension/js/filter-lists.js | 65 ++++++++++++++++------- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/platform/mv3/extension/js/filter-lists.js b/platform/mv3/extension/js/filter-lists.js index c48f3e357e045..daa647c5e28c9 100644 --- a/platform/mv3/extension/js/filter-lists.js +++ b/platform/mv3/extension/js/filter-lists.js @@ -130,7 +130,9 @@ export function renderFilterLists(rulesetData) { const initializeListEntry = (ruleset, listEntry) => { const on = enabledRulesets.includes(ruleset.id); - dom.prop(qs$(listEntry, ':scope > .detailbar input'), 'checked', on); + if ( dom.cl.has(listEntry, 'toggled') === false ) { + dom.prop(qs$(listEntry, ':scope > .detailbar input'), 'checked', on); + } if ( ruleset.homeURL ) { dom.attr(qs$(listEntry, 'a.support'), 'href', ruleset.homeURL); } @@ -360,6 +362,7 @@ const searchFilterLists = ( ) => { haystack = [ rulesetDetails.name, listEntry.dataset.nodeid, + rulesetDetails.group || '', rulesetDetails.tags || '', ].join(' ').trim(); perListHaystack.set(rulesetDetails, haystack); @@ -379,34 +382,60 @@ dom.on('#findInLists', 'input', searchFilterLists); /******************************************************************************/ -async function applyEnabledRulesets() { - const enabledRulesets = []; - for ( const liEntry of qsa$('#lists .listEntry[data-role="leaf"][data-rulesetid]') ) { - const checked = qs$(liEntry, 'input[type="checkbox"]:checked') !== null; - if ( checked === false ) { continue; } - const { rulesetid } = liEntry.dataset; - if ( dom.cl.has(liEntry, 'fromAdmin') ) { continue; } - enabledRulesets.push(rulesetid); - } +const applyEnabledRulesets = (( ) => { + const apply = async ( ) => { + const enabledRulesets = []; + for ( const liEntry of qsa$('#lists .listEntry[data-role="leaf"][data-rulesetid]') ) { + const checked = qs$(liEntry, 'input[type="checkbox"]:checked') !== null; + if ( checked === false ) { continue; } + const { rulesetid } = liEntry.dataset; + if ( dom.cl.has(liEntry, 'fromAdmin') ) { continue; } + enabledRulesets.push(rulesetid); + } - if ( enabledRulesets.length === 0 ) { return; } + dom.cl.remove('#lists .listEntry.toggled', 'toggled'); + + if ( enabledRulesets.length === 0 ) { return; } + + await sendMessage({ + what: 'applyRulesets', + enabledRulesets, + }); + }; - await sendMessage({ - what: 'applyRulesets', - enabledRulesets, + let timer; + + self.addEventListener('beforeunload', ( ) => { + if ( timer !== undefined ) { return; } + self.clearTimeout(timer); + timer = undefined; + apply(); }); -} + + return function() { + if ( timer !== undefined ) { + self.clearTimeout(timer); + } + timer = self.setTimeout(( ) => { + timer = undefined; + apply(); + }, 997); + } +})(); dom.on('#lists', 'change', '.listEntry input[type="checkbox"]', ev => { const input = ev.target; const listEntry = input.closest('.listEntry'); if ( listEntry === null ) { return; } if ( listEntry.dataset.nodeid !== undefined ) { - let checkAll = input.checked || + const checkAll = input.checked || dom.cl.has(qs$(listEntry, ':scope > .detailbar .checkbox'), 'partial'); - for ( const input of qsa$(listEntry, '.listEntries input') ) { - input.checked = checkAll; + for ( const subListEntry of qsa$(listEntry, ':scope > .listEntries .listEntry[data-rulesetid]') ) { + dom.cl.add(subListEntry, 'toggled'); + dom.prop(qsa$(subListEntry, ':scope > .detailbar input'), 'checked', checkAll); } + } else { + dom.cl.add(listEntry, 'toggled'); } updateNodes(); renderTotalRuleCounts(); From 77ed83ff2f6b35b530301f6ec59ee902d5fb9a31 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 18 Nov 2024 14:19:21 -0500 Subject: [PATCH 464/553] Improve `urlskip=` filter option Automatically upgrade `http:` to `https:` in the resulting URL. Related feedback: https://github.com/uBlockOrigin/uBlock-issues/issues/3206#issuecomment-2480930555 --- src/js/static-net-filtering.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 7e7e8bd5f2cae..422d5af5d957e 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5533,7 +5533,10 @@ function urlSkip(directive, url, blocked, steps) { return; } const urlfinal = new URL(urlout); - if ( urlfinal.protocol !== 'https:' ) { return; } + if ( urlfinal.protocol !== 'https:' ) { + if ( urlfinal.protocol !== 'http:' ) { return; } + urlout = urlout.replace('http', 'https'); + } if ( blocked && redirectBlocked !== true ) { return; } return urlout; } catch(x) { From dfc3c252d29540f16e0b26f9cb8d72efff880841 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 18 Nov 2024 14:22:02 -0500 Subject: [PATCH 465/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2482e13d7ffa4..4ee6ad46eb1a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `urlskip=` filter option](https://github.com/gorhill/uBlock/commit/77ed83ff2f) - [Improve `spoof-css` scriptlet](https://github.com/gorhill/uBlock/commit/5f5e3d730f) - [Improve `trusted-set-attr` scriptlet](https://github.com/gorhill/uBlock/commit/c8174d6032) - [Better handle unexpected conditions when deserializing](https://github.com/gorhill/uBlock/commit/4c299bfca9) From 9fb90ad14cbc026536653c2828e3472ec9f7a52d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 18 Nov 2024 14:22:27 -0500 Subject: [PATCH 466/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 060bb16eff91d..5ed06fb6b14ba 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.1.4 \ No newline at end of file +1.61.1.5 \ No newline at end of file From 2f2f383c1b3e30960289ee9d3d05c96e7be97da5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 18 Nov 2024 14:25:44 -0500 Subject: [PATCH 467/553] 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 89febecae6472..cf2fa66bb6b8a 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.1.4", + "version": "1.61.1.5", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.1b4/uBlock0_1.61.1b4.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.1b5/uBlock0_1.61.1b5.firefox.signed.xpi" } ] } From f3486275e9bee0b21a767135f0adab8a0b557765 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 19 Nov 2024 13:16:56 -0500 Subject: [PATCH 468/553] [mv3] Fix force-reloading repeatedly when erroring at load time Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/234 --- platform/mv3/extension/js/background.js | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index ea8c9f608c1ce..0455b5a3c4755 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -35,7 +35,7 @@ import { adminRead, browser, dnr, - localRead, localWrite, + localRead, localRemove, localWrite, runtime, windows, } from './ext.js'; @@ -407,13 +407,19 @@ async function start() { // https://github.com/uBlockOrigin/uBOL-home/issues/199 // Force a restart of the extension once when an "internal error" occurs start().then(( ) => { - localWrite({ goodStart: true }); + localRemove('goodStart'); + return false; }).catch(reason => { console.trace(reason); - localRead('goodStart').then((bin = {}) => { - if ( bin.goodStart === false ) { return; } - localWrite({ goodStart: false }).then(( ) => { - runtime.reload(); - }); + if ( process.wakeupRun ) { return; } + return localRead('goodStart').then(goodStart => { + if ( goodStart === false ) { + localRemove('goodStart'); + return false; + } + return localWrite('goodStart', false).then(( ) => true); }); +}).then(restart => { + if ( restart !== true ) { return; } + runtime.reload(); }); From 3aac2a7c972d108eefdced5b4a9e540ec732d3e1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 19 Nov 2024 13:44:25 -0500 Subject: [PATCH 469/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/ar/messages.json | 2 +- .../mv3/extension/_locales/bg/messages.json | 2 +- .../extension/_locales/br_FR/messages.json | 2 +- .../mv3/extension/_locales/ca/messages.json | 2 +- .../mv3/extension/_locales/cs/messages.json | 2 +- .../mv3/extension/_locales/da/messages.json | 4 +- .../mv3/extension/_locales/de/messages.json | 2 +- .../mv3/extension/_locales/es/messages.json | 2 +- .../mv3/extension/_locales/et/messages.json | 2 +- .../mv3/extension/_locales/fa/messages.json | 4 +- .../mv3/extension/_locales/fi/messages.json | 2 +- .../mv3/extension/_locales/fr/messages.json | 2 +- .../mv3/extension/_locales/fy/messages.json | 2 +- .../mv3/extension/_locales/he/messages.json | 2 +- .../mv3/extension/_locales/hr/messages.json | 2 +- .../mv3/extension/_locales/it/messages.json | 2 +- .../mv3/extension/_locales/ka/messages.json | 2 +- .../mv3/extension/_locales/ko/messages.json | 4 +- .../mv3/extension/_locales/lv/messages.json | 54 +++++++++---------- .../mv3/extension/_locales/nl/messages.json | 2 +- .../mv3/extension/_locales/pl/messages.json | 2 +- .../extension/_locales/pt_BR/messages.json | 2 +- .../mv3/extension/_locales/ru/messages.json | 2 +- .../mv3/extension/_locales/sk/messages.json | 2 +- .../mv3/extension/_locales/sr/messages.json | 2 +- .../mv3/extension/_locales/sv/messages.json | 2 +- .../mv3/extension/_locales/tr/messages.json | 2 +- .../mv3/extension/_locales/uk/messages.json | 2 +- src/_locales/cy/messages.json | 22 ++++---- src/_locales/lv/messages.json | 8 +-- src/_locales/pt_BR/messages.json | 2 +- 31 files changed, 73 insertions(+), 73 deletions(-) diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index 34bb05e35cad7..b925a42e0bfb9 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "البحث عن القوائم", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index 0a1fcef9b5dcf..e3d6b2545756d 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Намиране на списъци", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index 5c3cb4830a02c..4db287b541a92 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Kavout rolloù", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/ca/messages.json b/platform/mv3/extension/_locales/ca/messages.json index 8c9860785ad04..ac4da9e1d2035 100644 --- a/platform/mv3/extension/_locales/ca/messages.json +++ b/platform/mv3/extension/_locales/ca/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Cerca llistes", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/cs/messages.json b/platform/mv3/extension/_locales/cs/messages.json index 059ba02b198e6..5bf5f9d8720f9 100644 --- a/platform/mv3/extension/_locales/cs/messages.json +++ b/platform/mv3/extension/_locales/cs/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Najít seznamy", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/da/messages.json b/platform/mv3/extension/_locales/da/messages.json index 5ca16cd167912..7d987b92b3102 100644 --- a/platform/mv3/extension/_locales/da/messages.json +++ b/platform/mv3/extension/_locales/da/messages.json @@ -212,7 +212,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Liste over værtsnavne, for hvilke ingen filtrering vil ske.", + "message": "Liste over websteder, for hvilke ingen filtrering vil ske.", "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Find lister", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index b1a7d4fd1544f..bdf6c74bb09c1 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Listen suchen", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 5c649d305bba1..89fa0aaddee9d 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Encontrar listas", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/et/messages.json b/platform/mv3/extension/_locales/et/messages.json index ad7b35ced04c1..008059cc3c63b 100644 --- a/platform/mv3/extension/_locales/et/messages.json +++ b/platform/mv3/extension/_locales/et/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Otsi nimekirju", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/fa/messages.json b/platform/mv3/extension/_locales/fa/messages.json index cfdb831610f5d..ebc8ca22f8f43 100644 --- a/platform/mv3/extension/_locales/fa/messages.json +++ b/platform/mv3/extension/_locales/fa/messages.json @@ -84,7 +84,7 @@ "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "شرکت کنندگان", "description": "English: Contributors" }, "aboutSourceCode": { @@ -168,7 +168,7 @@ "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { - "message": "Welcome", + "message": "درود", "description": "The header text for the welcome message section" }, "firstRunDescription": { diff --git a/platform/mv3/extension/_locales/fi/messages.json b/platform/mv3/extension/_locales/fi/messages.json index 0daddc50f5a53..ecce31bfecf64 100644 --- a/platform/mv3/extension/_locales/fi/messages.json +++ b/platform/mv3/extension/_locales/fi/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Etsi listoja", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/fr/messages.json b/platform/mv3/extension/_locales/fr/messages.json index cd8af002f5622..96c47b8e32218 100644 --- a/platform/mv3/extension/_locales/fr/messages.json +++ b/platform/mv3/extension/_locales/fr/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Trouver des listes", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/fy/messages.json b/platform/mv3/extension/_locales/fy/messages.json index a6c66a520a936..4befbce49f5d5 100644 --- a/platform/mv3/extension/_locales/fy/messages.json +++ b/platform/mv3/extension/_locales/fy/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Sykje listen", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/he/messages.json b/platform/mv3/extension/_locales/he/messages.json index 2a49c7d181309..e9b9d50d094c6 100644 --- a/platform/mv3/extension/_locales/he/messages.json +++ b/platform/mv3/extension/_locales/he/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "חיפוש רשימות", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/hr/messages.json b/platform/mv3/extension/_locales/hr/messages.json index ce1be00206e5a..d8918586540c5 100644 --- a/platform/mv3/extension/_locales/hr/messages.json +++ b/platform/mv3/extension/_locales/hr/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Pronađi liste", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index d2221f3c53620..058376269d5d7 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Trova elenchi", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/ka/messages.json b/platform/mv3/extension/_locales/ka/messages.json index 0f95d40652fc8..18931165b03ac 100644 --- a/platform/mv3/extension/_locales/ka/messages.json +++ b/platform/mv3/extension/_locales/ka/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "სიების მოძიება", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/ko/messages.json b/platform/mv3/extension/_locales/ko/messages.json index a5125f5ad676d..fbdc2048ef4da 100644 --- a/platform/mv3/extension/_locales/ko/messages.json +++ b/platform/mv3/extension/_locales/ko/messages.json @@ -96,7 +96,7 @@ "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "필터 리스트", + "message": "필터 목록", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "목록 찾기", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/lv/messages.json b/platform/mv3/extension/_locales/lv/messages.json index 03dd849089d62..bc81840985140 100644 --- a/platform/mv3/extension/_locales/lv/messages.json +++ b/platform/mv3/extension/_locales/lv/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Izmēģinājuma, bezatļauju satura aizturētājs. Aiztur reklāmas, izsekotājus, kriptoracējus un vēl uzreiz pēc uzstādīšanas.", + "message": "Bezatļauju satura aizturētājs. Aiztur reklāmas, izsekotājus, kriptoracējus un daudz ko citu uzreiz pēc uzstādīšanas.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -24,7 +24,7 @@ "description": "appears as tab name in dashboard" }, "aboutPrivacyPolicy": { - "message": "Privātuma nosacījumi", + "message": "Konfidencialitātes nosacījumi", "description": "Link to privacy policy on GitHub (English)" }, "popupFilteringModeLabel": { @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Ziņot par problēmu šajā tīmekļa vietnē", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -64,7 +64,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Traucējumi", + "message": "Kaitinoši elementi", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Ziņot aizturēšanas filtra problēmu", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Ziņot par aizturēšanas filtru problēmām konkrētās vietnēs uBlockOrigin/uAssets problēmu izsekotājam. Nepieciešams GitHub konts.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Lai izvairītos no brīvprātīgo noslogošanas ar ziņojumiem, kas atkārtojas, lūgums pārbaudīt, ka par šādu problēmu jau nav ziņots.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Meklēt līdzīgus ziņojumus", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Tīmekļa lapas adrese:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Tīmekļa lapa…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Atlasiet ierakstu --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Rāda reklāmas vai to paliekas", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Ir pārklājumi vai citas neērtības (kaitinoši elementi)", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Nosaka uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Ir ar konfidencialitāti saistītas nebūšanas", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Darbības traucējumi, kad uBO Lite ir iespējots", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Atver nevēlamas cilnes vai logus", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Noved pie ļaunprātīgas programmatūras, pikšķerēšanas", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Atzīmēt šo lapu kā “nav droša skatīšanai darbā (NSFW)” (“Not Safe For Work”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Izveidot jaunu ziņojumu", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { @@ -172,7 +172,7 @@ "description": "The header text for the welcome message section" }, "firstRunDescription": { - "message": "Tikko ir uzstādīts uBO Lite. Šeit var izvēlēties noklusējuma aizturēšanas veidu, ko izmantot visām tīmekļa vietnēm.\n\nPēc noklusējuma ir atlasīts Pamata, jo tam nav nepieciešama atļauja lasīt un mainīt datus. Ja uBO Lite šķiet uzticams, ir iespējams piešķirt plašas atļaujas lasīt un mainīt datus visās tīmekļa vietnēs, lai pēc noklusējuma iespējotu pilnīgākas aizturēšanas spējas visās tīmekļa vietnēs.", + "message": "Tikko tika uzstādīts uBO Lite. Šeit var izvēlēties noklusējuma aizturēšanas veidu, ko izmantot visām tīmekļa vietnēm.\n\nPēc noklusējuma ir atlasīts Pamata, jo tam nav nepieciešama atļauja lasīt un mainīt datus. Ja uBO Lite šķiet uzticams, ir iespējams piešķirt plašas atļaujas lasīt un mainīt datus visās tīmekļa vietnēs, lai pēc noklusējuma iespējotu pilnīgākas aizturēšanas spējas visās tīmekļa vietnēs.", "description": "Descriptive text shown at first install time only " }, "defaultFilteringModeSectionLabel": { @@ -196,7 +196,7 @@ "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "pilnīgais", + "message": "pilnais", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { @@ -204,19 +204,19 @@ "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Attīstītāka tīkla aizturēšana ar atsevišķu paplašinātu aizturēšanu, izmantojot atlasītos aizturēšanas sarakstus.\n\nNepieciešamas plašas atļaujas lasīt un mainīt visu tīmekļa vietņu datus.", + "message": "Labāka tīkla aizturēšana ar atsevišķu paplašinātu aizturēšanu, izmantojot atlasītos aizturēšanas sarakstus.\n\nNepieciešamas plašas atļaujas lasīt un mainīt visu tīmekļa vietņu datus.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Attīstītāka tīkla aizturēšana ar pamata un papildu paplašinātu aizturēšanu, izmantojot atlasītos aizturēšanas sarakstus.\n\nNepieciešamas plašas atļaujas lasīt un mainīt visu tīmekļa vietņu datus.\n\nPamata paplašinātā aizturēšana var izraisīt paaugstinātu tīmekļa vietnes resursu izmantošanu.", + "message": "Pilna tīkla aizturēšana ar pamata un papildu paplašinātu aizturēšanu, izmantojot atlasītos aizturēšanas sarakstus.\n\nNepieciešamas plašas atļaujas lasīt un mainīt visu tīmekļa vietņu datus.\n\nPamata paplašinātā aizturēšana var izraisīt paaugstinātu tīmekļa vietnes resursu izmantošanu.", "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Saraksts ar saimniekdatoru nosaukumiem, kuriem netiks pielietota aizturēšana", + "message": "Saraksts ar resursdatoru nosaukumiem, kuriem netiks pielietota aizturēšana", "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[tikai saimniekdatoru nosaukumi]\nexample.com\ngames.example\n...", + "message": "[tikai resursdatoru nosaukumi]\nexample.com\ngames.example\n...", "description": "Default text for in edit field" }, "behaviorSectionLabel": { @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Atrast sarakstus", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/nl/messages.json b/platform/mv3/extension/_locales/nl/messages.json index 50908b9723445..04734466a7481 100644 --- a/platform/mv3/extension/_locales/nl/messages.json +++ b/platform/mv3/extension/_locales/nl/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Lijsten zoeken", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/pl/messages.json b/platform/mv3/extension/_locales/pl/messages.json index 57f1a9b193782..257d2f0f3b680 100644 --- a/platform/mv3/extension/_locales/pl/messages.json +++ b/platform/mv3/extension/_locales/pl/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Znajdź listy", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index c13d3d63d6551..e539229d5c972 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Achar listas", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/ru/messages.json b/platform/mv3/extension/_locales/ru/messages.json index ed4dea09eb30f..b2e7be8d3185e 100644 --- a/platform/mv3/extension/_locales/ru/messages.json +++ b/platform/mv3/extension/_locales/ru/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Найти списки", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/sk/messages.json b/platform/mv3/extension/_locales/sk/messages.json index f319ffdd19382..b31acd2fdc324 100644 --- a/platform/mv3/extension/_locales/sk/messages.json +++ b/platform/mv3/extension/_locales/sk/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Nájsť zoznamy", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/sr/messages.json b/platform/mv3/extension/_locales/sr/messages.json index 19357465d89a6..20c22b359194d 100644 --- a/platform/mv3/extension/_locales/sr/messages.json +++ b/platform/mv3/extension/_locales/sr/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Пронађи листе", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/sv/messages.json b/platform/mv3/extension/_locales/sv/messages.json index 064f191794f75..857cfc707f316 100644 --- a/platform/mv3/extension/_locales/sv/messages.json +++ b/platform/mv3/extension/_locales/sv/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Hitta listor", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/tr/messages.json b/platform/mv3/extension/_locales/tr/messages.json index 8699c2d9fc150..511312a66afdf 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Liste bul", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index 876a289449f94..ea7338db5f6f7 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Знайти списки", "description": "Placeholder for the input field used to find lists" } } diff --git a/src/_locales/cy/messages.json b/src/_locales/cy/messages.json index 6a327d423fa44..02cfc802feb66 100644 --- a/src/_locales/cy/messages.json +++ b/src/_locales/cy/messages.json @@ -236,15 +236,15 @@ "description": "" }, "popupImageRulePrompt": { - "message": "images", + "message": "delweddau", "description": "" }, "popup3pAnyRulePrompt": { - "message": "3rd-party", + "message": "3ydd-parti", "description": "" }, "popup3pPassiveRulePrompt": { - "message": "3rd-party CSS/images", + "message": "CSS/delweddau 3ydd-parti", "description": "" }, "popupInlineScriptRulePrompt": { @@ -312,7 +312,7 @@ "description": "English: Click, Ctrl-click" }, "pickerContextMenuEntry": { - "message": "Block element…", + "message": "Blocio elfen…", "description": "An entry in the browser's contextual menu" }, "settingsCollapseBlockedPrompt": { @@ -464,11 +464,11 @@ "description": "English: Lists of blocked hosts" }, "3pApplyChanges": { - "message": "Apply changes", + "message": "Rhoi newidiadau ar waith", "description": "English: Apply changes" }, "3pGroupDefault": { - "message": "Built-in", + "message": "Mewnol", "description": "Filter lists section name" }, "3pGroupAds": { @@ -488,7 +488,7 @@ "description": "Filter lists section name" }, "3pGroupCookies": { - "message": "Cookie notices", + "message": "Hysbysiadau cwci", "description": "Filter lists section name" }, "3pGroupAnnoyances": { @@ -940,7 +940,7 @@ "description": "Third paragraph of 'Filter issues' section in Support pane" }, "supportS4H": { - "message": "Bug report", + "message": "Adroddiad nam", "description": "Header of 'Bug report' section in Support pane" }, "supportS4P1": { @@ -1032,7 +1032,7 @@ "description": "Link to privacy policy on GitHub (English)" }, "aboutChangelog": { - "message": "Changelog", + "message": "Cofnod newidiadau", "description": "" }, "aboutCode": { @@ -1224,11 +1224,11 @@ "description": "for generic 'Submit' buttons" }, "genericApplyChanges": { - "message": "Apply changes", + "message": "Rhoi newidiadau ar waith", "description": "for generic 'Apply changes' buttons" }, "genericRevert": { - "message": "Revert", + "message": "Gwrthdroi", "description": "for generic 'Revert' buttons" }, "genericBytes": { diff --git a/src/_locales/lv/messages.json b/src/_locales/lv/messages.json index 0775a23ec7dcc..5135003bf11a5 100644 --- a/src/_locales/lv/messages.json +++ b/src/_locales/lv/messages.json @@ -340,7 +340,7 @@ "description": "Section for controlling user interface appearance" }, "settingsThemeLabel": { - "message": "Izskats", + "message": "Motīvs", "description": "Label for checkbox to enable a custom dark theme" }, "settingsThemeAccent0Label": { @@ -480,7 +480,7 @@ "description": "Filter lists section name" }, "3pGroupMalware": { - "message": "Ļaundabīgo programmu domēni", + "message": "Aizsardzība pret ļaunprātīgām (inficētas vai satur vīrusus) vietnēm, drošība", "description": "Filter lists section name" }, "3pGroupSocial": { @@ -552,7 +552,7 @@ "description": "Button in the 'My filters' pane" }, "1pExport": { - "message": "Eksportēt", + "message": "Eksportēt…", "description": "Button in the 'My filters' pane" }, "1pExportFilename": { @@ -636,7 +636,7 @@ "description": "Button in the 'Trusted sites' pane" }, "whitelistExport": { - "message": "Eksportēt", + "message": "Eksportēt…", "description": "Button in the 'Trusted sites' pane" }, "whitelistExportFilename": { diff --git a/src/_locales/pt_BR/messages.json b/src/_locales/pt_BR/messages.json index 7c0790dca68bb..5929b4e56bcc4 100644 --- a/src/_locales/pt_BR/messages.json +++ b/src/_locales/pt_BR/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "Finalmente, um bloqueador eficiente. Com baixo uso de memória e CPU.", + "message": "Finalmente, um bloqueador eficiente. Com baixo uso de CPU e memória.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { From bcc058eba75d4cbb2cd0447885f75e0705812883 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 20 Nov 2024 07:53:52 -0500 Subject: [PATCH 470/553] Add `-safebase64` directive in `urlskip=` Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3206#issuecomment-2487392846 --- src/js/static-net-filtering.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 422d5af5d957e..f11b2b1472881 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5417,6 +5417,8 @@ StaticNetFilteringEngine.prototype.transformRequest = function(fctxt, out = []) * * `-base64`: decode the current string as a base64-encoded string. * + * `-safebase64`: decode the current string as a safe base64-encoded string. + * * `-uricomponent`: decode the current string as a URI encoded string. * * `-blocked`: allow the redirection of blocked requests. By default, blocked @@ -5498,6 +5500,12 @@ function urlSkip(directive, url, blocked, steps) { urlout = self.atob(urlin); continue; } + // Safe Base64 + if ( step === '-safebase64' ) { + urlout = urlin.replace(/[-_]/, safeBase64Replacer); + urlout = self.atob(urlout); + continue; + } // URI component if ( step === '-uricomponent' ) { urlout = self.decodeURIComponent(urlin); @@ -5543,6 +5551,9 @@ function urlSkip(directive, url, blocked, steps) { } } +const safeBase64Map = { '-': '+', '_': '/' }; +const safeBase64Replacer = s => safeBase64Map[s]; + /******************************************************************************/ // https://github.com/uBlockOrigin/uBlock-issues/issues/1626 From fbbd5765c85227d94970f2e4afc925c290c600b5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 20 Nov 2024 08:01:27 -0500 Subject: [PATCH 471/553] Update changelog --- CHANGELOG.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ee6ad46eb1a2..3016630f05dd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,8 @@ +- [Add `-safebase64` directive to `urlskip=` option](https://github.com/gorhill/uBlock/commit/bcc058eba7) - [Improve `urlskip=` filter option](https://github.com/gorhill/uBlock/commit/77ed83ff2f) - [Improve `spoof-css` scriptlet](https://github.com/gorhill/uBlock/commit/5f5e3d730f) - [Improve `trusted-set-attr` scriptlet](https://github.com/gorhill/uBlock/commit/c8174d6032) -- [Better handle unexpected conditions when deserializing](https://github.com/gorhill/uBlock/commit/4c299bfca9) - [Add support for EasyList `{ remove: true }` cosmetic filter syntax](https://github.com/gorhill/uBlock/commit/ff5fc61753) -- [Fix potential infinite async loop](https://github.com/gorhill/uBlock/commit/335d947c10) (issue found by @Rob--W) - [Keep moving related scriptlets into separate files](https://github.com/gorhill/uBlock/commit/e5a088738d) - [Improve `prevent-xhr` scriptlet](https://github.com/gorhill/uBlock/commit/ce4908b341) - [Improve `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/41616df866) @@ -11,6 +10,15 @@ ---------- +# 1.61.2 + +## Fixes / changes + +- [Better handle unexpected conditions when deserializing](https://github.com/gorhill/uBlock/commit/4c299bfca9) +- [Fix potential infinite async loop](https://github.com/gorhill/uBlock/commit/335d947c10) (issue found by @Rob--W) + +---------- + # 1.61.0 ## Fixes / changes From 11bbee93fe1d87eb371307b2977313cbf1ab2acd Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 20 Nov 2024 08:01:50 -0500 Subject: [PATCH 472/553] Ne wrevision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 5ed06fb6b14ba..9dbe8ea6eefd8 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.1.5 \ No newline at end of file +1.61.3.0 \ No newline at end of file From 4a8efe1ed840702ced1f7fb849f1cb07b7100917 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 20 Nov 2024 08:07:52 -0500 Subject: [PATCH 473/553] Replace all instances, not just the first one --- src/js/static-net-filtering.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index f11b2b1472881..f4769c2c21702 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -5502,7 +5502,7 @@ function urlSkip(directive, url, blocked, steps) { } // Safe Base64 if ( step === '-safebase64' ) { - urlout = urlin.replace(/[-_]/, safeBase64Replacer); + urlout = urlin.replace(/[-_]/g, safeBase64Replacer); urlout = self.atob(urlout); continue; } From 8ae33afb760446948fe1f4a1b7e87c343f8a9f33 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 20 Nov 2024 08:15:59 -0500 Subject: [PATCH 474/553] 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 cf2fa66bb6b8a..1a51d97ba7d92 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.1.5", + "version": "1.61.3.0", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.1b5/uBlock0_1.61.1b5.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b0/uBlock0_1.61.3b0.firefox.signed.xpi" } ] } From 6355a17187f70c288ff8354656835bdc0a1e13eb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 20 Nov 2024 09:04:52 -0500 Subject: [PATCH 475/553] [mv3] Fix flaw breaking scriptlets injection in optimal/basic mode Not all matching scriptlets were injected on a given site in Optimal or Complete mode when default mode was set to Basic or less. A high profile manifestation of this bug was that Youtube ads were not being blocked when using Optimal on Youtube while default mode was Basic. --- platform/mv3/extension/js/scripting-manager.js | 4 ++-- platform/mv3/extension/js/utils.js | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/platform/mv3/extension/js/scripting-manager.js b/platform/mv3/extension/js/scripting-manager.js index 814343ebe7500..23a6444ea0acd 100644 --- a/platform/mv3/extension/js/scripting-manager.js +++ b/platform/mv3/extension/js/scripting-manager.js @@ -450,8 +450,8 @@ function registerScriptlet(context, scriptletDetails) { targetHostnames = permissionGrantedHostnames; } else { targetHostnames = ut.intersectHostnameIters( - permissionGrantedHostnames, - scriptletHostnames + scriptletHostnames, + permissionGrantedHostnames ); } } diff --git a/platform/mv3/extension/js/utils.js b/platform/mv3/extension/js/utils.js index b32104f946062..7bf6e13503dfd 100644 --- a/platform/mv3/extension/js/utils.js +++ b/platform/mv3/extension/js/utils.js @@ -47,6 +47,13 @@ const isDescendantHostname = (hna, hnb) => { return hna.charCodeAt(hna.length - hnb.length - 1) === 0x2E /* '.' */; }; +/** + * Returns whether a hostname is part of a collection, or is descendant of an + * item in the collection. + * @param hna - the hostname representing the needle. + * @param iterb - an iterable representing the haystack of hostnames. + */ + const isDescendantHostnameOfIter = (hna, iterb) => { const setb = iterb instanceof Set ? iterb : new Set(iterb); if ( setb.has('all-urls') || setb.has('*') ) { return true; } @@ -60,6 +67,13 @@ const isDescendantHostnameOfIter = (hna, iterb) => { return false; }; +/** + * Returns all hostnames in the first collection which are equal or descendant + * of hostnames in the second collection. + * @param itera - an iterable which hostnames must be filtered out. + * @param iterb - an iterable which hostnames must be matched. + */ + const intersectHostnameIters = (itera, iterb) => { const setb = iterb instanceof Set ? iterb : new Set(iterb); if ( setb.has('all-urls') || setb.has('*') ) { return Array.from(itera); } From b2d7bb72c79968894ff3c69abd231c8bef96f3cb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 20 Nov 2024 12:55:13 -0500 Subject: [PATCH 476/553] [mv3] Write log.txt file to extension folder --- platform/mv3/make-rulesets.js | 2 +- tools/make-mv3.sh | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index 501af6f706aaf..04688f15a0ae3 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -1351,7 +1351,7 @@ async function main() { // Log results const logContent = stdOutput.join('\n') + '\n'; - await fs.writeFile(`${cacheDir}/log.txt`, logContent); + await fs.writeFile(`${outputDir}/log.txt`, logContent); } main(); diff --git a/tools/make-mv3.sh b/tools/make-mv3.sh index 58a0505314968..92ce9d445177a 100755 --- a/tools/make-mv3.sh +++ b/tools/make-mv3.sh @@ -161,6 +161,7 @@ if [ "$FULL" = "yes" ]; then mkdir -p "$TMPDIR" cp -R "$DES"/* "$TMPDIR"/ cd "$TMPDIR" > /dev/null + rm -f ./log.txt zip "$PACKAGENAME" -qr ./* cd - > /dev/null cp "$TMPDIR"/"$PACKAGENAME" dist/build/ From 4979aa51f5eaad190acad512ff45ec28fefe1fde Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 21 Nov 2024 12:54:28 -0500 Subject: [PATCH 477/553] [mv3] Do not collect matched rules by default when side-loaded Collecting matched rules when the extension is side-loaded is now opt-in, by enabling "Developer mode" in the dashboard. The reason is to allow the extension to behave same as the official released version when side-loaded. Specifically, as side-loaded extension, uBOL's service worker would wake up due to matched-rule listener even though it would not wake up the worker with same configuration in stable release. --- platform/mv3/extension/dashboard.html | 1 + platform/mv3/extension/js/background.js | 14 +++ platform/mv3/extension/js/config.js | 19 ++-- platform/mv3/extension/js/debug.js | 136 ++++++++++++------------ platform/mv3/extension/js/popup.js | 1 + platform/mv3/extension/js/settings.js | 16 +++ 6 files changed, 108 insertions(+), 79 deletions(-) diff --git a/platform/mv3/extension/dashboard.html b/platform/mv3/extension/dashboard.html index 2169031eb4b1c..c8442cabc76a7 100644 --- a/platform/mv3/extension/dashboard.html +++ b/platform/mv3/extension/dashboard.html @@ -31,6 +31,7 @@

+

diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index 0455b5a3c4755..fcbc9af6036c4 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -50,6 +50,7 @@ import { import { getMatchedRules, isSideloaded, + toggleDeveloperMode, ubolLog, } from './debug.js'; @@ -207,6 +208,8 @@ function onMessage(request, sender, callback) { showBlockedCount: rulesetConfig.showBlockedCount, canShowBlockedCount, firstRun: process.firstRun, + isSideloaded, + developerMode: rulesetConfig.developerMode, }); process.firstRun = false; }); @@ -234,6 +237,14 @@ function onMessage(request, sender, callback) { }); return true; + case 'setDeveloperMode': + rulesetConfig.developerMode = request.state; + toggleDeveloperMode(rulesetConfig.developerMode); + saveRulesetConfig().then(( ) => { + callback(); + }); + return true; + case 'popupPanelData': { Promise.all([ getFilteringMode(request.hostname), @@ -248,6 +259,7 @@ function onMessage(request, sender, callback) { hasGreatPowers: results[2], rulesetDetails: results[3], isSideloaded, + developerMode: rulesetConfig.developerMode, }); }); return true; @@ -402,6 +414,8 @@ async function start() { process.firstRun = false; } } + + toggleDeveloperMode(rulesetConfig.developerMode); } // https://github.com/uBlockOrigin/uBOL-home/issues/199 diff --git a/platform/mv3/extension/js/config.js b/platform/mv3/extension/js/config.js index bb74a4416c551..71524e56048bb 100644 --- a/platform/mv3/extension/js/config.js +++ b/platform/mv3/extension/js/config.js @@ -33,6 +33,7 @@ export const rulesetConfig = { enabledRulesets: [ 'default' ], autoReload: true, showBlockedCount: true, + developerMode: false, }; export const process = { @@ -47,12 +48,9 @@ export async function loadRulesetConfig() { if ( sessionData ) { rulesetConfig.version = sessionData.version; rulesetConfig.enabledRulesets = sessionData.enabledRulesets; - rulesetConfig.autoReload = typeof sessionData.autoReload === 'boolean' - ? sessionData.autoReload - : true; - rulesetConfig.showBlockedCount = typeof sessionData.showBlockedCount === 'boolean' - ? sessionData.showBlockedCount - : true; + rulesetConfig.autoReload = sessionData.autoReload ?? true; + rulesetConfig.showBlockedCount = sessionData.showBlockedCount ?? true; + rulesetConfig.developerMode = sessionData.developerMode ?? false; process.wakeupRun = true; return; } @@ -60,12 +58,9 @@ export async function loadRulesetConfig() { if ( localData ) { rulesetConfig.version = localData.version; rulesetConfig.enabledRulesets = localData.enabledRulesets; - rulesetConfig.autoReload = typeof localData.autoReload === 'boolean' - ? localData.autoReload - : true; - rulesetConfig.showBlockedCount = typeof localData.showBlockedCount === 'boolean' - ? localData.showBlockedCount - : true; + rulesetConfig.autoReload = localData.autoReload ?? true; + rulesetConfig.showBlockedCount = localData.showBlockedCount ?? true; + rulesetConfig.developerMode = localData.developerMode ?? false; sessionWrite('rulesetConfig', rulesetConfig); return; } diff --git a/platform/mv3/extension/js/debug.js b/platform/mv3/extension/js/debug.js index 9488260d856c2..0a6ecaffe70ee 100644 --- a/platform/mv3/extension/js/debug.js +++ b/platform/mv3/extension/js/debug.js @@ -19,21 +19,11 @@ Home: https://github.com/gorhill/uBlock */ -import { browser, dnr } from './ext.js'; +import { dnr } from './ext.js'; /******************************************************************************/ -export const isSideloaded = (( ) => { - if ( dnr.onRuleMatchedDebug instanceof Object === false ) { return false; } - const { id } = browser.runtime; - // https://addons.mozilla.org/en-US/firefox/addon/ublock-origin-lite/ - if ( id === 'uBOLite@raymondhill.net' ) { return false; } - // https://chromewebstore.google.com/detail/ddkjiahejlhfcafbddmgiahcphecmpfh - if ( id === 'ddkjiahejlhfcafbddmgiahcphecmpfh' ) { return false; } - // https://microsoftedge.microsoft.com/addons/detail/cimighlppcgcoapaliogpjjdehbnofhn - if ( id === 'cimighlppcgcoapaliogpjjdehbnofhn' ) { return false; } - return true; -})(); +export const isSideloaded = dnr.onRuleMatchedDebug instanceof Object; /******************************************************************************/ @@ -45,66 +35,62 @@ export const ubolLog = (...args) => { /******************************************************************************/ -export const getMatchedRules = (( ) => { - const noopFn = ( ) => Promise.resolve([]); - if ( isSideloaded !== true ) { return noopFn; } - if ( dnr.onRuleMatchedDebug instanceof Object === false ) { return noopFn; } - - const rulesets = new Map(); - const bufferSize = 256; - const matchedRules = new Array(bufferSize); - matchedRules.fill(null); - let writePtr = 0; - - const pruneLongLists = list => { - if ( list.length <= 21 ) { return list; } - return [ ...list.slice(0, 10), '...', ...list.slice(-10) ]; - - }; +const rulesets = new Map(); +const bufferSize = isSideloaded ? 256 : 1; +const matchedRules = new Array(bufferSize); +matchedRules.fill(null); +let writePtr = 0; - const getRuleset = async rulesetId => { - if ( rulesets.has(rulesetId) ) { - return rulesets.get(rulesetId); - } - let rules; - if ( rulesetId === dnr.DYNAMIC_RULESET_ID ) { - rules = await dnr.getDynamicRules().catch(( ) => undefined); - } else { - const response = await fetch(`/rulesets/main/${rulesetId}.json`).catch(( ) => undefined); - if ( response === undefined ) { return; } - rules = await response.json().catch(( ) => undefined); - } - if ( Array.isArray(rules) === false ) { return; } - const ruleset = new Map(); - for ( const rule of rules ) { - const condition = rule.condition; - if ( condition ) { - if ( condition.requestDomains ) { - condition.requestDomains = pruneLongLists(condition.requestDomains); - } - if ( condition.initiatorDomains ) { - condition.initiatorDomains = pruneLongLists(condition.initiatorDomains); - } +const pruneLongLists = list => { + if ( list.length <= 21 ) { return list; } + return [ ...list.slice(0, 10), '...', ...list.slice(-10) ]; + +}; + +const getRuleset = async rulesetId => { + if ( rulesets.has(rulesetId) ) { + return rulesets.get(rulesetId); + } + let rules; + if ( rulesetId === dnr.DYNAMIC_RULESET_ID ) { + rules = await dnr.getDynamicRules().catch(( ) => undefined); + } else { + const response = await fetch(`/rulesets/main/${rulesetId}.json`).catch(( ) => undefined); + if ( response === undefined ) { return; } + rules = await response.json().catch(( ) => undefined); + } + if ( Array.isArray(rules) === false ) { return; } + const ruleset = new Map(); + for ( const rule of rules ) { + const condition = rule.condition; + if ( condition ) { + if ( condition.requestDomains ) { + condition.requestDomains = pruneLongLists(condition.requestDomains); + } + if ( condition.initiatorDomains ) { + condition.initiatorDomains = pruneLongLists(condition.initiatorDomains); } - const ruleId = rule.id; - rule.id = `${rulesetId}/${ruleId}`; - ruleset.set(ruleId, rule); } - rulesets.set(rulesetId, ruleset); - return ruleset; - }; + const ruleId = rule.id; + rule.id = `${rulesetId}/${ruleId}`; + ruleset.set(ruleId, rule); + } + rulesets.set(rulesetId, ruleset); + return ruleset; +}; - const getRuleDetails = async ruleInfo => { - const { rulesetId, ruleId } = ruleInfo.rule; - const ruleset = await getRuleset(rulesetId); - if ( ruleset === undefined ) { return; } - return { request: ruleInfo.request, rule: ruleset.get(ruleId) }; - }; +const getRuleDetails = async ruleInfo => { + const { rulesetId, ruleId } = ruleInfo.rule; + const ruleset = await getRuleset(rulesetId); + if ( ruleset === undefined ) { return; } + return { request: ruleInfo.request, rule: ruleset.get(ruleId) }; +}; - dnr.onRuleMatchedDebug.addListener(ruleInfo => { - matchedRules[writePtr] = ruleInfo; - writePtr = (writePtr + 1) % bufferSize; - }); +/******************************************************************************/ + +export const getMatchedRules = (( ) => { + const noopFn = ( ) => Promise.resolve([]); + if ( isSideloaded !== true ) { return noopFn; } return async tabId => { const promises = []; @@ -124,3 +110,19 @@ export const getMatchedRules = (( ) => { })(); /******************************************************************************/ + +const matchedRuleListener = ruleInfo => { + matchedRules[writePtr] = ruleInfo; + writePtr = (writePtr + 1) % bufferSize; +}; + +export const toggleDeveloperMode = state => { + if ( isSideloaded !== true ) { return; } + if ( state ) { + dnr.onRuleMatchedDebug.addListener(matchedRuleListener); + } else { + dnr.onRuleMatchedDebug.removeListener(matchedRuleListener); + } +}; + +/******************************************************************************/ diff --git a/platform/mv3/extension/js/popup.js b/platform/mv3/extension/js/popup.js index 4242e5bacf332..9a62eca3f18e0 100644 --- a/platform/mv3/extension/js/popup.js +++ b/platform/mv3/extension/js/popup.js @@ -331,6 +331,7 @@ async function init() { dom.cl.toggle('#showMatchedRules', 'enabled', popupPanelData.isSideloaded === true && + popupPanelData.developerMode && typeof currentTab.id === 'number' && isNaN(currentTab.id) === false ); diff --git a/platform/mv3/extension/js/settings.js b/platform/mv3/extension/js/settings.js index 81f55d03cc416..0233674d4bd10 100644 --- a/platform/mv3/extension/js/settings.js +++ b/platform/mv3/extension/js/settings.js @@ -55,6 +55,15 @@ function renderWidgets() { dom.attr(input, 'disabled', ''); } } + + { + dom.prop('#developerMode input[type="checkbox"]', 'checked', + Boolean(cachedRulesetData.developerMode) + ); + if ( cachedRulesetData.isSideloaded ) { + dom.attr('#developerMode', 'hidden', null); + } + } } /******************************************************************************/ @@ -126,6 +135,13 @@ dom.on('#showBlockedCount input[type="checkbox"]', 'change', ev => { }); }); +dom.on('#developerMode input[type="checkbox"]', 'change', ev => { + sendMessage({ + what: 'setDeveloperMode', + state: ev.target.checked, + }); +}); + /******************************************************************************/ function renderTrustedSites() { From 346b5ded7c5c740cffa5ed7df7ad30e5d92d9c8b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 23 Nov 2024 13:17:13 -0500 Subject: [PATCH 478/553] [mv3] Add ability for admins to disable features New managed setting: "disabledFeatures": { "title": "User interface features to disable", "description": "A list of tokens, each of which correspond to a user interface feature to disable.", "type": "array", "items": { "type": "string" } } Supported tokens: - `dashboard`: Prevent access to all dashboard settings - `filteringMode`: Prevent changes to the default filtering mode, or the current filtering mode of any site Related feedback: https://github.com/uBlockOrigin/uBOL-home/discussions/35#discussioncomment-11326086 --- platform/mv3/extension/css/filtering-mode.css | 17 +++++++++++++---- platform/mv3/extension/css/popup.css | 7 +++++++ platform/mv3/extension/css/settings.css | 14 ++++++++++++++ platform/mv3/extension/dashboard.html | 2 +- platform/mv3/extension/js/background.js | 16 +++++++++++++++- platform/mv3/extension/js/popup.js | 10 ++++++++++ platform/mv3/extension/js/settings.js | 13 +++++++++++++ platform/mv3/extension/managed_storage.json | 6 ++++++ platform/mv3/extension/popup.html | 2 +- 9 files changed, 80 insertions(+), 7 deletions(-) diff --git a/platform/mv3/extension/css/filtering-mode.css b/platform/mv3/extension/css/filtering-mode.css index fecb1ac3cf406..f6ed7783197bc 100644 --- a/platform/mv3/extension/css/filtering-mode.css +++ b/platform/mv3/extension/css/filtering-mode.css @@ -13,7 +13,7 @@ border-radius: 30% 15% / 15% 30%; height: 100%; position: absolute; - width: 25%; + width: calc(25% + 2px); z-index: 10; } @@ -39,12 +39,18 @@ .filteringModeSlider span[data-level] { background-color: var(--accent-surface-1); + border: 1px solid var(--accent-surface-1); + box-sizing: border-box; display: inline-flex; height: 30%; margin-left: 1px; width: 25%; } +.filteringModeSlider span[data-level]:first-of-type { + margin-left: 0; + } + .filteringModeSlider.moving span[data-level] { pointer-events: none; } @@ -53,13 +59,13 @@ left: 0; } .filteringModeSlider[data-level="1"] .filteringModeButton { - left: 25%; + left: calc(25% - 1px); } .filteringModeSlider[data-level="2"] .filteringModeButton { - left: 50%; + left: calc(50% - 1px); } .filteringModeSlider[data-level="3"] .filteringModeButton { - left: 75%; + left: calc(75% - 1px); } [dir="rtl"] .filteringModeSlider[data-level="0"] .filteringModeButton { left: 75%; @@ -77,14 +83,17 @@ .filteringModeSlider[data-level="0"] span[data-level] { background-color: var(--surface-2); + border-color: var(--surface-2); } .filteringModeSlider[data-level="1"] span[data-level]:nth-of-type(1) ~ span[data-level] { background-color: var(--surface-2); + border-color: var(--surface-2); } .filteringModeSlider[data-level="2"] span[data-level]:nth-of-type(2) ~ span[data-level] { background-color: var(--surface-2); + border-color: var(--surface-2); } .filteringModeSlider[data-level]:not(.moving) span[data-level]:hover { diff --git a/platform/mv3/extension/css/popup.css b/platform/mv3/extension/css/popup.css index 385a051652f82..cc6824674a18a 100644 --- a/platform/mv3/extension/css/popup.css +++ b/platform/mv3/extension/css/popup.css @@ -63,6 +63,13 @@ hr { font-weight: 600; } +body[data-forbid~="filteringMode"] .filteringModeSlider { + pointer-events: none; + } +body[data-forbid~="dashboard"] #gotoDashboard { + display: none; + } + #filteringModeText { color: var(--ink-3); margin: var(--default-gap-small); diff --git a/platform/mv3/extension/css/settings.css b/platform/mv3/extension/css/settings.css index fb5ba91517ab1..feefcadd8c3ee 100644 --- a/platform/mv3/extension/css/settings.css +++ b/platform/mv3/extension/css/settings.css @@ -1,3 +1,6 @@ +body.loading { + visibility: hidden; + } body .firstRun { display: none; } @@ -13,6 +16,17 @@ p { white-space: pre-line; } +body[data-forbid~="dashboard"] #dashboard-nav [data-pane="settings"], +body[data-forbid~="dashboard"] section[data-pane="settings"], +body[data-forbid~="dashboard"] #dashboard-nav [data-pane="rulesets"], +body[data-forbid~="dashboard"] section[data-pane="rulesets"] { + display: none; + } +body[data-forbid~="filteringMode"] section[data-pane="settings"] > div:has(> h3[data-i18n="defaultFilteringModeSectionLabel"]), +body[data-forbid~="filteringMode"] section[data-pane="settings"] > div:has(> h3[data-i18n="filteringMode0Name"]) { + display: none; + } + #showBlockedCount:has(input[type="checkbox"][disabled]) { opacity: 0.5; } diff --git a/platform/mv3/extension/dashboard.html b/platform/mv3/extension/dashboard.html index c8442cabc76a7..bcd1726bd05a3 100644 --- a/platform/mv3/extension/dashboard.html +++ b/platform/mv3/extension/dashboard.html @@ -16,7 +16,7 @@ - +
From 50ddedb9921b7b3e6e74eb43d200275ed186d697 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 24 Nov 2024 10:24:08 -0500 Subject: [PATCH 479/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.mk.txt | 30 +- .../mv3/extension/_locales/be/messages.json | 2 +- .../mv3/extension/_locales/mk/messages.json | 90 +++--- .../extension/_locales/pt_PT/messages.json | 2 +- .../mv3/extension/_locales/sq/messages.json | 2 +- .../extension/_locales/zh_CN/messages.json | 2 +- .../extension/_locales/zh_TW/messages.json | 2 +- src/_locales/mk/messages.json | 260 +++++++++--------- src/_locales/zh_TW/messages.json | 26 +- 9 files changed, 208 insertions(+), 208 deletions(-) diff --git a/platform/mv3/description/webstore.mk.txt b/platform/mv3/description/webstore.mk.txt index 7669a5939f98c..10a6944e5f205 100644 --- a/platform/mv3/description/webstore.mk.txt +++ b/platform/mv3/description/webstore.mk.txt @@ -1,30 +1,30 @@ -uBO Lite (uBOL) is a *permission-less* MV3-based content blocker. +uBO Lite (uBOL) е *без дозвола* MV3-базиран блокатор на содржини. -The default ruleset corresponds to uBlock Origin's default filterset: +Стандардниот сет на правила одговара на стандардниот филтер сет на uBlock Origin: -- uBlock Origin's built-in filter lists +- Вградени филтер листи на uBlock Origin - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list +- Листа на реклами и следачи на Peter Lowe -You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. +Можете да овозможите повеќе сетови на правила посетувајќи ја страницата со опции - кликнете на иконата _запчаник_ во попап панел. -uBOL is entirely declarative, meaning there is no need for a permanent uBOL process for the filtering to occur, and CSS/JS injection-based content filtering is performed reliably by the browser itself rather than by the extension. This means that uBOL itself does not consume CPU/memory resources while content blocking is ongoing -- uBOL's service worker process is required _only_ when you interact with the popup panel or the option pages. +uBOL е целосно декларативен, што значи дека не е потребен траен процес на uBOL за филтрирање да се одвива, а филтрирањето на содржини врз основа на инјекција на CSS/JS се извршува со сигурност од самото браузер, а не од самата екстензија. Ова значи дека самиот uBOL не консумира ресурси на CPU/меморија додека блокирањето на содржини е во тек - процесот на службениот работник на uBOL е потребен _само_ кога ќе е потребен со попап панел или страниците со опции. -uBOL does not require broad "read and modify data" permission at install time, hence its limited capabilities out of the box compared to uBlock Origin or other content blockers requiring broad "read and modify data" permissions at install time. +uBOL не бара широка дозвола за „читање и модификување на податоци“ во време на инсталација, па затоа неговите ограничени можности излезат од кутијата во споредба со uBlock Origin или други блокатори на содржини кои бараат широка „читање и модификување на податоци“ дозволи во време на инсталација. -However, uBOL allows you to *explicitly* grant extended permissions on specific sites of your choice so that it can better filter on those sites using cosmetic filtering and scriptlet injections. +Сепак, uBOL ви овозможува *експлицитно* да доделите проширени дозволи на специфични страници по ваш избор, така што може подобро да филтрира на тие страници користејќи козметичко филтрирање и инјекции на скрипти. -To grant extended permissions on a given site, open the popup panel and pick a higher filtering mode such as Optimal or Complete. +За да доделите проширени дозволи на одредена страница, отворете го исфрлениот панел и изберете повисок режим на филтрирање, како што се Оптимален или Комплетен. -The browser will then warn you about the effects of granting the additional permissions requested by the extension on the current site, and you will have to tell the browser whether you accept or decline the request. +Браузерот ќе ве предупреди за ефектите на задолжителното доделување на дополнителните дозволи кои ги побарала екстензијата на тековната страница, а вие треба да му кажете на браузерот дали ја прифаќате или одбивате побараното. -If you accept uBOL's request for additional permissions on the current site, it will be able to better filter content for the current site. +Ако ја прифатите побараното од uBOL за дополнителни дозволи на тековната страница, тоа ќе може подобро да филтрира содржина за тековната страница. -You can set the default filtering mode from uBOL's options page. If you pick the Optimal or Complete mode as the default one, you will need to grant uBOL the permission to read and modify data on all websites. +Можете да го поставите подразбираниот режим на филтрирање од страницата со опции на uBOL. Ако ја изберете Оптималната или Комплетната верзија како подразбирана, ќе треба да му овозможите на uBOL дозвола да чита и модифицира податоци на сите веб-страници. -Keep in mind this is still a work in progress, with these end goals: +Имајте на ум дека ова сè уште е работа во тек, со следниве завршни цели: -- No broad host permissions at install time -- extended permissions are granted explicitly by the user on a per-site basis. +- Нема широки хост дозволи при инсталација - проширените дозволи се доделуваат експлицитно од корисникот на основа на секоја страница. -- Entirely declarative for reliability and CPU/memory efficiency. +- Целосно декларативен за сигурност и ефикасност на CPU/меморија. diff --git a/platform/mv3/extension/_locales/be/messages.json b/platform/mv3/extension/_locales/be/messages.json index 5453c7b967e9e..3042d674c8b22 100644 --- a/platform/mv3/extension/_locales/be/messages.json +++ b/platform/mv3/extension/_locales/be/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Знайсці спісы", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/mk/messages.json b/platform/mv3/extension/_locales/mk/messages.json index 60186c0844080..13a59807181ac 100644 --- a/platform/mv3/extension/_locales/mk/messages.json +++ b/platform/mv3/extension/_locales/mk/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "A permission-less content blocker. Blocks ads, trackers, miners, and more immediately upon installation.", + "message": "Блокатор на содржини без дозволи. Блокира реклами, трекери, мајнери и уште многу повеќе веднаш по инсталацијата.", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -32,11 +32,11 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Пријави проблем на оваа веб-страница", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { - "message": "Отварање на Контролна Табла", + "message": "Отварање на Контролна плоча", "description": "English: Click to open the dashboard" }, "popupMoreButton": { @@ -44,7 +44,7 @@ "description": "Label to be used to show popup panel sections" }, "popupLessButton": { - "message": "Less", + "message": "Помалку", "description": "Label to be used to hide popup panel sections" }, "3pGroupDefault": { @@ -64,7 +64,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { - "message": "Annoyances", + "message": "Досадувања", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMisc": { @@ -76,163 +76,163 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "aboutChangelog": { - "message": "Changelog", + "message": "Промени", "description": "" }, "aboutCode": { - "message": "Source code (GPLv3)", + "message": "Изворен код (GPLv3)", "description": "English: Source code (GPLv3)" }, "aboutContributors": { - "message": "Contributors", + "message": "Сов contributors", "description": "English: Contributors" }, "aboutSourceCode": { - "message": "Source code", + "message": "Изворен код", "description": "Link text to source code repo" }, "aboutTranslations": { - "message": "Translations", + "message": "Преводи", "description": "Link text to translations repo" }, "aboutFilterLists": { - "message": "Filter lists", + "message": "Листи за филтрирање", "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "Надворешни зависности (компатибилни со GPLv3):", "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Пријави проблем со филтерот", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Пријавете проблеми со филтерите за специфични веб-страници до uBlockOrigin/uAssets issue tracker. Потребен е GitHub профил.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "За да се избегне оптоварување на волонтерите со дупликат пријави, ве молиме проверете дали проблемот веќе не е пријавен.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Најди слични пријави", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Адреса на веб-страницата:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Веб-страницата…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Изберете внос --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Покажува реклами или остатоци од реклами", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Има преOverlayи или други непријатности", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Детектира uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Има проблеми поврзани со приватноста", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Има многу проблеми кога е вклучен uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Отвора непожелни табови или прозорци", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Води до злонамерен софтвер, фишинг", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Означи ја веб-страницата како “NSFW” (“Не е безбедно за работа”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Создај нова пријава", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { - "message": "Welcome", + "message": "Добредојде", "description": "The header text for the welcome message section" }, "firstRunDescription": { - "message": "You have just installed uBO Lite. Here you can choose the default filtering mode to use on all websites.\n\nBy default, Basic mode is selected because it does not require the permission to read and modify data. If you trust uBO Lite, you can give it broad permission to read and modify data on all websites in order to enable more advanced filtering capabilities for all websites by default.", + "message": "Токму ја инсталиравте uBO Lite. Овде можете да изберете режим на филтрирање по подразбирање што ќе го користите на сите веб-страници.\n\nПо подразбирање, е избран режимот Основен затоа што не бара дозвола за читање и модификација на податоци. Ако му верувате на uBO Lite, можете да му дадете ширување на дозволата за читање и модификација на податоци на сите веб-страници за да овозможите попрецизни способности за филтрирање на сите веб-страници по подразбирање.", "description": "Descriptive text shown at first install time only " }, "defaultFilteringModeSectionLabel": { - "message": "Default filtering mode", + "message": "Режим на филтрирање по подразбирање", "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "The default filtering mode will be overridden by per-website filtering modes. You can adjust the filtering mode on any given website according to whichever mode works best on that website. Each mode has its advantages and disadvantages.", + "message": "Режимот на филтрирање по подразбирање ќе биде заменет со режимите на филтрирање за секоја веб-страница. Можете да го прилагодите режимот на филтрирање на која било дадена веб-страница во согласност со тој режим што најдобро функционира на таа веб-страница. Секој режим има свои предности и недостатоци.", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { - "message": "no filtering", + "message": "без филтрирање", "description": "Name of blocking mode 0" }, "filteringMode1Name": { - "message": "basic", + "message": "основен", "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "optimal", + "message": "оптимален", "description": "Name of blocking mode 2" }, "filteringMode3Name": { - "message": "complete", + "message": "целосен", "description": "Name of blocking mode 3" }, "basicFilteringModeDescription": { - "message": "Basic network filtering from selected filter lists.\n\nDoes not require permission to read and modify data on websites.", + "message": "Основно мрежно филтрирање од селектираните листи со филтри.\n\nНе бара дозвола за читање и модификација на податоци на веб-страниците.", "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "Advanced network filtering plus specific extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.", + "message": "Напредно мрежно филтрирање плус специфично проширено филтрирање од селектираните листи со филтри.\n\nБара широка дозвола за читање и модификација на податоци на сите веб-страници.", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "Advanced network filtering plus specific and generic extended filtering from selected filter lists.\n\nRequires broad permission to read and modify data on all websites.\n\nGeneric extended filtering may cause higher webpage resources usage.", + "message": "Напредно мрежно филтрирање плус специфично и генералистичко проширено филтрирање од селектираните листи со филтри.\n\nБара широка дозвола за читање и модификација на податоци на сите веб-страници.\n\nГенералистичкото проширено филтрирање може да предизвика поголема потрошувачка на ресурси на веб-страниците.", "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "List of websites for which no filtering will take place.", + "message": "Листата на веб-страници за кои нема да се врши филтрирање.", "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { - "message": "[hostnames only]\nexample.com\ngames.example\n...", + "message": "[само домени]\nexample.com\ngames.example\n...", "description": "Default text for in edit field" }, "behaviorSectionLabel": { - "message": "Behavior", + "message": "Понашање", "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Automatically reload page when changing filtering mode", + "message": "Автоматски освежи ја страницата кога се менува режимот на филтрирање", "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { - "message": "Show the number of blocked requests on the toolbar icon", + "message": "Прикажи го бројот на блокирани барања на иконата во алатникот", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Најди листи", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index b15553d53cfff..be2ee3752f79c 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Encontrar listas", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index da316b303a8ef..9aa0b63e6b238 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Gjej listat", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/zh_CN/messages.json b/platform/mv3/extension/_locales/zh_CN/messages.json index def4c6ac4a4c9..05b31c9d07b20 100644 --- a/platform/mv3/extension/_locales/zh_CN/messages.json +++ b/platform/mv3/extension/_locales/zh_CN/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "查找列表", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/zh_TW/messages.json b/platform/mv3/extension/_locales/zh_TW/messages.json index 7657061ef5404..096df7c4e23f3 100644 --- a/platform/mv3/extension/_locales/zh_TW/messages.json +++ b/platform/mv3/extension/_locales/zh_TW/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "尋找清單", "description": "Placeholder for the input field used to find lists" } } diff --git a/src/_locales/mk/messages.json b/src/_locales/mk/messages.json index 35c5285872a98..f0aca830ee686 100644 --- a/src/_locales/mk/messages.json +++ b/src/_locales/mk/messages.json @@ -56,11 +56,11 @@ "description": "appears as tab name in dashboard" }, "supportPageName": { - "message": "Support", + "message": "Поддршка", "description": "appears as tab name in dashboard" }, "assetViewerPageName": { - "message": "uBlock₀ — Asset viewer", + "message": "uBlock₀ — Прегледувач на средства", "description": "Title for the asset viewer page" }, "advancedSettingsPageName": { @@ -68,15 +68,15 @@ "description": "Title for the advanced settings page" }, "popupPowerSwitchInfo": { - "message": "Click: disable/enable uBlock₀ for this site.\n\nCtrl+click: disable uBlock₀ only on this page.", + "message": "Кликнете: деактивирајте/активирајте uBlock₀ за оваа страница.\n\nCtrl+клик: деактивирајте uBlock₀ само на оваа страница.", "description": "English: Click: disable/enable uBlock₀ for this site.\n\nCtrl+click: disable uBlock₀ only on this page." }, "popupPowerSwitchInfo1": { - "message": "Click to disable uBlock₀ for this site.\n\nCtrl+click to disable uBlock₀ only on this page.", + "message": "Кликнете за да го деактивирате uBlock₀ за оваа страница.\n\nCtrl+кликнете за да го деактивирате uBlock₀ само на оваа страница.", "description": "Message to be read by screen readers" }, "popupPowerSwitchInfo2": { - "message": "Click to enable uBlock₀ for this site.", + "message": "Кликнете за да го активирате uBlock₀ за оваа страница.", "description": "Message to be read by screen readers" }, "popupBlockedRequestPrompt": { @@ -128,11 +128,11 @@ "description": "Tooltip used for the logger icon in the panel" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Пријави проблем на оваа веб-страница", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipNoPopups": { - "message": "Toggle the blocking of all popups for this site", + "message": "Промени ја блокадата на сите поп-упи за оваа страница", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups1": { @@ -140,23 +140,23 @@ "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoPopups2": { - "message": "Click to no longer block all popups on this site", + "message": "Кликнете за да не блокирате повеќе сите поп-упи на оваа страница", "description": "Tooltip for the no-popups per-site switch" }, "popupTipNoLargeMedia": { - "message": "Toggle the blocking of large media elements for this site", + "message": "Промени ја блокадата на големите медиумски елементи за оваа страница", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia1": { - "message": "Click to block large media elements on this site", + "message": "Кликнете за да блокирате големи медиумски елементи на оваа страница", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoLargeMedia2": { - "message": "Click to no longer block large media elements on this site", + "message": "Кликнете за да не блокирате повеќе големи медиумски елементи на оваа страница", "description": "Tooltip for the no-large-media per-site switch" }, "popupTipNoCosmeticFiltering": { - "message": "Toggle cosmetic filtering for this site", + "message": "Промени го козметичкото филтрирање за оваа страница", "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoCosmeticFiltering1": { @@ -168,15 +168,15 @@ "description": "Tooltip for the no-cosmetic-filtering per-site switch" }, "popupTipNoRemoteFonts": { - "message": "Toggle the blocking of remote fonts for this site", + "message": "Промени ја блокадата на далечински фонтови за оваа страница", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoRemoteFonts1": { - "message": "Click to block remote fonts on this site", + "message": "Кликнете за да блокирате далечински фонтови на оваа страница", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoRemoteFonts2": { - "message": "Click to no longer block remote fonts on this site", + "message": "Кликнете за да не блокирате повеќе далечински фонтови на оваа страница", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoScripting1": { @@ -276,11 +276,11 @@ "description": "Example of use: Version 1.26.4" }, "popup3pScriptFilter": { - "message": "script", + "message": "скрипта", "description": "Appears as an option to filter out firewall rows" }, "popup3pFrameFilter": { - "message": "frame", + "message": "рамка", "description": "Appears as an option to filter out firewall rows" }, "pickerCreate": { @@ -316,7 +316,7 @@ "description": "An entry in the browser's contextual menu" }, "settingsCollapseBlockedPrompt": { - "message": "Hide placeholders of blocked elements", + "message": "Скријте ги местата за блокирани елементи", "description": "English: Hide placeholders of blocked elements" }, "settingsIconBadgePrompt": { @@ -328,7 +328,7 @@ "description": "A checkbox in the Settings pane" }, "settingsContextMenuPrompt": { - "message": "Make use of context menu where appropriate", + "message": "Искористете го контекстуалното мени каде што е соодветно", "description": "English: Make use of context menu where appropriate" }, "settingsColorBlindPrompt": { @@ -336,15 +336,15 @@ "description": "English: Color-blind friendly" }, "settingsAppearance": { - "message": "Appearance", + "message": "Изглед", "description": "Section for controlling user interface appearance" }, "settingsThemeLabel": { - "message": "Theme", + "message": "Тема", "description": "Label for checkbox to enable a custom dark theme" }, "settingsThemeAccent0Label": { - "message": "Custom accent color", + "message": "Прилагодена боја на акцентот", "description": "Label for checkbox to pick an accent color" }, "settingsCloudStorageEnabledPrompt": { @@ -356,15 +356,15 @@ "description": "Checkbox to let user access advanced, technical features" }, "settingsPrefetchingDisabledPrompt": { - "message": "Disable pre-fetching (to prevent any connection for blocked network requests)", + "message": "Деактивирајте пред-фаќање (за да се спречат било какви врски за блокирани мрежни барања)", "description": "English: " }, "settingsHyperlinkAuditingDisabledPrompt": { - "message": "Disable hyperlink auditing", + "message": "Деактивирајте проверка на хиперврски", "description": "English: " }, "settingsWebRTCIPAddressHiddenPrompt": { - "message": "Prevent WebRTC from leaking local IP addresses", + "message": "Спречете WebRTC да ги открие локалните IP адреси", "description": "English: " }, "settingPerSiteSwitchGroup": { @@ -392,19 +392,19 @@ "description": "The default state for the per-site no-scripting switch" }, "settingsNoCSPReportsPrompt": { - "message": "Block CSP reports", + "message": "Блокирајте CSP извештаи", "description": "background information: https://github.com/gorhill/uBlock/issues/3150" }, "settingsUncloakCnamePrompt": { - "message": "Uncloak canonical names", + "message": "Откријте канонски имиња", "description": "background information: https://github.com/uBlockOrigin/uBlock-issues/issues/1513" }, "settingsAdvanced": { - "message": "Advanced", + "message": "Напредно", "description": "Section for controlling advanced-user settings" }, "settingsAdvancedSynopsis": { - "message": "Features suitable only for technical users", + "message": "Функции погодни само за технички корисници", "description": "Description of section controlling advanced-user settings" }, "settingsAdvancedUserSettings": { @@ -440,23 +440,23 @@ "description": "A button in the in the _3rd-party filters_ pane" }, "3pParseAllABPHideFiltersPrompt1": { - "message": "Parse and enforce cosmetic filters", + "message": "Парсирајте и спроведете козметички филтри", "description": "English: Parse and enforce Adblock+ element hiding filters." }, "3pParseAllABPHideFiltersInfo": { - "message": "Cosmetic filters serve to hide elements in a web page which are deemed to be a visual nuisance, and which can't be blocked by the network request-based filtering engines.", + "message": "Козметичките филтри служат за сокривање на елементи во веб-страница кои се сметаат за визуелна непријатност, и кои не можат да се блокираат со мрежните мотори за филтрирање базирани на барања.", "description": "Describes the purpose of the 'Parse and enforce cosmetic filters' feature." }, "3pIgnoreGenericCosmeticFilters": { - "message": "Ignore generic cosmetic filters", + "message": "Игнорирајте генералистички козметички филтри", "description": "This will cause uBO to ignore all generic cosmetic filters." }, "3pIgnoreGenericCosmeticFiltersInfo": { - "message": "Generic cosmetic filters are those cosmetic filters which are meant to apply on all web sites. Enabling this option will eliminate the memory and CPU overhead added to web pages as a result of handling generic cosmetic filters.\n\nIt is recommended to enable this option on less powerful devices.", + "message": "Генералистичките козметички филтри се оние козметички филтри што се наменети да се применуваат на сите веб-страници. Вклучувањето на оваа опција ќе ја елиминира оптовареноста на меморијата и ЦПУ-то додадена на веб-страниците како резултат на обработката на генералистичките козметички филтри.\n\nСе препорачува да се вклучи оваа опција на помалку моќни уреди.", "description": "Describes the purpose of the 'Ignore generic cosmetic filters' feature." }, "3pSuspendUntilListsAreLoaded": { - "message": "Suspend network activity until all filter lists are loaded", + "message": "Суспендирајте ја мрежната активност додека не се вчитат сите листи со филтри", "description": "A checkbox in the 'Filter lists' pane" }, "3pListsOfBlockedHostsHeader": { @@ -484,11 +484,11 @@ "description": "Filter lists section name" }, "3pGroupSocial": { - "message": "Social widgets", + "message": "Социјални widgets", "description": "Filter lists section name" }, "3pGroupCookies": { - "message": "Cookie notices", + "message": "Известија за колачиња", "description": "Filter lists section name" }, "3pGroupAnnoyances": { @@ -496,7 +496,7 @@ "description": "Filter lists section name" }, "3pGroupMultipurpose": { - "message": "Multipurpose", + "message": "Многуцелно", "description": "Filter lists section name" }, "3pGroupRegions": { @@ -504,7 +504,7 @@ "description": "Filter lists section name" }, "3pGroupCustom": { - "message": "Custom", + "message": "Прилагодено", "description": "Filter lists section name" }, "3pImport": { @@ -520,11 +520,11 @@ "description": "used as a tooltip for the out-of-date icon beside a list" }, "3pViewContent": { - "message": "view content", + "message": "прегледајте содржина", "description": "used as a tooltip for eye icon beside a list" }, "3pLastUpdate": { - "message": "Last update: {{ago}}.\nClick to force an update.", + "message": "Последно обновување: {{ago}}.\nКликнете за да принудите обновување.", "description": "used as a tooltip for the clock icon beside a list" }, "3pUpdating": { @@ -532,19 +532,19 @@ "description": "used as a tooltip for the spinner icon beside a list" }, "3pNetworkError": { - "message": "A network error prevented the resource from being updated.", + "message": "Мрежна грешка ја спречи обновата на ресурсот.", "description": "used as a tooltip for error icon beside a list" }, "1pTrustWarning": { - "message": "Do not add filters from untrusted sources.", + "message": "Не додавајте филтри од ненадежни извори.", "description": "Warning against copy-pasting filters from random sources" }, "1pEnableMyFiltersLabel": { - "message": "Enable my custom filters", + "message": "Вклучете ги моите прилагодени филтри", "description": "Label for the checkbox use to enable/disable 'My filters' list" }, "1pTrustMyFiltersLabel": { - "message": "Allow custom filters requiring trust", + "message": "Дозволете прилагодени филтри што бараат доверба", "description": "Label for the checkbox use to trust the content of 'My filters' list" }, "1pImport": { @@ -560,7 +560,7 @@ "description": "English: my-ublock-static-filters_{{datetime}}.txt" }, "1pApplyChanges": { - "message": "Apply changes", + "message": "Применете ги промените", "description": "English: Apply changes" }, "rulesPermanentHeader": { @@ -608,7 +608,7 @@ "description": "English: List of your dynamic filtering rules." }, "rulesFormatHint": { - "message": "Rule syntax: source destination type action (full documentation).", + "message": "Синтакса на правило: извор дестинација тип акција (целосна документација).", "description": "English: dynamic rule syntax and full documentation." }, "rulesSort": { @@ -628,7 +628,7 @@ "description": "English: a sort option for list of rules." }, "whitelistPrompt": { - "message": "The trusted site directives dictate on which web pages uBlock Origin should be disabled. One entry per line.", + "message": "Директивите за доверливи веб-страници одредуваат на кои веб-страници uBlock Origin треба да биде исклучен. Еден внос по ред.", "description": "A concise description of the 'Trusted sites' pane." }, "whitelistImport": { @@ -676,19 +676,19 @@ "description": "Appears in the logger's tab selector" }, "loggerReloadTip": { - "message": "Reload the tab content", + "message": "Понови ја содржината на табот", "description": "Tooltip for the reload button in the logger page" }, "loggerDomInspectorTip": { - "message": "Toggle the DOM inspector", + "message": "Вклучи/исклучи DOM инспектор", "description": "Tooltip for the DOM inspector button in the logger page" }, "loggerPopupPanelTip": { - "message": "Toggle the popup panel", + "message": "Вклучи/исклучи панелот за поп-уп", "description": "Tooltip for the popup panel button in the logger page" }, "loggerInfoTip": { - "message": "uBlock Origin wiki: The logger", + "message": "uBlock Origin вики: Логер", "description": "Tooltip for the top-right info label in the logger page" }, "loggerClearTip": { @@ -704,15 +704,15 @@ "description": "Tooltip for the play button in the logger page" }, "loggerRowFiltererButtonTip": { - "message": "Toggle logger filtering", + "message": "Вклучи/исклучи филтрирање на логерот", "description": "Tooltip for the row filterer button in the logger page" }, "logFilterPrompt": { - "message": "filter logger content", + "message": "филтрирајте ја содржината на логерот", "description": "Placeholder string for logger output filtering input field" }, "loggerRowFiltererBuiltinTip": { - "message": "Logger filtering options", + "message": "Опции за филтрирање на логерот", "description": "Tooltip for the button to bring up logger output filtering options" }, "loggerRowFiltererBuiltinNot": { @@ -732,7 +732,7 @@ "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltinModified": { - "message": "modified", + "message": "модифицирано", "description": "A keyword in the built-in row filtering expression" }, "loggerRowFiltererBuiltin1p": { @@ -764,7 +764,7 @@ "description": "Label to identify a context field (typically a hostname)" }, "loggerEntryDetailsRootContext": { - "message": "Root context", + "message": "Корен контекст", "description": "Label to identify a root context field (typically a hostname)" }, "loggerEntryDetailsPartyness": { @@ -836,31 +836,31 @@ "description": "Below this sentence, the filter list(s) in which the filter was found" }, "loggerStaticFilteringFinderSentence2": { - "message": "Static filter could not be found in any of the currently enabled filter lists", + "message": "Статичкиот филтер не може да биде најден во ниедна од моментално овозможените листи со филтри.", "description": "Message to show when a filter cannot be found in any filter lists" }, "loggerSettingDiscardPrompt": { - "message": "Logger entries which do not fulfill all three conditions below will be automatically discarded:", + "message": "Записите во логерот кои не ги исполнуваат сите три услови подолу автоматски ќе бидат игнорирани:", "description": "Logger setting: A sentence to describe the purpose of the settings below" }, "loggerSettingPerEntryMaxAge": { - "message": "Preserve entries from the last {{input}} minutes", + "message": "Зачувајте записи од последните {{input}} минути", "description": "A logger setting" }, "loggerSettingPerTabMaxLoads": { - "message": "Preserve at most {{input}} page loads per tab", + "message": "Зачувајте најмногу {{input}} вчитувања на страници по таб", "description": "A logger setting" }, "loggerSettingPerTabMaxEntries": { - "message": "Preserve at most {{input}} entries per tab", + "message": "Зачувајте најмногу {{input}} записи по таб", "description": "A logger setting" }, "loggerSettingPerEntryLineCount": { - "message": "Use {{input}} lines per entry in vertically expanded mode", + "message": "Користете {{input}} редови по запис во вертикално проширен режим", "description": "A logger setting" }, "loggerSettingHideColumnsPrompt": { - "message": "Hide columns:", + "message": "Скријте колони:", "description": "Logger settings: a sentence to describe the purpose of the checkboxes below" }, "loggerSettingHideColumnTime": { @@ -896,127 +896,127 @@ "description": "Label for radio-button to pick export text format" }, "supportOpenButton": { - "message": "Open", + "message": "Отвори", "description": "Text for button which open an external webpage in Support pane" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Создај нова пријава", "description": "Text for button which open an external webpage in Support pane" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Најди слични пријави", "description": "A clickable link in the filter issue reporter section" }, "supportS1H": { - "message": "Documentation", + "message": "Документација", "description": "Header of 'Documentation' section in Support pane" }, "supportS1P1": { - "message": "Read the documentation at uBlock/wiki to learn about all of uBlock Origin's features.", + "message": "Прочитајте ја документацијата на uBlock/wiki за да научите за сите функции на uBlock Origin.", "description": "First paragraph of 'Documentation' section in Support pane" }, "supportS2H": { - "message": "Questions and support", + "message": "Прашања и поддршка", "description": "Header of 'Questions and support' section in Support pane" }, "supportS2P1": { - "message": "Answers to questions and other kinds of help support is provided on the subreddit /r/uBlockOrigin.", + "message": "Одговори на прашања и други видови поддршка се обезбедени на subreddit /r/uBlockOrigin.", "description": "First paragraph of 'Questions and support' section in Support pane" }, "supportS3H": { - "message": "Filter issues/website is broken", + "message": "Проблеми со филтрирањето/веб-страницата е расипана", "description": "Header of 'Filter issues' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Пријавете проблеми со филтрите за специфични веб-страници на uBlockOrigin/uAssets issue tracker. Потребен е GitHub профил.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS3P2": { - "message": "Important: Avoid using other similarly-purposed blockers along with uBlock Origin, as this may cause filter issues on specific websites.", + "message": "Важно: Избегнувајте да користите други блокатори со слична намена заедно со uBlock Origin, бидејќи тоа може да предизвика проблеми со филтрањето на специфични веб-страници.", "description": "Second paragraph of 'Filter issues' section in Support pane" }, "supportS3P3": { - "message": "Tips: Be sure your filter lists are up to date. The logger is the primary tool to diagnose filter-related issues.", + "message": "Совети: Проверете дали вашите листи со филтри се ажурирани. Логерот е главниот алат за дијагностицирање на проблемите поврзани со филтрите.", "description": "Third paragraph of 'Filter issues' section in Support pane" }, "supportS4H": { - "message": "Bug report", + "message": "Пријава за грешка", "description": "Header of 'Bug report' section in Support pane" }, "supportS4P1": { - "message": "Report issues with uBlock Origin itself to the uBlockOrigin/uBlock-issue issue tracker. Requires a GitHub account.", + "message": "Пријавете проблеми со самиот uBlock Origin на uBlockOrigin/uBlock-issue issue tracker. Потребен е GitHub профил.", "description": "First paragraph of 'Bug report' section in Support pane" }, "supportS5H": { - "message": "Troubleshooting Information", + "message": "Информации за решавање проблеми", "description": "Header of 'Troubleshooting Information' section in Support pane" }, "supportS5P1": { - "message": "Below is technical information that might be useful when volunteers are trying to help you solve a problem.", + "message": "Подолу е техничка информација која може да биде корисна кога волонтерите се обидуваат да ви помогнат да решите проблем.", "description": "First paragraph of 'Troubleshooting Information' section in Support pane" }, "supportS5P2": { - "message": "Important: Potentially private or sensitive information is redacted by default. Redacted information may make it more difficult to solve a problem.", + "message": "Важно: Потенцијално приватни или осетливи информации се цензурирани по подразбирање. Цензурираните информации можат да го отежнат решавањето на проблемот.", "description": "Second paragraph of 'Troubleshooting Information' section in Support pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Пријави проблем со филтерот", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "За да се избегне оптоварување на волонтерите со дупликат пријави, ве молиме проверете дека проблемот веќе не е пријавен.", "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S1": { - "message": "Filter lists are updated daily. Be sure your issue has not already been addressed in the most recent filter lists.", + "message": "Листите со филтри се обновуваат дневно. Осигурајте се дека вашиот проблем веќе не е решен во најновите листи со филтри.", "description": "A paragraph in the filter issue reporter section" }, "supportS6P2S2": { - "message": "Verify that the issue still exists after reloading the problematic webpage.", + "message": "Проверете дали проблемот сè уште постои по повторно вчитување на проблематичната веб-страница.", "description": "A paragraph in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the web page:", + "message": "Адреса на веб-страницата:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The web page…", + "message": "Веб-страницата…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "-- Изберете внос --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Покажува реклами или остатоци од реклами", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Има преOverlayи или други непријатности", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBlock Origin", + "message": "Детектира uBlock Origin", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "Има проблеми поврзани со приватноста", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBlock Origin is enabled", + "message": "Има многу проблеми кога е вклучен uBlock Origin", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Отвора непожелни табови или прозорци", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Води до злонамерен софтвер, фишинг", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the web page as “NSFW” (“Not Safe For Work”)", + "message": "Означи ја веб-страницата како “NSFW” (“Не е безбедно за работа”)", "description": "A checkbox to use for NSFW sites" }, "supportRedact": { @@ -1028,7 +1028,7 @@ "description": "Text for 'Unredact' button" }, "aboutPrivacyPolicy": { - "message": "Privacy policy", + "message": "Политика на приватност", "description": "Link to privacy policy on GitHub (English)" }, "aboutChangelog": { @@ -1056,19 +1056,19 @@ "description": "Link text to uBO's own filter lists repo" }, "aboutDependencies": { - "message": "External dependencies (GPLv3-compatible):", + "message": "Надворешни зависности (компатибилни со GPLv3):", "description": "Shown in the About pane" }, "aboutCDNs": { - "message": "uBO's own filter lists are freely hosted on the following CDNs:", + "message": "Листите со филтри на uBO се одвиваат слободно на следните CDN-ови:", "description": "Shown in the About pane" }, "aboutCDNsInfo": { - "message": "A randomly picked CDN is used when a filter list needs to be updated.", + "message": "Се користи случајно одбран CDN кога е потребно да се обнови листата со филтри.", "description": "Shown in the About pane" }, "aboutBackupDataButton": { - "message": "Back up to file…", + "message": "Направи резервна копија во датотека…", "description": "Text for button to create a backup of all settings" }, "aboutBackupFilename": { @@ -1076,23 +1076,23 @@ "description": "English: my-ublock-backup_{{datetime}}.txt" }, "aboutRestoreDataButton": { - "message": "Restore from file…", + "message": "Врати од датотека…", "description": "English: Restore from file..." }, "aboutResetDataButton": { - "message": "Reset to default settings…", + "message": "Врати на подразбирање…", "description": "English: Reset to default settings..." }, "aboutRestoreDataConfirm": { - "message": "All your settings will be overwritten using data backed up on {{time}}, and uBlock₀ will restart.\n\nOverwrite all existing settings using backed up data?", + "message": "Сите ваши поставки ќе бидат надминати со податоците направени на {{time}}, и uBlock₀ ќе се рестартира.\n\nДали сакате да го надминете сите постоечки поставки со резервираните податоци?", "description": "Message asking user to confirm restore" }, "aboutRestoreDataError": { - "message": "The data could not be read or is invalid", + "message": "Податоците не можат да бидат прочитани или се невалидни", "description": "Message to display when an error occurred during restore" }, "aboutResetDataConfirm": { - "message": "All your settings will be removed, and uBlock₀ will restart.\n\nReset uBlock₀ to factory settings?", + "message": "Сите ваши поставки ќе бидат отстранети, и uBlock₀ ќе се рестартира.\n\nДали сакате да го ресетирате uBlock₀ на фабрички поставки?", "description": "Message asking user to confirm reset" }, "errorCantConnectTo": { @@ -1100,11 +1100,11 @@ "description": "English: Network error: {{msg}}" }, "subscriberConfirm": { - "message": "Add the following URL to your custom filter lists?\n\nTitle: \"{{title}}\"\nURL: {{url}}", + "message": "Дали да ја додадете следната URL адреса на вашите прилагодени листи со филтри?\n\nНаслов: \"{{title}}\"\nURL: {{url}}", "description": "No longer used" }, "subscribeButton": { - "message": "Subscribe", + "message": "Пријави се", "description": "For the button used to subscribe to a filter list" }, "elapsedOneMinuteAgo": { @@ -1144,15 +1144,15 @@ "description": "Firefox-specific: appears as 'uBlock₀ (off)'" }, "docblockedTitle": { - "message": "Page blocked", + "message": "Страницата е блокирана", "description": "Used as a title for the document-blocked page" }, "docblockedPrompt1": { - "message": "uBlock Origin has prevented the following page from loading:", + "message": "uBlock Origin го спречи вчитувањето на следната страница:", "description": "Used in the strict-blocking page" }, "docblockedPrompt2": { - "message": "Because of the following filter:", + "message": "Поради следниот филтер:", "description": "Used in the strict-blocking page" }, "docblockedNoParamsPrompt": { @@ -1172,11 +1172,11 @@ "description": "English: Close this window" }, "docblockedDontWarn": { - "message": "Don't warn me again about this site", + "message": "Не ми предупредувај повторно за оваа веб-страница", "description": "Label for checkbox in document-blocked page" }, "docblockedProceed": { - "message": "Disable strict blocking for {{hostname}}", + "message": "Исклучи строго блокирање за {{hostname}}", "description": "English: Disable strict blocking for {{hostname}} ..." }, "docblockedDisableTemporary": { @@ -1188,23 +1188,23 @@ "description": "English: Permanently" }, "docblockedDisable": { - "message": "Proceed", + "message": "Продолжи", "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Блокираната страница сака да ве пренасочи на друга веб-страница. Ако изберете да продолжите, директно ќе навигирате до: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { - "message": "Export to cloud storage", + "message": "Извези во облачно складиште", "description": "tooltip" }, "cloudPull": { - "message": "Import from cloud storage", + "message": "Импортирај од облачно складиште", "description": "tooltip" }, "cloudPullAndMerge": { - "message": "Import from cloud storage and merge with current settings", + "message": "Импортирај од облачно складиште и спои со тековните поставки", "description": "tooltip" }, "cloudNoData": { @@ -1216,11 +1216,11 @@ "description": "used as a prompt for the user to provide a custom device name" }, "advancedSettingsWarning": { - "message": "Warning! Change these advanced settings at your own risk.", + "message": "Предупредување! Менувањето на овие напредни поставки е на ваша сопствена одговорност.", "description": "A warning to users at the top of 'Advanced settings' page" }, "genericSubmit": { - "message": "Submit", + "message": "Испрати", "description": "for generic 'Submit' buttons" }, "genericApplyChanges": { @@ -1236,19 +1236,19 @@ "description": "" }, "contextMenuBlockElementInFrame": { - "message": "Block element in frame…", + "message": "Блокирај елемент во рамката…", "description": "An entry in the browser's contextual menu" }, "contextMenuSubscribeToList": { - "message": "Subscribe to filter list…", + "message": "Пријави се на списокот со филтри…", "description": "An entry in the browser's contextual menu" }, "contextMenuTemporarilyAllowLargeMediaElements": { - "message": "Temporarily allow large media elements", + "message": "Привремено дозволи големи медиумски елементи", "description": "A context menu entry, present when large media elements have been blocked on the current site" }, "contextMenuViewSource": { - "message": "View source code…", + "message": "Прикажи изворен код…", "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": "Toggle locked scrolling", + "message": "Промени заклучување на скролувањето", "description": "Tooltip for the button used to lock scrolling between the views in the 'My rules' pane" }, "genericCopyToClipboard": { @@ -1264,15 +1264,15 @@ "description": "Label for buttons used to copy something to the clipboard" }, "genericSelectAll": { - "message": "Select all", + "message": "Избери сè", "description": "Label for buttons used to select all text in editor" }, "toggleCosmeticFiltering": { - "message": "Toggle cosmetic filtering", + "message": "Промени козметичко филтрирање", "description": "Label for keyboard shortcut used to toggle cosmetic filtering" }, "toggleJavascript": { - "message": "Toggle JavaScript", + "message": "Промени JavaScript", "description": "Label for keyboard shortcut used to toggle no-scripting switch" }, "relaxBlockingMode": { @@ -1280,7 +1280,7 @@ "description": "Label for keyboard shortcut used to relax blocking mode" }, "storageUsed": { - "message": "Место вземеноЧ {{value}} {{unit}}", + "message": "Место вземено: {{value}} {{unit}}", "description": " In Setting pane, renders as (example): Storage used: 13.2 MB" }, "KB": { @@ -1296,15 +1296,15 @@ "description": "short for 'gigabytes'" }, "clickToLoad": { - "message": "Click to load", + "message": "Кликнете за да вчитате", "description": "Message used in frame placeholders" }, "linterMainReport": { - "message": "Errors: {{count}}", + "message": "Грешки: {{count}}", "description": "Summary of number of errors as reported by the linter " }, "unprocessedRequestTooltip": { - "message": "Could not filter properly at browser launch. Reload the page to ensure proper filtering.", + "message": "Не можеше да се филтрира правилно при стартување на прелистувачот. Повторно вчитате ја страницата за да осигурите правилно филтрирање.", "description": "A warning which will appear in the popup panel if needed" }, "dummy": { diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json index 05ec46212f2d8..871a414a90737 100644 --- a/src/_locales/zh_TW/messages.json +++ b/src/_locales/zh_TW/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "終於,有款僅佔用少量 CPU 及記憶體的高效率阻擋器。", + "message": "終於,有一款僅使用少量 CPU 及記憶體的高效能攔截器。", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "dashboardName": { @@ -176,7 +176,7 @@ "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoRemoteFonts2": { - "message": "點擊以解除封鎖此網站的遠端字體", + "message": "點擊以解除封鎖此網站的遠端字型", "description": "Tooltip for the no-remote-fonts per-site switch" }, "popupTipNoScripting1": { @@ -200,7 +200,7 @@ "description": "Caption for the no-cosmetic-filtering per-site switch" }, "popupNoRemoteFonts_v2": { - "message": "遠端字體", + "message": "遠端字型", "description": "Caption for the no-remote-fonts per-site switch" }, "popupNoScripting_v2": { @@ -276,11 +276,11 @@ "description": "Example of use: Version 1.26.4" }, "popup3pScriptFilter": { - "message": "指令碼", + "message": "程式碼", "description": "Appears as an option to filter out firewall rows" }, "popup3pFrameFilter": { - "message": "框架", + "message": "框架元素", "description": "Appears as an option to filter out firewall rows" }, "pickerCreate": { @@ -356,7 +356,7 @@ "description": "Checkbox to let user access advanced, technical features" }, "settingsPrefetchingDisabledPrompt": { - "message": "停用「預先取回連結」功能(避免連接至已阻擋的網路請求)", + "message": "停用「預先取回連結」(避免連接至已阻擋的網路請求)", "description": "English: " }, "settingsHyperlinkAuditingDisabledPrompt": { @@ -364,7 +364,7 @@ "description": "English: " }, "settingsWebRTCIPAddressHiddenPrompt": { - "message": "防止 WebRTC 洩漏本地 IP 位址", + "message": "防止「網頁即時通訊」洩漏本地 IP 位址", "description": "English: " }, "settingPerSiteSwitchGroup": { @@ -384,7 +384,7 @@ "description": "" }, "settingsNoRemoteFontsPrompt": { - "message": "封鎖遠端字體", + "message": "封鎖遠端字型", "description": "" }, "settingsNoScriptingPrompt": { @@ -396,7 +396,7 @@ "description": "background information: https://github.com/gorhill/uBlock/issues/3150" }, "settingsUncloakCnamePrompt": { - "message": "揭露網域真實名稱", + "message": "揭露網域「正規名稱」", "description": "background information: https://github.com/uBlockOrigin/uBlock-issues/issues/1513" }, "settingsAdvanced": { @@ -404,7 +404,7 @@ "description": "Section for controlling advanced-user settings" }, "settingsAdvancedSynopsis": { - "message": "僅適合技術性使用者的功能", + "message": "僅合適技術使用者的功能", "description": "Description of section controlling advanced-user settings" }, "settingsAdvancedUserSettings": { @@ -452,7 +452,7 @@ "description": "This will cause uBO to ignore all generic cosmetic filters." }, "3pIgnoreGenericCosmeticFiltersInfo": { - "message": "「通用元素隱藏過濾規則」是會套用在所有網站上的網頁元素過濾規則。啟用此選項會消除網頁處理此類規則時增加的額外記憶體與 CPU 使用量。\n\n建議在擁有較低效能的裝置上啟用此選項。", + "message": "「通用元素過濾規則」是會套用在所有網站上的網頁元素過濾規則。啟用此選項會消除網頁處理此類規則時增加的額外記憶體與 CPU 使用量。\n\n建議在效能較弱的裝置上啟用此選項。", "description": "Describes the purpose of the 'Ignore generic cosmetic filters' feature." }, "3pSuspendUntilListsAreLoaded": { @@ -480,11 +480,11 @@ "description": "Filter lists section name" }, "3pGroupMalware": { - "message": "惡意軟體保護及保安", + "message": "惡意軟體保護、保安", "description": "Filter lists section name" }, "3pGroupSocial": { - "message": "社交媒體小工具", + "message": "社交小工具", "description": "Filter lists section name" }, "3pGroupCookies": { From e43cb6771ae6b0574579b8aae1464a5e624b30a0 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 25 Nov 2024 12:31:50 -0500 Subject: [PATCH 480/553] [mv3] Open options page in tab in Firefox --- platform/mv3/firefox/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/mv3/firefox/manifest.json b/platform/mv3/firefox/manifest.json index 723ef0fc8ba5b..e191e3c6be43c 100644 --- a/platform/mv3/firefox/manifest.json +++ b/platform/mv3/firefox/manifest.json @@ -37,6 +37,7 @@ "manifest_version": 3, "name": "__MSG_extName__", "options_ui": { + "open_in_tab": true, "page": "dashboard.html" }, "optional_permissions": [ From adced29b5bd26165ca89c4562a048c7e73a667f6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 27 Nov 2024 15:47:17 -0500 Subject: [PATCH 481/553] Improve `trusted-replace-argument` scriptlet As discussed with filter list maintainers, added ability to partially replace an argument using the `repl:` prefix. Updated documentation: --- @scriptlet trusted-replace-argument.js @description Replace an argument passed to a method. Requires a trusted source. @param propChain The property chain to the function which argument must be replaced when called. @param argposRaw The zero-based position of the argument in the argument list. Use a negative number for a position relative to the last argument. @param argraw The replacement value, validated using the same heuristic as with the `set-constant.js` scriptlet. If the replacement value matches `json:...`, the value will be the json-parsed string after `json:`. If the replacement value matches `repl:/.../.../`, the target argument will be replaced according the regex-replacement directive following `repl:` @param [, condition, pattern] Optional. The replacement will occur only when pattern matches the target argument. --- Aditionally, more scriptlets moved into their own files. --- assets/resources/attribute.js | 2 - assets/resources/base.js | 2 - assets/resources/cookie.js | 2 - assets/resources/localstorage.js | 2 - assets/resources/parse-replace.js | 54 ++++ assets/resources/proxy-apply.js | 109 +++++++ assets/resources/replace-argument.js | 105 +++++++ assets/resources/run-at.js | 2 - assets/resources/safe-self.js | 2 - assets/resources/scriptlets.js | 406 +-------------------------- assets/resources/set-constant.js | 287 +++++++++++++++++++ assets/resources/shared.js | 44 +++ assets/resources/spoof-css.js | 2 - src/js/arglist-parser.js | 116 ++++++++ src/js/static-filtering-parser.js | 103 +------ tools/make-nodejs.sh | 1 + 16 files changed, 723 insertions(+), 516 deletions(-) create mode 100644 assets/resources/parse-replace.js create mode 100644 assets/resources/proxy-apply.js create mode 100644 assets/resources/replace-argument.js create mode 100644 assets/resources/set-constant.js create mode 100644 assets/resources/shared.js create mode 100644 src/js/arglist-parser.js diff --git a/assets/resources/attribute.js b/assets/resources/attribute.js index 7873183de16b4..b6ecdf7a3e597 100644 --- a/assets/resources/attribute.js +++ b/assets/resources/attribute.js @@ -18,8 +18,6 @@ Home: https://github.com/gorhill/uBlock - The scriptlets below are meant to be injected only into a - web page context. */ import { registerScriptlet } from './base.js'; diff --git a/assets/resources/base.js b/assets/resources/base.js index dc677b7cb794c..2c54418a777d8 100644 --- a/assets/resources/base.js +++ b/assets/resources/base.js @@ -18,8 +18,6 @@ Home: https://github.com/gorhill/uBlock - The scriptlets below are meant to be injected only into a - web page context. */ export const registeredScriptlets = []; diff --git a/assets/resources/cookie.js b/assets/resources/cookie.js index 1be419121f5b5..3fbeb1858d122 100644 --- a/assets/resources/cookie.js +++ b/assets/resources/cookie.js @@ -18,8 +18,6 @@ Home: https://github.com/gorhill/uBlock - The scriptlets below are meant to be injected only into a - web page context. */ import { registerScriptlet } from './base.js'; diff --git a/assets/resources/localstorage.js b/assets/resources/localstorage.js index 6ea13df73a49e..73e41546e135d 100644 --- a/assets/resources/localstorage.js +++ b/assets/resources/localstorage.js @@ -18,8 +18,6 @@ Home: https://github.com/gorhill/uBlock - The scriptlets below are meant to be injected only into a - web page context. */ import { getSafeCookieValuesFn } from './cookie.js'; diff --git a/assets/resources/parse-replace.js b/assets/resources/parse-replace.js new file mode 100644 index 0000000000000..da638735f7140 --- /dev/null +++ b/assets/resources/parse-replace.js @@ -0,0 +1,54 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2019-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 { createArglistParser } from './shared.js'; +import { registerScriptlet } from './base.js'; + +/******************************************************************************/ + +export function parseReplaceFn(s) { + if ( s.charCodeAt(0) !== 0x2F /* / */ ) { return; } + const parser = createArglistParser('/'); + parser.nextArg(s, 1); + let pattern = s.slice(parser.argBeg, parser.argEnd); + if ( parser.transform ) { + pattern = parser.normalizeArg(pattern); + } + if ( pattern === '' ) { return; } + parser.nextArg(s, parser.separatorEnd); + let replacement = s.slice(parser.argBeg, parser.argEnd); + if ( parser.separatorEnd === parser.separatorBeg ) { return; } + if ( parser.transform ) { + replacement = parser.normalizeArg(replacement); + } + const flags = s.slice(parser.separatorEnd); + try { + return { re: new RegExp(pattern, flags), replacement }; + } catch(_) { + } +} +registerScriptlet(parseReplaceFn, { + name: 'parse-replace.fn', + dependencies: [ + createArglistParser, + ], +}); diff --git a/assets/resources/proxy-apply.js b/assets/resources/proxy-apply.js new file mode 100644 index 0000000000000..09d357f9052b6 --- /dev/null +++ b/assets/resources/proxy-apply.js @@ -0,0 +1,109 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2019-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 { registerScriptlet } from './base.js'; + +/******************************************************************************/ + +export function proxyApplyFn( + target = '', + handler = '' +) { + let context = globalThis; + let prop = target; + for (;;) { + const pos = prop.indexOf('.'); + if ( pos === -1 ) { break; } + context = context[prop.slice(0, pos)]; + if ( context instanceof Object === false ) { return; } + prop = prop.slice(pos+1); + } + const fn = context[prop]; + if ( typeof fn !== 'function' ) { return; } + if ( proxyApplyFn.CtorContext === undefined ) { + proxyApplyFn.ctorContexts = []; + proxyApplyFn.CtorContext = class { + constructor(...args) { + this.init(...args); + } + init(callFn, callArgs) { + this.callFn = callFn; + this.callArgs = callArgs; + return this; + } + reflect() { + const r = Reflect.construct(this.callFn, this.callArgs); + this.callFn = this.callArgs = undefined; + proxyApplyFn.ctorContexts.push(this); + return r; + } + static factory(...args) { + return proxyApplyFn.ctorContexts.length !== 0 + ? proxyApplyFn.ctorContexts.pop().init(...args) + : new proxyApplyFn.CtorContext(...args); + } + }; + proxyApplyFn.applyContexts = []; + proxyApplyFn.ApplyContext = class { + constructor(...args) { + this.init(...args); + } + init(callFn, thisArg, callArgs) { + this.callFn = callFn; + this.thisArg = thisArg; + this.callArgs = callArgs; + return this; + } + reflect() { + const r = Reflect.apply(this.callFn, this.thisArg, this.callArgs); + this.callFn = this.thisArg = this.callArgs = undefined; + proxyApplyFn.applyContexts.push(this); + return r; + } + static factory(...args) { + return proxyApplyFn.applyContexts.length !== 0 + ? proxyApplyFn.applyContexts.pop().init(...args) + : new proxyApplyFn.ApplyContext(...args); + } + }; + } + const fnStr = fn.toString(); + const toString = (function toString() { return fnStr; }).bind(null); + const proxyDetails = { + apply(target, thisArg, args) { + return handler(proxyApplyFn.ApplyContext.factory(target, thisArg, args)); + }, + get(target, prop) { + if ( prop === 'toString' ) { return toString; } + return Reflect.get(target, prop); + }, + }; + if ( fn.prototype?.constructor === fn ) { + proxyDetails.construct = function(target, args) { + return handler(proxyApplyFn.CtorContext.factory(target, args)); + }; + } + context[prop] = new Proxy(fn, proxyDetails); +} +registerScriptlet(proxyApplyFn, { + name: 'proxy-apply.fn', +}); diff --git a/assets/resources/replace-argument.js b/assets/resources/replace-argument.js new file mode 100644 index 0000000000000..150bf047b8a39 --- /dev/null +++ b/assets/resources/replace-argument.js @@ -0,0 +1,105 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2019-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 { parseReplaceFn } from './parse-replace.js'; +import { proxyApplyFn } from './proxy-apply.js'; +import { registerScriptlet } from './base.js'; +import { safeSelf } from './safe-self.js'; +import { validateConstantFn } from './set-constant.js'; + +/** + * @scriptlet trusted-replace-argument.js + * + * @description + * Replace an argument passed to a method. Requires a trusted source. + * + * @param propChain + * The property chain to the function which argument must be replaced when + * called. + * + * @param argposRaw + * The zero-based position of the argument in the argument list. Use a negative + * number for a position relative to the last argument. + * + * @param argraw + * The replacement value, validated using the same heuristic as with the + * `set-constant.js` scriptlet. + * If the replacement value matches `json:...`, the value will be the + * json-parsed string after `json:`. + * If the replacement value matches `repl:/.../.../`, the target argument will + * be replaced according the regex-replacement directive following `repl:` + * + * @param [, condition, pattern] + * Optional. The replacement will occur only when pattern matches the target + * argument. + * + * */ + +export function trustedReplaceArgument( + propChain = '', + argposRaw = '', + argraw = '' +) { + 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 replacer = argraw.startsWith('repl:/') && + parseReplaceFn(argraw.slice(5)) || undefined; + const value = replacer === undefined && + validateConstantFn(true, argraw, extraArgs) || undefined; + const reCondition = extraArgs.condition + ? safe.patternToRegex(extraArgs.condition) + : /^/; + proxyApplyFn(propChain, function(context) { + const { callArgs } = context; + if ( argposRaw === '' ) { + safe.uboLog(logPrefix, `Arguments:\n${callArgs.join('\n')}`); + return context.reflect(); + } + const argpos = argoffset >= 0 ? argoffset : callArgs.length - argoffset; + if ( argpos < 0 || argpos >= callArgs.length ) { + return context.reflect(); + } + const argBefore = callArgs[argpos]; + if ( safe.RegExp_test.call(reCondition, argBefore) === false ) { + return context.reflect(); + } + const argAfter = replacer && typeof argBefore === 'string' + ? argBefore.replace(replacer.re, replacer.replacement) + : value; + callArgs[argpos] = argAfter; + safe.uboLog(logPrefix, `Replaced argument:\nBefore: ${JSON.stringify(argBefore)}\nAfter: ${argAfter}`); + return context.reflect(); + }); +} +registerScriptlet(trustedReplaceArgument, { + name: 'trusted-replace-argument.js', + requiresTrust: true, + dependencies: [ + parseReplaceFn, + proxyApplyFn, + safeSelf, + validateConstantFn, + ], +}); diff --git a/assets/resources/run-at.js b/assets/resources/run-at.js index 65e1be534dd5a..545324dcf1160 100644 --- a/assets/resources/run-at.js +++ b/assets/resources/run-at.js @@ -18,8 +18,6 @@ Home: https://github.com/gorhill/uBlock - The scriptlets below are meant to be injected only into a - web page context. */ import { registerScriptlet } from './base.js'; diff --git a/assets/resources/safe-self.js b/assets/resources/safe-self.js index bad9eece359ae..a1840e13b6464 100644 --- a/assets/resources/safe-self.js +++ b/assets/resources/safe-self.js @@ -18,8 +18,6 @@ Home: https://github.com/gorhill/uBlock - The scriptlets below are meant to be injected only into a - web page context. */ import { registerScriptlet } from './base.js'; diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index 46c31b6dc4e13..d045352acc4d3 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -18,23 +18,20 @@ Home: https://github.com/gorhill/uBlock - The scriptlets below are meant to be injected only into a - web page context. */ import './attribute.js'; -import './cookie.js'; -import './localstorage.js'; -import './run-at.js'; -import './safe-self.js'; +import './replace-argument.js'; import './spoof-css.js'; import { runAt, runAtHtmlElementFn } from './run-at.js'; import { getAllCookiesFn } from './cookie.js'; import { getAllLocalStorageFn } from './localstorage.js'; +import { proxyApplyFn } from './proxy-apply.js'; import { registeredScriptlets } from './base.js'; import { safeSelf } from './safe-self.js'; +import { validateConstantFn } from './set-constant.js'; // Externally added to the private namespace in which scriptlets execute. /* global scriptletGlobals */ @@ -289,228 +286,6 @@ function abortCurrentScriptCore( /******************************************************************************/ -builtinScriptlets.push({ - name: 'validate-constant.fn', - fn: validateConstantFn, - dependencies: [ - 'safe-self.fn', - ], -}); -function validateConstantFn(trusted, raw, extraArgs = {}) { - const safe = safeSelf(); - let value; - if ( raw === 'undefined' ) { - value = undefined; - } else if ( raw === 'false' ) { - value = false; - } else if ( raw === 'true' ) { - value = true; - } else if ( raw === 'null' ) { - value = null; - } else if ( raw === "''" || raw === '' ) { - value = ''; - } else if ( raw === '[]' || raw === 'emptyArr' ) { - value = []; - } else if ( raw === '{}' || raw === 'emptyObj' ) { - value = {}; - } else if ( raw === 'noopFunc' ) { - value = function(){}; - } else if ( raw === 'trueFunc' ) { - value = function(){ return true; }; - } else if ( raw === 'falseFunc' ) { - value = function(){ return false; }; - } else if ( raw === 'throwFunc' ) { - value = function(){ throw ''; }; - } else if ( /^-?\d+$/.test(raw) ) { - value = parseInt(raw); - if ( isNaN(raw) ) { return; } - if ( Math.abs(raw) > 0x7FFF ) { return; } - } else if ( trusted ) { - if ( raw.startsWith('json:') ) { - try { value = safe.JSON_parse(raw.slice(5)); } catch(ex) { return; } - } else if ( raw.startsWith('{') && raw.endsWith('}') ) { - try { value = safe.JSON_parse(raw).value; } catch(ex) { return; } - } - } else { - return; - } - if ( extraArgs.as !== undefined ) { - if ( extraArgs.as === 'function' ) { - return ( ) => value; - } else if ( extraArgs.as === 'callback' ) { - return ( ) => (( ) => value); - } else if ( extraArgs.as === 'resolved' ) { - return Promise.resolve(value); - } else if ( extraArgs.as === 'rejected' ) { - return Promise.reject(value); - } - } - return value; -} - -/******************************************************************************/ - -builtinScriptlets.push({ - name: 'set-constant.fn', - fn: setConstantFn, - dependencies: [ - 'run-at.fn', - 'safe-self.fn', - 'validate-constant.fn', - ], -}); -function setConstantFn( - trusted = false, - chain = '', - rawValue = '' -) { - if ( chain === '' ) { return; } - const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('set-constant', chain, rawValue); - const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); - function setConstant(chain, rawValue) { - const trappedProp = (( ) => { - const pos = chain.lastIndexOf('.'); - if ( pos === -1 ) { return chain; } - return chain.slice(pos+1); - })(); - const cloakFunc = fn => { - safe.Object_defineProperty(fn, 'name', { value: trappedProp }); - return new Proxy(fn, { - defineProperty(target, prop) { - if ( prop !== 'toString' ) { - return Reflect.defineProperty(...arguments); - } - return true; - }, - deleteProperty(target, prop) { - if ( prop !== 'toString' ) { - return Reflect.deleteProperty(...arguments); - } - return true; - }, - get(target, prop) { - if ( prop === 'toString' ) { - return function() { - return `function ${trappedProp}() { [native code] }`; - }.bind(null); - } - return Reflect.get(...arguments); - }, - }); - }; - if ( trappedProp === '' ) { return; } - const thisScript = document.currentScript; - let normalValue = validateConstantFn(trusted, rawValue, extraArgs); - if ( rawValue === 'noopFunc' || rawValue === 'trueFunc' || rawValue === 'falseFunc' ) { - normalValue = cloakFunc(normalValue); - } - let aborted = false; - const mustAbort = function(v) { - if ( trusted ) { return false; } - if ( aborted ) { return true; } - aborted = - (v !== undefined && v !== null) && - (normalValue !== undefined && normalValue !== null) && - (typeof v !== typeof normalValue); - if ( aborted ) { - safe.uboLog(logPrefix, `Aborted because value set to ${v}`); - } - return aborted; - }; - // https://github.com/uBlockOrigin/uBlock-issues/issues/156 - // Support multiple trappers for the same property. - const trapProp = function(owner, prop, configurable, handler) { - if ( handler.init(configurable ? owner[prop] : normalValue) === false ) { return; } - const odesc = safe.Object_getOwnPropertyDescriptor(owner, prop); - let prevGetter, prevSetter; - if ( odesc instanceof safe.Object ) { - owner[prop] = normalValue; - if ( odesc.get instanceof Function ) { - prevGetter = odesc.get; - } - if ( odesc.set instanceof Function ) { - prevSetter = odesc.set; - } - } - try { - safe.Object_defineProperty(owner, prop, { - configurable, - get() { - if ( prevGetter !== undefined ) { - prevGetter(); - } - return handler.getter(); - }, - set(a) { - if ( prevSetter !== undefined ) { - prevSetter(a); - } - handler.setter(a); - } - }); - safe.uboLog(logPrefix, 'Trap installed'); - } catch(ex) { - safe.uboErr(logPrefix, ex); - } - }; - const trapChain = function(owner, chain) { - const pos = chain.indexOf('.'); - if ( pos === -1 ) { - trapProp(owner, chain, false, { - v: undefined, - init: function(v) { - if ( mustAbort(v) ) { return false; } - this.v = v; - return true; - }, - getter: function() { - if ( document.currentScript === thisScript ) { - return this.v; - } - safe.uboLog(logPrefix, 'Property read'); - return normalValue; - }, - setter: function(a) { - if ( mustAbort(a) === false ) { return; } - normalValue = a; - } - }); - return; - } - const prop = chain.slice(0, pos); - const v = owner[prop]; - chain = chain.slice(pos + 1); - if ( v instanceof safe.Object || typeof v === 'object' && v !== null ) { - trapChain(v, chain); - return; - } - trapProp(owner, prop, true, { - v: undefined, - init: function(v) { - this.v = v; - return true; - }, - getter: function() { - return this.v; - }, - setter: function(a) { - this.v = a; - if ( a instanceof safe.Object ) { - trapChain(a, chain); - } - } - }); - }; - trapChain(window, chain); - } - runAt(( ) => { - setConstant(chain, rawValue); - }, extraArgs.runAt); -} - -/******************************************************************************/ - builtinScriptlets.push({ name: 'replace-node-text.fn', fn: replaceNodeTextFn, @@ -1045,93 +820,6 @@ function replaceFetchResponseFn( /******************************************************************************/ -builtinScriptlets.push({ - name: 'proxy-apply.fn', - fn: proxyApplyFn, -}); -function proxyApplyFn( - target = '', - handler = '' -) { - let context = globalThis; - let prop = target; - for (;;) { - const pos = prop.indexOf('.'); - if ( pos === -1 ) { break; } - context = context[prop.slice(0, pos)]; - if ( context instanceof Object === false ) { return; } - prop = prop.slice(pos+1); - } - const fn = context[prop]; - if ( typeof fn !== 'function' ) { return; } - if ( proxyApplyFn.CtorContext === undefined ) { - proxyApplyFn.ctorContexts = []; - proxyApplyFn.CtorContext = class { - constructor(...args) { - this.init(...args); - } - init(callFn, callArgs) { - this.callFn = callFn; - this.callArgs = callArgs; - return this; - } - reflect() { - const r = Reflect.construct(this.callFn, this.callArgs); - this.callFn = this.callArgs = undefined; - proxyApplyFn.ctorContexts.push(this); - return r; - } - static factory(...args) { - return proxyApplyFn.ctorContexts.length !== 0 - ? proxyApplyFn.ctorContexts.pop().init(...args) - : new proxyApplyFn.CtorContext(...args); - } - }; - proxyApplyFn.applyContexts = []; - proxyApplyFn.ApplyContext = class { - constructor(...args) { - this.init(...args); - } - init(callFn, thisArg, callArgs) { - this.callFn = callFn; - this.thisArg = thisArg; - this.callArgs = callArgs; - return this; - } - reflect() { - const r = Reflect.apply(this.callFn, this.thisArg, this.callArgs); - this.callFn = this.thisArg = this.callArgs = undefined; - proxyApplyFn.applyContexts.push(this); - return r; - } - static factory(...args) { - return proxyApplyFn.applyContexts.length !== 0 - ? proxyApplyFn.applyContexts.pop().init(...args) - : new proxyApplyFn.ApplyContext(...args); - } - }; - } - const fnStr = fn.toString(); - const toString = (function toString() { return fnStr; }).bind(null); - const proxyDetails = { - apply(target, thisArg, args) { - return handler(proxyApplyFn.ApplyContext.factory(target, thisArg, args)); - }, - get(target, prop) { - if ( prop === 'toString' ) { return toString; } - return Reflect.get(target, prop); - }, - }; - if ( fn.prototype?.constructor === fn ) { - proxyDetails.construct = function(target, args) { - return handler(proxyApplyFn.CtorContext.factory(target, args)); - }; - } - context[prop] = new Proxy(fn, proxyDetails); -} - -/******************************************************************************/ - builtinScriptlets.push({ name: 'prevent-xhr.fn', fn: preventXhrFn, @@ -2205,24 +1893,6 @@ function noRequestAnimationFrameIf( /******************************************************************************/ -builtinScriptlets.push({ - name: 'set-constant.js', - aliases: [ - 'set.js', - ], - fn: setConstant, - dependencies: [ - 'set-constant.fn' - ], -}); -function setConstant( - ...args -) { - setConstantFn(false, ...args); -} - -/******************************************************************************/ - builtinScriptlets.push({ name: 'no-setInterval-if.js', aliases: [ @@ -3440,32 +3110,6 @@ function replaceNodeText( replaceNodeTextFn(nodeName, pattern, replacement, ...extraArgs); } -/******************************************************************************* - * - * trusted-set-constant.js - * - * Set specified property to any value. This is essentially the same as - * set-constant.js, but with no restriction as to which values can be used. - * - **/ - -builtinScriptlets.push({ - name: 'trusted-set-constant.js', - requiresTrust: true, - aliases: [ - 'trusted-set.js', - ], - fn: trustedSetConstant, - dependencies: [ - 'set-constant.fn' - ], -}); -function trustedSetConstant( - ...args -) { - setConstantFn(true, ...args); -} - /******************************************************************************* * * trusted-replace-fetch-response.js @@ -3880,50 +3524,6 @@ function trustedPruneOutboundObject( /******************************************************************************/ -builtinScriptlets.push({ - name: 'trusted-replace-argument.js', - requiresTrust: true, - fn: trustedReplaceArgument, - dependencies: [ - 'proxy-apply.fn', - 'safe-self.fn', - 'validate-constant.fn', - ], -}); -function trustedReplaceArgument( - propChain = '', - argposRaw = '', - argraw = '' -) { - 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 normalValue = validateConstantFn(true, argraw, extraArgs); - const reCondition = extraArgs.condition - ? safe.patternToRegex(extraArgs.condition) - : /^/; - proxyApplyFn(propChain, function(context) { - const { callArgs } = context; - if ( argposRaw === '' ) { - safe.uboLog(logPrefix, `Arguments:\n${callArgs.join('\n')}`); - return context.reflect(); - } - const argpos = argoffset >= 0 ? argoffset : callArgs.length - argoffset; - if ( argpos >= 0 && argpos < callArgs.length ) { - const argBefore = callArgs[argpos]; - if ( safe.RegExp_test.call(reCondition, argBefore) ) { - callArgs[argpos] = normalValue; - safe.uboLog(logPrefix, `Replaced argument:\nBefore: ${JSON.stringify(argBefore)}\nAfter: ${normalValue}`); - } - } - return context.reflect(); - }); -} - -/******************************************************************************/ - builtinScriptlets.push({ name: 'trusted-replace-outbound-text.js', requiresTrust: true, diff --git a/assets/resources/set-constant.js b/assets/resources/set-constant.js new file mode 100644 index 0000000000000..127f27bbbe910 --- /dev/null +++ b/assets/resources/set-constant.js @@ -0,0 +1,287 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2019-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 { registerScriptlet } from './base.js'; +import { runAt } from './run-at.js'; +import { safeSelf } from './safe-self.js'; + +/******************************************************************************/ + +export function validateConstantFn(trusted, raw, extraArgs = {}) { + const safe = safeSelf(); + let value; + if ( raw === 'undefined' ) { + value = undefined; + } else if ( raw === 'false' ) { + value = false; + } else if ( raw === 'true' ) { + value = true; + } else if ( raw === 'null' ) { + value = null; + } else if ( raw === "''" || raw === '' ) { + value = ''; + } else if ( raw === '[]' || raw === 'emptyArr' ) { + value = []; + } else if ( raw === '{}' || raw === 'emptyObj' ) { + value = {}; + } else if ( raw === 'noopFunc' ) { + value = function(){}; + } else if ( raw === 'trueFunc' ) { + value = function(){ return true; }; + } else if ( raw === 'falseFunc' ) { + value = function(){ return false; }; + } else if ( raw === 'throwFunc' ) { + value = function(){ throw ''; }; + } else if ( /^-?\d+$/.test(raw) ) { + value = parseInt(raw); + if ( isNaN(raw) ) { return; } + if ( Math.abs(raw) > 0x7FFF ) { return; } + } else if ( trusted ) { + if ( raw.startsWith('json:') ) { + try { value = safe.JSON_parse(raw.slice(5)); } catch(ex) { return; } + } else if ( raw.startsWith('{') && raw.endsWith('}') ) { + try { value = safe.JSON_parse(raw).value; } catch(ex) { return; } + } + } else { + return; + } + if ( extraArgs.as !== undefined ) { + if ( extraArgs.as === 'function' ) { + return ( ) => value; + } else if ( extraArgs.as === 'callback' ) { + return ( ) => (( ) => value); + } else if ( extraArgs.as === 'resolved' ) { + return Promise.resolve(value); + } else if ( extraArgs.as === 'rejected' ) { + return Promise.reject(value); + } + } + return value; +} +registerScriptlet(validateConstantFn, { + name: 'validate-constant.fn', + dependencies: [ + safeSelf, + ], +}); + +/******************************************************************************/ + +export function setConstantFn( + trusted = false, + chain = '', + rawValue = '' +) { + if ( chain === '' ) { return; } + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('set-constant', chain, rawValue); + const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); + function setConstant(chain, rawValue) { + const trappedProp = (( ) => { + const pos = chain.lastIndexOf('.'); + if ( pos === -1 ) { return chain; } + return chain.slice(pos+1); + })(); + const cloakFunc = fn => { + safe.Object_defineProperty(fn, 'name', { value: trappedProp }); + return new Proxy(fn, { + defineProperty(target, prop) { + if ( prop !== 'toString' ) { + return Reflect.defineProperty(...arguments); + } + return true; + }, + deleteProperty(target, prop) { + if ( prop !== 'toString' ) { + return Reflect.deleteProperty(...arguments); + } + return true; + }, + get(target, prop) { + if ( prop === 'toString' ) { + return function() { + return `function ${trappedProp}() { [native code] }`; + }.bind(null); + } + return Reflect.get(...arguments); + }, + }); + }; + if ( trappedProp === '' ) { return; } + const thisScript = document.currentScript; + let normalValue = validateConstantFn(trusted, rawValue, extraArgs); + if ( rawValue === 'noopFunc' || rawValue === 'trueFunc' || rawValue === 'falseFunc' ) { + normalValue = cloakFunc(normalValue); + } + let aborted = false; + const mustAbort = function(v) { + if ( trusted ) { return false; } + if ( aborted ) { return true; } + aborted = + (v !== undefined && v !== null) && + (normalValue !== undefined && normalValue !== null) && + (typeof v !== typeof normalValue); + if ( aborted ) { + safe.uboLog(logPrefix, `Aborted because value set to ${v}`); + } + return aborted; + }; + // https://github.com/uBlockOrigin/uBlock-issues/issues/156 + // Support multiple trappers for the same property. + const trapProp = function(owner, prop, configurable, handler) { + if ( handler.init(configurable ? owner[prop] : normalValue) === false ) { return; } + const odesc = safe.Object_getOwnPropertyDescriptor(owner, prop); + let prevGetter, prevSetter; + if ( odesc instanceof safe.Object ) { + owner[prop] = normalValue; + if ( odesc.get instanceof Function ) { + prevGetter = odesc.get; + } + if ( odesc.set instanceof Function ) { + prevSetter = odesc.set; + } + } + try { + safe.Object_defineProperty(owner, prop, { + configurable, + get() { + if ( prevGetter !== undefined ) { + prevGetter(); + } + return handler.getter(); + }, + set(a) { + if ( prevSetter !== undefined ) { + prevSetter(a); + } + handler.setter(a); + } + }); + safe.uboLog(logPrefix, 'Trap installed'); + } catch(ex) { + safe.uboErr(logPrefix, ex); + } + }; + const trapChain = function(owner, chain) { + const pos = chain.indexOf('.'); + if ( pos === -1 ) { + trapProp(owner, chain, false, { + v: undefined, + init: function(v) { + if ( mustAbort(v) ) { return false; } + this.v = v; + return true; + }, + getter: function() { + if ( document.currentScript === thisScript ) { + return this.v; + } + safe.uboLog(logPrefix, 'Property read'); + return normalValue; + }, + setter: function(a) { + if ( mustAbort(a) === false ) { return; } + normalValue = a; + } + }); + return; + } + const prop = chain.slice(0, pos); + const v = owner[prop]; + chain = chain.slice(pos + 1); + if ( v instanceof safe.Object || typeof v === 'object' && v !== null ) { + trapChain(v, chain); + return; + } + trapProp(owner, prop, true, { + v: undefined, + init: function(v) { + this.v = v; + return true; + }, + getter: function() { + return this.v; + }, + setter: function(a) { + this.v = a; + if ( a instanceof safe.Object ) { + trapChain(a, chain); + } + } + }); + }; + trapChain(window, chain); + } + runAt(( ) => { + setConstant(chain, rawValue); + }, extraArgs.runAt); +} +registerScriptlet(setConstantFn, { + name: 'set-constant.fn', + dependencies: [ + runAt, + safeSelf, + validateConstantFn, + ], +}); + +/******************************************************************************/ + +export function setConstant( + ...args +) { + setConstantFn(false, ...args); +} +registerScriptlet(setConstant, { + name: 'set-constant.js', + aliases: [ + 'set.js', + ], + dependencies: [ + setConstantFn, + ], +}); + +/******************************************************************************* + * + * trusted-set-constant.js + * + * Set specified property to any value. This is essentially the same as + * set-constant.js, but with no restriction as to which values can be used. + * + **/ + +export function trustedSetConstant( + ...args +) { + setConstantFn(true, ...args); +} +registerScriptlet(trustedSetConstant, { + name: 'trusted-set-constant.js', + requiresTrust: true, + aliases: [ + 'trusted-set.js', + ], + dependencies: [ + setConstantFn, + ], +}); diff --git a/assets/resources/shared.js b/assets/resources/shared.js new file mode 100644 index 0000000000000..89d8503e7e4d0 --- /dev/null +++ b/assets/resources/shared.js @@ -0,0 +1,44 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2019-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 + +*/ + +// Code imported from main code base and exposed as injectable scriptlets +import { ArglistParser } from '../../js/arglist-parser.js'; + +import { registerScriptlet } from './base.js'; + +/******************************************************************************/ + +registerScriptlet(ArglistParser, { + name: 'arglist-parser.fn', +}); + +/******************************************************************************/ + +export function createArglistParser(...args) { + return new ArglistParser(...args); +} +registerScriptlet(createArglistParser, { + name: 'create-arglist-parser.fn', + dependencies: [ + ArglistParser, + ], +}); diff --git a/assets/resources/spoof-css.js b/assets/resources/spoof-css.js index 32b51acf407c0..7cc7b9f95574c 100644 --- a/assets/resources/spoof-css.js +++ b/assets/resources/spoof-css.js @@ -18,8 +18,6 @@ Home: https://github.com/gorhill/uBlock - The scriptlets below are meant to be injected only into a - web page context. */ import { registerScriptlet } from './base.js'; diff --git a/src/js/arglist-parser.js b/src/js/arglist-parser.js new file mode 100644 index 0000000000000..d8200df5822a1 --- /dev/null +++ b/src/js/arglist-parser.js @@ -0,0 +1,116 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2020-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 class ArglistParser { + constructor(separatorChar = ',', mustQuote = false) { + this.separatorChar = this.actualSeparatorChar = separatorChar; + this.separatorCode = this.actualSeparatorCode = separatorChar.charCodeAt(0); + this.mustQuote = mustQuote; + this.quoteBeg = 0; this.quoteEnd = 0; + this.argBeg = 0; this.argEnd = 0; + this.separatorBeg = 0; this.separatorEnd = 0; + this.transform = false; + this.failed = false; + this.reWhitespaceStart = /^\s+/; + this.reWhitespaceEnd = /\s+$/; + this.reOddTrailingEscape = /(?:^|[^\\])(?:\\\\)*\\$/; + this.reTrailingEscapeChars = /\\+$/; + } + nextArg(pattern, beg = 0) { + const len = pattern.length; + this.quoteBeg = beg + this.leftWhitespaceCount(pattern.slice(beg)); + this.failed = false; + const qc = pattern.charCodeAt(this.quoteBeg); + if ( qc === 0x22 /* " */ || qc === 0x27 /* ' */ || qc === 0x60 /* ` */ ) { + this.indexOfNextArgSeparator(pattern, qc); + if ( this.argEnd !== len ) { + this.quoteEnd = this.argEnd + 1; + this.separatorBeg = this.separatorEnd = this.quoteEnd; + this.separatorEnd += this.leftWhitespaceCount(pattern.slice(this.quoteEnd)); + if ( this.separatorEnd === len ) { return this; } + if ( pattern.charCodeAt(this.separatorEnd) === this.separatorCode ) { + this.separatorEnd += 1; + return this; + } + } + } + this.indexOfNextArgSeparator(pattern, this.separatorCode); + this.separatorBeg = this.separatorEnd = this.argEnd; + if ( this.separatorBeg < len ) { + this.separatorEnd += 1; + } + this.argEnd -= this.rightWhitespaceCount(pattern.slice(0, this.separatorBeg)); + this.quoteEnd = this.argEnd; + if ( this.mustQuote ) { + this.failed = true; + } + return this; + } + normalizeArg(s, char = '') { + if ( char === '' ) { char = this.actualSeparatorChar; } + let out = ''; + let pos = 0; + while ( (pos = s.lastIndexOf(char)) !== -1 ) { + out = s.slice(pos) + out; + s = s.slice(0, pos); + const match = this.reTrailingEscapeChars.exec(s); + if ( match === null ) { continue; } + const tail = (match[0].length & 1) !== 0 + ? match[0].slice(0, -1) + : match[0]; + out = tail + out; + s = s.slice(0, -match[0].length); + } + if ( out === '' ) { return s; } + return s + out; + } + leftWhitespaceCount(s) { + const match = this.reWhitespaceStart.exec(s); + return match === null ? 0 : match[0].length; + } + rightWhitespaceCount(s) { + const match = this.reWhitespaceEnd.exec(s); + return match === null ? 0 : match[0].length; + } + indexOfNextArgSeparator(pattern, separatorCode) { + this.argBeg = this.argEnd = separatorCode !== this.separatorCode + ? this.quoteBeg + 1 + : this.quoteBeg; + this.transform = false; + if ( separatorCode !== this.actualSeparatorCode ) { + this.actualSeparatorCode = separatorCode; + this.actualSeparatorChar = String.fromCharCode(separatorCode); + } + while ( this.argEnd < pattern.length ) { + const pos = pattern.indexOf(this.actualSeparatorChar, this.argEnd); + if ( pos === -1 ) { + return (this.argEnd = pattern.length); + } + if ( this.reOddTrailingEscape.test(pattern.slice(0, pos)) === false ) { + return (this.argEnd = pos); + } + this.transform = true; + this.argEnd = pos + 1; + } + } +} diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index f49b0bfe7208d..2be165eb107ef 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -22,6 +22,7 @@ /******************************************************************************/ import * as cssTree from '../lib/csstree/css-tree.js'; +import { ArglistParser } from './arglist-parser.js'; import Regex from '../lib/regexanalyzer/regex.js'; /******************************************************************************* @@ -606,102 +607,6 @@ const exCharCodeAt = (s, i) => { /******************************************************************************/ -class ArgListParser { - constructor(separatorChar = ',', mustQuote = false) { - this.separatorChar = this.actualSeparatorChar = separatorChar; - this.separatorCode = this.actualSeparatorCode = separatorChar.charCodeAt(0); - this.mustQuote = mustQuote; - this.quoteBeg = 0; this.quoteEnd = 0; - this.argBeg = 0; this.argEnd = 0; - this.separatorBeg = 0; this.separatorEnd = 0; - this.transform = false; - this.failed = false; - this.reWhitespaceStart = /^\s+/; - this.reWhitespaceEnd = /\s+$/; - this.reOddTrailingEscape = /(?:^|[^\\])(?:\\\\)*\\$/; - this.reTrailingEscapeChars = /\\+$/; - } - nextArg(pattern, beg = 0) { - const len = pattern.length; - this.quoteBeg = beg + this.leftWhitespaceCount(pattern.slice(beg)); - this.failed = false; - const qc = pattern.charCodeAt(this.quoteBeg); - if ( qc === 0x22 /* " */ || qc === 0x27 /* ' */ || qc === 0x60 /* ` */ ) { - this.indexOfNextArgSeparator(pattern, qc); - if ( this.argEnd !== len ) { - this.quoteEnd = this.argEnd + 1; - this.separatorBeg = this.separatorEnd = this.quoteEnd; - this.separatorEnd += this.leftWhitespaceCount(pattern.slice(this.quoteEnd)); - if ( this.separatorEnd === len ) { return this; } - if ( pattern.charCodeAt(this.separatorEnd) === this.separatorCode ) { - this.separatorEnd += 1; - return this; - } - } - } - this.indexOfNextArgSeparator(pattern, this.separatorCode); - this.separatorBeg = this.separatorEnd = this.argEnd; - if ( this.separatorBeg < len ) { - this.separatorEnd += 1; - } - this.argEnd -= this.rightWhitespaceCount(pattern.slice(0, this.separatorBeg)); - this.quoteEnd = this.argEnd; - if ( this.mustQuote ) { - this.failed = true; - } - return this; - } - normalizeArg(s, char = '') { - if ( char === '' ) { char = this.actualSeparatorChar; } - let out = ''; - let pos = 0; - while ( (pos = s.lastIndexOf(char)) !== -1 ) { - out = s.slice(pos) + out; - s = s.slice(0, pos); - const match = this.reTrailingEscapeChars.exec(s); - if ( match === null ) { continue; } - const tail = (match[0].length & 1) !== 0 - ? match[0].slice(0, -1) - : match[0]; - out = tail + out; - s = s.slice(0, -match[0].length); - } - if ( out === '' ) { return s; } - return s + out; - } - leftWhitespaceCount(s) { - const match = this.reWhitespaceStart.exec(s); - return match === null ? 0 : match[0].length; - } - rightWhitespaceCount(s) { - const match = this.reWhitespaceEnd.exec(s); - return match === null ? 0 : match[0].length; - } - indexOfNextArgSeparator(pattern, separatorCode) { - this.argBeg = this.argEnd = separatorCode !== this.separatorCode - ? this.quoteBeg + 1 - : this.quoteBeg; - this.transform = false; - if ( separatorCode !== this.actualSeparatorCode ) { - this.actualSeparatorCode = separatorCode; - this.actualSeparatorChar = String.fromCharCode(separatorCode); - } - while ( this.argEnd < pattern.length ) { - const pos = pattern.indexOf(this.actualSeparatorChar, this.argEnd); - if ( pos === -1 ) { - return (this.argEnd = pattern.length); - } - if ( this.reOddTrailingEscape.test(pattern.slice(0, pos)) === false ) { - return (this.argEnd = pos); - } - this.transform = true; - this.argEnd = pos + 1; - } - } -} - -/******************************************************************************/ - class AstWalker { constructor(parser, from = 0) { this.parser = parser; @@ -904,8 +809,8 @@ export class AstFilterParser { this.reBadPP = /(?:^|[;,])\s*report-to\b/i; this.reNetOption = /^(~?)([134a-z_-]+)(=?)/; this.reNoopOption = /^_+$/; - this.netOptionValueParser = new ArgListParser(','); - this.scriptletArgListParser = new ArgListParser(','); + this.netOptionValueParser = new ArglistParser(','); + this.scriptletArgListParser = new ArglistParser(','); } finish() { @@ -3100,7 +3005,7 @@ export function parseHeaderValue(arg) { export function parseReplaceValue(s) { if ( s.charCodeAt(0) !== 0x2F /* / */ ) { return; } - const parser = new ArgListParser('/'); + const parser = new ArglistParser('/'); parser.nextArg(s, 1); let pattern = s.slice(parser.argBeg, parser.argEnd); if ( parser.transform ) { diff --git a/tools/make-nodejs.sh b/tools/make-nodejs.sh index 270456814b9b3..87e96ddade909 100755 --- a/tools/make-nodejs.sh +++ b/tools/make-nodejs.sh @@ -7,6 +7,7 @@ set -e DES=$1 mkdir -p $DES/js +cp src/js/arglist-parser.js $DES/js cp src/js/base64-custom.js $DES/js cp src/js/biditrie.js $DES/js cp src/js/dynamic-net-filtering.js $DES/js From 4d525f1a55c7d55b525b98414b4c184611745296 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 27 Nov 2024 16:47:11 -0500 Subject: [PATCH 482/553] Move `assets/resources` into `src/js/` --- platform/mv3/make-scriptlets.js | 6 +----- src/js/redirect-engine.js | 2 +- {assets => src/js}/resources/attribute.js | 0 {assets => src/js}/resources/base.js | 0 {assets => src/js}/resources/cookie.js | 0 {assets => src/js}/resources/localstorage.js | 0 {assets => src/js}/resources/parse-replace.js | 0 {assets => src/js}/resources/proxy-apply.js | 0 {assets => src/js}/resources/replace-argument.js | 0 {assets => src/js}/resources/run-at.js | 0 {assets => src/js}/resources/safe-self.js | 0 {assets => src/js}/resources/scriptlets.js | 0 {assets => src/js}/resources/set-constant.js | 0 {assets => src/js}/resources/shared.js | 2 +- {assets => src/js}/resources/spoof-css.js | 0 tools/copy-common-files.sh | 1 + tools/make-mv3.sh | 2 +- 17 files changed, 5 insertions(+), 8 deletions(-) rename {assets => src/js}/resources/attribute.js (100%) rename {assets => src/js}/resources/base.js (100%) rename {assets => src/js}/resources/cookie.js (100%) rename {assets => src/js}/resources/localstorage.js (100%) rename {assets => src/js}/resources/parse-replace.js (100%) rename {assets => src/js}/resources/proxy-apply.js (100%) rename {assets => src/js}/resources/replace-argument.js (100%) rename {assets => src/js}/resources/run-at.js (100%) rename {assets => src/js}/resources/safe-self.js (100%) rename {assets => src/js}/resources/scriptlets.js (100%) rename {assets => src/js}/resources/set-constant.js (100%) rename {assets => src/js}/resources/shared.js (96%) rename {assets => src/js}/resources/spoof-css.js (100%) diff --git a/platform/mv3/make-scriptlets.js b/platform/mv3/make-scriptlets.js index d276a56a6ace4..4ca52cd1ba7b8 100644 --- a/platform/mv3/make-scriptlets.js +++ b/platform/mv3/make-scriptlets.js @@ -19,12 +19,8 @@ Home: https://github.com/gorhill/uBlock */ -'use strict'; - -/******************************************************************************/ - +import { builtinScriptlets } from './resources/scriptlets.js'; import fs from 'fs/promises'; -import { builtinScriptlets } from './scriptlets.js'; import { safeReplace } from './safe-replace.js'; /******************************************************************************/ diff --git a/src/js/redirect-engine.js b/src/js/redirect-engine.js index f16b73ca0765f..d768db546f537 100644 --- a/src/js/redirect-engine.js +++ b/src/js/redirect-engine.js @@ -316,7 +316,7 @@ class RedirectEngine { this.aliases = new Map(); const fetches = [ - import('/assets/resources/scriptlets.js').then(module => { + import('/js/resources/scriptlets.js').then(module => { for ( const scriptlet of module.builtinScriptlets ) { const details = {}; details.mime = mimeFromName(scriptlet.name); diff --git a/assets/resources/attribute.js b/src/js/resources/attribute.js similarity index 100% rename from assets/resources/attribute.js rename to src/js/resources/attribute.js diff --git a/assets/resources/base.js b/src/js/resources/base.js similarity index 100% rename from assets/resources/base.js rename to src/js/resources/base.js diff --git a/assets/resources/cookie.js b/src/js/resources/cookie.js similarity index 100% rename from assets/resources/cookie.js rename to src/js/resources/cookie.js diff --git a/assets/resources/localstorage.js b/src/js/resources/localstorage.js similarity index 100% rename from assets/resources/localstorage.js rename to src/js/resources/localstorage.js diff --git a/assets/resources/parse-replace.js b/src/js/resources/parse-replace.js similarity index 100% rename from assets/resources/parse-replace.js rename to src/js/resources/parse-replace.js diff --git a/assets/resources/proxy-apply.js b/src/js/resources/proxy-apply.js similarity index 100% rename from assets/resources/proxy-apply.js rename to src/js/resources/proxy-apply.js diff --git a/assets/resources/replace-argument.js b/src/js/resources/replace-argument.js similarity index 100% rename from assets/resources/replace-argument.js rename to src/js/resources/replace-argument.js diff --git a/assets/resources/run-at.js b/src/js/resources/run-at.js similarity index 100% rename from assets/resources/run-at.js rename to src/js/resources/run-at.js diff --git a/assets/resources/safe-self.js b/src/js/resources/safe-self.js similarity index 100% rename from assets/resources/safe-self.js rename to src/js/resources/safe-self.js diff --git a/assets/resources/scriptlets.js b/src/js/resources/scriptlets.js similarity index 100% rename from assets/resources/scriptlets.js rename to src/js/resources/scriptlets.js diff --git a/assets/resources/set-constant.js b/src/js/resources/set-constant.js similarity index 100% rename from assets/resources/set-constant.js rename to src/js/resources/set-constant.js diff --git a/assets/resources/shared.js b/src/js/resources/shared.js similarity index 96% rename from assets/resources/shared.js rename to src/js/resources/shared.js index 89d8503e7e4d0..9a38fca48105b 100644 --- a/assets/resources/shared.js +++ b/src/js/resources/shared.js @@ -21,7 +21,7 @@ */ // Code imported from main code base and exposed as injectable scriptlets -import { ArglistParser } from '../../js/arglist-parser.js'; +import { ArglistParser } from '../arglist-parser.js'; import { registerScriptlet } from './base.js'; diff --git a/assets/resources/spoof-css.js b/src/js/resources/spoof-css.js similarity index 100% rename from assets/resources/spoof-css.js rename to src/js/resources/spoof-css.js diff --git a/tools/copy-common-files.sh b/tools/copy-common-files.sh index 56fb20ab3b8cf..29f7ee45c1e4d 100644 --- a/tools/copy-common-files.sh +++ b/tools/copy-common-files.sh @@ -12,6 +12,7 @@ cp -R src/css $DES/ cp -R src/img $DES/ mkdir $DES/js cp -R src/js/*.js $DES/js/ +cp -R src/js/resources $DES/js/ cp -R src/js/codemirror $DES/js/ cp -R src/js/scriptlets $DES/js/ cp -R src/js/wasm $DES/js/ diff --git a/tools/make-mv3.sh b/tools/make-mv3.sh index 92ce9d445177a..8b18039873c08 100755 --- a/tools/make-mv3.sh +++ b/tools/make-mv3.sh @@ -109,7 +109,7 @@ if [ "$QUICK" != "yes" ]; then cp platform/mv3/*.mjs "$TMPDIR"/ cp platform/mv3/extension/js/utils.js "$TMPDIR"/js/ cp "$UBO_DIR"/assets/assets.dev.json "$TMPDIR"/ - cp "$UBO_DIR"/assets/resources/*.js "$TMPDIR"/ + cp -R "$UBO_DIR"/src/js/resources "$TMPDIR"/ cp -R platform/mv3/scriptlets "$TMPDIR"/ mkdir -p "$TMPDIR"/web_accessible_resources cp "$UBO_DIR"/src/web_accessible_resources/* "$TMPDIR"/web_accessible_resources/ From 703fdf673c62841af0650cccce852bcbdab767c6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 27 Nov 2024 17:55:18 -0500 Subject: [PATCH 483/553] [mv3] Fix mv3 build script --- platform/mv3/make-scriptlets.js | 2 +- tools/make-mv3.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/mv3/make-scriptlets.js b/platform/mv3/make-scriptlets.js index 4ca52cd1ba7b8..27dc5d247921b 100644 --- a/platform/mv3/make-scriptlets.js +++ b/platform/mv3/make-scriptlets.js @@ -19,7 +19,7 @@ Home: https://github.com/gorhill/uBlock */ -import { builtinScriptlets } from './resources/scriptlets.js'; +import { builtinScriptlets } from './js/resources/scriptlets.js'; import fs from 'fs/promises'; import { safeReplace } from './safe-replace.js'; diff --git a/tools/make-mv3.sh b/tools/make-mv3.sh index 8b18039873c08..c6b02abddfec9 100755 --- a/tools/make-mv3.sh +++ b/tools/make-mv3.sh @@ -108,8 +108,8 @@ if [ "$QUICK" != "yes" ]; then cp platform/mv3/*.js "$TMPDIR"/ cp platform/mv3/*.mjs "$TMPDIR"/ cp platform/mv3/extension/js/utils.js "$TMPDIR"/js/ + cp -R "$UBO_DIR"/src/js/resources "$TMPDIR"/js/ cp "$UBO_DIR"/assets/assets.dev.json "$TMPDIR"/ - cp -R "$UBO_DIR"/src/js/resources "$TMPDIR"/ cp -R platform/mv3/scriptlets "$TMPDIR"/ mkdir -p "$TMPDIR"/web_accessible_resources cp "$UBO_DIR"/src/web_accessible_resources/* "$TMPDIR"/web_accessible_resources/ From 3b7fa79a6813dd34e18dcd448a1417a67e0f1f58 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 28 Nov 2024 11:47:28 -0500 Subject: [PATCH 484/553] Improve `prevent-setTimeout`/`prevent-setInterval` scriptlet Add support for range for the `delay` paramater: --- @param [delay] A value to match against the delay. Can be a single value for exact match, or a range: - `min-max`: matches if delay >= min and delay <= max - `min-`: matches if delay >= min - `-max`: matches if delay <= max No delay means to match any delay value. Prepend with `!` to reverse the match condition. --- As discussed with filter list maintainers. --- src/js/resources/prevent-settimeout.js | 236 +++++++++++++++++++++++++ src/js/resources/scriptlets.js | 156 +--------------- 2 files changed, 237 insertions(+), 155 deletions(-) create mode 100644 src/js/resources/prevent-settimeout.js diff --git a/src/js/resources/prevent-settimeout.js b/src/js/resources/prevent-settimeout.js new file mode 100644 index 0000000000000..d8cfefad739d6 --- /dev/null +++ b/src/js/resources/prevent-settimeout.js @@ -0,0 +1,236 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2019-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 { proxyApplyFn } from './proxy-apply.js'; +import { registerScriptlet } from './base.js'; +import { safeSelf } from './safe-self.js'; + +/******************************************************************************/ + +class RangeParser { + constructor(s) { + this.not = s.charAt(0) === '!'; + if ( this.not ) { s = s.slice(1); } + if ( s === '' ) { return; } + const pos = s.indexOf('-'); + if ( pos !== 0 ) { + this.min = this.max = parseInt(s, 10) || 0; + } + if ( pos !== -1 ) { + this.max = parseInt(s.slice(1), 10) || Number.MAX_SAFE_INTEGER; + } + } + unbound() { + return this.min === undefined && this.max === undefined; + } + test(v) { + const n = Math.min(Math.max(Number(v) || 0, 0), Number.MAX_SAFE_INTEGER); + if ( this.min === this.max ) { + return (this.min === undefined || n === this.min) !== this.not; + } + if ( this.min === undefined ) { + return (n <= this.max) !== this.not; + } + if ( this.max === undefined ) { + return (n >= this.min) !== this.not; + } + return (n >= this.min && n <= this.max) !== this.not; + } +} +registerScriptlet(RangeParser, { + name: 'range-parser.fn', +}); + +/** + * @scriptlet prevent-setTimeout + * + * @description + * Conditionally prevent execution of the callback function passed to native + * setTimeout method. With no parameters, all calls to setTimeout will be + * shown in the logger. + * + * @param [needle] + * A pattern to match against the stringified callback. The pattern can be a + * plain string, or a regex. Prepend with `!` to reverse the match condition. + * + * @param [delay] + * A value to match against the delay. Can be a single value for exact match, + * or a range: + * - `min-max`: matches if delay >= min and delay <= max + * - `min-`: matches if delay >= min + * - `-max`: matches if delay <= max + * No delay means to match any delay value. + * Prepend with `!` to reverse the match condition. + * + * */ + +export function preventSetTimeout( + needleRaw = '', + delayRaw = '' +) { + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('prevent-setTimeout', needleRaw, delayRaw); + const needleNot = needleRaw.charAt(0) === '!'; + const reNeedle = safe.patternToRegex(needleNot ? needleRaw.slice(1) : needleRaw); + const range = new RangeParser(delayRaw); + proxyApplyFn('setTimeout', function(context) { + const { callArgs } = context; + const a = callArgs[0] instanceof Function + ? String(safe.Function_toString(callArgs[0])) + : String(callArgs[0]); + const b = callArgs[1]; + if ( needleRaw === '' && range.unbound() ) { + safe.uboLog(logPrefix, `Called:\n${a}\n${b}`); + return context.reflect(); + } + if ( reNeedle.test(a) !== needleNot && range.test(b) ) { + callArgs[0] = function(){}; + safe.uboLog(logPrefix, `Prevented:\n${a}\n${b}`); + } + return context.reflect(); + }); +} +registerScriptlet(preventSetTimeout, { + name: 'prevent-setTimeout.js', + aliases: [ + 'no-setTimeout-if.js', + 'nostif.js', + 'setTimeout-defuser.js', + ], + dependencies: [ + proxyApplyFn, + RangeParser, + safeSelf, + ], +}); + +/** + * @scriptlet prevent-setInterval + * + * @description + * Conditionally prevent execution of the callback function passed to native + * setInterval method. With no parameters, all calls to setInterval will be + * shown in the logger. + * + * @param [needle] + * A pattern to match against the stringified callback. The pattern can be a + * plain string, or a regex. Prepend with `!` to reverse the match condition. + * No pattern means to match anything. + * + * @param [delay] + * A value to match against the delay. Can be a single value for exact match, + * or a range: + * - `min-max`: matches if delay >= min and delay <= max + * - `min-`: matches if delay >= min + * - `-max`: matches if delay <= max + * No delay means to match any delay value. + * Prepend with `!` to reverse the match condition. + * + * */ + +export function preventSetInterval( + needleRaw = '', + delayRaw = '' +) { + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('prevent-setInterval', needleRaw, delayRaw); + const needleNot = needleRaw.charAt(0) === '!'; + const reNeedle = safe.patternToRegex(needleNot ? needleRaw.slice(1) : needleRaw); + const range = new RangeParser(delayRaw); + proxyApplyFn('setInterval', function(context) { + const { callArgs } = context; + const a = callArgs[0] instanceof Function + ? String(safe.Function_toString(callArgs[0])) + : String(callArgs[0]); + const b = callArgs[1]; + if ( needleRaw === '' && range.unbound() ) { + safe.uboLog(logPrefix, `Called:\n${a}\n${b}`); + return context.reflect(); + } + if ( reNeedle.test(a) !== needleNot && range.test(b) ) { + callArgs[0] = function(){}; + safe.uboLog(logPrefix, `Prevented:\n${a}\n${b}`); + } + return context.reflect(); + }); +} +registerScriptlet(preventSetInterval, { + name: 'prevent-setInterval.js', + aliases: [ + 'no-setInterval-if.js', + 'nosiif.js', + 'setInterval-defuser.js', + ], + dependencies: [ + proxyApplyFn, + RangeParser, + safeSelf, + ], +}); + +/** + * @scriptlet prevent-requestAnimationFrame + * + * @description + * Conditionally prevent execution of the callback function passed to native + * requestAnimationFrame method. With no parameters, all calls to + * requestAnimationFrame will be shown in the logger. + * + * @param [needle] + * A pattern to match against the stringified callback. The pattern can be a + * plain string, or a regex. + * Prepend with `!` to reverse the match condition. + * + * */ + +export function preventRequestAnimationFrame( + needleRaw = '' +) { + const safe = safeSelf(); + const logPrefix = safe.makeLogPrefix('prevent-requestAnimationFrame', needleRaw); + const needleNot = needleRaw.charAt(0) === '!'; + const reNeedle = safe.patternToRegex(needleNot ? needleRaw.slice(1) : needleRaw); + proxyApplyFn('requestAnimationFrame', function(context) { + const { callArgs } = context; + const a = callArgs[0] instanceof Function + ? String(safe.Function_toString(callArgs[0])) + : String(callArgs[0]); + if ( needleRaw === '' ) { + safe.uboLog(logPrefix, `Called:\n${a}`); + } else if ( reNeedle.test(a) !== needleNot ) { + callArgs[0] = function(){}; + safe.uboLog(logPrefix, `Prevented:\n${a}`); + } + return context.reflect(); + }); +} +registerScriptlet(preventRequestAnimationFrame, { + name: 'prevent-requestAnimationFrame.js', + aliases: [ + 'no-requestAnimationFrame-if.js', + 'norafif.js', + ], + dependencies: [ + proxyApplyFn, + safeSelf, + ], +}); diff --git a/src/js/resources/scriptlets.js b/src/js/resources/scriptlets.js index d045352acc4d3..d1e4c4b58d8e1 100644 --- a/src/js/resources/scriptlets.js +++ b/src/js/resources/scriptlets.js @@ -23,6 +23,7 @@ import './attribute.js'; import './replace-argument.js'; import './spoof-css.js'; +import './prevent-settimeout.js'; import { runAt, runAtHtmlElementFn } from './run-at.js'; @@ -1852,161 +1853,6 @@ function removeClass( /******************************************************************************/ -builtinScriptlets.push({ - name: 'no-requestAnimationFrame-if.js', - aliases: [ - 'norafif.js', - 'prevent-requestAnimationFrame.js', - ], - fn: noRequestAnimationFrameIf, - dependencies: [ - 'safe-self.fn', - ], -}); -function noRequestAnimationFrameIf( - needle = '' -) { - if ( typeof needle !== 'string' ) { return; } - const safe = safeSelf(); - const needleNot = needle.charAt(0) === '!'; - if ( needleNot ) { needle = needle.slice(1); } - const log = needleNot === false && needle === '' ? console.log : undefined; - const reNeedle = safe.patternToRegex(needle); - window.requestAnimationFrame = new Proxy(window.requestAnimationFrame, { - apply: function(target, thisArg, args) { - const a = args[0] instanceof Function - ? String(safe.Function_toString(args[0])) - : String(args[0]); - let defuse = false; - if ( log !== undefined ) { - log('uBO: requestAnimationFrame("%s")', a); - } else { - defuse = reNeedle.test(a) !== needleNot; - } - if ( defuse ) { - args[0] = function(){}; - } - return target.apply(thisArg, args); - } - }); -} - -/******************************************************************************/ - -builtinScriptlets.push({ - name: 'no-setInterval-if.js', - aliases: [ - 'nosiif.js', - 'prevent-setInterval.js', - 'setInterval-defuser.js', - ], - fn: noSetIntervalIf, - dependencies: [ - 'proxy-apply.fn', - 'safe-self.fn', - ], -}); -function noSetIntervalIf( - needle = '', - delay = '' -) { - if ( typeof needle !== 'string' ) { return; } - const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('prevent-setInterval', needle, delay); - const needleNot = needle.charAt(0) === '!'; - if ( needleNot ) { needle = needle.slice(1); } - if ( delay === '' ) { delay = undefined; } - let delayNot = false; - if ( delay !== undefined ) { - delayNot = delay.charAt(0) === '!'; - if ( delayNot ) { delay = delay.slice(1); } - delay = parseInt(delay, 10); - } - const reNeedle = safe.patternToRegex(needle); - proxyApplyFn('setInterval', function setInterval(context) { - const { callArgs } = context; - const a = callArgs[0] instanceof Function - ? String(safe.Function_toString(callArgs[0])) - : String(callArgs[0]); - const b = callArgs[1]; - if ( needle === '' && delay === undefined ) { - safe.uboLog(logPrefix, `Called:\n${a}\n${b}`); - return context.reflect(); - } - let defuse; - if ( needle !== '' ) { - defuse = reNeedle.test(a) !== needleNot; - } - if ( defuse !== false && delay !== undefined ) { - defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; - } - if ( defuse ) { - callArgs[0] = function(){}; - safe.uboLog(logPrefix, `Prevented:\n${a}\n${b}`); - } - return context.reflect(); - }); -} - -/******************************************************************************/ - -builtinScriptlets.push({ - name: 'no-setTimeout-if.js', - aliases: [ - 'nostif.js', - 'prevent-setTimeout.js', - 'setTimeout-defuser.js', - ], - fn: noSetTimeoutIf, - dependencies: [ - 'proxy-apply.fn', - 'safe-self.fn', - ], -}); -function noSetTimeoutIf( - needle = '', - delay = '' -) { - if ( typeof needle !== 'string' ) { return; } - const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('prevent-setTimeout', needle, delay); - const needleNot = needle.charAt(0) === '!'; - if ( needleNot ) { needle = needle.slice(1); } - if ( delay === '' ) { delay = undefined; } - let delayNot = false; - if ( delay !== undefined ) { - delayNot = delay.charAt(0) === '!'; - if ( delayNot ) { delay = delay.slice(1); } - delay = parseInt(delay, 10); - } - const reNeedle = safe.patternToRegex(needle); - proxyApplyFn('setTimeout', function setTimeout(context) { - const { callArgs } = context; - const a = callArgs[0] instanceof Function - ? String(safe.Function_toString(callArgs[0])) - : String(callArgs[0]); - const b = callArgs[1]; - if ( needle === '' && delay === undefined ) { - safe.uboLog(logPrefix, `Called:\n${a}\n${b}`); - return context.reflect(); - } - let defuse; - if ( needle !== '' ) { - defuse = reNeedle.test(a) !== needleNot; - } - if ( defuse !== false && delay !== undefined ) { - defuse = (b === delay || isNaN(b) && isNaN(delay) ) !== delayNot; - } - if ( defuse ) { - callArgs[0] = function(){}; - safe.uboLog(logPrefix, `Prevented:\n${a}\n${b}`); - } - return context.reflect(); - }); -} - -/******************************************************************************/ - builtinScriptlets.push({ name: 'webrtc-if.js', fn: webrtcIf, From 58a5a23763e5f8449928ef84173f0e67985117a8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 28 Nov 2024 11:51:05 -0500 Subject: [PATCH 485/553] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3016630f05dd4..898505fa9e206 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- [Improve `prevent-setTimeout`/`prevent-setInterval` scriptlets](https://github.com/gorhill/uBlock/commit/3b7fa79a68) +- [Improve `trusted-replace-argument` scriptlet](https://github.com/gorhill/uBlock/commit/adced29b5b) - [Add `-safebase64` directive to `urlskip=` option](https://github.com/gorhill/uBlock/commit/bcc058eba7) - [Improve `urlskip=` filter option](https://github.com/gorhill/uBlock/commit/77ed83ff2f) - [Improve `spoof-css` scriptlet](https://github.com/gorhill/uBlock/commit/5f5e3d730f) From f04645ab9fd37ca748403f35cd6ec5434aeaad19 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 28 Nov 2024 11:51:27 -0500 Subject: [PATCH 486/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 9dbe8ea6eefd8..21de96197f693 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.3.0 \ No newline at end of file +1.61.3.1 \ No newline at end of file From d6867699c98c9d71056a901a975da6b366438d5d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 28 Nov 2024 12:01:12 -0500 Subject: [PATCH 487/553] 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 1a51d97ba7d92..c10ca37b0d9dc 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.3.0", + "version": "1.61.3.1", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b0/uBlock0_1.61.3b0.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b1/uBlock0_1.61.3b1.firefox.signed.xpi" } ] } From b1a00145bd704b87369c680621f68123e70cef52 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 29 Nov 2024 10:13:39 -0500 Subject: [PATCH 488/553] Mitigate potentially delayed execution of scriptlets in Firefox Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/3452 Use blob-based injection only when direct injection fails because of a page's CSP. This is a mitigation until a better approach is devised. Such future better approach to investigate: - Use `MAIN` world injection supported by contentScript.register() since Firefox 128 - Investigate registering script to inject ahead of time thru some heuristic --- platform/chromium/vapi-background-ext.js | 52 ++++++++++---- platform/firefox/vapi-background-ext.js | 92 ++++++++++++++++++------ src/js/scriptlet-filtering.js | 32 +-------- 3 files changed, 111 insertions(+), 65 deletions(-) diff --git a/platform/chromium/vapi-background-ext.js b/platform/chromium/vapi-background-ext.js index 9ee69d8199ae5..acbdc3e9d7b74 100644 --- a/platform/chromium/vapi-background-ext.js +++ b/platform/chromium/vapi-background-ext.js @@ -208,19 +208,43 @@ vAPI.prefetching = (( ) => { /******************************************************************************/ -vAPI.scriptletsInjector = ((doc, details) => { - let script; - try { - script = doc.createElement('script'); - script.appendChild(doc.createTextNode(details.scriptlets)); - (doc.head || doc.documentElement).appendChild(script); - self.uBO_scriptletsInjected = details.filters; - } catch (ex) { - } - if ( script ) { - script.remove(); - script.textContent = ''; - } -}).toString(); +vAPI.scriptletsInjector = (( ) => { + const parts = [ + '(', + function(details) { + if ( typeof self.uBO_scriptletsInjected === 'string' ) { return; } + const doc = document; + const { location } = doc; + if ( location === null ) { return; } + const { hostname } = location; + if ( hostname !== '' && details.hostname !== hostname ) { return; } + let script; + try { + script = doc.createElement('script'); + script.appendChild(doc.createTextNode(details.scriptlets)); + (doc.head || doc.documentElement).appendChild(script); + self.uBO_scriptletsInjected = details.filters; + } catch (ex) { + } + if ( script ) { + script.remove(); + script.textContent = ''; + } + return 0; + }.toString(), + ')(', + 'json-slot', + ');', + ]; + const jsonSlot = parts.indexOf('json-slot'); + return (hostname, details) => { + parts[jsonSlot] = JSON.stringify({ + hostname, + scriptlets: details.mainWorld, + filters: details.filters, + }); + return parts.join(''); + }; +})(); /******************************************************************************/ diff --git a/platform/firefox/vapi-background-ext.js b/platform/firefox/vapi-background-ext.js index 65420bc3f39cf..5710224a34adb 100644 --- a/platform/firefox/vapi-background-ext.js +++ b/platform/firefox/vapi-background-ext.js @@ -351,25 +351,77 @@ vAPI.Net = class extends vAPI.Net { /******************************************************************************/ -vAPI.scriptletsInjector = ((doc, details) => { - let script, url; - try { - const blob = new self.Blob( - [ details.scriptlets ], - { type: 'text/javascript; charset=utf-8' } - ); - url = self.URL.createObjectURL(blob); - script = doc.createElement('script'); - script.async = false; - script.src = url; - (doc.head || doc.documentElement || doc).append(script); - self.uBO_scriptletsInjected = details.filters; - } catch (ex) { - } - if ( url ) { - if ( script ) { script.remove(); } - self.URL.revokeObjectURL(url); - } -}).toString(); +vAPI.scriptletsInjector = (( ) => { + const parts = [ + '(', + function(details) { + if ( typeof self.uBO_scriptletsInjected === 'string' ) { return; } + const doc = document; + const { location } = doc; + if ( location === null ) { return; } + const { hostname } = location; + if ( hostname !== '' && details.hostname !== hostname ) { return; } + // Use a page world sentinel to verify that execution was + // successful + const { sentinel } = details; + let script; + try { + const code = [ + `self['${sentinel}'] = true;`, + details.scriptlets, + ].join('\n'); + script = doc.createElement('script'); + script.appendChild(doc.createTextNode(code)); + (doc.head || doc.documentElement).appendChild(script); + } catch (ex) { + } + if ( script ) { + script.remove(); + script.textContent = ''; + script = undefined; + } + if ( self.wrappedJSObject[sentinel] ) { + delete self.wrappedJSObject[sentinel]; + self.uBO_scriptletsInjected = details.filters; + return 0; + } + // https://github.com/uBlockOrigin/uBlock-issues/issues/235 + // Fall back to blob injection if execution through direct + // injection failed + let url; + try { + const blob = new self.Blob( + [ details.scriptlets ], + { type: 'text/javascript; charset=utf-8' } + ); + url = self.URL.createObjectURL(blob); + script = doc.createElement('script'); + script.async = false; + script.src = url; + (doc.head || doc.documentElement || doc).append(script); + self.uBO_scriptletsInjected = details.filters; + } catch (ex) { + } + if ( url ) { + if ( script ) { script.remove(); } + self.URL.revokeObjectURL(url); + } + return 0; + }.toString(), + ')(', + 'json-slot', + ');', + ]; + const jsonSlot = parts.indexOf('json-slot'); + return (hostname, details) => { + parts[jsonSlot] = JSON.stringify({ + hostname, + scriptlets: details.mainWorld, + filters: details.filters, + sentinel: vAPI.generateSecret(3), + }); + return parts.join(''); + }; +})(); /******************************************************************************/ diff --git a/src/js/scriptlet-filtering.js b/src/js/scriptlet-filtering.js index 1cc6a959b3536..b7a0617722838 100644 --- a/src/js/scriptlet-filtering.js +++ b/src/js/scriptlet-filtering.js @@ -106,36 +106,6 @@ const contentScriptRegisterer = new (class { /******************************************************************************/ -const mainWorldInjector = (( ) => { - const parts = [ - '(', - function(injector, details) { - if ( typeof self.uBO_scriptletsInjected === 'string' ) { return; } - const doc = document; - if ( doc.location === null ) { return; } - const hostname = doc.location.hostname; - if ( hostname !== '' && details.hostname !== hostname ) { return; } - injector(doc, details); - return 0; - }.toString(), - ')(', - vAPI.scriptletsInjector, ', ', - 'json-slot', - ');', - ]; - const jsonSlot = parts.indexOf('json-slot'); - return { - assemble: function(hostname, details) { - parts[jsonSlot] = JSON.stringify({ - hostname, - scriptlets: details.mainWorld, - filters: details.filters, - }); - return parts.join(''); - }, - }; -})(); - const isolatedWorldInjector = (( ) => { const parts = [ '(', @@ -334,7 +304,7 @@ export class ScriptletFilteringEngineEx extends ScriptletFilteringEngine { const contentScript = []; if ( scriptletDetails.mainWorld ) { - contentScript.push(mainWorldInjector.assemble(hostname, scriptletDetails)); + contentScript.push(vAPI.scriptletsInjector(hostname, scriptletDetails)); } if ( scriptletDetails.isolatedWorld ) { contentScript.push(isolatedWorldInjector.assemble(hostname, scriptletDetails)); From 580f2dee06c0f8defee19bb5b0be6ee0be6aba08 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 29 Nov 2024 10:54:43 -0500 Subject: [PATCH 489/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 898505fa9e206..ec88ef78c4ea0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Mitigate potentially delayed execution of scriptlets in Firefox](https://github.com/gorhill/uBlock/commit/b1a00145bd) - [Improve `prevent-setTimeout`/`prevent-setInterval` scriptlets](https://github.com/gorhill/uBlock/commit/3b7fa79a68) - [Improve `trusted-replace-argument` scriptlet](https://github.com/gorhill/uBlock/commit/adced29b5b) - [Add `-safebase64` directive to `urlskip=` option](https://github.com/gorhill/uBlock/commit/bcc058eba7) From 47bdec422a683815c8594d71e8b7c97ea4ecfa99 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 29 Nov 2024 10:55:07 -0500 Subject: [PATCH 490/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 21de96197f693..cf4063a4b0380 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.3.1 \ No newline at end of file +1.61.3.2 \ No newline at end of file From 556bea809e9990d3670a1079b8fca19f9dc1b4d2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 29 Nov 2024 11:01:23 -0500 Subject: [PATCH 491/553] 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 c10ca37b0d9dc..247f6252182f4 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.3.1", + "version": "1.61.3.2", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b1/uBlock0_1.61.3b1.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b2/uBlock0_1.61.3b2.firefox.signed.xpi" } ] } From d7df6cda4ae5467d679fbdcc5a7fab3a80f5cdc0 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 1 Dec 2024 19:46:29 -0500 Subject: [PATCH 492/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/bg/messages.json | 8 ++++---- .../mv3/extension/_locales/el/messages.json | 2 +- .../mv3/extension/_locales/fy/messages.json | 2 +- .../mv3/extension/_locales/gl/messages.json | 2 +- .../mv3/extension/_locales/hu/messages.json | 2 +- .../mv3/extension/_locales/lv/messages.json | 18 +++++++++--------- src/_locales/bg/messages.json | 2 +- src/_locales/hu/messages.json | 2 +- src/_locales/zh_TW/messages.json | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index e3d6b2545756d..5c2ecb76f4ac9 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -108,7 +108,7 @@ "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Докладвайте за проблеми с филтъра с конкретни уебсайтове към uBlockOrigin/uAssets инструмент за проследяване на проблеми. Изисква акаунт в GitHub.", + "message": "Докладвайте за проблеми с филтрирането на конкретни уебсайтове в uBlockOrigin/uAssets за проследяване на проблеми. Изисква се акаунт в GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { @@ -140,7 +140,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Открива uBO Lite", + "message": "Засича uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { @@ -148,7 +148,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Неправилно функциониране, когато е активиран uBO Lite", + "message": "Неправилно функциониране, когато uBO Lite е активиран", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { @@ -212,7 +212,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Списък с имена на хостове, за които няма да се извършва филтриране", + "message": "Списък с имена на хостове, за които няма да се извършва филтриране.", "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index b1941281a3299..45ef7ec9d9cc2 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Εύρεση λιστών", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/fy/messages.json b/platform/mv3/extension/_locales/fy/messages.json index 4befbce49f5d5..44d68458821ed 100644 --- a/platform/mv3/extension/_locales/fy/messages.json +++ b/platform/mv3/extension/_locales/fy/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Sykje listen", + "message": "Listen sykje", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/gl/messages.json b/platform/mv3/extension/_locales/gl/messages.json index f45f9f240ed25..53589b6f6cf72 100644 --- a/platform/mv3/extension/_locales/gl/messages.json +++ b/platform/mv3/extension/_locales/gl/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Atopa listas", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index 3ba4ccdcace10..cacd7fee325ad 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Listák keresése", "description": "Placeholder for the input field used to find lists" } } diff --git a/platform/mv3/extension/_locales/lv/messages.json b/platform/mv3/extension/_locales/lv/messages.json index bc81840985140..1d470f70f1ee0 100644 --- a/platform/mv3/extension/_locales/lv/messages.json +++ b/platform/mv3/extension/_locales/lv/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Ziņot par problēmu šajā tīmekļa vietnē", + "message": "Ziņot par nepilnību šajā tīmekļa vietnē", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,15 +104,15 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Ziņot aizturēšanas filtra problēmu", + "message": "Ziņot par aizturēšanas filtra nepilnību", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Ziņot par aizturēšanas filtru problēmām konkrētās vietnēs uBlockOrigin/uAssets problēmu izsekotājam. Nepieciešams GitHub konts.", + "message": "Ziņot par aizturēšanas filtru nepilnībām noteiktās vietnēs uBlockOrigin/uAssets pieteikumu izsekotājā. Nepieciešams GitHub konts.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "Lai izvairītos no brīvprātīgo noslogošanas ar ziņojumiem, kas atkārtojas, lūgums pārbaudīt, ka par šādu problēmu jau nav ziņots.", + "message": "Lai izvairītos no brīvprātīgo noslogošanas ar ziņojumiem, kas atkārtojas, lūgums pārbaudīt, ka par šādu nepilnību jau nav ziņots.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { @@ -128,7 +128,7 @@ "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Atlasiet ierakstu --", + "message": "-- Atlasīt ierakstu --", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { @@ -136,7 +136,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Ir pārklājumi vai citas neērtības (kaitinoši elementi)", + "message": "Ir pārklājumi vai citi traucējumi", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { @@ -144,11 +144,11 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Ir ar konfidencialitāti saistītas nebūšanas", + "message": "Ir ar privātumu saistītas nepilnības", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Darbības traucējumi, kad uBO Lite ir iespējots", + "message": "Darbības traucējumi, kad ir iespējots uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { @@ -156,7 +156,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Noved pie ļaunprātīgas programmatūras, pikšķerēšanas", + "message": "Noved pie ļaunatūras, pikšķerēšanas", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { diff --git a/src/_locales/bg/messages.json b/src/_locales/bg/messages.json index c17e58fc00399..b5cbeadfab1ab 100644 --- a/src/_locales/bg/messages.json +++ b/src/_locales/bg/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "Блокираната страница иска да ви пренасочи към друг сайт. Ако изберете да продължите, ще отидете директно на: {{url}}", + "message": "Блокираната страница иска да Ви пренасочи към друг сайт. Ако изберете да продължите, ще отидете директно на: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/hu/messages.json b/src/_locales/hu/messages.json index 6408662920d50..062d1dae1c9c2 100644 --- a/src/_locales/hu/messages.json +++ b/src/_locales/hu/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "A blokkolt oldal egy másik webhelyre akarja átirányítani. Ha a folytatást választja, akkor követlenül ide fog navigálni: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json index 871a414a90737..92923a9e122c8 100644 --- a/src/_locales/zh_TW/messages.json +++ b/src/_locales/zh_TW/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "被封鎖的頁面想要重新導向至另一個網站。如果您選擇繼續,則會直接前往:{{url}}", + "message": "被封鎖的網頁想要重新導向至其他網站。如果您選擇繼續,則會直接前往:{{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { From aa05cb32c6e6b25a29cdb3ade8003ad3b0173883 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 3 Dec 2024 16:41:34 -0500 Subject: [PATCH 493/553] [mv3] Implement strict blocking Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/214 This implements basic functionality for strict blocking, i.e. the ability to block navigation to undesirable websites. This is a first implementation, which converts only filters that are plain hostnames. Unlike with uBO, it is not possible to know from which ruleset a blocking rule originates. Nonetheless, users will have to make a choice as to whether navigation should proceed or not. A setting has been added to the dashboard to wholly enable/disable strict blocking. It is enabled by default. Potential future improvements, pending investigation on feasability in an MV3 framework: - Extend coverage to explicit `document` filters - Leverage and use `urlskip=` filters in the blocking page in order to proceed while bypassing unwanted redirects. --- platform/mv3/chromium/manifest.json | 5 +- .../mv3/extension/_locales/en/messages.json | 36 ++ platform/mv3/extension/css/settings.css | 7 +- platform/mv3/extension/css/strictblock.css | 147 +++++ platform/mv3/extension/dashboard.html | 1 + platform/mv3/extension/js/background.js | 29 +- platform/mv3/extension/js/config.js | 3 + platform/mv3/extension/js/ext.js | 6 + platform/mv3/extension/js/mode-manager.js | 107 +--- platform/mv3/extension/js/popup.js | 20 +- platform/mv3/extension/js/ruleset-manager.js | 594 +++++++++++------- platform/mv3/extension/js/settings.js | 16 + platform/mv3/extension/js/strictblock.js | 178 ++++++ platform/mv3/firefox/manifest.json | 7 +- platform/mv3/make-rulesets.js | 40 +- platform/mv3/strictblock.html | 43 ++ src/document-blocked.html | 4 +- tools/make-mv3.sh | 1 + 18 files changed, 879 insertions(+), 365 deletions(-) create mode 100644 platform/mv3/extension/css/strictblock.css create mode 100644 platform/mv3/extension/js/strictblock.js create mode 100644 platform/mv3/strictblock.html diff --git a/platform/mv3/chromium/manifest.json b/platform/mv3/chromium/manifest.json index 49f1381b2c679..72760301c5a32 100644 --- a/platform/mv3/chromium/manifest.json +++ b/platform/mv3/chromium/manifest.json @@ -25,7 +25,7 @@ "128": "img/icon_128.png" }, "manifest_version": 3, - "minimum_chrome_version": "119.0", + "minimum_chrome_version": "122.0", "name": "__MSG_extName__", "options_page": "dashboard.html", "optional_host_permissions": [ @@ -41,6 +41,5 @@ "storage": { "managed_schema": "managed_storage.json" }, - "version": "1.0", - "web_accessible_resources": [] + "version": "1.0" } diff --git a/platform/mv3/extension/_locales/en/messages.json b/platform/mv3/extension/_locales/en/messages.json index 60cc95401447c..17a5b24cd7935 100644 --- a/platform/mv3/extension/_locales/en/messages.json +++ b/platform/mv3/extension/_locales/en/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/css/settings.css b/platform/mv3/extension/css/settings.css index feefcadd8c3ee..a8b07d2a1894c 100644 --- a/platform/mv3/extension/css/settings.css +++ b/platform/mv3/extension/css/settings.css @@ -12,8 +12,11 @@ body.firstRun .firstRun { h3 { margin: 1em 0; } -p { - white-space: pre-line; + +label + legend { + color: color-mix(in srgb, currentColor 69%, transparent); + font-size: small; + margin-inline-start: var(--default-gap-large); } body[data-forbid~="dashboard"] #dashboard-nav [data-pane="settings"], diff --git a/platform/mv3/extension/css/strictblock.css b/platform/mv3/extension/css/strictblock.css new file mode 100644 index 0000000000000..f7534078cca7b --- /dev/null +++ b/platform/mv3/extension/css/strictblock.css @@ -0,0 +1,147 @@ +/** + uBlock Origin - a browser extension to block requests. + Copyright (C) 2018-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 +*/ + +body { + display: flex; + padding: var(--default-gap-xxlarge) var(--default-gap-small); + justify-content: center; + } +:root.mobile body { + padding: var(--default-gap-small); + } + +#rootContainer { + width: min(100%, 640px); + } +#rootContainer > * { + margin: 0 0 var(--default-gap-xxlarge) 0; + } +:root.mobile #rootContainer > * { + margin-bottom: var(--default-gap-xlarge); + } + +p { + margin: 0.5em 0; + } +a { + text-decoration: none; + } +.code { + font-size: 13px; + word-break: break-all; + } +#warningSign { + color: var(--accent-surface-1); + fill: var(--accent-surface-1); + font-size: 96px; + line-height: 1; + width: 100%; + } +:root.mobile #warningSign { + font-size: 64px; + } +#theURL { + color: var(--ink-2); + padding: 0; + } +#theURL > * { + margin: 0; + } +#theURL > p { + position: relative; + z-index: 10; + } +#theURL > p > span:first-of-type { + display: block; + max-height: 6lh; + overflow-y: auto; + } +:root.mobile #theURL > p > span:first-of-type { + max-height: 3lh; + } +#theURL #toggleParse { + background-color: transparent; + top: 100%; + box-sizing: border-box; + color: var(--ink-3); + fill: var(--ink-3); + cursor: pointer; + font-size: 1.2rem; + padding: var(--default-gap-xxsmall); + position: absolute; + transform: translate(0, -50%); + } +#theURL:not(.collapsed) #toggleParse > span:first-of-type { + display: none; + } +#theURL.collapsed #toggleParse > span:last-of-type { + display: none; + } +body[dir="ltr"] #toggleParse { + right: 0; + } +body[dir="rtl"] #toggleParse { + left: 0; + } +#theURL > p:hover #toggleParse { + transform: translate(0, -50%) scale(1.15); + } +#parsed { + background-color: var(--surface-1); + border: 4px solid var(--surface-2); + font-size: small; + overflow-x: auto; + padding: var(--default-gap-xxsmall); + text-align: initial; + text-overflow: ellipsis; + } +#theURL.collapsed > #parsed { + display: none; + } +#parsed ul, #parsed li { + list-style-type: none; + } +#parsed li { + white-space: nowrap; + } +#parsed span { + display: inline-block; + } +#parsed span:first-of-type { + font-weight: bold; + } + +#actionContainer { + display: flex; + justify-content: space-between; + } +:root.mobile #actionContainer { + justify-content: center; + display: flex; + flex-direction: column; + } +#actionContainer > button { + margin-bottom: 2rem + } + +/* Small-screen devices */ +:root.mobile button { + width: 100%; + } diff --git a/platform/mv3/extension/dashboard.html b/platform/mv3/extension/dashboard.html index bcd1726bd05a3..5ac63f3d06d0f 100644 --- a/platform/mv3/extension/dashboard.html +++ b/platform/mv3/extension/dashboard.html @@ -31,6 +31,7 @@

+

diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index 2e3a41124f5c0..a58dd70639a48 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -47,8 +47,10 @@ import { import { enableRulesets, + excludeFromStrictBlock, getEnabledRulesetsDetails, getRulesetDetails, + setStrictBlockMode, updateDynamicRules, } from './ruleset-manager.js'; @@ -213,6 +215,7 @@ function onMessage(request, sender, callback) { autoReload: rulesetConfig.autoReload, showBlockedCount: rulesetConfig.showBlockedCount, canShowBlockedCount, + strictBlockMode: rulesetConfig.strictBlockMode, firstRun: process.firstRun, isSideloaded, developerMode: rulesetConfig.developerMode, @@ -244,6 +247,13 @@ function onMessage(request, sender, callback) { }); return true; + case 'setStrictBlockMode': + setStrictBlockMode(request.state).then(( ) => { + callback(); + broadcastMessage({ strictBlockMode: rulesetConfig.strictBlockMode }); + }); + return true; + case 'setDeveloperMode': rulesetConfig.developerMode = request.state; toggleDeveloperMode(rulesetConfig.developerMode); @@ -335,6 +345,13 @@ function onMessage(request, sender, callback) { }); return true; + case 'excludeFromStrictBlock': { + excludeFromStrictBlock(request.hostname, request.permanent).then(( ) => { + callback(); + }); + return true; + } + case 'getMatchedRules': getMatchedRules(request.tabId).then(entries => { callback(entries); @@ -360,19 +377,19 @@ function onMessage(request, sender, callback) { async function start() { await loadRulesetConfig(); - if ( process.wakeupRun === false ) { + const rulesetsUpdated = process.wakeupRun === false && await enableRulesets(rulesetConfig.enabledRulesets); - } // We need to update the regex rules only when ruleset version changes. if ( process.wakeupRun === false ) { const currentVersion = getCurrentVersion(); if ( currentVersion !== rulesetConfig.version ) { ubolLog(`Version change: ${rulesetConfig.version} => ${currentVersion}`); - updateDynamicRules().then(( ) => { - rulesetConfig.version = currentVersion; - saveRulesetConfig(); - }); + rulesetConfig.version = currentVersion; + saveRulesetConfig(); + if ( rulesetsUpdated === false ) { + updateDynamicRules(); + } } } diff --git a/platform/mv3/extension/js/config.js b/platform/mv3/extension/js/config.js index 71524e56048bb..e3859e63fa42f 100644 --- a/platform/mv3/extension/js/config.js +++ b/platform/mv3/extension/js/config.js @@ -33,6 +33,7 @@ export const rulesetConfig = { enabledRulesets: [ 'default' ], autoReload: true, showBlockedCount: true, + strictBlockMode: true, developerMode: false, }; @@ -50,6 +51,7 @@ export async function loadRulesetConfig() { rulesetConfig.enabledRulesets = sessionData.enabledRulesets; rulesetConfig.autoReload = sessionData.autoReload ?? true; rulesetConfig.showBlockedCount = sessionData.showBlockedCount ?? true; + rulesetConfig.strictBlockMode = sessionData.strictBlockMode ?? true; rulesetConfig.developerMode = sessionData.developerMode ?? false; process.wakeupRun = true; return; @@ -60,6 +62,7 @@ export async function loadRulesetConfig() { rulesetConfig.enabledRulesets = localData.enabledRulesets; rulesetConfig.autoReload = localData.autoReload ?? true; rulesetConfig.showBlockedCount = localData.showBlockedCount ?? true; + rulesetConfig.strictBlockMode = localData.strictBlockMode ?? true; rulesetConfig.developerMode = localData.developerMode ?? false; sessionWrite('rulesetConfig', rulesetConfig); return; diff --git a/platform/mv3/extension/js/ext.js b/platform/mv3/extension/js/ext.js index 94d5118a211b5..0a5a98f4f59a2 100644 --- a/platform/mv3/extension/js/ext.js +++ b/platform/mv3/extension/js/ext.js @@ -98,6 +98,12 @@ export async function sessionWrite(key, value) { return browser.storage.session.set({ [key]: value }); } +export async function sessionRemove(key) { + if ( browser.storage instanceof Object === false ) { return; } + if ( browser.storage.session instanceof Object === false ) { return; } + return browser.storage.session.remove(key); +} + /******************************************************************************/ export async function adminRead(key) { diff --git a/platform/mv3/extension/js/mode-manager.js b/platform/mv3/extension/js/mode-manager.js index 335c8da166d73..3630925caad9a 100644 --- a/platform/mv3/extension/js/mode-manager.js +++ b/platform/mv3/extension/js/mode-manager.js @@ -19,11 +19,6 @@ Home: https://github.com/gorhill/uBlock */ -import { - TRUSTED_DIRECTIVE_BASE_RULE_ID, - getDynamicRules, -} from './ruleset-manager.js'; - import { broadcastMessage, hostnamesFromMatches, @@ -33,12 +28,12 @@ import { import { browser, - dnr, localRead, localWrite, sessionRead, sessionWrite, } from './ext.js'; import { adminReadEx } from './admin.js'; +import { filteringModesToDNR } from './ruleset-manager.js'; /******************************************************************************/ @@ -74,19 +69,6 @@ const pruneHostnameFromSet = (hostname, hnSet) => { /******************************************************************************/ -const eqSets = (setBefore, setAfter) => { - if ( setBefore.size !== setAfter.size ) { return false; } - for ( const hn of setAfter ) { - if ( setBefore.has(hn) === false ) { return false; } - } - for ( const hn of setBefore ) { - if ( setAfter.has(hn) === false ) { return false; } - } - return true; -}; - -/******************************************************************************/ - const serializeModeDetails = details => { return { none: Array.from(details.none), @@ -284,93 +266,6 @@ async function writeFilteringModeDetails(afterDetails) { /******************************************************************************/ -async function filteringModesToDNR(modes) { - const dynamicRuleMap = await getDynamicRules(); - const trustedRule = dynamicRuleMap.get(TRUSTED_DIRECTIVE_BASE_RULE_ID+0); - const beforeRequestDomainSet = new Set(trustedRule?.condition.requestDomains); - const beforeExcludedRrequestDomainSet = new Set(trustedRule?.condition.excludedRequestDomains); - if ( trustedRule !== undefined && beforeRequestDomainSet.size === 0 ) { - beforeRequestDomainSet.add('all-urls'); - } else { - beforeExcludedRrequestDomainSet.add('all-urls'); - } - - const noneHostnames = new Set([ ...modes.none ]); - const notNoneHostnames = new Set([ ...modes.basic, ...modes.optimal, ...modes.complete ]); - let afterRequestDomainSet = new Set(); - let afterExcludedRequestDomainSet = new Set(); - if ( noneHostnames.has('all-urls') ) { - afterRequestDomainSet = new Set([ 'all-urls' ]); - afterExcludedRequestDomainSet = notNoneHostnames; - } else { - afterRequestDomainSet = noneHostnames; - afterExcludedRequestDomainSet = new Set([ 'all-urls' ]); - } - - if ( eqSets(beforeRequestDomainSet, afterRequestDomainSet) ) { - if ( eqSets(beforeExcludedRrequestDomainSet, afterExcludedRequestDomainSet) ) { - return; - } - } - - const removeRuleIds = [ - TRUSTED_DIRECTIVE_BASE_RULE_ID+0, - TRUSTED_DIRECTIVE_BASE_RULE_ID+1, - ]; - dynamicRuleMap.delete(TRUSTED_DIRECTIVE_BASE_RULE_ID+0); - dynamicRuleMap.delete(TRUSTED_DIRECTIVE_BASE_RULE_ID+1); - - const allowEverywhere = afterRequestDomainSet.delete('all-urls'); - afterExcludedRequestDomainSet.delete('all-urls'); - - const addRules = []; - if ( - allowEverywhere || - afterRequestDomainSet.size !== 0 || - afterExcludedRequestDomainSet.size !== 0 - ) { - const rule0 = { - id: TRUSTED_DIRECTIVE_BASE_RULE_ID+0, - action: { type: 'allowAllRequests' }, - condition: { - resourceTypes: [ 'main_frame' ], - }, - priority: 100, - }; - if ( afterRequestDomainSet.size !== 0 ) { - rule0.condition.requestDomains = Array.from(afterRequestDomainSet); - } else if ( afterExcludedRequestDomainSet.size !== 0 ) { - rule0.condition.excludedRequestDomains = Array.from(afterExcludedRequestDomainSet); - } - addRules.push(rule0); - dynamicRuleMap.set(TRUSTED_DIRECTIVE_BASE_RULE_ID+0, rule0); - // https://github.com/uBlockOrigin/uBOL-home/issues/114 - const rule1 = { - id: TRUSTED_DIRECTIVE_BASE_RULE_ID+1, - action: { type: 'allow' }, - condition: { - resourceTypes: [ 'script' ], - }, - priority: 100, - }; - if ( rule0.condition.requestDomains ) { - rule1.condition.initiatorDomains = rule0.condition.requestDomains.slice(); - } else if ( rule0.condition.excludedRequestDomains ) { - rule1.condition.excludedInitiatorDomains = rule0.condition.excludedRequestDomains.slice(); - } - addRules.push(rule1); - dynamicRuleMap.set(TRUSTED_DIRECTIVE_BASE_RULE_ID+1, rule1); - } - - const updateOptions = { removeRuleIds }; - if ( addRules.length ) { - updateOptions.addRules = addRules; - } - await dnr.updateDynamicRules(updateOptions); -} - -/******************************************************************************/ - export async function getFilteringModeDetails() { const actualDetails = await readFilteringModeDetails(); return { diff --git a/platform/mv3/extension/js/popup.js b/platform/mv3/extension/js/popup.js index b12a3fbcc9cef..98b4d54ce1434 100644 --- a/platform/mv3/extension/js/popup.js +++ b/platform/mv3/extension/js/popup.js @@ -34,7 +34,7 @@ import punycode from './punycode.js'; const popupPanelData = {}; const currentTab = {}; -let tabHostname = ''; +const tabURL = new URL(runtime.getURL('/')); /******************************************************************************/ @@ -68,8 +68,8 @@ function setFilteringMode(level, commit = false) { } async function commitFilteringMode() { - if ( tabHostname === '' ) { return; } - const targetHostname = normalizedHostname(tabHostname); + if ( tabURL.hostname === '' ) { return; } + const targetHostname = normalizedHostname(tabURL.hostname); const modeSlider = qs$('.filteringModeSlider'); const afterLevel = parseInt(modeSlider.dataset.level, 10); const beforeLevel = parseInt(modeSlider.dataset.levelBefore, 10); @@ -100,7 +100,9 @@ async function commitFilteringMode() { } if ( actualLevel !== beforeLevel && popupPanelData.autoReload ) { self.setTimeout(( ) => { - browser.tabs.reload(currentTab.id); + browser.tabs.update(currentTab.id, { + url: tabURL.href, + }); }, 437); } } @@ -317,8 +319,12 @@ async function init() { let url; try { + const strictBlockURL = runtime.getURL('/strictblock.'); url = new URL(currentTab.url); - tabHostname = url.hostname || ''; + if ( url.href.startsWith(strictBlockURL) ) { + url = new URL(url.hash.slice(1)); + } + tabURL.href = url.href || ''; } catch(ex) { } @@ -326,7 +332,7 @@ async function init() { const response = await sendMessage({ what: 'popupPanelData', origin: url.origin, - hostname: normalizedHostname(tabHostname), + hostname: normalizedHostname(tabURL.hostname), }); if ( response instanceof Object ) { Object.assign(popupPanelData, response); @@ -337,7 +343,7 @@ async function init() { setFilteringMode(popupPanelData.level); - dom.text('#hostname', punycode.toUnicode(tabHostname)); + dom.text('#hostname', punycode.toUnicode(tabURL.hostname)); dom.cl.toggle('#showMatchedRules', 'enabled', popupPanelData.isSideloaded === true && diff --git a/platform/mv3/extension/js/ruleset-manager.js b/platform/mv3/extension/js/ruleset-manager.js index f7d811e7d87bd..c9490e6836592 100644 --- a/platform/mv3/extension/js/ruleset-manager.js +++ b/platform/mv3/extension/js/ruleset-manager.js @@ -23,25 +23,44 @@ import { browser, dnr, i18n, + runtime, } from './ext.js'; +import { + localRead, localRemove, localWrite, + sessionRead, sessionRemove, sessionWrite, +} from './ext.js'; + +import { + rulesetConfig, + saveRulesetConfig, +} from './config.js'; + + import { fetchJSON } from './fetch.js'; import { getAdminRulesets } from './admin.js'; import { ubolLog } from './debug.js'; /******************************************************************************/ -const RULE_REALM_SIZE = 1000000; -const REGEXES_REALM_START = 1000000; -const REGEXES_REALM_END = REGEXES_REALM_START + RULE_REALM_SIZE; -const REMOVEPARAMS_REALM_START = REGEXES_REALM_END; -const REMOVEPARAMS_REALM_END = REMOVEPARAMS_REALM_START + RULE_REALM_SIZE; -const REDIRECT_REALM_START = REMOVEPARAMS_REALM_END; -const REDIRECT_REALM_END = REDIRECT_REALM_START + RULE_REALM_SIZE; -const MODIFYHEADERS_REALM_START = REDIRECT_REALM_END; -const MODIFYHEADERS_REALM_END = MODIFYHEADERS_REALM_START + RULE_REALM_SIZE; +const STRICTBLOCK_BASE_RULE_ID = 7000000; const TRUSTED_DIRECTIVE_BASE_RULE_ID = 8000000; +let dynamicRuleId = 1; + +/******************************************************************************/ + +const eqSets = (setBefore, setAfter) => { + if ( setBefore.size !== setAfter.size ) { return false; } + for ( const hn of setAfter ) { + if ( setBefore.has(hn) === false ) { return false; } + } + for ( const hn of setBefore ) { + if ( setAfter.has(hn) === false ) { return false; } + } + return true; +}; + /******************************************************************************/ function getRulesetDetails() { @@ -59,79 +78,50 @@ function getRulesetDetails() { /******************************************************************************/ -function getDynamicRules() { - if ( getDynamicRules.dynamicRuleMapPromise !== undefined ) { - return getDynamicRules.dynamicRuleMapPromise; - } - getDynamicRules.dynamicRuleMapPromise = dnr.getDynamicRules().then(rules => { - const rulesMap = new Map(rules.map(rule => [ rule.id, rule ])); - ubolLog(`Dynamic rule count: ${rulesMap.size}`); - ubolLog(`Available dynamic rule count: ${dnr.MAX_NUMBER_OF_DYNAMIC_AND_SESSION_RULES - rulesMap.size}`); - return rulesMap; - }); - return getDynamicRules.dynamicRuleMapPromise; -} - -/******************************************************************************/ - async function pruneInvalidRegexRules(realm, rulesIn) { - // Avoid testing already tested regexes - const dynamicRules = await dnr.getDynamicRules(); - const validRegexSet = new Set( - dynamicRules.filter(rule => - rule.condition?.regexFilter && true || false - ).map(rule => - rule.condition.regexFilter - ) - ); + const rejectedRegexRules = []; + + const validateRegex = regex => { + return dnr.isRegexSupported({ regex, isCaseSensitive: false }).then(result => { + const isSupported = result?.isSupported || false; + pruneInvalidRegexRules.validated.set(regex, isSupported); + if ( isSupported ) { return true; } + rejectedRegexRules.push(`\t${regex} ${result?.reason}`); + return false; + }); + }; // Validate regex-based rules const toCheck = []; - const rejectedRegexRules = []; for ( const rule of rulesIn ) { if ( rule.condition?.regexFilter === undefined ) { toCheck.push(true); continue; } - const { - regexFilter: regex, - isUrlFilterCaseSensitive: isCaseSensitive - } = rule.condition; - if ( validRegexSet.has(regex) ) { - toCheck.push(true); - continue; - } - if ( pruneInvalidRegexRules.invalidRegexes.has(regex) ) { - toCheck.push(false); + const { regexFilter } = rule.condition; + if ( pruneInvalidRegexRules.validated.has(regexFilter) ) { + toCheck.push(pruneInvalidRegexRules.validated.get(regexFilter)); continue; } - toCheck.push( - dnr.isRegexSupported({ regex, isCaseSensitive }).then(result => { - if ( result.isSupported ) { return true; } - pruneInvalidRegexRules.invalidRegexes.add(regex); - rejectedRegexRules.push(`\t${regex} ${result.reason}`); - return false; - }) - ); + toCheck.push(validateRegex(regexFilter)); } // Collate results const isValid = await Promise.all(toCheck); if ( rejectedRegexRules.length !== 0 ) { - ubolLog( - `${realm} realm: rejected regexes:\n`, + ubolLog(`${realm} realm: rejected regexes:\n`, rejectedRegexRules.join('\n') ); } return rulesIn.filter((v, i) => isValid[i]); } -pruneInvalidRegexRules.invalidRegexes = new Set(); +pruneInvalidRegexRules.validated = new Map(); /******************************************************************************/ -async function updateRegexRules() { +async function updateRegexRules(toAdd) { const rulesetDetails = await getEnabledRulesetsDetails(); // Fetch regexes for all enabled rulesets @@ -144,69 +134,31 @@ async function updateRegexRules() { // Collate all regexes rules const allRules = []; - let regexRuleId = REGEXES_REALM_START; for ( const rules of regexRulesets ) { if ( Array.isArray(rules) === false ) { continue; } for ( const rule of rules ) { - rule.id = regexRuleId++; + rule.id = dynamicRuleId++; allRules.push(rule); } } + if ( allRules.length === 0 ) { return; } - const validatedRules = await pruneInvalidRegexRules('regexes', allRules); - - // Add validated regex rules to dynamic ruleset without affecting rules - // outside regex rules realm. - const dynamicRuleMap = await getDynamicRules(); - const newRuleMap = new Map(validatedRules.map(rule => [ rule.id, rule ])); - const addRules = []; - const removeRuleIds = []; - - for ( const oldRule of dynamicRuleMap.values() ) { - if ( oldRule.id < REGEXES_REALM_START ) { continue; } - if ( oldRule.id >= REGEXES_REALM_END ) { continue; } - const newRule = newRuleMap.get(oldRule.id); - if ( newRule === undefined ) { - removeRuleIds.push(oldRule.id); - dynamicRuleMap.delete(oldRule.id); - } else if ( JSON.stringify(oldRule) !== JSON.stringify(newRule) ) { - removeRuleIds.push(oldRule.id); - addRules.push(newRule); - dynamicRuleMap.set(oldRule.id, newRule); - } - } - - for ( const newRule of newRuleMap.values() ) { - if ( dynamicRuleMap.has(newRule.id) ) { continue; } - addRules.push(newRule); - dynamicRuleMap.set(newRule.id, newRule); - } + const validRules = await pruneInvalidRegexRules('regexes', allRules); + if ( validRules.length === 0 ) { return; } - if ( addRules.length === 0 && removeRuleIds.length === 0 ) { return; } - - if ( removeRuleIds.length !== 0 ) { - ubolLog(`Remove ${removeRuleIds.length} DNR regex rules`); - } - if ( addRules.length !== 0 ) { - ubolLog(`Add ${addRules.length} DNR regex rules`); - } - - return dnr.updateDynamicRules({ addRules, removeRuleIds }).catch(reason => { - console.error(`updateRegexRules() / ${reason}`); - }); + ubolLog(`Add ${validRules.length} DNR regex rules`); + toAdd.push(...validRules); } /******************************************************************************/ -async function updateRemoveparamRules() { +async function updateRemoveparamRules(toAdd) { const [ hasOmnipotence, rulesetDetails, - dynamicRuleMap, ] = await Promise.all([ browser.permissions.contains({ origins: [ '' ] }), getEnabledRulesetsDetails(), - getDynamicRules(), ]); // Fetch removeparam rules for all enabled rulesets @@ -220,69 +172,32 @@ async function updateRemoveparamRules() { // Removeparam rules can only be enforced with omnipotence const allRules = []; if ( hasOmnipotence ) { - let removeparamRuleId = REMOVEPARAMS_REALM_START; for ( const rules of removeparamRulesets ) { if ( Array.isArray(rules) === false ) { continue; } for ( const rule of rules ) { - rule.id = removeparamRuleId++; + rule.id = dynamicRuleId++; allRules.push(rule); } } } + if ( allRules.length === 0 ) { return; } - const validatedRules = await pruneInvalidRegexRules('removeparam', allRules); - - // Add removeparam rules to dynamic ruleset without affecting rules - // outside removeparam rules realm. - const newRuleMap = new Map(validatedRules.map(rule => [ rule.id, rule ])); - const addRules = []; - const removeRuleIds = []; - - for ( const oldRule of dynamicRuleMap.values() ) { - if ( oldRule.id < REMOVEPARAMS_REALM_START ) { continue; } - if ( oldRule.id >= REMOVEPARAMS_REALM_END ) { continue; } - const newRule = newRuleMap.get(oldRule.id); - if ( newRule === undefined ) { - removeRuleIds.push(oldRule.id); - dynamicRuleMap.delete(oldRule.id); - } else if ( JSON.stringify(oldRule) !== JSON.stringify(newRule) ) { - removeRuleIds.push(oldRule.id); - addRules.push(newRule); - dynamicRuleMap.set(oldRule.id, newRule); - } - } - - for ( const newRule of newRuleMap.values() ) { - if ( dynamicRuleMap.has(newRule.id) ) { continue; } - addRules.push(newRule); - dynamicRuleMap.set(newRule.id, newRule); - } - - if ( addRules.length === 0 && removeRuleIds.length === 0 ) { return; } - - if ( removeRuleIds.length !== 0 ) { - ubolLog(`Remove ${removeRuleIds.length} DNR removeparam rules`); - } - if ( addRules.length !== 0 ) { - ubolLog(`Add ${addRules.length} DNR removeparam rules`); - } + const validRules = await pruneInvalidRegexRules('removeparam', allRules); + if ( validRules.length === 0 ) { return; } - return dnr.updateDynamicRules({ addRules, removeRuleIds }).catch(reason => { - console.error(`updateRemoveparamRules() / ${reason}`); - }); + ubolLog(`Add ${validRules.length} DNR removeparam rules`); + toAdd.push(...validRules); } /******************************************************************************/ -async function updateRedirectRules() { +async function updateRedirectRules(toAdd) { const [ hasOmnipotence, rulesetDetails, - dynamicRuleMap, ] = await Promise.all([ browser.permissions.contains({ origins: [ '' ] }), getEnabledRulesetsDetails(), - getDynamicRules(), ]); // Fetch redirect rules for all enabled rulesets @@ -296,69 +211,32 @@ async function updateRedirectRules() { // Redirect rules can only be enforced with omnipotence const allRules = []; if ( hasOmnipotence ) { - let redirectRuleId = REDIRECT_REALM_START; for ( const rules of redirectRulesets ) { if ( Array.isArray(rules) === false ) { continue; } for ( const rule of rules ) { - rule.id = redirectRuleId++; + rule.id = dynamicRuleId++; allRules.push(rule); } } } + if ( allRules.length === 0 ) { return; } - const validatedRules = await pruneInvalidRegexRules('redirect', allRules); - - // Add redirect rules to dynamic ruleset without affecting rules - // outside redirect rules realm. - const newRuleMap = new Map(validatedRules.map(rule => [ rule.id, rule ])); - const addRules = []; - const removeRuleIds = []; - - for ( const oldRule of dynamicRuleMap.values() ) { - if ( oldRule.id < REDIRECT_REALM_START ) { continue; } - if ( oldRule.id >= REDIRECT_REALM_END ) { continue; } - const newRule = newRuleMap.get(oldRule.id); - if ( newRule === undefined ) { - removeRuleIds.push(oldRule.id); - dynamicRuleMap.delete(oldRule.id); - } else if ( JSON.stringify(oldRule) !== JSON.stringify(newRule) ) { - removeRuleIds.push(oldRule.id); - addRules.push(newRule); - dynamicRuleMap.set(oldRule.id, newRule); - } - } - - for ( const newRule of newRuleMap.values() ) { - if ( dynamicRuleMap.has(newRule.id) ) { continue; } - addRules.push(newRule); - dynamicRuleMap.set(newRule.id, newRule); - } - - if ( addRules.length === 0 && removeRuleIds.length === 0 ) { return; } + const validRules = await pruneInvalidRegexRules('redirect', allRules); + if ( validRules.length === 0 ) { return; } - if ( removeRuleIds.length !== 0 ) { - ubolLog(`Remove ${removeRuleIds.length} DNR redirect rules`); - } - if ( addRules.length !== 0 ) { - ubolLog(`Add ${addRules.length} DNR redirect rules`); - } - - return dnr.updateDynamicRules({ addRules, removeRuleIds }).catch(reason => { - console.error(`updateRedirectRules() / ${reason}`); - }); + ubolLog(`Add ${validRules.length} DNR redirect rules`); + toAdd.push(...validRules); } /******************************************************************************/ -async function updateModifyHeadersRules() { +async function updateModifyHeadersRules(toAdd) { const [ hasOmnipotence, rulesetDetails, - dynamicRuleMap, ] = await Promise.all([ browser.permissions.contains({ origins: [ '' ] }), getEnabledRulesetsDetails(), - getDynamicRules(), ]); // Fetch modifyHeaders rules for all enabled rulesets @@ -372,69 +250,312 @@ async function updateModifyHeadersRules() { // Redirect rules can only be enforced with omnipotence const allRules = []; if ( hasOmnipotence ) { - let ruleId = MODIFYHEADERS_REALM_START; for ( const rules of rulesets ) { if ( Array.isArray(rules) === false ) { continue; } for ( const rule of rules ) { - rule.id = ruleId++; + rule.id = dynamicRuleId++; allRules.push(rule); } } } + if ( allRules.length === 0 ) { return; } - const validatedRules = await pruneInvalidRegexRules('modify-headers', allRules); + const validRules = await pruneInvalidRegexRules('modify-headers', allRules); + if ( validRules.length === 0 ) { return; } - // Add modifyHeaders rules to dynamic ruleset without affecting rules - // outside modifyHeaders realm. - const newRuleMap = new Map(validatedRules.map(rule => [ rule.id, rule ])); - const addRules = []; - const removeRuleIds = []; + ubolLog(`Add ${validRules.length} DNR modify-headers rules`); + toAdd.push(...validRules); +} - for ( const oldRule of dynamicRuleMap.values() ) { - if ( oldRule.id < MODIFYHEADERS_REALM_START ) { continue; } - if ( oldRule.id >= MODIFYHEADERS_REALM_END ) { continue; } - const newRule = newRuleMap.get(oldRule.id); - if ( newRule === undefined ) { - removeRuleIds.push(oldRule.id); - dynamicRuleMap.delete(oldRule.id); - } else if ( JSON.stringify(oldRule) !== JSON.stringify(newRule) ) { - removeRuleIds.push(oldRule.id); - addRules.push(newRule); - dynamicRuleMap.set(oldRule.id, newRule); - } - } +/******************************************************************************/ + +async function updateStrictBlockRules(dynamicRules, sessionRules) { + if ( rulesetConfig.strictBlockMode === false ) { return; } + + const [ + hasOmnipotence, + rulesetDetails, + permanentlyExcluded = [], + temporarilyExcluded = [], + ] = await Promise.all([ + browser.permissions.contains({ origins: [ '' ] }), + getEnabledRulesetsDetails(), + localRead('excludedStrictBlockHostnames'), + sessionRead('excludedStrictBlockHostnames'), + ]); - for ( const newRule of newRuleMap.values() ) { - if ( dynamicRuleMap.has(newRule.id) ) { continue; } - addRules.push(newRule); - dynamicRuleMap.set(newRule.id, newRule); + // Fetch strick-block hostnames + const toFetch = []; + for ( const details of rulesetDetails ) { + if ( details.rules.strictblock === 0 ) { continue; } + toFetch.push(fetchJSON(`/rulesets/strictblock/${details.id}`)); } + const strictblockRulesets = await Promise.all(toFetch); - if ( addRules.length === 0 && removeRuleIds.length === 0 ) { return; } + // Strict-block rules can only be enforced with omnipotence + let toStrictBlock = new Set(); + if ( hasOmnipotence ) { + for ( const hostnames of strictblockRulesets ) { + if ( Array.isArray(hostnames) === false ) { continue; } + toStrictBlock = toStrictBlock.union(new Set(hostnames)); + } + } else { + if ( permanentlyExcluded.length !== 0 ) { + localRemove('excludedStrictBlockHostnames'); + permanentlyExcluded.length = 0; + } + if ( temporarilyExcluded.length !== 0 ) { + sessionRemove('excludedStrictBlockHostnames'); + temporarilyExcluded.length = 0; + } + } + for ( const hn of permanentlyExcluded ) { + toStrictBlock.delete(hn); + } + if ( toStrictBlock.size === 0 ) { return; } + const manifest = runtime.getManifest(); + let strictblockPath = ''; + for ( const war of manifest.web_accessible_resources ) { + if ( war.resources.length !== 1 ) { continue; } + if ( war.resources[0].startsWith('/strictblock.') === false ) { continue; } + strictblockPath = runtime.getURL(war.resources[0]); + break; + } + if ( strictblockPath === '' ) { return; } + const dynamicRule = { + id: STRICTBLOCK_BASE_RULE_ID, + action: { + type: 'redirect', + redirect: { + regexSubstitution: `${strictblockPath}#\\0`, + }, + }, + condition: { + regexFilter: '^https?://.+', + requestDomains: Array.from(toStrictBlock), + resourceTypes: [ 'main_frame' ], + }, + priority: 29, + }; + if ( permanentlyExcluded.length !== 0 ) { + dynamicRule.condition.excludedRequestDomains = permanentlyExcluded; + } + dynamicRules.push(dynamicRule); + ubolLog(`Add 1 DNR dynamic rule with ${toStrictBlock.size} strictblock domains`); + + if ( temporarilyExcluded.length === 0 ) { return; } + sessionRules.push({ + id: STRICTBLOCK_BASE_RULE_ID, + action: { + type: 'allow', + }, + condition: { + requestDomains: temporarilyExcluded, + resourceTypes: [ 'main_frame' ], + }, + priority: 29, + }); + ubolLog(`Add 1 DNR session rule with ${temporarilyExcluded.length} excluded strictblock domains`); +} - if ( removeRuleIds.length !== 0 ) { - ubolLog(`Remove ${removeRuleIds.length} DNR modifyHeaders rules`); +async function commitStrictBlockRules() { + const [ + beforePermanentRules, + beforeTemporaryRules, + ] = await Promise.all([ + dnr.getDynamicRules({ ruleIds: [ STRICTBLOCK_BASE_RULE_ID ] }), + dnr.getSessionRules({ ruleIds: [ STRICTBLOCK_BASE_RULE_ID ] }), + ]); + if ( beforePermanentRules?.length ) { + ubolLog(`Remove 1 DNR dynamic strictblock rule`); } - if ( addRules.length !== 0 ) { - ubolLog(`Add ${addRules.length} DNR modifyHeaders rules`); + if ( beforeTemporaryRules?.length ) { + ubolLog(`Remove 1 DNR session strictblock rule`); } + const afterPermanentRules = []; + const afterTemporaryRules = []; + await updateStrictBlockRules(afterPermanentRules, afterTemporaryRules) + return Promise.all([ + dnr.updateDynamicRules({ + addRules: afterPermanentRules, + removeRuleIds: beforePermanentRules.map(rule => rule.id), + }), + dnr.updateSessionRules({ + addRules: afterTemporaryRules, + removeRuleIds: beforeTemporaryRules.map(rule => rule.id), + }), + ]); +} - return dnr.updateDynamicRules({ addRules, removeRuleIds }).catch(reason => { - console.error(`updateModifyHeadersRules() / ${reason}`); - }); +async function excludeFromStrictBlock(hostname, permanent) { + if ( typeof hostname !== 'string' || hostname === '' ) { return; } + const readFn = permanent ? localRead : sessionRead; + const hostnames = new Set(await readFn('excludedStrictBlockHostnames')); + hostnames.add(hostname); + const writeFn = permanent ? localWrite : sessionWrite; + await writeFn('excludedStrictBlockHostnames', Array.from(hostnames)); + return commitStrictBlockRules(); } -/******************************************************************************/ +async function setStrictBlockMode(state) { + const newState = Boolean(state); + if ( newState === rulesetConfig.strictBlockMode ) { return; } + rulesetConfig.strictBlockMode = newState; + const promises = [ saveRulesetConfig() ]; + if ( newState === false ) { + promises.push( + localRemove('excludedStrictBlockHostnames'), + sessionRemove('excludedStrictBlockHostnames') + ); + } + await Promise.all(promises); + return commitStrictBlockRules(); +} -// TODO: group all omnipotence-related rules into one realm. +/******************************************************************************/ async function updateDynamicRules() { - return Promise.all([ - updateRegexRules(), - updateRemoveparamRules(), - updateRedirectRules(), - updateModifyHeadersRules(), + dynamicRuleId = 1; + const dynamicRules = []; + const sessionRules = []; + const [ + dynamicRuleIds, + sessionRuleIds, + ] = await Promise.all([ + dnr.getDynamicRules().then(rules => + rules.map(rule => rule.id) + .filter(id => id < TRUSTED_DIRECTIVE_BASE_RULE_ID) + ), + dnr.getSessionRules().then(rules => rules.map(rule => rule.id)), + updateRegexRules(dynamicRules), + updateRemoveparamRules(dynamicRules), + updateRedirectRules(dynamicRules), + updateModifyHeadersRules(dynamicRules), + updateStrictBlockRules(dynamicRules, sessionRules), ]); + if ( dynamicRules.length === 0 && dynamicRuleIds.length === 0 ) { return; } + const promises = []; + if ( dynamicRules.length !== 0 || dynamicRuleIds.length !== 0 ) { + promises.push( + dnr.updateDynamicRules({ + addRules: dynamicRules, + removeRuleIds: dynamicRuleIds, + }).then(( ) => { + if ( dynamicRuleIds.length !== 0 ) { + ubolLog(`Remove ${dynamicRuleIds.length} dynamic DNR rules`); + } + if ( dynamicRules.length !== 0 ) { + ubolLog(`Add ${dynamicRules.length} dynamic DNR rules`); + } + }).catch(reason => { + console.error(`updateDynamicRules() / ${reason}`); + }) + ); + } + if ( sessionRules.length !== 0 || sessionRuleIds.length !== 0 ) { + promises.push( + dnr.updateSessionRules({ + addRules: sessionRules, + removeRuleIds: sessionRuleIds, + }).then(( ) => { + if ( sessionRuleIds.length !== 0 ) { + ubolLog(`Remove ${sessionRuleIds.length} session DNR rules`); + } + if ( sessionRules.length !== 0 ) { + ubolLog(`Add ${sessionRules.length} session DNR rules`); + } + }).catch(reason => { + console.error(`updateSessionRules() / ${reason}`); + }) + ); + } + return Promise.all(promises); +} + +/******************************************************************************/ + +async function filteringModesToDNR(modes) { + const trustedRules = await dnr.getDynamicRules({ + ruleIds: [ TRUSTED_DIRECTIVE_BASE_RULE_ID+0 ], + }); + const trustedRule = trustedRules.length !== 0 && trustedRules[0] || undefined; + const beforeRequestDomainSet = new Set(trustedRule?.condition.requestDomains); + const beforeExcludedRrequestDomainSet = new Set(trustedRule?.condition.excludedRequestDomains); + if ( trustedRule !== undefined && beforeRequestDomainSet.size === 0 ) { + beforeRequestDomainSet.add('all-urls'); + } else { + beforeExcludedRrequestDomainSet.add('all-urls'); + } + + const noneHostnames = new Set([ ...modes.none ]); + const notNoneHostnames = new Set([ ...modes.basic, ...modes.optimal, ...modes.complete ]); + let afterRequestDomainSet = new Set(); + let afterExcludedRequestDomainSet = new Set(); + if ( noneHostnames.has('all-urls') ) { + afterRequestDomainSet = new Set([ 'all-urls' ]); + afterExcludedRequestDomainSet = notNoneHostnames; + } else { + afterRequestDomainSet = noneHostnames; + afterExcludedRequestDomainSet = new Set([ 'all-urls' ]); + } + + if ( eqSets(beforeRequestDomainSet, afterRequestDomainSet) ) { + if ( eqSets(beforeExcludedRrequestDomainSet, afterExcludedRequestDomainSet) ) { + return; + } + } + + const removeRuleIds = []; + if ( trustedRule ) { + removeRuleIds.push( + TRUSTED_DIRECTIVE_BASE_RULE_ID+0, + TRUSTED_DIRECTIVE_BASE_RULE_ID+1 + ); + } + + const allowEverywhere = afterRequestDomainSet.delete('all-urls'); + afterExcludedRequestDomainSet.delete('all-urls'); + + const addRules = []; + if ( + allowEverywhere || + afterRequestDomainSet.size !== 0 || + afterExcludedRequestDomainSet.size !== 0 + ) { + const rule0 = { + id: TRUSTED_DIRECTIVE_BASE_RULE_ID+0, + action: { type: 'allowAllRequests' }, + condition: { + resourceTypes: [ 'main_frame' ], + }, + priority: 100, + }; + if ( afterRequestDomainSet.size !== 0 ) { + rule0.condition.requestDomains = Array.from(afterRequestDomainSet); + } else if ( afterExcludedRequestDomainSet.size !== 0 ) { + rule0.condition.excludedRequestDomains = Array.from(afterExcludedRequestDomainSet); + } + addRules.push(rule0); + // https://github.com/uBlockOrigin/uBOL-home/issues/114 + const rule1 = { + id: TRUSTED_DIRECTIVE_BASE_RULE_ID+1, + action: { type: 'allow' }, + condition: { + resourceTypes: [ 'script' ], + }, + priority: 100, + }; + if ( rule0.condition.requestDomains ) { + rule1.condition.initiatorDomains = rule0.condition.requestDomains.slice(); + } else if ( rule0.condition.excludedRequestDomains ) { + rule1.condition.excludedInitiatorDomains = rule0.condition.excludedRequestDomains.slice(); + } + addRules.push(rule1); + } + + if ( addRules.length === 0 && removeRuleIds.length === 0 ) { return; } + + return dnr.updateDynamicRules({ addRules, removeRuleIds }); } /******************************************************************************/ @@ -511,7 +632,7 @@ async function enableRulesets(ids) { } if ( enableRulesetSet.size === 0 && disableRulesetSet.size === 0 ) { - return; + return false; } const enableRulesetIds = Array.from(enableRulesetSet); @@ -525,7 +646,9 @@ async function enableRulesets(ids) { } await dnr.updateEnabledRulesets({ enableRulesetIds, disableRulesetIds }); - return updateDynamicRules(); + await updateDynamicRules(); + + return true; } /******************************************************************************/ @@ -550,11 +673,12 @@ async function getEnabledRulesetsDetails() { /******************************************************************************/ export { - TRUSTED_DIRECTIVE_BASE_RULE_ID, - getRulesetDetails, - getDynamicRules, - enableRulesets, defaultRulesetsFromLanguage, + enableRulesets, + excludeFromStrictBlock, + filteringModesToDNR, + getRulesetDetails, getEnabledRulesetsDetails, + setStrictBlockMode, updateDynamicRules, }; diff --git a/platform/mv3/extension/js/settings.js b/platform/mv3/extension/js/settings.js index 6cbd0e23d08fa..5b73144cb3dc1 100644 --- a/platform/mv3/extension/js/settings.js +++ b/platform/mv3/extension/js/settings.js @@ -67,6 +67,8 @@ function renderWidgets() { } } + qs$('#strictBlockMode input[type="checkbox"]').checked = cachedRulesetData.strictBlockMode; + { dom.prop('#developerMode input[type="checkbox"]', 'checked', Boolean(cachedRulesetData.developerMode) @@ -146,6 +148,13 @@ dom.on('#showBlockedCount input[type="checkbox"]', 'change', ev => { }); }); +dom.on('#strictBlockMode input[type="checkbox"]', 'change', ev => { + sendMessage({ + what: 'setStrictBlockMode', + state: ev.target.checked, + }); +}); + dom.on('#developerMode input[type="checkbox"]', 'change', ev => { sendMessage({ what: 'setDeveloperMode', @@ -240,6 +249,13 @@ listen.onmessage = ev => { } } + if ( message.strictBlockMode !== undefined ) { + if ( message.strictBlockMode !== local.strictBlockMode ) { + local.strictBlockMode = message.strictBlockMode; + render = true; + } + } + if ( message.adminRulesets !== undefined ) { if ( hashFromIterable(message.adminRulesets) !== hashFromIterable(local.adminRulesets) ) { local.adminRulesets = message.adminRulesets; diff --git a/platform/mv3/extension/js/strictblock.js b/platform/mv3/extension/js/strictblock.js new file mode 100644 index 0000000000000..616ef6ddbc32d --- /dev/null +++ b/platform/mv3/extension/js/strictblock.js @@ -0,0 +1,178 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2024-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 { dom, qs$ } from './dom.js'; +import { i18n$ } from './i18n.js'; +import { sendMessage } from './ext.js'; + +/******************************************************************************/ + +const toURL = new URL('about:blank'); + +function setURL(url) { + try { + toURL.href = url; + } catch(_) { + } +} + +setURL(self.location.hash.slice(1)); + +/******************************************************************************/ + +function urlToFragment(raw) { + try { + const fragment = new DocumentFragment(); + const url = new URL(raw); + const hn = url.hostname; + const i = raw.indexOf(hn); + const b = document.createElement('b'); + b.append(hn); + fragment.append(raw.slice(0,i), b, raw.slice(i+hn.length)); + return fragment; + } catch(_) { + } + return raw; +} + +/******************************************************************************/ + +async function proceed() { + await sendMessage({ + what: 'excludeFromStrictBlock', + hostname: toURL.hostname, + permanent: qs$('#disableWarning').checked, + }); + window.location.replace(toURL.href); +} + +/******************************************************************************/ + +dom.clear('#theURL > p > span:first-of-type'); +qs$('#theURL > p > span:first-of-type').append(urlToFragment(toURL.href)); + +/******************************************************************************/ + +// https://github.com/gorhill/uBlock/issues/691 +// Parse URL to extract as much useful information as possible. This is +// useful to assist the user in deciding whether to navigate to the web page. +(( ) => { + const reURL = /^https?:\/\//; + + const liFromParam = function(name, value) { + if ( value === '' ) { + value = name; + name = ''; + } + const li = dom.create('li'); + let span = dom.create('span'); + dom.text(span, name); + li.appendChild(span); + if ( name !== '' && value !== '' ) { + li.appendChild(document.createTextNode(' = ')); + } + span = dom.create('span'); + if ( reURL.test(value) ) { + const a = dom.create('a'); + dom.attr(a, 'href', value); + dom.text(a, value); + span.appendChild(a); + } else { + dom.text(span, value); + } + li.appendChild(span); + return li; + }; + + // https://github.com/uBlockOrigin/uBlock-issues/issues/1649 + // Limit recursion. + const renderParams = function(parentNode, rawURL, depth = 0) { + let url; + try { + url = new URL(rawURL); + } catch(ex) { + return false; + } + + const search = url.search.slice(1); + if ( search === '' ) { return false; } + + url.search = ''; + const li = liFromParam(i18n$('strictblockNoParamsPrompt'), url.href); + parentNode.appendChild(li); + + const params = new self.URLSearchParams(search); + for ( const [ name, value ] of params ) { + const li = liFromParam(name, value); + if ( depth < 2 && reURL.test(value) ) { + const ul = dom.create('ul'); + renderParams(ul, value, depth + 1); + li.appendChild(ul); + } + parentNode.appendChild(li); + } + + return true; + }; + + if ( renderParams(qs$('#parsed'), toURL.href) === false ) { return; } + + dom.cl.remove('#toggleParse', 'hidden'); + + dom.on('#toggleParse', 'click', ( ) => { + dom.cl.toggle('#theURL', 'collapsed'); + //vAPI.localStorage.setItem( + // 'document-blocked-expand-url', + // (dom.cl.has('#theURL', 'collapsed') === false).toString() + //); + }); + + //vAPI.localStorage.getItemAsync('document-blocked-expand-url').then(value => { + // dom.cl.toggle('#theURL', 'collapsed', value !== 'true' && value !== true); + //}); +})(); + +/******************************************************************************/ + +// https://www.reddit.com/r/uBlockOrigin/comments/breeux/ +if ( window.history.length > 1 ) { + dom.on('#back', 'click', ( ) => { + window.history.back(); + }); + qs$('#bye').style.display = 'none'; +} else { + dom.on('#bye', 'click', ( ) => { + window.close(); + }); + qs$('#back').style.display = 'none'; +} + +dom.on('#disableWarning', 'change', ev => { + const checked = ev.target.checked; + dom.cl.toggle('[data-i18n="strictblockBack"]', 'disabled', checked); + dom.cl.toggle('[data-i18n="strictblockClose"]', 'disabled', checked); +}); + +dom.on('#proceed', 'click', ( ) => { + proceed(); +}); + +/******************************************************************************/ diff --git a/platform/mv3/firefox/manifest.json b/platform/mv3/firefox/manifest.json index e191e3c6be43c..703f652b28ec0 100644 --- a/platform/mv3/firefox/manifest.json +++ b/platform/mv3/firefox/manifest.json @@ -16,10 +16,10 @@ "browser_specific_settings": { "gecko": { "id": "uBOLite@raymondhill.net", - "strict_min_version": "114.0" + "strict_min_version": "127.0" }, "gecko_android": { - "strict_min_version": "114.0" + "strict_min_version": "127.0" } }, "declarative_net_request": { @@ -50,6 +50,5 @@ "storage" ], "short_name": "uBO Lite", - "version": "1.0", - "web_accessible_resources": [] + "version": "1.0" } diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index 04688f15a0ae3..b570067055473 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -433,6 +433,33 @@ async function processNetworkFilters(assetDetails, network) { ); } + const strictBlocked = new Set(); + for ( const rule of plainGood ) { + if ( rule.action.type !== 'block' ) { continue; } + if ( rule.condition.domainType ) { continue; } + if ( rule.condition.regexFilter ) { continue; } + if ( rule.condition.urlFilter ) { continue; } + if ( rule.condition.requestMethods ) { continue; } + if ( rule.condition.excludedRequestMethods ) { continue; } + if ( rule.condition.resourceTypes ) { continue; } + if ( rule.condition.excludedResourceTypes ) { continue; } + if ( rule.condition.responseHeaders ) { continue; } + if ( rule.condition.excludedResponseHeaders ) { continue; } + if ( rule.condition.initiatorDomains ) { continue; } + if ( rule.condition.excludedInitiatorDomains ) { continue; } + if ( rule.condition.requestDomains === undefined ) { continue; } + if ( rule.condition.excludedRequestDomains ) { continue; } + for ( const hn of rule.condition.requestDomains ) { + strictBlocked.add(hn); + } + } + if ( strictBlocked.size !== 0 ) { + writeFile( + `${rulesetDir}/strictblock/${assetDetails.id}.json`, + toJSONRuleset(Array.from(strictBlocked)) + ); + } + return { total: rules.length, plain: plainGood.length, @@ -442,6 +469,7 @@ async function processNetworkFilters(assetDetails, network) { removeparam: removeparamsGood.length, redirect: redirects.length, modifyHeaders: modifyHeaders.length, + strictblock: strictBlocked.size, }; } @@ -1085,6 +1113,7 @@ async function rulesetFromURLs(assetDetails) { removeparam: netStats.removeparam, redirect: netStats.redirect, modifyHeaders: netStats.modifyHeaders, + strictblock: netStats.strictblock, discarded: netStats.discarded, rejected: netStats.rejected, }, @@ -1332,6 +1361,15 @@ async function main() { // Patch declarative_net_request key manifest.declarative_net_request = { rule_resources: ruleResources }; // Patch web_accessible_resources key + manifest.web_accessible_resources = manifest.web_accessible_resources || []; + // Strict-block-related resource + const strictblockDocument = `strictblock.${secret}.html`; + copyFile('./strictblock.html', `${outputDir}/${strictblockDocument}`); + manifest.web_accessible_resources.push({ + resources: [ `/${strictblockDocument}` ], + matches: [ '' ], + }); + // Secondary resources const web_accessible_resources = { resources: Array.from(requiredRedirectResources).map(path => `/${path}`), matches: [ '' ], @@ -1339,7 +1377,7 @@ async function main() { if ( platform === 'chromium' ) { web_accessible_resources.use_dynamic_url = true; } - manifest.web_accessible_resources = [ web_accessible_resources ]; + manifest.web_accessible_resources.push(web_accessible_resources); // Patch manifest version property manifest.version = version; diff --git a/platform/mv3/strictblock.html b/platform/mv3/strictblock.html new file mode 100644 index 0000000000000..9572eab09715b --- /dev/null +++ b/platform/mv3/strictblock.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + +
+ + +
+

_

+ +
+ +
+ +
+ +
+ + + +
+
+ + + + + + + diff --git a/src/document-blocked.html b/src/document-blocked.html index 56d6a95a42b9d..4c69359f1664e 100644 --- a/src/document-blocked.html +++ b/src/document-blocked.html @@ -47,10 +47,12 @@
diff --git a/tools/make-mv3.sh b/tools/make-mv3.sh index c6b02abddfec9..287a7b08b26bd 100755 --- a/tools/make-mv3.sh +++ b/tools/make-mv3.sh @@ -107,6 +107,7 @@ if [ "$QUICK" != "yes" ]; then cp platform/mv3/package.json "$TMPDIR"/ cp platform/mv3/*.js "$TMPDIR"/ cp platform/mv3/*.mjs "$TMPDIR"/ + cp platform/mv3/*.html "$TMPDIR"/ cp platform/mv3/extension/js/utils.js "$TMPDIR"/js/ cp -R "$UBO_DIR"/src/js/resources "$TMPDIR"/js/ cp "$UBO_DIR"/assets/assets.dev.json "$TMPDIR"/ From 784888471a57298d0c2c4f7a9af262d46d1ae113 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 3 Dec 2024 16:53:50 -0500 Subject: [PATCH 494/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/ar/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/az/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/be/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/bg/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/bn/messages.json | 36 +++++++++++++++++++ .../extension/_locales/br_FR/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/bs/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/ca/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/cs/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/cv/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/cy/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/da/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/de/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/el/messages.json | 36 +++++++++++++++++++ .../extension/_locales/en_GB/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/eo/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/es/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/et/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/eu/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/fa/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/fi/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/fil/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/fr/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/fy/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/gl/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/gu/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/he/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/hi/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/hr/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/hu/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/hy/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/id/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/it/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/ja/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/ka/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/kk/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/kn/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/ko/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/lt/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/lv/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/mk/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/ml/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/mr/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/ms/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/nb/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/nl/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/oc/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/pa/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/pl/messages.json | 36 +++++++++++++++++++ .../extension/_locales/pt_BR/messages.json | 36 +++++++++++++++++++ .../extension/_locales/pt_PT/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/ro/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/ru/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/si/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/sk/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/sl/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/so/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/sq/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/sr/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/sv/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/sw/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/ta/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/te/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/th/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/tr/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/uk/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/ur/messages.json | 36 +++++++++++++++++++ .../mv3/extension/_locales/vi/messages.json | 36 +++++++++++++++++++ .../extension/_locales/zh_CN/messages.json | 36 +++++++++++++++++++ .../extension/_locales/zh_TW/messages.json | 36 +++++++++++++++++++ 70 files changed, 2520 insertions(+) diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index b925a42e0bfb9..6d3d859d2ea43 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -231,8 +231,44 @@ "message": "إظهار عدد الطلبات المحظورة على أيقونة شريط الأدوات", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "البحث عن القوائم", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/az/messages.json b/platform/mv3/extension/_locales/az/messages.json index b573b25e394cf..ef0b36678e2d8 100644 --- a/platform/mv3/extension/_locales/az/messages.json +++ b/platform/mv3/extension/_locales/az/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/be/messages.json b/platform/mv3/extension/_locales/be/messages.json index 3042d674c8b22..a75a324e67a74 100644 --- a/platform/mv3/extension/_locales/be/messages.json +++ b/platform/mv3/extension/_locales/be/messages.json @@ -231,8 +231,44 @@ "message": "Паказваць колькасць заблакаваных запытаў на значку панэлі інструментаў", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Знайсці спісы", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index 5c2ecb76f4ac9..686b39f1058af 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -231,8 +231,44 @@ "message": "Показване на брояч в иконката за блокираните заявки", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Намиране на списъци", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/bn/messages.json b/platform/mv3/extension/_locales/bn/messages.json index f2593fc516db7..a9af81782712f 100644 --- a/platform/mv3/extension/_locales/bn/messages.json +++ b/platform/mv3/extension/_locales/bn/messages.json @@ -231,8 +231,44 @@ "message": "কতগুলো অনুরোধ ব্লক করা হয়েছে তা টুলবার আইকনে দেখাও", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index 4db287b541a92..9e61a7f21105b 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -231,8 +231,44 @@ "message": "Diskouez an niver a rekedoù bet stanket war arouez ar varrenn-ostilhoù", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Kavout rolloù", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/bs/messages.json b/platform/mv3/extension/_locales/bs/messages.json index 43466580b2805..a913ad1482aa7 100644 --- a/platform/mv3/extension/_locales/bs/messages.json +++ b/platform/mv3/extension/_locales/bs/messages.json @@ -231,8 +231,44 @@ "message": "Prikažite broj blokiranih zahtjeva na ikoni trake sa alatkama", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ca/messages.json b/platform/mv3/extension/_locales/ca/messages.json index ac4da9e1d2035..12c826c458189 100644 --- a/platform/mv3/extension/_locales/ca/messages.json +++ b/platform/mv3/extension/_locales/ca/messages.json @@ -231,8 +231,44 @@ "message": "Mostra el nombre de sol·licituds blocades a la icona de la barra d'eines", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Cerca llistes", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/cs/messages.json b/platform/mv3/extension/_locales/cs/messages.json index 5bf5f9d8720f9..ea9251418cf05 100644 --- a/platform/mv3/extension/_locales/cs/messages.json +++ b/platform/mv3/extension/_locales/cs/messages.json @@ -231,8 +231,44 @@ "message": "Zobrazit počet blokovaných požadavků u ikony v panelu nástrojů", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Najít seznamy", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/cv/messages.json b/platform/mv3/extension/_locales/cv/messages.json index 001ac9feaf606..1c200f3653e00 100644 --- a/platform/mv3/extension/_locales/cv/messages.json +++ b/platform/mv3/extension/_locales/cv/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/cy/messages.json b/platform/mv3/extension/_locales/cy/messages.json index bae4fc9205771..963338c56b06e 100644 --- a/platform/mv3/extension/_locales/cy/messages.json +++ b/platform/mv3/extension/_locales/cy/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/da/messages.json b/platform/mv3/extension/_locales/da/messages.json index 7d987b92b3102..edddf00153b7f 100644 --- a/platform/mv3/extension/_locales/da/messages.json +++ b/platform/mv3/extension/_locales/da/messages.json @@ -231,8 +231,44 @@ "message": "Vis antallet af blokerede forespørgsler på værktøjsbjælkeikonet", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lister", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index bdf6c74bb09c1..58ccefdcd6773 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -231,8 +231,44 @@ "message": "Anzahl der blockierten Anfragen auf dem Symbol in der Symbolleiste anzeigen", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Listen suchen", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index 45ef7ec9d9cc2..5b11ba4ceca0d 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -231,8 +231,44 @@ "message": "Εμφάνιση του αριθμού των αποκλεισμένων αιτημάτων στο εικονίδιο της γραμμής εργαλείων", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Εύρεση λιστών", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/en_GB/messages.json b/platform/mv3/extension/_locales/en_GB/messages.json index ee80a063a5e79..1ebff08aef9ce 100644 --- a/platform/mv3/extension/_locales/en_GB/messages.json +++ b/platform/mv3/extension/_locales/en_GB/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/eo/messages.json b/platform/mv3/extension/_locales/eo/messages.json index ec68394744eac..4c75658ccd218 100644 --- a/platform/mv3/extension/_locales/eo/messages.json +++ b/platform/mv3/extension/_locales/eo/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 89fa0aaddee9d..5fd5d530b0043 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -231,8 +231,44 @@ "message": "Mostrar el número de peticiones bloqueadas en el icono de la barra de herramientas", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Encontrar listas", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/et/messages.json b/platform/mv3/extension/_locales/et/messages.json index 008059cc3c63b..1d8efd99ccdee 100644 --- a/platform/mv3/extension/_locales/et/messages.json +++ b/platform/mv3/extension/_locales/et/messages.json @@ -231,8 +231,44 @@ "message": "Kuva tööriistariba ikoonil blokeeritud elementide arv", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Otsi nimekirju", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/eu/messages.json b/platform/mv3/extension/_locales/eu/messages.json index a477239fc0fbe..4d026da6bc9fe 100644 --- a/platform/mv3/extension/_locales/eu/messages.json +++ b/platform/mv3/extension/_locales/eu/messages.json @@ -231,8 +231,44 @@ "message": "Tresna-barraren ikonoan blokeatutako eskaeren kopurua erakutsi", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/fa/messages.json b/platform/mv3/extension/_locales/fa/messages.json index ebc8ca22f8f43..276405ceb51a7 100644 --- a/platform/mv3/extension/_locales/fa/messages.json +++ b/platform/mv3/extension/_locales/fa/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/fi/messages.json b/platform/mv3/extension/_locales/fi/messages.json index ecce31bfecf64..e3fe20347cc94 100644 --- a/platform/mv3/extension/_locales/fi/messages.json +++ b/platform/mv3/extension/_locales/fi/messages.json @@ -231,8 +231,44 @@ "message": "Näytä estettyjen pyyntöjen määrä työkalupalkin kuvakkeessa", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Etsi listoja", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/fil/messages.json b/platform/mv3/extension/_locales/fil/messages.json index 6450bb8f60597..3fb3e29541216 100644 --- a/platform/mv3/extension/_locales/fil/messages.json +++ b/platform/mv3/extension/_locales/fil/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/fr/messages.json b/platform/mv3/extension/_locales/fr/messages.json index 96c47b8e32218..7a9f2f3f31eb9 100644 --- a/platform/mv3/extension/_locales/fr/messages.json +++ b/platform/mv3/extension/_locales/fr/messages.json @@ -231,8 +231,44 @@ "message": "Afficher le nombre de requêtes bloquées sur l'icône", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Trouver des listes", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/fy/messages.json b/platform/mv3/extension/_locales/fy/messages.json index 44d68458821ed..bedb17ef55c4d 100644 --- a/platform/mv3/extension/_locales/fy/messages.json +++ b/platform/mv3/extension/_locales/fy/messages.json @@ -231,8 +231,44 @@ "message": "It tal blokkearre oanfragen op it arkbalkepiktogram toane", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Listen sykje", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/gl/messages.json b/platform/mv3/extension/_locales/gl/messages.json index 53589b6f6cf72..10c74dc99c343 100644 --- a/platform/mv3/extension/_locales/gl/messages.json +++ b/platform/mv3/extension/_locales/gl/messages.json @@ -231,8 +231,44 @@ "message": "Mostrar na icona da barra o número de peticións bloqueadas", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Atopa listas", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/gu/messages.json b/platform/mv3/extension/_locales/gu/messages.json index 001ac9feaf606..1c200f3653e00 100644 --- a/platform/mv3/extension/_locales/gu/messages.json +++ b/platform/mv3/extension/_locales/gu/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/he/messages.json b/platform/mv3/extension/_locales/he/messages.json index e9b9d50d094c6..ee12c27ad7591 100644 --- a/platform/mv3/extension/_locales/he/messages.json +++ b/platform/mv3/extension/_locales/he/messages.json @@ -231,8 +231,44 @@ "message": "הצגת מספר הבקשות החסומות על הסמל", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "חיפוש רשימות", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/hi/messages.json b/platform/mv3/extension/_locales/hi/messages.json index 710ac407d6515..fa5407f5856c2 100644 --- a/platform/mv3/extension/_locales/hi/messages.json +++ b/platform/mv3/extension/_locales/hi/messages.json @@ -231,8 +231,44 @@ "message": "टूलबार आइकन पर अवरुद्ध अनुरोधों की संख्या दिखाएं", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/hr/messages.json b/platform/mv3/extension/_locales/hr/messages.json index d8918586540c5..db09ff164dbf9 100644 --- a/platform/mv3/extension/_locales/hr/messages.json +++ b/platform/mv3/extension/_locales/hr/messages.json @@ -231,8 +231,44 @@ "message": "Prikaži broj blokiranih zahtjeva na ikoni alatne trake", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Pronađi liste", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index cacd7fee325ad..7fc3f9f07c335 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -231,8 +231,44 @@ "message": "Blokkolt kérések számának megjelenítése az eszköztárikonon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Listák keresése", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/hy/messages.json b/platform/mv3/extension/_locales/hy/messages.json index 9f6b7e347715e..005a83ca2b4cc 100644 --- a/platform/mv3/extension/_locales/hy/messages.json +++ b/platform/mv3/extension/_locales/hy/messages.json @@ -231,8 +231,44 @@ "message": "Ցուցադրել արգելափակված հայտերի քանակը գործիքների վահանակին", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/id/messages.json b/platform/mv3/extension/_locales/id/messages.json index 90b49987c904e..6b05ba7f9d2f2 100644 --- a/platform/mv3/extension/_locales/id/messages.json +++ b/platform/mv3/extension/_locales/id/messages.json @@ -231,8 +231,44 @@ "message": "Tampilkan jumlah permintaan yang diblokir pada ikon toolbar", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index 058376269d5d7..2e434a816a359 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -231,8 +231,44 @@ "message": "Mostra il numero delle richieste bloccate sull'icona nella barra degli strumenti", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Trova elenchi", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ja/messages.json b/platform/mv3/extension/_locales/ja/messages.json index 0efa9bd95eb7b..5c310b1a36c75 100644 --- a/platform/mv3/extension/_locales/ja/messages.json +++ b/platform/mv3/extension/_locales/ja/messages.json @@ -231,8 +231,44 @@ "message": "ブロックしたリクエストの数をツールバーのアイコンに表示", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ka/messages.json b/platform/mv3/extension/_locales/ka/messages.json index 18931165b03ac..1c874e90178c5 100644 --- a/platform/mv3/extension/_locales/ka/messages.json +++ b/platform/mv3/extension/_locales/ka/messages.json @@ -231,8 +231,44 @@ "message": "აჩვენეთ დაბლოკილი მოთხოვნების რაოდენობა ხელსაწყოთა ზოლის ხატულაზე", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "სიების მოძიება", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/kk/messages.json b/platform/mv3/extension/_locales/kk/messages.json index 001ac9feaf606..1c200f3653e00 100644 --- a/platform/mv3/extension/_locales/kk/messages.json +++ b/platform/mv3/extension/_locales/kk/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/kn/messages.json b/platform/mv3/extension/_locales/kn/messages.json index 7b349ff0a0c16..8d4b80ab44f7e 100644 --- a/platform/mv3/extension/_locales/kn/messages.json +++ b/platform/mv3/extension/_locales/kn/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ko/messages.json b/platform/mv3/extension/_locales/ko/messages.json index fbdc2048ef4da..18475960de041 100644 --- a/platform/mv3/extension/_locales/ko/messages.json +++ b/platform/mv3/extension/_locales/ko/messages.json @@ -231,8 +231,44 @@ "message": "차단된 요청 개수를 도구 모음 아이콘에 표시", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "목록 찾기", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/lt/messages.json b/platform/mv3/extension/_locales/lt/messages.json index 7e7ae212faeef..8a7b9cb2112e8 100644 --- a/platform/mv3/extension/_locales/lt/messages.json +++ b/platform/mv3/extension/_locales/lt/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/lv/messages.json b/platform/mv3/extension/_locales/lv/messages.json index 1d470f70f1ee0..cbd9d8b7c9752 100644 --- a/platform/mv3/extension/_locales/lv/messages.json +++ b/platform/mv3/extension/_locales/lv/messages.json @@ -231,8 +231,44 @@ "message": "Rādīt aizturēto pieprasījumu skaitu rīkjoslas ikonā", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Atrast sarakstus", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/mk/messages.json b/platform/mv3/extension/_locales/mk/messages.json index 13a59807181ac..e50658321a032 100644 --- a/platform/mv3/extension/_locales/mk/messages.json +++ b/platform/mv3/extension/_locales/mk/messages.json @@ -231,8 +231,44 @@ "message": "Прикажи го бројот на блокирани барања на иконата во алатникот", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Најди листи", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ml/messages.json b/platform/mv3/extension/_locales/ml/messages.json index 0862924b4fa66..7db51a3d39f8c 100644 --- a/platform/mv3/extension/_locales/ml/messages.json +++ b/platform/mv3/extension/_locales/ml/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/mr/messages.json b/platform/mv3/extension/_locales/mr/messages.json index 001ac9feaf606..1c200f3653e00 100644 --- a/platform/mv3/extension/_locales/mr/messages.json +++ b/platform/mv3/extension/_locales/mr/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ms/messages.json b/platform/mv3/extension/_locales/ms/messages.json index 853c8ce344b05..784f11dec42ba 100644 --- a/platform/mv3/extension/_locales/ms/messages.json +++ b/platform/mv3/extension/_locales/ms/messages.json @@ -231,8 +231,44 @@ "message": "Tunjukkan bilangan permintaan yang disekat pada ikon bar alat", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/nb/messages.json b/platform/mv3/extension/_locales/nb/messages.json index a977e85326f83..2e553978e3d35 100644 --- a/platform/mv3/extension/_locales/nb/messages.json +++ b/platform/mv3/extension/_locales/nb/messages.json @@ -231,8 +231,44 @@ "message": "Vis antall blokkerte forespørsler på verktøylinjeikonet", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/nl/messages.json b/platform/mv3/extension/_locales/nl/messages.json index 04734466a7481..74e3608a41dfa 100644 --- a/platform/mv3/extension/_locales/nl/messages.json +++ b/platform/mv3/extension/_locales/nl/messages.json @@ -231,8 +231,44 @@ "message": "Het aantal geblokkeerde aanvragen op het werkbalkpictogram tonen", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Lijsten zoeken", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/oc/messages.json b/platform/mv3/extension/_locales/oc/messages.json index 001ac9feaf606..1c200f3653e00 100644 --- a/platform/mv3/extension/_locales/oc/messages.json +++ b/platform/mv3/extension/_locales/oc/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/pa/messages.json b/platform/mv3/extension/_locales/pa/messages.json index f8ce344bc6e10..6bf60fe983285 100644 --- a/platform/mv3/extension/_locales/pa/messages.json +++ b/platform/mv3/extension/_locales/pa/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/pl/messages.json b/platform/mv3/extension/_locales/pl/messages.json index 257d2f0f3b680..791eb14d964f4 100644 --- a/platform/mv3/extension/_locales/pl/messages.json +++ b/platform/mv3/extension/_locales/pl/messages.json @@ -231,8 +231,44 @@ "message": "Wyświetlaj liczbę zablokowanych żądań na ikonie paska narzędzi", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Znajdź listy", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index e539229d5c972..429d7d5d94a9f 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -231,8 +231,44 @@ "message": "Mostrar o número de requisições bloqueadas no ícone da barra de ferramentas", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Achar listas", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index be2ee3752f79c..22d1eaf1e84ea 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -231,8 +231,44 @@ "message": "Mostra o número de pedidos bloqueados no ícone da barra de ferramentas", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Encontrar listas", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ro/messages.json b/platform/mv3/extension/_locales/ro/messages.json index 0b6384fb5a384..6d496312d84ea 100644 --- a/platform/mv3/extension/_locales/ro/messages.json +++ b/platform/mv3/extension/_locales/ro/messages.json @@ -231,8 +231,44 @@ "message": "Arată numărul cererilor blocate pe simbolul extensiei", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ru/messages.json b/platform/mv3/extension/_locales/ru/messages.json index b2e7be8d3185e..0e84993d58102 100644 --- a/platform/mv3/extension/_locales/ru/messages.json +++ b/platform/mv3/extension/_locales/ru/messages.json @@ -231,8 +231,44 @@ "message": "Показывать количество заблокированных запросов на иконке в панели инструментов", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Найти списки", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/si/messages.json b/platform/mv3/extension/_locales/si/messages.json index cf5b4f4413db1..f8c573375f6b1 100644 --- a/platform/mv3/extension/_locales/si/messages.json +++ b/platform/mv3/extension/_locales/si/messages.json @@ -231,8 +231,44 @@ "message": "මෙවලම් තීරු නිරූපකයේ අවහිර කළ ඉල්ලීම් ගණන පෙන්වන්න", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/sk/messages.json b/platform/mv3/extension/_locales/sk/messages.json index b31acd2fdc324..2f20bb2dca3a7 100644 --- a/platform/mv3/extension/_locales/sk/messages.json +++ b/platform/mv3/extension/_locales/sk/messages.json @@ -231,8 +231,44 @@ "message": "Zobraziť počet zablokovaných požiadaviek na ikone rozšírenia", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Nájsť zoznamy", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/sl/messages.json b/platform/mv3/extension/_locales/sl/messages.json index 001ac9feaf606..1c200f3653e00 100644 --- a/platform/mv3/extension/_locales/sl/messages.json +++ b/platform/mv3/extension/_locales/sl/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/so/messages.json b/platform/mv3/extension/_locales/so/messages.json index 001ac9feaf606..1c200f3653e00 100644 --- a/platform/mv3/extension/_locales/so/messages.json +++ b/platform/mv3/extension/_locales/so/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index 9aa0b63e6b238..2f161843a43b9 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -231,8 +231,44 @@ "message": "Shfaq numrin e kërkesave të bllokuara në ikonën e instrumenteve", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Gjej listat", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/sr/messages.json b/platform/mv3/extension/_locales/sr/messages.json index 20c22b359194d..dd4859978c912 100644 --- a/platform/mv3/extension/_locales/sr/messages.json +++ b/platform/mv3/extension/_locales/sr/messages.json @@ -231,8 +231,44 @@ "message": "Прикажи број блокираних захтева на иконици на траци алата", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Пронађи листе", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/sv/messages.json b/platform/mv3/extension/_locales/sv/messages.json index 857cfc707f316..91715d6bac039 100644 --- a/platform/mv3/extension/_locales/sv/messages.json +++ b/platform/mv3/extension/_locales/sv/messages.json @@ -231,8 +231,44 @@ "message": "Visa antalet blockerade förfrågningar på verktygsfältsikonen", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Hitta listor", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/sw/messages.json b/platform/mv3/extension/_locales/sw/messages.json index 001ac9feaf606..1c200f3653e00 100644 --- a/platform/mv3/extension/_locales/sw/messages.json +++ b/platform/mv3/extension/_locales/sw/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ta/messages.json b/platform/mv3/extension/_locales/ta/messages.json index 001ac9feaf606..1c200f3653e00 100644 --- a/platform/mv3/extension/_locales/ta/messages.json +++ b/platform/mv3/extension/_locales/ta/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/te/messages.json b/platform/mv3/extension/_locales/te/messages.json index 7a1cb67fa6a3b..c1933035602e3 100644 --- a/platform/mv3/extension/_locales/te/messages.json +++ b/platform/mv3/extension/_locales/te/messages.json @@ -231,8 +231,44 @@ "message": "Show the number of blocked requests on the toolbar icon", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/th/messages.json b/platform/mv3/extension/_locales/th/messages.json index dd77461de48e0..8ae7f62db2588 100644 --- a/platform/mv3/extension/_locales/th/messages.json +++ b/platform/mv3/extension/_locales/th/messages.json @@ -231,8 +231,44 @@ "message": "แสดงจำนวนคำขอที่ถูกปิดกั้นบนไอคอนแถบเครื่องมือ", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/tr/messages.json b/platform/mv3/extension/_locales/tr/messages.json index 511312a66afdf..5054aca0375b8 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -231,8 +231,44 @@ "message": "Engellenen isteklerin sayısını araç çubuğu simgesinde göster", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Liste bul", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index ea7338db5f6f7..98cac736f3004 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -231,8 +231,44 @@ "message": "Показувати кількість заблокованих запитів на піктограмі панелі інструментів", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Знайти списки", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ur/messages.json b/platform/mv3/extension/_locales/ur/messages.json index 0af9983ebe907..3c4d796af358a 100644 --- a/platform/mv3/extension/_locales/ur/messages.json +++ b/platform/mv3/extension/_locales/ur/messages.json @@ -231,8 +231,44 @@ "message": "ٹول بار کے آئیکن پر بلاک شدہ درخواستوں کی تعداد دکھائیں۔", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/vi/messages.json b/platform/mv3/extension/_locales/vi/messages.json index 5826504b1cea4..2e1c09546aee1 100644 --- a/platform/mv3/extension/_locales/vi/messages.json +++ b/platform/mv3/extension/_locales/vi/messages.json @@ -231,8 +231,44 @@ "message": "Hiện số lượng yêu cầu bị chặn trên biểu tượng thanh công cụ", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "Find lists", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/zh_CN/messages.json b/platform/mv3/extension/_locales/zh_CN/messages.json index 05b31c9d07b20..4f01ba20adee8 100644 --- a/platform/mv3/extension/_locales/zh_CN/messages.json +++ b/platform/mv3/extension/_locales/zh_CN/messages.json @@ -231,8 +231,44 @@ "message": "在工具栏图标上显示拦截请求数", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "查找列表", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/zh_TW/messages.json b/platform/mv3/extension/_locales/zh_TW/messages.json index 096df7c4e23f3..2aa06e3966568 100644 --- a/platform/mv3/extension/_locales/zh_TW/messages.json +++ b/platform/mv3/extension/_locales/zh_TW/messages.json @@ -231,8 +231,44 @@ "message": "在工具列圖示上顯示被阻擋的連線請求的數量", "description": "Label for a checkbox in the options page" }, + "enableStrictBlockLabel": { + "message": "Enable strict blocking", + "description": "Label for a checkbox in the options page" + }, + "enableStrictBlockLegend": { + "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "description": "Label for a checkbox in the options page" + }, "findListsPlaceholder": { "message": "尋找清單", "description": "Placeholder for the input field used to find lists" + }, + "strictblockTitle": { + "message": "Page blocked", + "description": "Webpage title for the strict-blocked page" + }, + "strictblockSentence1": { + "message": "uBO Lite has prevented the following page from loading:", + "description": "Sentence used in the strict-blocked page" + }, + "strictblockNoParamsPrompt": { + "message": "without parameters", + "description": "Label to be used for the parameter-less URL" + }, + "strictblockBack": { + "message": "Go back", + "description": "A button to go back to the previous webpage" + }, + "strictblockClose": { + "message": "Close this window", + "description": "A button to close the current tab" + }, + "strictblockDontWarn": { + "message": "Don't warn me again about this site", + "description": "Label for checkbox in document-blocked page" + }, + "strictblockProceed": { + "message": "Proceed", + "description": "A button to navigate to the blocked page" } } From 076e9fa73e4c169dab5c3fb6251fbae5bb51ed56 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 4 Dec 2024 10:48:55 -0500 Subject: [PATCH 495/553] Visually separate scriptlet parameters in active line This makes it easier to see how parameters are parsed internally, in order to make it easier to distinguish commas as separator and literal commas meant to be part of a parameter. Related discussion: https://github.com/uBlockOrigin/uBlock-discussions/discussions/865#discussioncomment-11461980 --- src/css/codemirror.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/css/codemirror.css b/src/css/codemirror.css index 9036acc990182..d1ca9fa1008de 100644 --- a/src/css/codemirror.css +++ b/src/css/codemirror.css @@ -134,6 +134,10 @@ .cm-theme-override .cm-s-default .cm-variable { color: var(--sf-variable-ink); } +.cm-theme-override .cm-s-default .CodeMirror-activeline .cm-ext-js .cm-variable { + text-decoration: underline color-mix(in srgb, var(--sf-variable-ink) 30%, transparent) solid 3px; + text-decoration-skip-ink: none; + } .cm-theme-override .cm-s-default .cm-warning { background-color: var(--sf-warning-surface); text-decoration: underline var(--sf-warning-ink); From 48fed03128c59af89d23ba0d0e9f0d8b58e25825 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 4 Dec 2024 16:55:18 -0500 Subject: [PATCH 496/553] Add "RU AdList: Counters" to stable release of uBO Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/229#issuecomment-2408527226 --- assets/assets.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/assets/assets.json b/assets/assets.json index 76967068a6e99..6449dbe932434 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -826,6 +826,7 @@ "RUS-0": { "content": "filters", "group": "regions", + "parent": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", "off": true, "title": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek", @@ -839,6 +840,22 @@ "supportURL": "https://forums.lanik.us/viewforum.php?f=102", "instructionURL": "https://forums.lanik.us/viewtopic.php?f=102&t=22512" }, + "RUS-1": { + "content": "filters", + "group": "regions", + "parent": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", + "off": true, + "title": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList: Counters", + "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek be kk tt ru uk uz", + "contentURL": "https://raw.githubusercontent.com/easylist/ruadlist/master/cntblock.txt", + "cdnURLs": [ + "https://cdn.jsdelivr.net/gh/easylist/ruadlist@master/cntblock.txt", + "https://cdn.statically.io/gh/easylist/ruadlist/master/cntblock.txt", + "https://raw.githubusercontent.com/easylist/ruadlist/master/cntblock.txt" + ], + "supportURL": "https://forums.lanik.us/viewforum.php?f=102", + "instructionURL": "https://forums.lanik.us/viewtopic.php?f=102&t=22512" + }, "spa-0": { "content": "filters", "group": "regions", From ea1b1abaee29e76e0fac84f168e75fb0d31e174d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 4 Dec 2024 19:43:40 -0500 Subject: [PATCH 497/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/ar/messages.json | 16 +++--- .../mv3/extension/_locales/be/messages.json | 18 +++---- .../mv3/extension/_locales/bg/messages.json | 18 +++---- .../extension/_locales/br_FR/messages.json | 20 +++---- .../mv3/extension/_locales/ca/messages.json | 18 +++---- .../mv3/extension/_locales/da/messages.json | 18 +++---- .../mv3/extension/_locales/de/messages.json | 18 +++---- .../mv3/extension/_locales/es/messages.json | 18 +++---- .../mv3/extension/_locales/et/messages.json | 18 +++---- .../mv3/extension/_locales/fi/messages.json | 18 +++---- .../mv3/extension/_locales/fr/messages.json | 18 +++---- .../mv3/extension/_locales/fy/messages.json | 18 +++---- .../mv3/extension/_locales/gl/messages.json | 18 +++---- .../mv3/extension/_locales/hr/messages.json | 18 +++---- .../mv3/extension/_locales/hu/messages.json | 18 +++---- .../mv3/extension/_locales/ja/messages.json | 18 +++---- .../mv3/extension/_locales/lv/messages.json | 18 +++---- .../mv3/extension/_locales/pl/messages.json | 18 +++---- .../extension/_locales/pt_BR/messages.json | 18 +++---- .../mv3/extension/_locales/ru/messages.json | 18 +++---- .../mv3/extension/_locales/sk/messages.json | 18 +++---- .../mv3/extension/_locales/sr/messages.json | 54 +++++++++---------- .../mv3/extension/_locales/sv/messages.json | 18 +++---- .../mv3/extension/_locales/tr/messages.json | 18 +++---- .../extension/_locales/zh_CN/messages.json | 18 +++---- .../extension/_locales/zh_TW/messages.json | 32 +++++------ src/_locales/sr/messages.json | 8 +-- 27 files changed, 263 insertions(+), 263 deletions(-) diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index 6d3d859d2ea43..b4281ab21df17 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "تمكين الحظر الصارم", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "سيتم حظر التنقل إلى المواقع غير المرغوب فيها، وسيتم تقديم خيار لك للمتابعة.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,11 +244,11 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "الصفحة محجوبة", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "لقد منع uBO Lite تحميل الصفحة التالية:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { @@ -256,19 +256,19 @@ "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "رجوع", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "إغلاق هذه النافذة", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "لا تحذرني مرة أخرى من هذا الموقع", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "متابعة", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/be/messages.json b/platform/mv3/extension/_locales/be/messages.json index a75a324e67a74..9ca2a032414e0 100644 --- a/platform/mv3/extension/_locales/be/messages.json +++ b/platform/mv3/extension/_locales/be/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Уключыць строгае блакаванне", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Пераход да патэнцыйна непажаданых сайтаў будзе заблакаваны, і вам будзе прапанавана магчымасць працягнуць.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Старонка заблакавана", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite папярэдзіў чытанне наступнай старонкі:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "без параметраў", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Вярнуцца", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Закрыць гэтае акно", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Не папярэджваць больш пра гэты сайт", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Працягнуць", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index 686b39f1058af..8ebf6cbd586a2 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Активиране на строгото блокиране", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Навигацията към потенциално нежелани сайтове ще бъде блокирана и ще ви бъде предложена възможността да продължите.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Страницата е блокирана", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite попречи на зареждането на следната страница:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "без параметри", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Назад", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Затворяне на прозореца", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Не ме предупреждавайте отново за този сайт", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Продължаване", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index 9e61a7f21105b..2b5784900f48f 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -160,7 +160,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Merkañ ar bejenn web evel \"NSFW\" (“Not Safe For Work”, dizereat evit al labour)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Enaouiñ ar stankañ strizh", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Stanket e vo ar merdeiñ etrezek lec'hiennoù a c'hallfe bezañ dañjerus, ha moaien a vo deoc'h dibab da genderc'hel pe get.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Pajenn stanket", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite en deus miret ar bajenn-mañ da gargañ:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "kuit a arventennoù", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Distreiñ", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Serriñ ar prenestr-mañ", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Arabat kemenn din diwar-benn al lec'hienn-mañ en-dro", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Kenderc'hel", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ca/messages.json b/platform/mv3/extension/_locales/ca/messages.json index 12c826c458189..96bbd7029e32b 100644 --- a/platform/mv3/extension/_locales/ca/messages.json +++ b/platform/mv3/extension/_locales/ca/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Habilita el blocatge estricte", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Es blocarà la navegació en webs potencialment no desitjables, oferint-vos la possibilitat de continuar.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Pàgina blocada", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "L'uBO Lite ha evitat la càrrega d'aquesta pàgina:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "sense paràmetres", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Enrere", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Tanca aquesta finestra", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "No em tornis a avisar sobre aquest lloc", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Continua", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/da/messages.json b/platform/mv3/extension/_locales/da/messages.json index edddf00153b7f..63efbe0d83cd9 100644 --- a/platform/mv3/extension/_locales/da/messages.json +++ b/platform/mv3/extension/_locales/da/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Aktivér striks blokering", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Navigering til potentielt uønskede websteder blokeres, men man tilbydes muligheden for at fortsætte.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Side blokeret", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite har forhindret flg. side i at blive indlæst:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "uden parametre", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Gå tilbage", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Luk dette vindue", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Advar ikke igen om dette websted", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Fortsæt", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index 58ccefdcd6773..32c14d1ca49df 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Stricktes Blockieren aktivieren", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Die Navigation zu potenziell unerwünschten Websites wird verhindert, jedoch wird eine Möglichkeit zum Fortfahren angeboten.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Seite blockiert", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite hat das Laden der folgenden Seite verhindert:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "ohne Parameter", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Zurück", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Dieses Fenster schließen", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Nicht erneut vor dieser Seite warnen", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Fortfahren", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 5fd5d530b0043..6bf520e79b2b9 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Habilitar bloqueo estricto", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "La navegación a sitios potencialmente no deseados será bloqueada, y se te ofrecerá la opción de continuar.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Página bloqueada", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite impidió la carga de la página:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "sin parámetros", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Regresar", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Cerrar esta ventana", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "No me adviertas de nuevo sobre este sitio", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Continuar", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/et/messages.json b/platform/mv3/extension/_locales/et/messages.json index 1d8efd99ccdee..3b7ced5a48785 100644 --- a/platform/mv3/extension/_locales/et/messages.json +++ b/platform/mv3/extension/_locales/et/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Luba range tõkestamine", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Kahtlastele veebilehtedele suunamist takistatakse ja pakutakse võimalust jätkamiseks.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Lehe sirvimine piiratud", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite ennetas järgmise veebilehe laadimist:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "ilma näitajateta", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Tagasi", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Sulge see aken", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Edaspidi luba mul seda sirvida", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Jätka", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/fi/messages.json b/platform/mv3/extension/_locales/fi/messages.json index e3fe20347cc94..963a50c6900ce 100644 --- a/platform/mv3/extension/_locales/fi/messages.json +++ b/platform/mv3/extension/_locales/fi/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Käytä tiukkaa estoa", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Potentiaalisesti ei-toivottujen sivustojen avaaminen estetään mahdollisuudella jatkaa.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Sivu estettiin", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite on estänyt seuraavan sivun latauksen:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "ilman parametreja", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Palaa takaisin", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Sulje tämä ikkuna", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Älä varoita minua tästä sivustosta uudelleen", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Jatka", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/fr/messages.json b/platform/mv3/extension/_locales/fr/messages.json index 7a9f2f3f31eb9..a08099a95f8aa 100644 --- a/platform/mv3/extension/_locales/fr/messages.json +++ b/platform/mv3/extension/_locales/fr/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Activer le blocage strict", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "La navigation vers des sites potentiellement indésirables sera bloquée, et vous aurez la possibilité de continuer", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Page bloquée", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite a empêché le chargement de cette page :", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "sans paramètres", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Précédent", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Fermer cette fenêtre", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Ne plus me prévenir pour ce site", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Continuer", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/fy/messages.json b/platform/mv3/extension/_locales/fy/messages.json index bedb17ef55c4d..f570ed2c0ed19 100644 --- a/platform/mv3/extension/_locales/fy/messages.json +++ b/platform/mv3/extension/_locales/fy/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Strikte blokkearring ynskeakelje", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Navigaasje nei in potinsjeel net-winske websites sil blokkearre wurde, en jo krije in opsje om troch te gean.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Side blokkearre", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite hat opkeard dat de folgjende side laden wurd:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "sûnder parameters", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Tebek", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Slút dit finster", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "My net mear warskôgje oer dizze website", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Tochgean", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/gl/messages.json b/platform/mv3/extension/_locales/gl/messages.json index 10c74dc99c343..3054c798c8c3b 100644 --- a/platform/mv3/extension/_locales/gl/messages.json +++ b/platform/mv3/extension/_locales/gl/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Activar bloqueo estrito", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Vaise bloquear a navegación en webs potencialmente non desexables, e ofrecerase a opción de bloquealas.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Páxina bloqueada", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite evitou que a seguinte páxina se cargase:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "sen parámetros", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Volver", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Pechar esta xanela", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Non volver avisarme sobre esta web", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Proceder", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/hr/messages.json b/platform/mv3/extension/_locales/hr/messages.json index db09ff164dbf9..b70b02ca1a81f 100644 --- a/platform/mv3/extension/_locales/hr/messages.json +++ b/platform/mv3/extension/_locales/hr/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Omogući strogo blokiranje", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Navigacija do potencijalno nepoželjnih stranica bit će blokirana i bit će vam ponuđena opcija za nastavak.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Stranica blokirana", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite je spriječio učitavanje sljedeće stranice:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "bez parametara", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Idi natrag", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Zatvori ovaj prozor", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Ne upozoravaj me više za ovu web stranicu", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Nastavi", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index 7fc3f9f07c335..6a31151a5d6b4 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Szigorú blokkolás engedélyezése", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Az esetleges nem kívánatos webhelyekre való navigáció blokkolva lesz, és rákérdez arra, hogy folytatja-e.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Oldal blokkolva", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "A uBO Lite megakadályozta a következő oldal betöltését:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "paraméterek nélkül", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Vissza", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Ablak bezárása", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Ne figyelmeztessen többet erről az oldalról", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Folytatás", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ja/messages.json b/platform/mv3/extension/_locales/ja/messages.json index 5c310b1a36c75..6da09a7720eaf 100644 --- a/platform/mv3/extension/_locales/ja/messages.json +++ b/platform/mv3/extension/_locales/ja/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "厳格なブロックを有効化", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "望ましくない可能性のあるサイトへのナビゲーションはブロックされ、次に進むためのオプションが表示されます。", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "ブロックしたページ", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite はこのページの読み込みをブロックしています:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "パラメータを除いた URL", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "戻る", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "このウィンドウを閉じる", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "今後このサイトに関する警告を表示しない", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "続行する", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/lv/messages.json b/platform/mv3/extension/_locales/lv/messages.json index cbd9d8b7c9752..70c7ad1754c61 100644 --- a/platform/mv3/extension/_locales/lv/messages.json +++ b/platform/mv3/extension/_locales/lv/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Iespējot stingro aizturēšanu", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Iespējami nevēlamu vietņu apmeklēšana tiks aizturēta, un tiks piedāvāta iespēja turpināt.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Lapa aizturēta", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite novērsa šīs lapas ielādēšanu:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "bez parametriem", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Doties atpakaļ", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Aizvērt šo logu", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Nebrīdināt vairs par šo vietni", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Turpināt", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/pl/messages.json b/platform/mv3/extension/_locales/pl/messages.json index 791eb14d964f4..b6e9cca38813a 100644 --- a/platform/mv3/extension/_locales/pl/messages.json +++ b/platform/mv3/extension/_locales/pl/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Włącz ścisłe blokowanie", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Nawigacja do potencjalnie niepożądanych witryn zostanie zablokowana i pojawi się opcja kontynuowania.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Strona zablokowana", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite nie pozwolił załadować się następującej stronie:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "bez parametrów", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Wstecz", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Zamknij to okno", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Nie ostrzegaj mnie ponownie o tej witrynie", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Kontynuuj", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index 429d7d5d94a9f..b64c7e263769d 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Ativar bloqueio rigoroso", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "A navegação até sites potencialmente indesejáveis ​​será bloqueada e será oferecido a você a opção de prosseguir.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Página bloqueada", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "O uBO Lite impediu o carregamento da seguinte página:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "sem parâmetros", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Voltar", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Fechar esta janela", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Não me avise de novo sobre este site", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Prosseguir", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ru/messages.json b/platform/mv3/extension/_locales/ru/messages.json index 0e84993d58102..011a910226275 100644 --- a/platform/mv3/extension/_locales/ru/messages.json +++ b/platform/mv3/extension/_locales/ru/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Включить строгую блокировку", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Переход к потенциально нежелательным сайтам будет заблокирован, и будет дана возможность продолжить переход на сайт", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Страница заблокирована", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite предотвратил загрузку следующей страницы:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "без параметров", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Назад", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Закрыть это окно", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Больше не предупреждать меня об этом сайте", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Продолжить", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/sk/messages.json b/platform/mv3/extension/_locales/sk/messages.json index 2f20bb2dca3a7..8d7da8002cdfb 100644 --- a/platform/mv3/extension/_locales/sk/messages.json +++ b/platform/mv3/extension/_locales/sk/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Povoliť prísne blokovanie", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Navigácia na potenciálne nežiaduce stránky sa zablokuje a ponúkne sa vám možnosť pokračovať.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Zablokovaná stránka", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite zabránil načítaniu nasledujúcej stránky:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "bez parametrov", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Naspäť", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Zatvoriť toto okno", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Už ma na túto stránku neupozorňovať", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Pokračovať", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/sr/messages.json b/platform/mv3/extension/_locales/sr/messages.json index dd4859978c912..ca3218b7a650b 100644 --- a/platform/mv3/extension/_locales/sr/messages.json +++ b/platform/mv3/extension/_locales/sr/messages.json @@ -32,7 +32,7 @@ "description": "Label in the popup panel for the current filtering mode" }, "popupTipReport": { - "message": "Report an issue on this website", + "message": "Пријавите проблем на овом веб сајту", "description": "Tooltip used for the 'chat' icon in the panel" }, "popupTipDashboard": { @@ -104,67 +104,67 @@ "description": "Shown in the About pane" }, "supportS6H": { - "message": "Report a filter issue", + "message": "Пријављивање проблема са филтером", "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Report filter issues with specific websites to the uBlockOrigin/uAssets issue tracker. Requires a GitHub account.", + "message": "Пријавите проблеме са филтерима на одређеним веб сајтовима на uBlockOrigin/uAssets issue tracker. Захтева GitHub налог.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "To avoid burdening volunteers with duplicate reports, please verify that the issue has not already been reported.", + "message": "Да не бисте оптерећивали волонтере дуплим извештајима, проверите да ли је проблем већ пријављен.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { - "message": "Find similar reports", + "message": "Пронађи сличне извештаје", "description": "A clickable link in the filter issue reporter section" }, "supportS6URL": { - "message": "Address of the webpage:", + "message": "Адреса веб странице:", "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "The webpage…", + "message": "Веб страница...", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { - "message": "-- Pick an entry --", + "message": "", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option1": { - "message": "Shows ads or ad leftovers", + "message": "Приказује рекламе или остатке реклама", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option2": { - "message": "Has overlays or other nuisances", + "message": "Има преклапања или друге сметње", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Detects uBO Lite", + "message": "Детектује uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "Has privacy-related issues", + "message": "", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Malfunctions when uBO Lite is enabled", + "message": "Кварови када је uBO Lite омогућен", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { - "message": "Opens unwanted tabs or windows", + "message": "Отвара нежељене картице или прозоре", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Води до лошег софтвера, „пецања\"", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { - "message": "Label the webpage as “NSFW” (“Not Safe For Work”)", + "message": "Означи веб страницу као „NSFW” („Није безбедно за рад”)", "description": "A checkbox to use for NSFW sites" }, "supportReportSpecificButton": { - "message": "Create new report", + "message": "Креирај нови извештај", "description": "Text for button which open an external webpage in Support pane" }, "firstRunSectionLabel": { @@ -212,7 +212,7 @@ "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "Листа имена хостова за које се неће вршити филтрирање", + "message": "Листа веб сајтова за које се неће вршити филтрирање", "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Омогући строго блокирање", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Навигација до потенцијално непожељних сајтова ће бити блокирана и биће вам понуђена опција да наставите.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Страница је блокирана", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite је спречио учитавање следеће странице:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "без параметара", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Иди назад", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Затвори овај прозор", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Не упозоравај ме поново на ову страницу", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Настави", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/sv/messages.json b/platform/mv3/extension/_locales/sv/messages.json index 91715d6bac039..164a91ba3f326 100644 --- a/platform/mv3/extension/_locales/sv/messages.json +++ b/platform/mv3/extension/_locales/sv/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Aktivera strikt blockering", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Navigering till potentiellt oönskade webbplatser kommer att blockeras och du kommer att erbjudas alternativet att fortsätta.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Sidan blockerad", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite har förhindrat följande sida från att läsas in:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "utan parametrar", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Gå tillbaka", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Stäng det här fönstret", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Varna mig inte igen om den här sidan", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Fortsätt", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/tr/messages.json b/platform/mv3/extension/_locales/tr/messages.json index 5054aca0375b8..a3a6dacf5f140 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Sıkı engellemeyi kullanıma al", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "İstenmeyebilecek sitelere giriş engellenecek ve devam edip etmeyeceğiniz size sorulacak.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Sayfa engellendi", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBo Lite aşağıdaki sayfaların yüklenmesini engelledi:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "değişkensiz", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Geri git", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Bu pencereyi kapat", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Bu site için beni bir daha uyarma", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Devam et", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/zh_CN/messages.json b/platform/mv3/extension/_locales/zh_CN/messages.json index 4f01ba20adee8..9fa3896976ec1 100644 --- a/platform/mv3/extension/_locales/zh_CN/messages.json +++ b/platform/mv3/extension/_locales/zh_CN/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "开启严格拦截", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "导航至潜在不良网站的操作将被拦截,并且您将可以选择继续前往。", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "被拦截的页面", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite 已阻止了以下页面的加载:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "不含参数", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "返回", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "关闭此窗口", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "不要再警告我关于这个网站了", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "继续", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/zh_TW/messages.json b/platform/mv3/extension/_locales/zh_TW/messages.json index 2aa06e3966568..5061d297175b6 100644 --- a/platform/mv3/extension/_locales/zh_TW/messages.json +++ b/platform/mv3/extension/_locales/zh_TW/messages.json @@ -108,7 +108,7 @@ "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "回報特定網站的過濾器問題至 uBlockOrigin/uAssets 議題追蹤器需要 GitHub 帳號。", + "message": "將特定網站的過濾器問題回報至 uBlockOrigin/uAssets 議題追蹤器需要 GitHub 帳號。.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { @@ -172,7 +172,7 @@ "description": "The header text for the welcome message section" }, "firstRunDescription": { - "message": "您剛安裝了 uBO Lite。您可以在此處選擇會套用在所有網站上的預設過濾模式。\n\n預設情況下,將會使用基礎模式,因為其不需要讀取與變更資料的權限。若您信任 uBO Lite,您可以給予其讀取並變更在所有網站上資料的廣泛權限,以便為所有網站啟用更進階的過濾功能。", + "message": "您剛安裝了 uBO Lite。您可以在此處選擇會套用在所有網站上的預設過濾模式。\n\n預設將會使用基礎模式,因為其不需要讀取與變更資料的權限。若您信任 uBO Lite,您可以給予其讀取並變更在所有網站上資料的廣泛權限,以便為所有網站啟用進階過濾功能。", "description": "Descriptive text shown at first install time only " }, "defaultFilteringModeSectionLabel": { @@ -192,7 +192,7 @@ "description": "Name of blocking mode 1" }, "filteringMode2Name": { - "message": "最佳化", + "message": "最佳", "description": "Name of blocking mode 2" }, "filteringMode3Name": { @@ -208,11 +208,11 @@ "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "進階網路過濾以及來自選定過濾條件清單的特定與通用擴展過濾條件。\n\n需要在所有網站上讀取並變更資料的廣泛權限。\n\n通用擴展過濾可能會導致更高的網頁資源使用率。", + "message": "進階網路過濾以及來自選定過濾清單的特定與通用擴展過濾條件。\n\n需要在所有網站上讀取並變更資料的廣泛權限。\n\n通用擴展過濾可能會導致使用更多的網頁資源。", "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { - "message": "不進行過濾的主機名稱列表", + "message": "不會被過濾的網站", "description": "A short description for the editable field which lists trusted sites" }, "noFilteringModePlaceholder": { @@ -224,19 +224,19 @@ "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "變更過濾模式時自動重新載入頁面", + "message": "變更過濾模式時,自動重新載入", "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { - "message": "在工具列圖示上顯示被阻擋的連線請求的數量", + "message": "在工具列圖示上顯示被阻擋的網路請求數量", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "啟用嚴格阻擋", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "將會阻擋前往潛在不良網站的請求,您可以選擇繼續。", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "已封鎖頁面", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite 已防止下列頁面載入:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "不帶參數", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "返回", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "關閉此視窗", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "不要再顯示關於此網站的警告", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "繼續", "description": "A button to navigate to the blocked page" } } diff --git a/src/_locales/sr/messages.json b/src/_locales/sr/messages.json index bf92e441d98e2..1e4f7d6d91df2 100644 --- a/src/_locales/sr/messages.json +++ b/src/_locales/sr/messages.json @@ -928,7 +928,7 @@ "description": "Header of 'Filter issues' section in Support pane" }, "supportS3P1": { - "message": "Пријавите проблеме са филтерима на одређеним веб сајтовима на uBlockOrigin/uAssets, страници за праћење проблема. Неопходан је GitHub налог.", + "message": "Пријавите проблеме са филтерима на одређеним веб сајтовима на uBlockOrigin/uAssets issue tracker. Неопходан је GitHub налог.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS3P2": { @@ -944,7 +944,7 @@ "description": "Header of 'Bug report' section in Support pane" }, "supportS4P1": { - "message": "Пријавите проблеме са самим uBlock Origin-ом на uBlockOrigin/uBlock-issue, страници за праћење проблема. Неопходан је GitHub налог.", + "message": "Пријавите проблеме са самим uBlock Origin-ом на uBlockOrigin/uBlock-issue issue tracker. Неопходан је GitHub налог.", "description": "First paragraph of 'Bug report' section in Support pane" }, "supportS5H": { @@ -1012,7 +1012,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option7": { - "message": "Leads to badware, phishing", + "message": "Води до лошег софтвера, „пецања\"", "description": "An entry in the widget used to select the type of issue" }, "supportS6Checkbox1": { @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Блокирана страница жели да преусмери на други сајт. Ако одлучите да наставите, ићи ћете директно на: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { From 1a0331b7c2d5eb4c6ebc99ed383bb61408f8e10a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 4 Dec 2024 19:44:23 -0500 Subject: [PATCH 498/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index cf4063a4b0380..867a6909b5fbd 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.3.2 \ No newline at end of file +1.61.3.3 \ No newline at end of file From 5eb44d01e50fd55a19bdded64789b3df1096df27 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 4 Dec 2024 19:45:06 -0500 Subject: [PATCH 499/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec88ef78c4ea0..1f406ffd55b87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Visually separate scriptlet parameters in active line](https://github.com/gorhill/uBlock/commit/076e9fa73e) - [Mitigate potentially delayed execution of scriptlets in Firefox](https://github.com/gorhill/uBlock/commit/b1a00145bd) - [Improve `prevent-setTimeout`/`prevent-setInterval` scriptlets](https://github.com/gorhill/uBlock/commit/3b7fa79a68) - [Improve `trusted-replace-argument` scriptlet](https://github.com/gorhill/uBlock/commit/adced29b5b) From f80143a8ee559befb629217c13b04e3827abacfa Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 4 Dec 2024 19:50:40 -0500 Subject: [PATCH 500/553] 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 247f6252182f4..d123412a32903 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.3.2", + "version": "1.61.3.3", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b2/uBlock0_1.61.3b2.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b3/uBlock0_1.61.3b3.firefox.signed.xpi" } ] } From a86e802afc1f5623f61981fdd45e0d54d583688e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 5 Dec 2024 09:04:31 -0500 Subject: [PATCH 501/553] Add advanced setting `noScriptingCSP` Related discussion: https://github.com/uBlockOrigin/uBlock-issues/issues/2642#issuecomment-2520096503 Specify which CSP directive to inject when no-scripting switch is toggled on. If this hidden setting is changed, uBO will not try to spoof `noscript` elements. For internal use at the moment, not to be documented. --- src/js/background.js | 2 +- src/js/messaging.js | 5 ++++- src/js/traffic.js | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/js/background.js b/src/js/background.js index fa7e3f2e72bd4..01fd3b5d6b1ec 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -73,6 +73,7 @@ const hiddenSettingsDefault = { loggerPopupType: 'popup', manualUpdateAssetFetchPeriod: 500, modifyWebextFlavor: 'unset', + noScriptingCSP: 'script-src http: https:', popupFontSize: 'unset', popupPanelDisabledSections: 0, popupPanelHeightMode: 0, @@ -254,7 +255,6 @@ const µBlock = { // jshint ignore:line scriptlets: {}, cspNoInlineScript: "script-src 'unsafe-eval' * blob: data:", - cspNoScripting: 'script-src http: https:', cspNoInlineFont: 'font-src *', liveBlockingProfiles: [], diff --git a/src/js/messaging.js b/src/js/messaging.js index d35a1347e782e..16d527c60b48e 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -804,6 +804,9 @@ const onMessage = function(request, sender, callback) { case 'shouldRenderNoscriptTags': { if ( pageStore === null ) { break; } + if ( µb.hiddenSettings.noScriptingCSP !== µb.hiddenSettingsDefault.noScriptingCSP ) { + break; + } const fctxt = µb.filteringContext.fromTabId(sender.tabId); if ( pageStore.filterScripting(fctxt, undefined) ) { vAPI.tabs.executeScript(sender.tabId, { @@ -2009,7 +2012,7 @@ const logCSPViolations = function(pageStore, request) { fctxt.type = 'script'; fctxt.filter = undefined; if ( pageStore.filterScripting(fctxt, true) === 1 ) { - cspData.set(µb.cspNoScripting, fctxt.filter); + cspData.set(µb.hiddenSettings.noScriptingCSP, fctxt.filter); } fctxt.type = 'inline-font'; diff --git a/src/js/traffic.js b/src/js/traffic.js index 894554a804f70..df3b09714ff99 100644 --- a/src/js/traffic.js +++ b/src/js/traffic.js @@ -969,7 +969,7 @@ const injectCSP = function(fctxt, pageStore, responseHeaders) { const builtinDirectives = []; if ( pageStore.filterScripting(fctxt, true) === 1 ) { - builtinDirectives.push(µb.cspNoScripting); + builtinDirectives.push(µb.hiddenSettings.noScriptingCSP); if ( logger.enabled ) { fctxt.setRealm('network').setType('scripting').toLogger(); } From 37f7181a52b45beb3ed4e4eca83c1a37a8f54adb Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 5 Dec 2024 09:08:26 -0500 Subject: [PATCH 502/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 867a6909b5fbd..8a93a27b73714 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.3.3 \ No newline at end of file +1.61.3.4 \ No newline at end of file From 07484ceed1486c9822187e0d2a541d9fb92225f3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 5 Dec 2024 09:10:46 -0500 Subject: [PATCH 503/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/id/messages.json | 20 +++++++++---------- .../mv3/extension/_locales/sq/messages.json | 18 ++++++++--------- .../mv3/extension/_locales/uk/messages.json | 18 ++++++++--------- src/_locales/id/messages.json | 2 +- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/platform/mv3/extension/_locales/id/messages.json b/platform/mv3/extension/_locales/id/messages.json index 6b05ba7f9d2f2..f37442b5034a3 100644 --- a/platform/mv3/extension/_locales/id/messages.json +++ b/platform/mv3/extension/_locales/id/messages.json @@ -232,43 +232,43 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Aktifkan pemblokiran ketat", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Navigasi ke situs yang mungkin tidak diinginkan akan diblokir, dan Anda akan ditawari opsi untuk melanjutkan.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { - "message": "Find lists", + "message": "Temukan daftar", "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Halaman diblokir", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite telah mencegah pemuatan halaman berikut:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "tanpa parameter", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Kembali", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Tutup jendela ini", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Jangan peringatkan saya lagi tentang situs ini", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Lanjutkan", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index 2f161843a43b9..2d881d1cf0d35 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Aktivizo bllokimin strikt", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Lundrimi drejt faqeve potencialisht të padëshirueshme do të bllokohet dhe do t'ju ofrohet mundësia për të vazhduar.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Faqe e bllokuar", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uMatrix ka penguar ngarkimin e faqes vijuese:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "pa parametra", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Mbrapa", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Mbyll këtë dritare", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Mos më paralajmëro më për këtë faqe.", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Vazhdo", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index 98cac736f3004..fbd534207c1c3 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Увімкнути суворе блокування", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Перехід до потенційно небажаних сайтів буде заблоковано, та вам буде запропоновано можливість продовжити", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,31 +244,31 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Сторінку заблоковано", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite заблокував завантаження наступних сторінок:", "description": "Sentence used in the strict-blocked page" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "без параметрів", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Повернутися", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Закрити це вікно", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Більше не попереджати мене про цей сайт", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Продовжити", "description": "A button to navigate to the blocked page" } } diff --git a/src/_locales/id/messages.json b/src/_locales/id/messages.json index 493b6210bbe57..38616c1449587 100644 --- a/src/_locales/id/messages.json +++ b/src/_locales/id/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Halaman yang terblokir ingin dialihkan ke situs lain. Jika Anda memilih untuk melanjutkan, Anda akan langsung menuju ke: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { From fd2ddd3c01c4033eed0d14dbe11ec543e16a3ee2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 5 Dec 2024 09:12:28 -0500 Subject: [PATCH 504/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/extension/_locales/ar/messages.json | 8 ++++++++ platform/mv3/extension/_locales/az/messages.json | 8 ++++++++ platform/mv3/extension/_locales/be/messages.json | 8 ++++++++ platform/mv3/extension/_locales/bg/messages.json | 8 ++++++++ platform/mv3/extension/_locales/bn/messages.json | 8 ++++++++ platform/mv3/extension/_locales/br_FR/messages.json | 8 ++++++++ platform/mv3/extension/_locales/bs/messages.json | 8 ++++++++ platform/mv3/extension/_locales/ca/messages.json | 8 ++++++++ platform/mv3/extension/_locales/cs/messages.json | 8 ++++++++ platform/mv3/extension/_locales/cv/messages.json | 8 ++++++++ platform/mv3/extension/_locales/cy/messages.json | 8 ++++++++ platform/mv3/extension/_locales/da/messages.json | 8 ++++++++ platform/mv3/extension/_locales/de/messages.json | 8 ++++++++ platform/mv3/extension/_locales/el/messages.json | 8 ++++++++ platform/mv3/extension/_locales/en_GB/messages.json | 8 ++++++++ platform/mv3/extension/_locales/eo/messages.json | 8 ++++++++ platform/mv3/extension/_locales/es/messages.json | 8 ++++++++ platform/mv3/extension/_locales/et/messages.json | 8 ++++++++ platform/mv3/extension/_locales/eu/messages.json | 8 ++++++++ platform/mv3/extension/_locales/fa/messages.json | 8 ++++++++ platform/mv3/extension/_locales/fi/messages.json | 8 ++++++++ platform/mv3/extension/_locales/fil/messages.json | 8 ++++++++ platform/mv3/extension/_locales/fr/messages.json | 8 ++++++++ platform/mv3/extension/_locales/fy/messages.json | 8 ++++++++ platform/mv3/extension/_locales/gl/messages.json | 8 ++++++++ platform/mv3/extension/_locales/gu/messages.json | 8 ++++++++ platform/mv3/extension/_locales/he/messages.json | 8 ++++++++ platform/mv3/extension/_locales/hi/messages.json | 8 ++++++++ platform/mv3/extension/_locales/hr/messages.json | 8 ++++++++ platform/mv3/extension/_locales/hu/messages.json | 8 ++++++++ platform/mv3/extension/_locales/hy/messages.json | 8 ++++++++ platform/mv3/extension/_locales/id/messages.json | 8 ++++++++ platform/mv3/extension/_locales/it/messages.json | 8 ++++++++ platform/mv3/extension/_locales/ja/messages.json | 8 ++++++++ platform/mv3/extension/_locales/ka/messages.json | 8 ++++++++ platform/mv3/extension/_locales/kk/messages.json | 8 ++++++++ platform/mv3/extension/_locales/kn/messages.json | 8 ++++++++ platform/mv3/extension/_locales/ko/messages.json | 8 ++++++++ platform/mv3/extension/_locales/lt/messages.json | 8 ++++++++ platform/mv3/extension/_locales/lv/messages.json | 8 ++++++++ platform/mv3/extension/_locales/mk/messages.json | 8 ++++++++ platform/mv3/extension/_locales/ml/messages.json | 8 ++++++++ platform/mv3/extension/_locales/mr/messages.json | 8 ++++++++ platform/mv3/extension/_locales/ms/messages.json | 8 ++++++++ platform/mv3/extension/_locales/nb/messages.json | 8 ++++++++ platform/mv3/extension/_locales/nl/messages.json | 8 ++++++++ platform/mv3/extension/_locales/oc/messages.json | 8 ++++++++ platform/mv3/extension/_locales/pa/messages.json | 8 ++++++++ platform/mv3/extension/_locales/pl/messages.json | 8 ++++++++ platform/mv3/extension/_locales/pt_BR/messages.json | 8 ++++++++ platform/mv3/extension/_locales/pt_PT/messages.json | 8 ++++++++ platform/mv3/extension/_locales/ro/messages.json | 8 ++++++++ platform/mv3/extension/_locales/ru/messages.json | 8 ++++++++ platform/mv3/extension/_locales/si/messages.json | 8 ++++++++ platform/mv3/extension/_locales/sk/messages.json | 8 ++++++++ platform/mv3/extension/_locales/sl/messages.json | 8 ++++++++ platform/mv3/extension/_locales/so/messages.json | 8 ++++++++ platform/mv3/extension/_locales/sq/messages.json | 8 ++++++++ platform/mv3/extension/_locales/sr/messages.json | 8 ++++++++ platform/mv3/extension/_locales/sv/messages.json | 8 ++++++++ platform/mv3/extension/_locales/sw/messages.json | 8 ++++++++ platform/mv3/extension/_locales/ta/messages.json | 8 ++++++++ platform/mv3/extension/_locales/te/messages.json | 8 ++++++++ platform/mv3/extension/_locales/th/messages.json | 8 ++++++++ platform/mv3/extension/_locales/tr/messages.json | 8 ++++++++ platform/mv3/extension/_locales/uk/messages.json | 8 ++++++++ platform/mv3/extension/_locales/ur/messages.json | 8 ++++++++ platform/mv3/extension/_locales/vi/messages.json | 8 ++++++++ platform/mv3/extension/_locales/zh_CN/messages.json | 8 ++++++++ platform/mv3/extension/_locales/zh_TW/messages.json | 8 ++++++++ 70 files changed, 560 insertions(+) diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index b4281ab21df17..6a2aac1b594a3 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -251,6 +251,14 @@ "message": "لقد منع uBO Lite تحميل الصفحة التالية:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/az/messages.json b/platform/mv3/extension/_locales/az/messages.json index ef0b36678e2d8..8172ac24b5bf2 100644 --- a/platform/mv3/extension/_locales/az/messages.json +++ b/platform/mv3/extension/_locales/az/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/be/messages.json b/platform/mv3/extension/_locales/be/messages.json index 9ca2a032414e0..ebed0a2a7309d 100644 --- a/platform/mv3/extension/_locales/be/messages.json +++ b/platform/mv3/extension/_locales/be/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite папярэдзіў чытанне наступнай старонкі:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "без параметраў", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index 8ebf6cbd586a2..c312968671465 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite попречи на зареждането на следната страница:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "без параметри", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/bn/messages.json b/platform/mv3/extension/_locales/bn/messages.json index a9af81782712f..9087a0ae719d8 100644 --- a/platform/mv3/extension/_locales/bn/messages.json +++ b/platform/mv3/extension/_locales/bn/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index 2b5784900f48f..9fd91dcd3ba6f 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite en deus miret ar bajenn-mañ da gargañ:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "kuit a arventennoù", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/bs/messages.json b/platform/mv3/extension/_locales/bs/messages.json index a913ad1482aa7..20c51af871ca1 100644 --- a/platform/mv3/extension/_locales/bs/messages.json +++ b/platform/mv3/extension/_locales/bs/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/ca/messages.json b/platform/mv3/extension/_locales/ca/messages.json index 96bbd7029e32b..070b24a5b38bf 100644 --- a/platform/mv3/extension/_locales/ca/messages.json +++ b/platform/mv3/extension/_locales/ca/messages.json @@ -251,6 +251,14 @@ "message": "L'uBO Lite ha evitat la càrrega d'aquesta pàgina:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "sense paràmetres", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/cs/messages.json b/platform/mv3/extension/_locales/cs/messages.json index ea9251418cf05..585475287b5a5 100644 --- a/platform/mv3/extension/_locales/cs/messages.json +++ b/platform/mv3/extension/_locales/cs/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/cv/messages.json b/platform/mv3/extension/_locales/cv/messages.json index 1c200f3653e00..515422f202c23 100644 --- a/platform/mv3/extension/_locales/cv/messages.json +++ b/platform/mv3/extension/_locales/cv/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/cy/messages.json b/platform/mv3/extension/_locales/cy/messages.json index 963338c56b06e..e8f7e1cb5ba9a 100644 --- a/platform/mv3/extension/_locales/cy/messages.json +++ b/platform/mv3/extension/_locales/cy/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/da/messages.json b/platform/mv3/extension/_locales/da/messages.json index 63efbe0d83cd9..25b24263ac287 100644 --- a/platform/mv3/extension/_locales/da/messages.json +++ b/platform/mv3/extension/_locales/da/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite har forhindret flg. side i at blive indlæst:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "uden parametre", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index 32c14d1ca49df..dacd1edcf9793 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite hat das Laden der folgenden Seite verhindert:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "ohne Parameter", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index 5b11ba4ceca0d..1bfb831e66ad6 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/en_GB/messages.json b/platform/mv3/extension/_locales/en_GB/messages.json index 1ebff08aef9ce..ff21a6e83edec 100644 --- a/platform/mv3/extension/_locales/en_GB/messages.json +++ b/platform/mv3/extension/_locales/en_GB/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/eo/messages.json b/platform/mv3/extension/_locales/eo/messages.json index 4c75658ccd218..ed989e8b46d37 100644 --- a/platform/mv3/extension/_locales/eo/messages.json +++ b/platform/mv3/extension/_locales/eo/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 6bf520e79b2b9..027bb7094e644 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite impidió la carga de la página:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "sin parámetros", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/et/messages.json b/platform/mv3/extension/_locales/et/messages.json index 3b7ced5a48785..9d498685a3a50 100644 --- a/platform/mv3/extension/_locales/et/messages.json +++ b/platform/mv3/extension/_locales/et/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite ennetas järgmise veebilehe laadimist:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "ilma näitajateta", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/eu/messages.json b/platform/mv3/extension/_locales/eu/messages.json index 4d026da6bc9fe..812e5eada31ca 100644 --- a/platform/mv3/extension/_locales/eu/messages.json +++ b/platform/mv3/extension/_locales/eu/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/fa/messages.json b/platform/mv3/extension/_locales/fa/messages.json index 276405ceb51a7..e9b868325b9e9 100644 --- a/platform/mv3/extension/_locales/fa/messages.json +++ b/platform/mv3/extension/_locales/fa/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/fi/messages.json b/platform/mv3/extension/_locales/fi/messages.json index 963a50c6900ce..761093b972b74 100644 --- a/platform/mv3/extension/_locales/fi/messages.json +++ b/platform/mv3/extension/_locales/fi/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite on estänyt seuraavan sivun latauksen:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "ilman parametreja", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/fil/messages.json b/platform/mv3/extension/_locales/fil/messages.json index 3fb3e29541216..9e5b7cece38a8 100644 --- a/platform/mv3/extension/_locales/fil/messages.json +++ b/platform/mv3/extension/_locales/fil/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/fr/messages.json b/platform/mv3/extension/_locales/fr/messages.json index a08099a95f8aa..4bba2ac8f412c 100644 --- a/platform/mv3/extension/_locales/fr/messages.json +++ b/platform/mv3/extension/_locales/fr/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite a empêché le chargement de cette page :", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "sans paramètres", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/fy/messages.json b/platform/mv3/extension/_locales/fy/messages.json index f570ed2c0ed19..64b72057bbfb3 100644 --- a/platform/mv3/extension/_locales/fy/messages.json +++ b/platform/mv3/extension/_locales/fy/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite hat opkeard dat de folgjende side laden wurd:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "sûnder parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/gl/messages.json b/platform/mv3/extension/_locales/gl/messages.json index 3054c798c8c3b..67f783e282dc1 100644 --- a/platform/mv3/extension/_locales/gl/messages.json +++ b/platform/mv3/extension/_locales/gl/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite evitou que a seguinte páxina se cargase:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "sen parámetros", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/gu/messages.json b/platform/mv3/extension/_locales/gu/messages.json index 1c200f3653e00..515422f202c23 100644 --- a/platform/mv3/extension/_locales/gu/messages.json +++ b/platform/mv3/extension/_locales/gu/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/he/messages.json b/platform/mv3/extension/_locales/he/messages.json index ee12c27ad7591..8a62a294e1745 100644 --- a/platform/mv3/extension/_locales/he/messages.json +++ b/platform/mv3/extension/_locales/he/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/hi/messages.json b/platform/mv3/extension/_locales/hi/messages.json index fa5407f5856c2..7ec113adf70d4 100644 --- a/platform/mv3/extension/_locales/hi/messages.json +++ b/platform/mv3/extension/_locales/hi/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/hr/messages.json b/platform/mv3/extension/_locales/hr/messages.json index b70b02ca1a81f..be7af624f95a7 100644 --- a/platform/mv3/extension/_locales/hr/messages.json +++ b/platform/mv3/extension/_locales/hr/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite je spriječio učitavanje sljedeće stranice:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "bez parametara", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index 6a31151a5d6b4..f6663ad3c65aa 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -251,6 +251,14 @@ "message": "A uBO Lite megakadályozta a következő oldal betöltését:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "paraméterek nélkül", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/hy/messages.json b/platform/mv3/extension/_locales/hy/messages.json index 005a83ca2b4cc..4d8a874100ec3 100644 --- a/platform/mv3/extension/_locales/hy/messages.json +++ b/platform/mv3/extension/_locales/hy/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/id/messages.json b/platform/mv3/extension/_locales/id/messages.json index f37442b5034a3..4afc32fd7a072 100644 --- a/platform/mv3/extension/_locales/id/messages.json +++ b/platform/mv3/extension/_locales/id/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite telah mencegah pemuatan halaman berikut:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "tanpa parameter", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index 2e434a816a359..1e82bba9fc3d4 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/ja/messages.json b/platform/mv3/extension/_locales/ja/messages.json index 6da09a7720eaf..e94d710cfb7a7 100644 --- a/platform/mv3/extension/_locales/ja/messages.json +++ b/platform/mv3/extension/_locales/ja/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite はこのページの読み込みをブロックしています:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "パラメータを除いた URL", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/ka/messages.json b/platform/mv3/extension/_locales/ka/messages.json index 1c874e90178c5..c916896c69457 100644 --- a/platform/mv3/extension/_locales/ka/messages.json +++ b/platform/mv3/extension/_locales/ka/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/kk/messages.json b/platform/mv3/extension/_locales/kk/messages.json index 1c200f3653e00..515422f202c23 100644 --- a/platform/mv3/extension/_locales/kk/messages.json +++ b/platform/mv3/extension/_locales/kk/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/kn/messages.json b/platform/mv3/extension/_locales/kn/messages.json index 8d4b80ab44f7e..4eead835febb8 100644 --- a/platform/mv3/extension/_locales/kn/messages.json +++ b/platform/mv3/extension/_locales/kn/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/ko/messages.json b/platform/mv3/extension/_locales/ko/messages.json index 18475960de041..66de739efbc37 100644 --- a/platform/mv3/extension/_locales/ko/messages.json +++ b/platform/mv3/extension/_locales/ko/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/lt/messages.json b/platform/mv3/extension/_locales/lt/messages.json index 8a7b9cb2112e8..abdd54d2d3c21 100644 --- a/platform/mv3/extension/_locales/lt/messages.json +++ b/platform/mv3/extension/_locales/lt/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/lv/messages.json b/platform/mv3/extension/_locales/lv/messages.json index 70c7ad1754c61..4f388fa909693 100644 --- a/platform/mv3/extension/_locales/lv/messages.json +++ b/platform/mv3/extension/_locales/lv/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite novērsa šīs lapas ielādēšanu:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "bez parametriem", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/mk/messages.json b/platform/mv3/extension/_locales/mk/messages.json index e50658321a032..3a61406f87fec 100644 --- a/platform/mv3/extension/_locales/mk/messages.json +++ b/platform/mv3/extension/_locales/mk/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/ml/messages.json b/platform/mv3/extension/_locales/ml/messages.json index 7db51a3d39f8c..9a5d77e6d00b4 100644 --- a/platform/mv3/extension/_locales/ml/messages.json +++ b/platform/mv3/extension/_locales/ml/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/mr/messages.json b/platform/mv3/extension/_locales/mr/messages.json index 1c200f3653e00..515422f202c23 100644 --- a/platform/mv3/extension/_locales/mr/messages.json +++ b/platform/mv3/extension/_locales/mr/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/ms/messages.json b/platform/mv3/extension/_locales/ms/messages.json index 784f11dec42ba..c90d647d292dc 100644 --- a/platform/mv3/extension/_locales/ms/messages.json +++ b/platform/mv3/extension/_locales/ms/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/nb/messages.json b/platform/mv3/extension/_locales/nb/messages.json index 2e553978e3d35..c65495bd664c5 100644 --- a/platform/mv3/extension/_locales/nb/messages.json +++ b/platform/mv3/extension/_locales/nb/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/nl/messages.json b/platform/mv3/extension/_locales/nl/messages.json index 74e3608a41dfa..d1874b6aed8f0 100644 --- a/platform/mv3/extension/_locales/nl/messages.json +++ b/platform/mv3/extension/_locales/nl/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/oc/messages.json b/platform/mv3/extension/_locales/oc/messages.json index 1c200f3653e00..515422f202c23 100644 --- a/platform/mv3/extension/_locales/oc/messages.json +++ b/platform/mv3/extension/_locales/oc/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/pa/messages.json b/platform/mv3/extension/_locales/pa/messages.json index 6bf60fe983285..dcd08462ffb0f 100644 --- a/platform/mv3/extension/_locales/pa/messages.json +++ b/platform/mv3/extension/_locales/pa/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/pl/messages.json b/platform/mv3/extension/_locales/pl/messages.json index b6e9cca38813a..8a7afcc037e44 100644 --- a/platform/mv3/extension/_locales/pl/messages.json +++ b/platform/mv3/extension/_locales/pl/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite nie pozwolił załadować się następującej stronie:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "bez parametrów", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index b64c7e263769d..77ad6cb270579 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -251,6 +251,14 @@ "message": "O uBO Lite impediu o carregamento da seguinte página:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "sem parâmetros", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index 22d1eaf1e84ea..cc744201ba365 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/ro/messages.json b/platform/mv3/extension/_locales/ro/messages.json index 6d496312d84ea..8c29e9a458135 100644 --- a/platform/mv3/extension/_locales/ro/messages.json +++ b/platform/mv3/extension/_locales/ro/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/ru/messages.json b/platform/mv3/extension/_locales/ru/messages.json index 011a910226275..53c354a7787b1 100644 --- a/platform/mv3/extension/_locales/ru/messages.json +++ b/platform/mv3/extension/_locales/ru/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite предотвратил загрузку следующей страницы:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "без параметров", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/si/messages.json b/platform/mv3/extension/_locales/si/messages.json index f8c573375f6b1..e411dbb45a2ca 100644 --- a/platform/mv3/extension/_locales/si/messages.json +++ b/platform/mv3/extension/_locales/si/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/sk/messages.json b/platform/mv3/extension/_locales/sk/messages.json index 8d7da8002cdfb..79cd5c4e57912 100644 --- a/platform/mv3/extension/_locales/sk/messages.json +++ b/platform/mv3/extension/_locales/sk/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite zabránil načítaniu nasledujúcej stránky:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "bez parametrov", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/sl/messages.json b/platform/mv3/extension/_locales/sl/messages.json index 1c200f3653e00..515422f202c23 100644 --- a/platform/mv3/extension/_locales/sl/messages.json +++ b/platform/mv3/extension/_locales/sl/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/so/messages.json b/platform/mv3/extension/_locales/so/messages.json index 1c200f3653e00..515422f202c23 100644 --- a/platform/mv3/extension/_locales/so/messages.json +++ b/platform/mv3/extension/_locales/so/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index 2d881d1cf0d35..5d3d191728ab2 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -251,6 +251,14 @@ "message": "uMatrix ka penguar ngarkimin e faqes vijuese:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "pa parametra", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/sr/messages.json b/platform/mv3/extension/_locales/sr/messages.json index ca3218b7a650b..329b33f041768 100644 --- a/platform/mv3/extension/_locales/sr/messages.json +++ b/platform/mv3/extension/_locales/sr/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite је спречио учитавање следеће странице:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "без параметара", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/sv/messages.json b/platform/mv3/extension/_locales/sv/messages.json index 164a91ba3f326..d9c8c7762228a 100644 --- a/platform/mv3/extension/_locales/sv/messages.json +++ b/platform/mv3/extension/_locales/sv/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite har förhindrat följande sida från att läsas in:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "utan parametrar", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/sw/messages.json b/platform/mv3/extension/_locales/sw/messages.json index 1c200f3653e00..515422f202c23 100644 --- a/platform/mv3/extension/_locales/sw/messages.json +++ b/platform/mv3/extension/_locales/sw/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/ta/messages.json b/platform/mv3/extension/_locales/ta/messages.json index 1c200f3653e00..515422f202c23 100644 --- a/platform/mv3/extension/_locales/ta/messages.json +++ b/platform/mv3/extension/_locales/ta/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/te/messages.json b/platform/mv3/extension/_locales/te/messages.json index c1933035602e3..5f4823359b226 100644 --- a/platform/mv3/extension/_locales/te/messages.json +++ b/platform/mv3/extension/_locales/te/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/th/messages.json b/platform/mv3/extension/_locales/th/messages.json index 8ae7f62db2588..31a0642920e39 100644 --- a/platform/mv3/extension/_locales/th/messages.json +++ b/platform/mv3/extension/_locales/th/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/tr/messages.json b/platform/mv3/extension/_locales/tr/messages.json index a3a6dacf5f140..8fa869b596ef0 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -251,6 +251,14 @@ "message": "uBo Lite aşağıdaki sayfaların yüklenmesini engelledi:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "değişkensiz", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index fbd534207c1c3..51e42d2efb696 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite заблокував завантаження наступних сторінок:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "без параметрів", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/ur/messages.json b/platform/mv3/extension/_locales/ur/messages.json index 3c4d796af358a..d620ff2b57c9e 100644 --- a/platform/mv3/extension/_locales/ur/messages.json +++ b/platform/mv3/extension/_locales/ur/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/vi/messages.json b/platform/mv3/extension/_locales/vi/messages.json index 2e1c09546aee1..069791bb6ec7e 100644 --- a/platform/mv3/extension/_locales/vi/messages.json +++ b/platform/mv3/extension/_locales/vi/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "without parameters", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/zh_CN/messages.json b/platform/mv3/extension/_locales/zh_CN/messages.json index 9fa3896976ec1..490bc10672f00 100644 --- a/platform/mv3/extension/_locales/zh_CN/messages.json +++ b/platform/mv3/extension/_locales/zh_CN/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite 已阻止了以下页面的加载:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "不含参数", "description": "Label to be used for the parameter-less URL" diff --git a/platform/mv3/extension/_locales/zh_TW/messages.json b/platform/mv3/extension/_locales/zh_TW/messages.json index 5061d297175b6..003ef30a71f68 100644 --- a/platform/mv3/extension/_locales/zh_TW/messages.json +++ b/platform/mv3/extension/_locales/zh_TW/messages.json @@ -251,6 +251,14 @@ "message": "uBO Lite 已防止下列頁面載入:", "description": "Sentence used in the strict-blocked page" }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" + }, "strictblockNoParamsPrompt": { "message": "不帶參數", "description": "Label to be used for the parameter-less URL" From fb82db34f7c9f207f02b5a69694079bb99607276 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 5 Dec 2024 09:20:54 -0500 Subject: [PATCH 505/553] 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 d123412a32903..67cb51badbed6 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.3.3", + "version": "1.61.3.4", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b3/uBlock0_1.61.3b3.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b4/uBlock0_1.61.3b4.firefox.signed.xpi" } ] } From 38390bab9cffe3c2a52de88c130c42d6c2de768e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 5 Dec 2024 12:56:25 -0500 Subject: [PATCH 506/553] [mv3] Add `urlskip` support for strict-blocked page + extra info Add information about which ruleset caused a page to be strict- blocked. Whenever possible, add ability to URL-skip an incoming redirect in a strict-blocked page. Add new default list: "30-day Phishing Domain List" --- .../mv3/extension/_locales/en/messages.json | 8 + platform/mv3/extension/css/settings.css | 2 +- platform/mv3/extension/css/strictblock.css | 12 ++ platform/mv3/extension/js/background.js | 25 +-- platform/mv3/extension/js/config.js | 5 +- platform/mv3/extension/js/ruleset-manager.js | 44 ++++- platform/mv3/extension/js/strictblock.js | 115 ++++++++++--- platform/mv3/make-rulesets.js | 58 ++++++- platform/mv3/strictblock.html | 10 +- src/js/messaging.js | 6 +- src/js/static-dnr-filtering.js | 1 + src/js/static-net-filtering.js | 158 +++--------------- src/js/urlskip.js | 157 +++++++++++++++++ tools/make-mv3.sh | 1 + tools/make-nodejs.sh | 1 + 15 files changed, 418 insertions(+), 185 deletions(-) create mode 100644 src/js/urlskip.js diff --git a/platform/mv3/extension/_locales/en/messages.json b/platform/mv3/extension/_locales/en/messages.json index 17a5b24cd7935..ad9d26911371e 100644 --- a/platform/mv3/extension/_locales/en/messages.json +++ b/platform/mv3/extension/_locales/en/messages.json @@ -250,6 +250,14 @@ "strictblockSentence1": { "message": "uBO Lite has prevented the following page from loading:", "description": "Sentence used in the strict-blocked page" + }, + "strictblockReasonSentence1": { + "message": "The page was blocked because of a matching filter in {{listname}}.", + "description": "Text informing about what is causing the page to be blocked" + }, + "strictblockRedirectSentence1": { + "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { "message": "without parameters", diff --git a/platform/mv3/extension/css/settings.css b/platform/mv3/extension/css/settings.css index a8b07d2a1894c..02eb600370a5d 100644 --- a/platform/mv3/extension/css/settings.css +++ b/platform/mv3/extension/css/settings.css @@ -15,7 +15,7 @@ h3 { label + legend { color: color-mix(in srgb, currentColor 69%, transparent); - font-size: small; + font-size: var(--font-size-smaller); margin-inline-start: var(--default-gap-large); } diff --git a/platform/mv3/extension/css/strictblock.css b/platform/mv3/extension/css/strictblock.css index f7534078cca7b..7f1f0e9c0d162 100644 --- a/platform/mv3/extension/css/strictblock.css +++ b/platform/mv3/extension/css/strictblock.css @@ -26,6 +26,9 @@ body { :root.mobile body { padding: var(--default-gap-small); } +body.loading { + visibility: hidden; + } #rootContainer { width: min(100%, 640px); @@ -43,6 +46,9 @@ p { a { text-decoration: none; } +q { + font-weight: bold; + } .code { font-size: 13px; word-break: break-all; @@ -128,6 +134,12 @@ body[dir="rtl"] #toggleParse { font-weight: bold; } +#urlskip a { + display: block; + overflow-y: auto; + word-break: break-all; + } + #actionContainer { display: flex; justify-content: space-between; diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index a58dd70639a48..e250d1025ed96 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -50,6 +50,7 @@ import { excludeFromStrictBlock, getEnabledRulesetsDetails, getRulesetDetails, + patchDefaultRulesets, setStrictBlockMode, updateDynamicRules, } from './ruleset-manager.js'; @@ -377,20 +378,24 @@ function onMessage(request, sender, callback) { async function start() { await loadRulesetConfig(); + const currentVersion = getCurrentVersion(); + const isNewVersion = currentVersion !== rulesetConfig.version; + + // The default rulesets may have changed, find out new ruleset to enable, + // obsolete ruleset to remove. + if ( isNewVersion ) { + ubolLog(`Version change: ${rulesetConfig.version} => ${currentVersion}`); + rulesetConfig.version = currentVersion; + await patchDefaultRulesets(); + saveRulesetConfig(); + } + const rulesetsUpdated = process.wakeupRun === false && await enableRulesets(rulesetConfig.enabledRulesets); // We need to update the regex rules only when ruleset version changes. - if ( process.wakeupRun === false ) { - const currentVersion = getCurrentVersion(); - if ( currentVersion !== rulesetConfig.version ) { - ubolLog(`Version change: ${rulesetConfig.version} => ${currentVersion}`); - rulesetConfig.version = currentVersion; - saveRulesetConfig(); - if ( rulesetsUpdated === false ) { - updateDynamicRules(); - } - } + if ( isNewVersion && rulesetsUpdated === false ) { + updateDynamicRules(); } // Permissions may have been removed while the extension was disabled diff --git a/platform/mv3/extension/js/config.js b/platform/mv3/extension/js/config.js index e3859e63fa42f..0c79dd62b18f0 100644 --- a/platform/mv3/extension/js/config.js +++ b/platform/mv3/extension/js/config.js @@ -24,13 +24,11 @@ import { sessionRead, sessionWrite, } from './ext.js'; -import { defaultRulesetsFromLanguage } from './ruleset-manager.js'; - /******************************************************************************/ export const rulesetConfig = { version: '', - enabledRulesets: [ 'default' ], + enabledRulesets: [], autoReload: true, showBlockedCount: true, strictBlockMode: true, @@ -67,7 +65,6 @@ export async function loadRulesetConfig() { sessionWrite('rulesetConfig', rulesetConfig); return; } - rulesetConfig.enabledRulesets = await defaultRulesetsFromLanguage(); sessionWrite('rulesetConfig', rulesetConfig); localWrite('rulesetConfig', rulesetConfig); process.firstRun = true; diff --git a/platform/mv3/extension/js/ruleset-manager.js b/platform/mv3/extension/js/ruleset-manager.js index c9490e6836592..04bfb3b6f241d 100644 --- a/platform/mv3/extension/js/ruleset-manager.js +++ b/platform/mv3/extension/js/ruleset-manager.js @@ -561,8 +561,6 @@ async function filteringModesToDNR(modes) { /******************************************************************************/ async function defaultRulesetsFromLanguage() { - const out = await dnr.getEnabledRulesets(); - const dropCountry = lang => { const pos = lang.indexOf('-'); if ( pos === -1 ) { return lang; } @@ -581,7 +579,12 @@ async function defaultRulesetsFromLanguage() { ); const rulesetDetails = await getRulesetDetails(); + const out = []; for ( const [ id, details ] of rulesetDetails ) { + if ( details.enabled ) { + out.push(id); + continue; + } if ( typeof details.lang !== 'string' ) { continue; } if ( reTargetLang.test(details.lang) === false ) { continue; } out.push(id); @@ -591,6 +594,42 @@ async function defaultRulesetsFromLanguage() { /******************************************************************************/ +async function patchDefaultRulesets() { + const [ + oldDefaultIds = [], + newDefaultIds, + newIds, + ] = await Promise.all([ + localRead('defaultRulesetIds'), + defaultRulesetsFromLanguage(), + getRulesetDetails(), + ]); + const toAdd = []; + const toRemove = []; + for ( const id of newDefaultIds ) { + if ( oldDefaultIds.includes(id) ) { continue; } + toAdd.push(id); + } + for ( const id of oldDefaultIds ) { + if ( newDefaultIds.includes(id) ) { continue; } + toRemove.push(id); + } + for ( const id of rulesetConfig.enabledRulesets ) { + if ( newIds.has(id) ) { continue; } + toRemove.push(id); + } + localWrite('defaultRulesetIds', newDefaultIds); + if ( toAdd.length === 0 && toRemove.length === 0 ) { return; } + const enabledRulesets = new Set(rulesetConfig.enabledRulesets); + toAdd.forEach(id => enabledRulesets.add(id)); + toRemove.forEach(id => enabledRulesets.delete(id)); + const patchedRulesets = Array.from(enabledRulesets); + ubolLog(`Patched rulesets: ${rulesetConfig.enabledRulesets} => ${patchedRulesets}`); + rulesetConfig.enabledRulesets = patchedRulesets; +} + +/******************************************************************************/ + async function enableRulesets(ids) { const afterIds = new Set(ids); const [ beforeIds, adminIds, rulesetDetails ] = await Promise.all([ @@ -679,6 +718,7 @@ export { filteringModesToDNR, getRulesetDetails, getEnabledRulesetsDetails, + patchDefaultRulesets, setStrictBlockMode, updateDynamicRules, }; diff --git a/platform/mv3/extension/js/strictblock.js b/platform/mv3/extension/js/strictblock.js index 616ef6ddbc32d..7600bcfbb9e7f 100644 --- a/platform/mv3/extension/js/strictblock.js +++ b/platform/mv3/extension/js/strictblock.js @@ -20,21 +20,15 @@ */ import { dom, qs$ } from './dom.js'; +import { fetchJSON } from './fetch.js'; +import { getEnabledRulesetsDetails } from './ruleset-manager.js'; import { i18n$ } from './i18n.js'; import { sendMessage } from './ext.js'; +import { urlSkip } from './urlskip.js'; /******************************************************************************/ -const toURL = new URL('about:blank'); - -function setURL(url) { - try { - toURL.href = url; - } catch(_) { - } -} - -setURL(self.location.hash.slice(1)); +const rulesetDetailsPromise = getEnabledRulesetsDetails(); /******************************************************************************/ @@ -66,6 +60,13 @@ async function proceed() { /******************************************************************************/ +const toURL = new URL('about:blank'); + +try { + toURL.href = self.location.hash.slice(1); +} catch(_) { +} + dom.clear('#theURL > p > span:first-of-type'); qs$('#theURL > p > span:first-of-type').append(urlToFragment(toURL.href)); @@ -152,16 +153,92 @@ qs$('#theURL > p > span:first-of-type').append(urlToFragment(toURL.href)); /******************************************************************************/ +// Find which list caused the blocking. +(async ( ) => { + const rulesetDetails = await rulesetDetailsPromise; + let iList = -1; + const searchInList = async i => { + if ( iList !== -1 ) { return; } + const hostnames = new Set( + await fetchJSON(`/rulesets/strictblock/${rulesetDetails[i].id}`) + ); + if ( iList !== -1 ) { return; } + let hn = toURL.hostname; + for (;;) { + if ( hostnames.has(hn) ) { iList = i; break; } + const pos = hn.indexOf('.'); + if ( pos === -1 ) { break; } + hn = hn.slice(pos+1); + } + }; + const toFetch = []; + for ( let i = 0; i < rulesetDetails.length; i++ ) { + if ( rulesetDetails[i].rules.strictblock === 0 ) { continue; } + toFetch.push(searchInList(i)); + } + if ( toFetch.length === 0 ) { return; } + await Promise.all(toFetch); + if ( iList === -1 ) { return; } + + const fragment = new DocumentFragment(); + const text = i18n$('strictblockReasonSentence1'); + const placeholder = '{{listname}}'; + const pos = text.indexOf(placeholder); + if ( pos === -1 ) { return; } + const q = document.createElement('q'); + q.append(rulesetDetails[iList].name); + fragment.append(text.slice(0, pos), q, text.slice(pos + placeholder.length)); + qs$('#reason').append(fragment); + dom.attr('#reason', 'hidden', null); +})(); + +/******************************************************************************/ + +// Offer to skip redirection whenever possible +(async ( ) => { + const rulesetDetails = await rulesetDetailsPromise; + const toFetch = []; + for ( const details of rulesetDetails ) { + if ( details.rules.urlskip === 0 ) { continue; } + toFetch.push(fetchJSON(`/rulesets/urlskip/${details.id}`)); + } + if ( toFetch.length === 0 ) { return; } + const urlskipLists = await Promise.all(toFetch); + for ( const urlskips of urlskipLists ) { + for ( const urlskip of urlskips ) { + const re = new RegExp(urlskip.re, urlskip.c ? undefined : 'i'); + if ( re.test(toURL.href) === false ) { continue; } + const finalURL = urlSkip(toURL.href, false, urlskip.steps); + if ( finalURL === undefined ) { continue; } + const fragment = new DocumentFragment(); + const text = i18n$('strictblockRedirectSentence1'); + const linkPlaceholder = '{{url}}'; + const pos = text.indexOf(linkPlaceholder); + if ( pos === -1 ) { return; } + const link = document.createElement('a'); + link.href = finalURL; + dom.cl.add(link, 'code'); + link.append(urlToFragment(finalURL)); + fragment.append( + text.slice(0, pos), + link, + text.slice(pos + linkPlaceholder.length) + ); + qs$('#urlskip').append(fragment); + dom.attr('#urlskip', 'hidden', null); + return; + } + } +})(); + +/******************************************************************************/ + // https://www.reddit.com/r/uBlockOrigin/comments/breeux/ if ( window.history.length > 1 ) { - dom.on('#back', 'click', ( ) => { - window.history.back(); - }); + dom.on('#back', 'click', ( ) => { window.history.back(); }); qs$('#bye').style.display = 'none'; } else { - dom.on('#bye', 'click', ( ) => { - window.close(); - }); + dom.on('#bye', 'click', ( ) => { window.close(); }); qs$('#back').style.display = 'none'; } @@ -171,8 +248,8 @@ dom.on('#disableWarning', 'change', ev => { dom.cl.toggle('[data-i18n="strictblockClose"]', 'disabled', checked); }); -dom.on('#proceed', 'click', ( ) => { - proceed(); -}); +dom.on('#proceed', 'click', ( ) => { proceed(); }); + +dom.cl.remove(dom.body, 'loading'); /******************************************************************************/ diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index b570067055473..4ea7ae6dba1d0 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -225,7 +225,7 @@ const isRegex = rule => rule.condition.regexFilter !== undefined; const isRedirect = rule => { - if ( rule.action === undefined ) { return false; } + if ( isUnsupported(rule) ) { return false; } if ( rule.action.type !== 'redirect' ) { return false; } if ( rule.action.redirect?.extensionPath !== undefined ) { return true; } if ( rule.action.redirect?.transform?.path !== undefined ) { return true; } @@ -233,19 +233,26 @@ const isRedirect = rule => { }; const isModifyHeaders = rule => - rule.action !== undefined && + isUnsupported(rule) === false && rule.action.type === 'modifyHeaders'; const isRemoveparam = rule => - rule.action !== undefined && + isUnsupported(rule) === false && rule.action.type === 'redirect' && rule.action.redirect.transform !== undefined; -const isGood = rule => +const isSafe = rule => + isUnsupported(rule) === false && + rule.action !== undefined && ( + rule.action.type === 'block' || + rule.action.type === 'allow' || + rule.action.type === 'allowAllRequests' + ); + +const isURLSkip = rule => isUnsupported(rule) === false && - isRedirect(rule) === false && - isModifyHeaders(rule) === false && - isRemoveparam(rule) === false; + rule.action !== undefined && + rule.action.type === 'urlskip'; /******************************************************************************/ @@ -357,7 +364,7 @@ async function processNetworkFilters(assetDetails, network) { } } - const plainGood = rules.filter(rule => isGood(rule) && isRegex(rule) === false); + const plainGood = rules.filter(rule => isSafe(rule) && isRegex(rule) === false); log(`\tPlain good: ${plainGood.length}`); log(plainGood .filter(rule => Array.isArray(rule._warning)) @@ -365,7 +372,7 @@ async function processNetworkFilters(assetDetails, network) { .join('\n'), true ); - const regexes = rules.filter(rule => isGood(rule) && isRegex(rule)); + const regexes = rules.filter(rule => isSafe(rule) && isRegex(rule)); log(`\tMaybe good (regexes): ${regexes.length}`); const redirects = rules.filter(rule => @@ -394,6 +401,22 @@ async function processNetworkFilters(assetDetails, network) { ); log(`\tmodifyHeaders=: ${modifyHeaders.length}`); + const urlskips = rules.filter(rule => isURLSkip(rule)).filter(rule => + rule.__modifierAction === 0 && + rule.condition && + rule.condition.regexFilter && + rule.condition.resourceTypes && + rule.condition.resourceTypes.includes('main_frame') + ).map(rule => { + const steps = rule.__modifierValue; + return { + re: rule.condition.regexFilter, + c: rule.condition.isUrlFilterCaseSensitive, + steps: steps.includes(' ') && steps.split(/ +/) || [ steps ], + }; + }); + log(`\turlskip=: ${urlskips.length}`); + const bad = rules.filter(rule => isUnsupported(rule) ); @@ -460,6 +483,13 @@ async function processNetworkFilters(assetDetails, network) { ); } + if ( urlskips.length !== 0 ) { + writeFile( + `${rulesetDir}/urlskip/${assetDetails.id}.json`, + JSON.stringify(urlskips, null, 1) + ); + } + return { total: rules.length, plain: plainGood.length, @@ -470,6 +500,7 @@ async function processNetworkFilters(assetDetails, network) { redirect: redirects.length, modifyHeaders: modifyHeaders.length, strictblock: strictBlocked.size, + urlskip: urlskips.length, }; } @@ -1114,6 +1145,7 @@ async function rulesetFromURLs(assetDetails) { redirect: netStats.redirect, modifyHeaders: netStats.modifyHeaders, strictblock: netStats.strictblock, + urlskip: netStats.urlskip, discarded: netStats.discarded, rejected: netStats.rejected, }, @@ -1264,6 +1296,14 @@ async function main() { }); // Handpicked rulesets from abroad + await rulesetFromURLs({ + id: 'nrd.30day.phishing', + name: '30-day Phishing Domain List', + enabled: true, + urls: [ 'https://raw.githubusercontent.com/xRuffKez/NRD/refs/heads/main/lists/30-day_phishing/domains-only/nrd-phishing-30day.txt' ], + homeURL: 'https://github.com/xRuffKez/NRD?tab=readme-ov-file', + }); + await rulesetFromURLs({ id: 'stevenblack-hosts', name: 'Steven Black’s Unified Hosts (adware + malware)', diff --git a/platform/mv3/strictblock.html b/platform/mv3/strictblock.html index 9572eab09715b..8b6ef2d9be94b 100644 --- a/platform/mv3/strictblock.html +++ b/platform/mv3/strictblock.html @@ -10,20 +10,26 @@ - +
-

_

+

+ + + +
diff --git a/src/js/messaging.js b/src/js/messaging.js index 16d527c60b48e..b24a9a5a27560 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -1887,7 +1887,11 @@ const onMessage = function(request, sender, callback) { listPromises.push( io.get(assetKey, { dontCache: true }).then(details => { listNames.push(assetKey); - return { name: assetKey, text: details.content }; + return { + name: assetKey, + text: details.content, + trustedSource: assetKey.startsWith('ublock-'), + }; }) ); } diff --git a/src/js/static-dnr-filtering.js b/src/js/static-dnr-filtering.js index d3e7732a6771f..63639006585c2 100644 --- a/src/js/static-dnr-filtering.js +++ b/src/js/static-dnr-filtering.js @@ -284,6 +284,7 @@ function addToDNR(context, list) { toDNR: true, nativeCssHas: env.includes('native_css_has'), badTypes: [ sfp.NODE_TYPE_NET_OPTION_NAME_REDIRECTRULE ], + trustedSource: list.trustedSource || undefined, }); const compiler = staticNetFilteringEngine.createCompiler(); diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index f4769c2c21702..f084180ffccf3 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -28,6 +28,7 @@ import BidiTrieContainer from './biditrie.js'; import { CompiledListReader } from './static-filtering-io.js'; import { FilteringContext } from './filtering-context.js'; import HNTrieContainer from './hntrie.js'; +import { urlSkip } from './urlskip.js'; /******************************************************************************/ @@ -4679,6 +4680,25 @@ StaticNetFilteringEngine.prototype.dnrFromCompiled = function(op, context, ...ar dnrAddRuleError(rule, `Incompatible with DNR: uritransform=${rule.__modifierValue}`); break; } + case 'urlskip': { + let urlFilter = rule.condition?.urlFilter; + if ( urlFilter === undefined ) { break; } + let anchor = 0b000; + if ( urlFilter.startsWith('||') ) { + anchor |= 0b100; + urlFilter = urlFilter.slice(2); + } else if ( urlFilter.startsWith('|') ) { + anchor |= 0b10; + urlFilter = urlFilter.slice(1); + } + if ( urlFilter.endsWith('|') ) { + anchor |= 0b001; + urlFilter = urlFilter.slice(0, -1); + } + rule.condition.urlFilter = undefined; + rule.condition.regexFilter = restrFromGenericPattern(urlFilter, anchor); + break; + } default: dnrAddRuleError(rule, `Unsupported modifier ${rule.__modifierType}`); break; @@ -5391,57 +5411,6 @@ StaticNetFilteringEngine.prototype.transformRequest = function(fctxt, out = []) return out; }; -/** - * @trustedOption urlskip - * - * @description - * Extract a URL from another URL according to one or more transformation steps, - * thereby skipping over intermediate network request(s) to remote servers. - * Requires a trusted source. - * - * @param steps - * A serie of space-separated directives representing the transformation steps - * to perform to extract the final URL to which a network request should be - * redirected. - * - * Supported directives: - * - * `?name`: extract the value of parameter `name` as the current string. - * - * `&i`: extract the name of the parameter at position `i` as the current - * string. The position is 1-based. - * - * `/.../`: extract the first capture group of a regex as the current string. - * - * `+https`: prepend the current string with `https://`. - * - * `-base64`: decode the current string as a base64-encoded string. - * - * `-safebase64`: decode the current string as a safe base64-encoded string. - * - * `-uricomponent`: decode the current string as a URI encoded string. - * - * `-blocked`: allow the redirection of blocked requests. By default, blocked - * requests can't by urlskip'ed. - * - * At any given step, the currently extracted string may not necessarily be - * a valid URL, and more transformation steps may be needed to obtain a valid - * URL once all the steps are applied. - * - * An unsupported step or a failed step will abort the transformation and no - * redirection will be performed. - * - * The final step is expected to yield a valid URL. If the result is not a - * valid URL, no redirection will be performed. - * - * @example - * ||example.com/path/to/tracker$urlskip=?url - * ||example.com/path/to/tracker$urlskip=?url ?to - * ||pixiv.net/jump.php?$urlskip=&1 - * ||podtrac.com/pts/redirect.mp3/$urlskip=/\/redirect\.mp3\/(.*?\.mp3\b)/ +https - * - * */ - StaticNetFilteringEngine.prototype.urlSkip = function( fctxt, blocked, @@ -5458,7 +5427,7 @@ StaticNetFilteringEngine.prototype.urlSkip = function( const urlin = fctxt.url; const value = directive.value; const steps = value.includes(' ') && value.split(/ +/) || [ value ]; - const urlout = urlSkip(directive, urlin, blocked, steps); + const urlout = urlSkip(urlin, blocked, steps, directive); if ( urlout === undefined ) { continue; } if ( urlout === urlin ) { continue; } fctxt.redirectURL = urlout; @@ -5469,91 +5438,6 @@ StaticNetFilteringEngine.prototype.urlSkip = function( return out; }; -function urlSkip(directive, url, blocked, steps) { - try { - let redirectBlocked = false; - let urlout = url; - for ( const step of steps ) { - const urlin = urlout; - const c0 = step.charCodeAt(0); - // Extract from URL parameter name at position i - if ( c0 === 0x26 ) { // & - const i = (parseInt(step.slice(1)) || 0) - 1; - if ( i < 0 ) { return; } - const url = new URL(urlin); - if ( i >= url.searchParams.size ) { return; } - const params = Array.from(url.searchParams.keys()); - urlout = decodeURIComponent(params[i]); - continue; - } - // Enforce https - if ( c0 === 0x2B && step === '+https' ) { - const s = urlin.replace(/^https?:\/\//, ''); - if ( /^[\w-]:\/\//.test(s) ) { return; } - urlout = `https://${s}`; - continue; - } - // Decode - if ( c0 === 0x2D ) { - // Base64 - if ( step === '-base64' ) { - urlout = self.atob(urlin); - continue; - } - // Safe Base64 - if ( step === '-safebase64' ) { - urlout = urlin.replace(/[-_]/g, safeBase64Replacer); - urlout = self.atob(urlout); - continue; - } - // URI component - if ( step === '-uricomponent' ) { - urlout = self.decodeURIComponent(urlin); - continue; - } - // Enable skip of blocked requests - if ( step === '-blocked' ) { - redirectBlocked = true; - continue; - } - } - // Regex extraction from first capture group - if ( c0 === 0x2F ) { // / - if ( directive.cache === null ) { - directive.cache = new RegExp(step.slice(1, -1)); - } - const match = directive.cache.exec(urlin); - if ( match === null ) { return; } - if ( match.length <= 1 ) { return; } - urlout = match[1]; - continue; - } - // Extract from URL parameter - if ( c0 === 0x3F ) { // ? - urlout = (new URL(urlin)).searchParams.get(step.slice(1)); - if ( urlout === null ) { return; } - if ( urlout.includes(' ') ) { - urlout = urlout.replace(/ /g, '%20'); - } - continue; - } - // Unknown directive - return; - } - const urlfinal = new URL(urlout); - if ( urlfinal.protocol !== 'https:' ) { - if ( urlfinal.protocol !== 'http:' ) { return; } - urlout = urlout.replace('http', 'https'); - } - if ( blocked && redirectBlocked !== true ) { return; } - return urlout; - } catch(x) { - } -} - -const safeBase64Map = { '-': '+', '_': '/' }; -const safeBase64Replacer = s => safeBase64Map[s]; - /******************************************************************************/ // https://github.com/uBlockOrigin/uBlock-issues/issues/1626 diff --git a/src/js/urlskip.js b/src/js/urlskip.js new file mode 100644 index 0000000000000..e4182bbc4be24 --- /dev/null +++ b/src/js/urlskip.js @@ -0,0 +1,157 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2022-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 +*/ + +const safeBase64Map = { '-': '+', '_': '/' }; +const safeBase64Replacer = s => safeBase64Map[s]; + +/** + * @trustedOption urlskip + * + * @description + * Extract a URL from another URL according to one or more transformation steps, + * thereby skipping over intermediate network request(s) to remote servers. + * Requires a trusted source. + * + * @param steps + * A serie of space-separated directives representing the transformation steps + * to perform to extract the final URL to which a network request should be + * redirected. + * + * Supported directives: + * + * `?name`: extract the value of parameter `name` as the current string. + * + * `&i`: extract the name of the parameter at position `i` as the current + * string. The position is 1-based. + * + * `/.../`: extract the first capture group of a regex as the current string. + * + * `+https`: prepend the current string with `https://`. + * + * `-base64`: decode the current string as a base64-encoded string. + * + * `-safebase64`: decode the current string as a safe base64-encoded string. + * + * `-uricomponent`: decode the current string as a URI encoded string. + * + * `-blocked`: allow the redirection of blocked requests. By default, blocked + * requests can't by urlskip'ed. + * + * At any given step, the currently extracted string may not necessarily be + * a valid URL, and more transformation steps may be needed to obtain a valid + * URL once all the steps are applied. + * + * An unsupported step or a failed step will abort the transformation and no + * redirection will be performed. + * + * The final step is expected to yield a valid URL. If the result is not a + * valid URL, no redirection will be performed. + * + * @example + * ||example.com/path/to/tracker$urlskip=?url + * ||example.com/path/to/tracker$urlskip=?url ?to + * ||pixiv.net/jump.php?$urlskip=&1 + * ||podtrac.com/pts/redirect.mp3/$urlskip=/\/redirect\.mp3\/(.*?\.mp3\b)/ +https + * + * */ + +export function urlSkip(url, blocked, steps, directive = {}) { + try { + let redirectBlocked = false; + let urlout = url; + for ( const step of steps ) { + const urlin = urlout; + const c0 = step.charCodeAt(0); + // Extract from URL parameter name at position i + if ( c0 === 0x26 ) { // & + const i = (parseInt(step.slice(1)) || 0) - 1; + if ( i < 0 ) { return; } + const url = new URL(urlin); + if ( i >= url.searchParams.size ) { return; } + const params = Array.from(url.searchParams.keys()); + urlout = decodeURIComponent(params[i]); + continue; + } + // Enforce https + if ( c0 === 0x2B && step === '+https' ) { + const s = urlin.replace(/^https?:\/\//, ''); + if ( /^[\w-]:\/\//.test(s) ) { return; } + urlout = `https://${s}`; + continue; + } + // Decode + if ( c0 === 0x2D ) { + // Base64 + if ( step === '-base64' ) { + urlout = self.atob(urlin); + continue; + } + // Safe Base64 + if ( step === '-safebase64' ) { + urlout = urlin.replace(/[-_]/g, safeBase64Replacer); + urlout = self.atob(urlout); + continue; + } + // URI component + if ( step === '-uricomponent' ) { + urlout = self.decodeURIComponent(urlin); + continue; + } + // Enable skip of blocked requests + if ( step === '-blocked' ) { + redirectBlocked = true; + continue; + } + } + // Regex extraction from first capture group + if ( c0 === 0x2F ) { // / + const re = directive.cache ?? new RegExp(step.slice(1, -1)); + if ( directive.cache === null ) { + directive.cache = re; + } + const match = re.exec(urlin); + if ( match === null ) { return; } + if ( match.length <= 1 ) { return; } + urlout = match[1]; + continue; + } + // Extract from URL parameter + if ( c0 === 0x3F ) { // ? + urlout = (new URL(urlin)).searchParams.get(step.slice(1)); + if ( urlout === null ) { return; } + if ( urlout.includes(' ') ) { + urlout = urlout.replace(/ /g, '%20'); + } + continue; + } + // Unknown directive + return; + } + const urlfinal = new URL(urlout); + if ( urlfinal.protocol !== 'https:' ) { + if ( urlfinal.protocol !== 'http:' ) { return; } + urlout = urlout.replace('http', 'https'); + } + if ( blocked && redirectBlocked !== true ) { return; } + return urlout; + } catch(x) { + } +} diff --git a/tools/make-mv3.sh b/tools/make-mv3.sh index 287a7b08b26bd..5c812ec214dd5 100755 --- a/tools/make-mv3.sh +++ b/tools/make-mv3.sh @@ -76,6 +76,7 @@ cp "$UBO_DIR"/src/css/fa-icons.css "$DES"/css/ cp "$UBO_DIR"/src/js/dom.js "$DES"/js/ cp "$UBO_DIR"/src/js/fa-icons.js "$DES"/js/ cp "$UBO_DIR"/src/js/i18n.js "$DES"/js/ +cp "$UBO_DIR"/src/js/urlskip.js "$DES"/js/ cp "$UBO_DIR"/src/lib/punycode.js "$DES"/js/ cp -R "$UBO_DIR/src/img/flags-of-the-world" "$DES"/img diff --git a/tools/make-nodejs.sh b/tools/make-nodejs.sh index 87e96ddade909..ed8db6cbbf77a 100755 --- a/tools/make-nodejs.sh +++ b/tools/make-nodejs.sh @@ -22,6 +22,7 @@ cp src/js/static-net-filtering.js $DES/js cp src/js/static-filtering-io.js $DES/js cp src/js/tasks.js $DES/js cp src/js/text-utils.js $DES/js +cp src/js/urlskip.js $DES/js cp src/js/uri-utils.js $DES/js cp src/js/url-net-filtering.js $DES/js From b3a51d00180eb352a6424574f46b81fe362fa1b2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 5 Dec 2024 13:09:07 -0500 Subject: [PATCH 507/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/bg/messages.json | 4 ++-- .../extension/_locales/br_FR/messages.json | 4 ++-- .../mv3/extension/_locales/de/messages.json | 4 ++-- .../mv3/extension/_locales/es/messages.json | 4 ++-- .../mv3/extension/_locales/he/messages.json | 22 +++++++++---------- .../mv3/extension/_locales/hi/messages.json | 4 ++-- .../mv3/extension/_locales/hr/messages.json | 4 ++-- .../mv3/extension/_locales/it/messages.json | 4 ++-- .../mv3/extension/_locales/pl/messages.json | 4 ++-- .../extension/_locales/pt_BR/messages.json | 4 ++-- .../mv3/extension/_locales/sk/messages.json | 4 ++-- .../mv3/extension/_locales/sq/messages.json | 4 ++-- .../mv3/extension/_locales/sv/messages.json | 4 ++-- .../mv3/extension/_locales/tr/messages.json | 4 ++-- .../mv3/extension/_locales/uk/messages.json | 4 ++-- 15 files changed, 39 insertions(+), 39 deletions(-) diff --git a/platform/mv3/extension/_locales/bg/messages.json b/platform/mv3/extension/_locales/bg/messages.json index c312968671465..cf834661f3eb5 100644 --- a/platform/mv3/extension/_locales/bg/messages.json +++ b/platform/mv3/extension/_locales/bg/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Страницата е блокирана поради съвпадащ филтър в {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Блокираната страница иска да ви пренасочи към друг сайт. Ако изберете да продължите, ще преминете директно към: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index 9fd91dcd3ba6f..31ae55bb1298b 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Stanket eo bet ar bajenn abalamour d'ur sil dereat e-barzh {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Ar bajenn stanket a fell dezhi adkas d'ul lec'hienn all. M'ho peus c'hoant da genderc'hel e vioc'h kaset d'ar chomlec'h-mañ: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index dacd1edcf9793..af32e26d2f365 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Die Seite wurde aufgrund eines übereinstimmenden Filters in {{listname}} blockiert.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Die blockierte Seite möchte zu einer anderen Website weiterleiten. Beim Fortfahren wird folgende Seite aufgerufen: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 027bb7094e644..32fe1fc070f3c 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "La página fue bloqueada debido a un filtro coincidente en {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "La página bloqueada quiere redirigir a otro sitio. Si eliges proceder, navegarás directamente a: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/he/messages.json b/platform/mv3/extension/_locales/he/messages.json index 8a62a294e1745..2bbc73d76ef81 100644 --- a/platform/mv3/extension/_locales/he/messages.json +++ b/platform/mv3/extension/_locales/he/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "הפעלת חסימה קפדנית", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "ניווט אפשרי לאתרים לא רצויים יחסם ותהיה אפשרות להחליט להמשיך.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,39 +244,39 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "הדף נחסם", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite מנע טעינה של הדפים הבאים:", "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "הדף נחסם בגלל התאמה למסנן מהרשימה {{listname}}", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "הדף החסום רוצה להעביר אותך לאתר אחר. בחירה להמשיך תעבור ישירות ל {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "ללא פרמטרים", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "חזור", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "סגור חלון זה", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "אל תתריע לי שוב על אתר זה", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "המשך", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/hi/messages.json b/platform/mv3/extension/_locales/hi/messages.json index 7ec113adf70d4..66334c281411a 100644 --- a/platform/mv3/extension/_locales/hi/messages.json +++ b/platform/mv3/extension/_locales/hi/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "पृष्ठ को {{listname}} में मेल खाते फ़िल्टर के कारण अवरुद्ध किया गया था.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "ब्लॉक किया गया पेज किसी दूसरी साइट पर रीडायरेक्ट करना चाहता है. अगर आप आगे बढ़ना चुनते हैं, तो आप सीधे इस पर नेविगेट करें: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/hr/messages.json b/platform/mv3/extension/_locales/hr/messages.json index be7af624f95a7..116371621df8f 100644 --- a/platform/mv3/extension/_locales/hr/messages.json +++ b/platform/mv3/extension/_locales/hr/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Stranica je blokirana zbog odgovarajućeg filtra u {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Blokirana stranica želi preusmjeriti na drugu stranicu. Ako odlučite nastaviti, otići ćete izravno na: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index 1e82bba9fc3d4..3a7da35ac8aa9 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "La pagina è stata bloccata a causa di un filtro corrispondente in {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "La pagina bloccata vuole reindirizzare a un altro sito. Se scegli di procedere, navigherai direttamente su: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/pl/messages.json b/platform/mv3/extension/_locales/pl/messages.json index 8a7afcc037e44..ededd11838d77 100644 --- a/platform/mv3/extension/_locales/pl/messages.json +++ b/platform/mv3/extension/_locales/pl/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Strona została zablokowana z powodu pasującego filtra na liście {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Zablokowana strona chce przekierować na inną witrynę. Jeśli zdecydujesz się kontynuować, przejdziesz bezpośrednio do: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/pt_BR/messages.json b/platform/mv3/extension/_locales/pt_BR/messages.json index 77ad6cb270579..b92f5b59579eb 100644 --- a/platform/mv3/extension/_locales/pt_BR/messages.json +++ b/platform/mv3/extension/_locales/pt_BR/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "A página foi bloqueada por causa de um filtro que combina no {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "A página bloqueada quer redirecionar para outro site. Se você escolher prosseguir, você navegará diretamente para: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/sk/messages.json b/platform/mv3/extension/_locales/sk/messages.json index 79cd5c4e57912..e33e990e4185b 100644 --- a/platform/mv3/extension/_locales/sk/messages.json +++ b/platform/mv3/extension/_locales/sk/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Stránka bola zablokovaná z dôvodu zhodného filtra v{{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Zablokovaná stránka chce presmerovať na inú stránku. Ak sa rozhodnete pokračovať, prejdete priamo na: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index 5d3d191728ab2..42a8679f0a2bd 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Faqja u bllokua për shkak të një filtri që përputhet në: {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Faqja e bllokuar do t'ju drejtojë në një uebsajt tjetër. Në rast se pranoni do të shkoni te: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/sv/messages.json b/platform/mv3/extension/_locales/sv/messages.json index d9c8c7762228a..e164490906acc 100644 --- a/platform/mv3/extension/_locales/sv/messages.json +++ b/platform/mv3/extension/_locales/sv/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Sidan har blockerats på grund av ett matchande filter i {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Den blockerade sidan vill omdirigera till en annan webbplats. Om du väljer att fortsätta skickas du direkt till: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/tr/messages.json b/platform/mv3/extension/_locales/tr/messages.json index 8fa869b596ef0..0fb973629fedc 100644 --- a/platform/mv3/extension/_locales/tr/messages.json +++ b/platform/mv3/extension/_locales/tr/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Bu sayfa {{listname}} içindeki bir süzgece takıldığı için engellenmiştir.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Engellenen sayfa sizi başka bir siteye yönlendirmek istiyor. Devam etmek isterseniz doğrudan şuraya yönlendirileceksiniz: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/uk/messages.json b/platform/mv3/extension/_locales/uk/messages.json index 51e42d2efb696..c6d372980a1e6 100644 --- a/platform/mv3/extension/_locales/uk/messages.json +++ b/platform/mv3/extension/_locales/uk/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Сторінку заблоковано, бо вона відповідає фільтру в {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Заблокована сторінка хоче переадресувати на інший сайт. Якщо ви вирішите продовжити, ви перейдете безпосередньо на: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { From 36db7f83274ae219d68e24d4aa477c007050e951 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 6 Dec 2024 10:15:42 -0500 Subject: [PATCH 508/553] Block media elements unconditionally when max size is set to 0 Related feedback: https://old.reddit.com/r/uBlockOrigin/comments/1h7x9nj/ --- src/js/pagestore.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/js/pagestore.js b/src/js/pagestore.js index 44a5674cbe718..7adca8482847e 100644 --- a/src/js/pagestore.js +++ b/src/js/pagestore.js @@ -1063,7 +1063,9 @@ const PageStore = class { this.largeMediaTimer.on(500); } const size = headers.contentLength; - if ( isNaN(size) ) { return 0; } + if ( isNaN(size) ) { + return µb.userSettings.largeMediaSize === 0 ? 1 : 0; + } if ( (size >>> 10) < µb.userSettings.largeMediaSize ) { return 0; } this.largeMediaCount += 1; this.largeMediaTimer.on(500); From 3417fe3d5dcbf2666846761466da1927ead2e9a5 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 6 Dec 2024 11:53:42 -0500 Subject: [PATCH 509/553] Improve `trusted-replace-argument` scriptlet As discussed with filter list maintainers. --- src/js/resources/attribute.js | 4 +-- src/js/resources/cookie.js | 16 +++++++++--- src/js/resources/proxy-apply.js | 4 +-- src/js/resources/replace-argument.js | 32 ++++++++++++++++------- src/js/resources/safe-self.js | 1 + src/js/resources/scriptlets.js | 38 ++++++++++++++++------------ src/js/resources/set-constant.js | 1 + 7 files changed, 63 insertions(+), 33 deletions(-) diff --git a/src/js/resources/attribute.js b/src/js/resources/attribute.js index b6ecdf7a3e597..ed735eecdd70b 100644 --- a/src/js/resources/attribute.js +++ b/src/js/resources/attribute.js @@ -229,7 +229,7 @@ export function removeAttr( if ( rawToken === '' ) { return; } const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('remove-attr', rawToken, rawSelector, behavior); - const tokens = rawToken.split(/\s*\|\s*/); + const tokens = safe.String_split.call(rawToken, /\s*\|\s*/); const selector = tokens .map(a => `${rawSelector}[${CSS.escape(a)}]`) .join(','); @@ -289,7 +289,7 @@ export function removeAttr( subtree: true, }); }; - runAt(( ) => { start(); }, behavior.split(/\s+/)); + runAt(( ) => { start(); }, safe.String_split.call(behavior, /\s+/)); } registerScriptlet(removeAttr, { name: 'remove-attr.js', diff --git a/src/js/resources/cookie.js b/src/js/resources/cookie.js index 3fbeb1858d122..29ad7315cc805 100644 --- a/src/js/resources/cookie.js +++ b/src/js/resources/cookie.js @@ -53,7 +53,8 @@ registerScriptlet(getSafeCookieValuesFn, { /******************************************************************************/ export function getAllCookiesFn() { - return document.cookie.split(/\s*;\s*/).map(s => { + const safe = safeSelf(); + return safe.String_split.call(document.cookie, /\s*;\s*/).map(s => { const pos = s.indexOf('='); if ( pos === 0 ) { return; } if ( pos === -1 ) { return `${s.trim()}=`; } @@ -64,6 +65,9 @@ export function getAllCookiesFn() { } registerScriptlet(getAllCookiesFn, { name: 'get-all-cookies.fn', + dependencies: [ + safeSelf, + ], }); /******************************************************************************/ @@ -71,7 +75,8 @@ registerScriptlet(getAllCookiesFn, { export function getCookieFn( name = '' ) { - for ( const s of document.cookie.split(/\s*;\s*/) ) { + const safe = safeSelf(); + for ( const s of safe.String_split.call(document.cookie, /\s*;\s*/) ) { const pos = s.indexOf('='); if ( pos === -1 ) { continue; } if ( s.slice(0, pos) !== name ) { continue; } @@ -80,6 +85,9 @@ export function getCookieFn( } registerScriptlet(getCookieFn, { name: 'get-cookie.fn', + dependencies: [ + safeSelf, + ], }); /******************************************************************************/ @@ -349,7 +357,7 @@ export function removeCookie( }, ms); }; const remove = ( ) => { - document.cookie.split(';').forEach(cookieStr => { + safe.String_split.call(document.cookie, ';').forEach(cookieStr => { const pos = cookieStr.indexOf('='); if ( pos === -1 ) { return; } const cookieName = cookieStr.slice(0, pos).trim(); @@ -387,7 +395,7 @@ export function removeCookie( window.addEventListener('beforeunload', remove); if ( typeof extraArgs.when !== 'string' ) { return; } const supportedEventTypes = [ 'scroll', 'keydown' ]; - const eventTypes = extraArgs.when.split(/\s/); + const eventTypes = safe.String_split.call(extraArgs.when, /\s/); for ( const type of eventTypes ) { if ( supportedEventTypes.includes(type) === false ) { continue; } document.addEventListener(type, ( ) => { diff --git a/src/js/resources/proxy-apply.js b/src/js/resources/proxy-apply.js index 09d357f9052b6..60326f54617e2 100644 --- a/src/js/resources/proxy-apply.js +++ b/src/js/resources/proxy-apply.js @@ -52,7 +52,7 @@ export function proxyApplyFn( } reflect() { const r = Reflect.construct(this.callFn, this.callArgs); - this.callFn = this.callArgs = undefined; + this.callFn = this.callArgs = this.private = undefined; proxyApplyFn.ctorContexts.push(this); return r; } @@ -75,7 +75,7 @@ export function proxyApplyFn( } reflect() { const r = Reflect.apply(this.callFn, this.thisArg, this.callArgs); - this.callFn = this.thisArg = this.callArgs = undefined; + this.callFn = this.thisArg = this.callArgs = this.private = undefined; proxyApplyFn.applyContexts.push(this); return r; } diff --git a/src/js/resources/replace-argument.js b/src/js/resources/replace-argument.js index 150bf047b8a39..f06938b74d2dd 100644 --- a/src/js/resources/replace-argument.js +++ b/src/js/resources/replace-argument.js @@ -71,25 +71,39 @@ export function trustedReplaceArgument( const reCondition = extraArgs.condition ? safe.patternToRegex(extraArgs.condition) : /^/; - proxyApplyFn(propChain, function(context) { + const getArg = context => { + if ( argposRaw === 'this' ) { return context.thisArg; } const { callArgs } = context; - if ( argposRaw === '' ) { - safe.uboLog(logPrefix, `Arguments:\n${callArgs.join('\n')}`); - return context.reflect(); - } const argpos = argoffset >= 0 ? argoffset : callArgs.length - argoffset; - if ( argpos < 0 || argpos >= callArgs.length ) { + if ( argpos < 0 || argpos >= callArgs.length ) { return; } + context.private = { argpos }; + return callArgs[argpos]; + }; + const setArg = (context, value) => { + if ( argposRaw === 'this' ) { + if ( value !== context.thisArg ) { + context.thisArg = value; + } + } else if ( context.private ) { + context.callArgs[context.private.argpos] = value; + } + }; + proxyApplyFn(propChain, function(context) { + if ( argposRaw === '' ) { + safe.uboLog(logPrefix, `Arguments:\n${context.callArgs.join('\n')}`); return context.reflect(); } - const argBefore = callArgs[argpos]; + const argBefore = getArg(context); if ( safe.RegExp_test.call(reCondition, argBefore) === false ) { return context.reflect(); } const argAfter = replacer && typeof argBefore === 'string' ? argBefore.replace(replacer.re, replacer.replacement) : value; - callArgs[argpos] = argAfter; - safe.uboLog(logPrefix, `Replaced argument:\nBefore: ${JSON.stringify(argBefore)}\nAfter: ${argAfter}`); + if ( argAfter !== argBefore ) { + setArg(context, argAfter); + safe.uboLog(logPrefix, `Replaced argument:\nBefore: ${JSON.stringify(argBefore)}\nAfter: ${argAfter}`); + } return context.reflect(); }); } diff --git a/src/js/resources/safe-self.js b/src/js/resources/safe-self.js index a1840e13b6464..afb98722113fa 100644 --- a/src/js/resources/safe-self.js +++ b/src/js/resources/safe-self.js @@ -51,6 +51,7 @@ export function safeSelf() { 'RegExp_exec': self.RegExp.prototype.exec, 'Request_clone': self.Request.prototype.clone, 'String_fromCharCode': String.fromCharCode, + 'String_split': String.prototype.split, 'XMLHttpRequest': self.XMLHttpRequest, 'addEventListener': self.EventTarget.prototype.addEventListener, 'removeEventListener': self.EventTarget.prototype.removeEventListener, diff --git a/src/js/resources/scriptlets.js b/src/js/resources/scriptlets.js index d1e4c4b58d8e1..f8a761990b946 100644 --- a/src/js/resources/scriptlets.js +++ b/src/js/resources/scriptlets.js @@ -192,7 +192,7 @@ function abortCurrentScriptCore( const reContext = safe.patternToRegex(context); const extraArgs = safe.getExtraArgs(Array.from(arguments), 3); const thisScript = document.currentScript; - const chain = target.split('.'); + const chain = safe.String_split.call(target, '.'); let owner = window; let prop; for (;;) { @@ -406,6 +406,7 @@ builtinScriptlets.push({ dependencies: [ 'matches-stack-trace.fn', 'object-find-owner.fn', + 'safe-self.fn', ], }); // When no "prune paths" argument is provided, the scriptlet is @@ -422,11 +423,12 @@ function objectPruneFn( extraArgs = {} ) { if ( typeof rawPrunePaths !== 'string' ) { return; } + const safe = safeSelf(); const prunePaths = rawPrunePaths !== '' - ? rawPrunePaths.split(/ +/) + ? safe.String_split.call(rawPrunePaths, / +/) : []; const needlePaths = prunePaths.length !== 0 && rawNeedlePaths !== '' - ? rawNeedlePaths.split(/ +/) + ? safe.String_split.call(rawNeedlePaths, / +/) : []; if ( stackNeedleDetails.matchAll !== true ) { if ( matchesStackTrace(stackNeedleDetails, extraArgs.logstack) === false ) { @@ -547,7 +549,7 @@ function matchesStackTrace( // Normalize stack trace const reLine = /(.*?@)?(\S+)(:\d+):\d+\)?$/; const lines = []; - for ( let line of error.stack.split(/[\n\r]+/) ) { + for ( let line of safe.String_split.call(error.stack, /[\n\r]+/) ) { if ( line.includes(exceptionToken) ) { continue; } line = line.trim(); const match = safe.RegExp_exec.call(reLine, line); @@ -594,8 +596,8 @@ function parsePropertiesToMatch(propsToMatch, implicit = '') { const needles = new Map(); if ( propsToMatch === undefined || propsToMatch === '' ) { return needles; } const options = { canNegate: true }; - for ( const needle of propsToMatch.split(/\s+/) ) { - const [ prop, pattern ] = needle.split(':'); + for ( const needle of safe.String_split.call(propsToMatch, /\s+/) ) { + const [ prop, pattern ] = safe.String_split.call(needle, ':'); if ( prop === '' ) { continue; } if ( pattern !== undefined ) { needles.set(prop, safe.initPattern(pattern, options)); @@ -1643,7 +1645,7 @@ function noFetchIf( const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('prevent-fetch', propsToMatch, responseBody, responseType); const needles = []; - for ( const condition of propsToMatch.split(/\s+/) ) { + for ( const condition of safe.String_split.call(propsToMatch, /\s+/) ) { if ( condition === '' ) { continue; } const pos = condition.indexOf(':'); let key, value; @@ -1797,7 +1799,7 @@ function removeClass( if ( rawToken === '' ) { return; } const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('remove-class', rawToken, rawSelector, behavior); - const tokens = rawToken.split(/\s*\|\s*/); + const tokens = safe.String_split.call(rawToken, /\s*\|\s*/); const selector = tokens .map(a => `${rawSelector}.${CSS.escape(a)}`) .join(','); @@ -2510,12 +2512,12 @@ function m3uPrune( } text = before.trim() + '\n' + after.trim(); reM3u.lastIndex = before.length + 1; - toLog.push('Discarding', ...discard.split(/\n+/).map(s => `\t${s}`)); + toLog.push('Discarding', ...safe.String_split.call(discard, /\n+/).map(s => `\t${s}`)); if ( reM3u.global === false ) { break; } } return text; } - const lines = text.split(/\n\r|\n|\r/); + const lines = safe.String_split.call(text, /\n\r|\n|\r/); for ( let i = 0; i < lines.length; i++ ) { if ( lines[i] === undefined ) { continue; } if ( pruneSpliceoutBlock(lines, i) ) { continue; } @@ -2758,13 +2760,17 @@ function hrefSanitizer( builtinScriptlets.push({ name: 'call-nothrow.js', fn: callNothrow, + dependencies: [ + 'safe-self.fn', + ], }); function callNothrow( chain = '' ) { if ( typeof chain !== 'string' ) { return; } if ( chain === '' ) { return; } - const parts = chain.split('.'); + const safe = safeSelf(); + const parts = safe.String_split.call(chain, '.'); let owner = window, prop; for (;;) { prop = parts.shift(); @@ -3095,7 +3101,7 @@ function trustedClickElement( const logPrefix = safe.makeLogPrefix('trusted-click-element', selectors, extraMatch, delay); if ( extraMatch !== '' ) { - const assertions = extraMatch.split(',').map(s => { + const assertions = safe.String_split.call(extraMatch, ',').map(s => { const pos1 = s.indexOf(':'); const s1 = pos1 !== -1 ? s.slice(0, pos1) : s; const not = s1.startsWith('!'); @@ -3163,7 +3169,7 @@ function trustedClickElement( return shadowRoot && querySelectorEx(inside, shadowRoot); }; - const selectorList = selectors.split(/\s*,\s*/) + const selectorList = safe.String_split.call(selectors, /\s*,\s*/) .filter(s => { try { void querySelectorEx(s); @@ -3290,10 +3296,10 @@ function trustedPruneInboundObject( const extraArgs = safe.getExtraArgs(Array.from(arguments), 4); const needlePaths = []; if ( rawPrunePaths !== '' ) { - needlePaths.push(...rawPrunePaths.split(/ +/)); + needlePaths.push(...safe.String_split.call(rawPrunePaths, / +/)); } if ( rawNeedlePaths !== '' ) { - needlePaths.push(...rawNeedlePaths.split(/ +/)); + needlePaths.push(...safe.String_split.call(rawNeedlePaths, / +/)); } const stackNeedle = safe.initPattern(extraArgs.stackToMatch || '', { canNegate: true }); const mustProcess = root => { @@ -3455,7 +3461,7 @@ function trustedSuppressNativeMethod( if ( stack !== '' ) { return; } const safe = safeSelf(); const logPrefix = safe.makeLogPrefix('trusted-suppress-native-method', methodPath, signature, how); - const signatureArgs = signature.split(/\s*\|\s*/).map(v => { + const signatureArgs = safe.String_split.call(signature, /\s*\|\s*/).map(v => { if ( /^".*"$/.test(v) ) { return { type: 'pattern', re: safe.patternToRegex(v.slice(1, -1)) }; } diff --git a/src/js/resources/set-constant.js b/src/js/resources/set-constant.js index 127f27bbbe910..66584fb81d3e6 100644 --- a/src/js/resources/set-constant.js +++ b/src/js/resources/set-constant.js @@ -61,6 +61,7 @@ export function validateConstantFn(trusted, raw, extraArgs = {}) { } else if ( raw.startsWith('{') && raw.endsWith('}') ) { try { value = safe.JSON_parse(raw).value; } catch(ex) { return; } } + return raw; } else { return; } From 0d0754a57bfd65025061237071d262f72bfb08f3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 6 Dec 2024 11:56:33 -0500 Subject: [PATCH 510/553] Update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f406ffd55b87..a2f2928b71c2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +- [Improve `trusted-replace-argument` scriptlet](https://github.com/gorhill/uBlock/commit/3417fe3d5d) +- [Block media elements unconditionally when max size is set to 0](https://github.com/gorhill/uBlock/commit/36db7f8327) + - Regression from - [Visually separate scriptlet parameters in active line](https://github.com/gorhill/uBlock/commit/076e9fa73e) - [Mitigate potentially delayed execution of scriptlets in Firefox](https://github.com/gorhill/uBlock/commit/b1a00145bd) - [Improve `prevent-setTimeout`/`prevent-setInterval` scriptlets](https://github.com/gorhill/uBlock/commit/3b7fa79a68) From 0701422dcf30c8c0010cd839101ccaa278cd7763 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 6 Dec 2024 11:56:56 -0500 Subject: [PATCH 511/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 8a93a27b73714..34da318f7a219 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.3.4 \ No newline at end of file +1.61.3.5 \ No newline at end of file From 4ed97bb513e0a9fa229194e4c25d8332198d56d0 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 6 Dec 2024 12:04:21 -0500 Subject: [PATCH 512/553] Update JSDoc documenation --- src/js/resources/replace-argument.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/resources/replace-argument.js b/src/js/resources/replace-argument.js index f06938b74d2dd..c5927d2b9dc35 100644 --- a/src/js/resources/replace-argument.js +++ b/src/js/resources/replace-argument.js @@ -38,7 +38,8 @@ import { validateConstantFn } from './set-constant.js'; * * @param argposRaw * The zero-based position of the argument in the argument list. Use a negative - * number for a position relative to the last argument. + * number for a position relative to the last argument. Use literal `this` to + * replace the value used in `prototype`-based methods. * * @param argraw * The replacement value, validated using the same heuristic as with the From 4e7bdff8edff35b862b0b7ecd75a6d462845e46d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 6 Dec 2024 12:11:15 -0500 Subject: [PATCH 513/553] 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 67cb51badbed6..f8302e8163f60 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.3.4", + "version": "1.61.3.5", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b4/uBlock0_1.61.3b4.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b5/uBlock0_1.61.3b5.firefox.signed.xpi" } ] } From 424fc816281ce053f8e41b0776fcefd73e5fc8a8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 6 Dec 2024 12:13:18 -0500 Subject: [PATCH 514/553] [mv3] Minor code review --- platform/mv3/extension/css/strictblock.css | 3 +- platform/mv3/extension/js/strictblock.js | 56 +++++++++++++--------- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/platform/mv3/extension/css/strictblock.css b/platform/mv3/extension/css/strictblock.css index 7f1f0e9c0d162..5a459446434a3 100644 --- a/platform/mv3/extension/css/strictblock.css +++ b/platform/mv3/extension/css/strictblock.css @@ -50,7 +50,7 @@ q { font-weight: bold; } .code { - font-size: 13px; + font-size: var(--font-size-smaller); word-break: break-all; } #warningSign { @@ -137,7 +137,6 @@ body[dir="rtl"] #toggleParse { #urlskip a { display: block; overflow-y: auto; - word-break: break-all; } #actionContainer { diff --git a/platform/mv3/extension/js/strictblock.js b/platform/mv3/extension/js/strictblock.js index 7600bcfbb9e7f..2e8c74c67e5ea 100644 --- a/platform/mv3/extension/js/strictblock.js +++ b/platform/mv3/extension/js/strictblock.js @@ -72,6 +72,31 @@ qs$('#theURL > p > span:first-of-type').append(urlToFragment(toURL.href)); /******************************************************************************/ +function fragmentFromTemplate(template, placeholder, text, details) { + const fragment = new DocumentFragment(); + const pos = template.indexOf(placeholder); + if ( pos === -1 ) { + fragment.append(template); + return fragment; + } + const elem = document.createElement(details.tag); + const { attributes } = details; + if ( attributes ) { + for ( let i = 0; i < attributes.length; i+= 2 ) { + elem.setAttribute(attributes[i+0], attributes[i+1]); + } + } + elem.append(text); + fragment.append( + template.slice(0, pos), + elem, + template.slice(pos + placeholder.length) + ); + return fragment; +} + +/******************************************************************************/ + // https://github.com/gorhill/uBlock/issues/691 // Parse URL to extract as much useful information as possible. This is // useful to assist the user in deciding whether to navigate to the web page. @@ -179,15 +204,11 @@ qs$('#theURL > p > span:first-of-type').append(urlToFragment(toURL.href)); if ( toFetch.length === 0 ) { return; } await Promise.all(toFetch); if ( iList === -1 ) { return; } - - const fragment = new DocumentFragment(); - const text = i18n$('strictblockReasonSentence1'); - const placeholder = '{{listname}}'; - const pos = text.indexOf(placeholder); - if ( pos === -1 ) { return; } - const q = document.createElement('q'); - q.append(rulesetDetails[iList].name); - fragment.append(text.slice(0, pos), q, text.slice(pos + placeholder.length)); + const fragment = fragmentFromTemplate( + i18n$('strictblockReasonSentence1'), + '{{listname}}', rulesetDetails[iList].name, + { tag: 'q' } + ); qs$('#reason').append(fragment); dom.attr('#reason', 'hidden', null); })(); @@ -210,19 +231,10 @@ qs$('#theURL > p > span:first-of-type').append(urlToFragment(toURL.href)); if ( re.test(toURL.href) === false ) { continue; } const finalURL = urlSkip(toURL.href, false, urlskip.steps); if ( finalURL === undefined ) { continue; } - const fragment = new DocumentFragment(); - const text = i18n$('strictblockRedirectSentence1'); - const linkPlaceholder = '{{url}}'; - const pos = text.indexOf(linkPlaceholder); - if ( pos === -1 ) { return; } - const link = document.createElement('a'); - link.href = finalURL; - dom.cl.add(link, 'code'); - link.append(urlToFragment(finalURL)); - fragment.append( - text.slice(0, pos), - link, - text.slice(pos + linkPlaceholder.length) + const fragment = fragmentFromTemplate( + i18n$('strictblockRedirectSentence1'), + '{{url}}', urlToFragment(finalURL), + { tag: 'a', attributes: [ 'href', finalURL, 'class', 'code' ] } ); qs$('#urlskip').append(fragment); dom.attr('#urlskip', 'hidden', null); From ec5a1b3ab6c7abe6a5f94c44cef5d9e51ffb169d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 6 Dec 2024 17:21:30 -0500 Subject: [PATCH 515/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/ca/messages.json | 4 ++-- .../mv3/extension/_locales/da/messages.json | 4 ++-- .../mv3/extension/_locales/de/messages.json | 2 +- .../mv3/extension/_locales/et/messages.json | 4 ++-- .../mv3/extension/_locales/fi/messages.json | 4 ++-- .../mv3/extension/_locales/fr/messages.json | 4 ++-- .../mv3/extension/_locales/gl/messages.json | 4 ++-- .../mv3/extension/_locales/lv/messages.json | 4 ++-- .../mv3/extension/_locales/nl/messages.json | 22 +++++++++---------- .../mv3/extension/_locales/ru/messages.json | 4 ++-- .../extension/_locales/zh_CN/messages.json | 4 ++-- .../extension/_locales/zh_TW/messages.json | 4 ++-- 12 files changed, 32 insertions(+), 32 deletions(-) diff --git a/platform/mv3/extension/_locales/ca/messages.json b/platform/mv3/extension/_locales/ca/messages.json index 070b24a5b38bf..a11095949897a 100644 --- a/platform/mv3/extension/_locales/ca/messages.json +++ b/platform/mv3/extension/_locales/ca/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "La pàgina s'ha blocat a causa d'un filtre coincident a {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "La pàgina blocada vol redirigir-vos a un altre web diferent. Si continueu, si us reenviarà a: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/da/messages.json b/platform/mv3/extension/_locales/da/messages.json index 25b24263ac287..a89b9c535d609 100644 --- a/platform/mv3/extension/_locales/da/messages.json +++ b/platform/mv3/extension/_locales/da/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Siden blev blokeret grundet et matchende filter i {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Den blokerede side ønsker at omdirigere til et andet websted. Vælger man at fortsætte, navigeres direkte til: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index af32e26d2f365..de200b1f5e779 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -232,7 +232,7 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Stricktes Blockieren aktivieren", + "message": "Striktes Blockieren aktivieren", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { diff --git a/platform/mv3/extension/_locales/et/messages.json b/platform/mv3/extension/_locales/et/messages.json index 9d498685a3a50..a6dc44ddafb36 100644 --- a/platform/mv3/extension/_locales/et/messages.json +++ b/platform/mv3/extension/_locales/et/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Lehe avamine keelati {{listname}} tõttu.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Keelatud leht üritab suunata teisele lehele. Jätkates nõustute avama {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/fi/messages.json b/platform/mv3/extension/_locales/fi/messages.json index 761093b972b74..905e8319fecb7 100644 --- a/platform/mv3/extension/_locales/fi/messages.json +++ b/platform/mv3/extension/_locales/fi/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Sivu estettiin listalla {{listname}} olevan sännön perusteella.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Estetty sivu ohjautuu eri sivustolle. Jos jatkat, siirryt suoraan osoitteeseen {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/fr/messages.json b/platform/mv3/extension/_locales/fr/messages.json index 4bba2ac8f412c..58cf3803e7f88 100644 --- a/platform/mv3/extension/_locales/fr/messages.json +++ b/platform/mv3/extension/_locales/fr/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "La page a été bloquée à cause d'un filtre correspondant dans {{listname}}", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "La page bloquée souhaite rediriger vers un autre site. Si vous choisissez de continuer, vous vous rendrez à l'adresse suivante : {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/gl/messages.json b/platform/mv3/extension/_locales/gl/messages.json index 67f783e282dc1..9afa714e8a941 100644 --- a/platform/mv3/extension/_locales/gl/messages.json +++ b/platform/mv3/extension/_locales/gl/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Bloqueouse a páxina porque concorda cun filtro de {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "A páxina bloqueada quere redirixir a outra web. Se elixes continuar vas ir directamente a: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/lv/messages.json b/platform/mv3/extension/_locales/lv/messages.json index 4f388fa909693..53b675ac7de02 100644 --- a/platform/mv3/extension/_locales/lv/messages.json +++ b/platform/mv3/extension/_locales/lv/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Lapa tika aizturēta, jo atbilst aizturētājam sarakstā {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Aizturētā lapa veic pārvirzīšanu uz citu vietni. Ja izvēlēsies turpināt, nonāksi uzreiz šeit: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/nl/messages.json b/platform/mv3/extension/_locales/nl/messages.json index d1874b6aed8f0..a170351aa536e 100644 --- a/platform/mv3/extension/_locales/nl/messages.json +++ b/platform/mv3/extension/_locales/nl/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Strenge blokkering inschakelen", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Navigatie naar mogelijk ongewenste websites wordt geblokkeerd, en nu krijgt de mogelijkheid om door te gaan.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,39 +244,39 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Pagina geblokkeerd", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite heeft het laden van de volgende pagina voorkomen:", "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "De pagina is geblokkeerd vanwege een overeenkomend filter in {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "De geblokkeerde pagina wil u omleiden naar een andere website. Als u doorgaat, navigeert u rechtstreeks naar: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "zonder parameters", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Teruggaan", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Dit venster sluiten", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Mij niet meer waarschuwen over deze website", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Doorgaan", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ru/messages.json b/platform/mv3/extension/_locales/ru/messages.json index 53c354a7787b1..bd89af9f8d8a6 100644 --- a/platform/mv3/extension/_locales/ru/messages.json +++ b/platform/mv3/extension/_locales/ru/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Веб-страница была заблокирована из-за попадания в фильтр из {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Заблокированная страница собирается перенаправить вас на другой сайт. Если вы решите продолжить, вы перейдете непосредственно на: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/zh_CN/messages.json b/platform/mv3/extension/_locales/zh_CN/messages.json index 490bc10672f00..136a6284673da 100644 --- a/platform/mv3/extension/_locales/zh_CN/messages.json +++ b/platform/mv3/extension/_locales/zh_CN/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "该页面由于 {{listName}} 中的匹配过滤器而被阻止。", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "被屏蔽的页面希望重定向到另一个网站。如果您选择继续,将直接导航到:{{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/zh_TW/messages.json b/platform/mv3/extension/_locales/zh_TW/messages.json index 003ef30a71f68..7a80c28a11484 100644 --- a/platform/mv3/extension/_locales/zh_TW/messages.json +++ b/platform/mv3/extension/_locales/zh_TW/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "由於在 {{listname}} 中有符合的過濾條件,因此該頁面被封鎖。", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "被封鎖的網頁想要重新導向至其他網站。如果您選擇繼續,則會直接前往:{{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { From 56ba93700c092c00f869fc85129046fe096c1c00 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 8 Dec 2024 08:37:29 -0500 Subject: [PATCH 516/553] [mv3] Ensure no generic cosmetic filters end up in specific realm Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/254 Cosmetic filters with only negated hostnames would end up being classified as specific, while in reality the filter is generic, with specific exceptions. This commit fixes the improper classification. Enforcing specific exception filters in the generic realm is still an issue to address. --- platform/mv3/make-rulesets.js | 13 +---- src/js/static-dnr-filtering.js | 97 +++++++++++++++++++--------------- 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index 4ea7ae6dba1d0..9df90963cc7be 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -83,11 +83,6 @@ const uidint32 = (s) => { return parseInt(h,16) & 0x7FFFFFFF; }; -const hnSort = (a, b) => - a.split('.').reverse().join('.').localeCompare( - b.split('.').reverse().join('.') - ); - /******************************************************************************/ const stdOutput = []; @@ -681,14 +676,10 @@ function groupHostnamesBySelectors(arrayin) { const out = Array.from(contentMap).map(a => [ a[0], { a: a[1].a, - y: a[1].y ? Array.from(a[1].y).sort(hnSort) : '*', + y: a[1].y ? Array.from(a[1].y) : undefined, n: a[1].n ? Array.from(a[1].n) : undefined, } - ]).sort((a, b) => { - const ha = Array.isArray(a[1].y) ? a[1].y[0] : '*'; - const hb = Array.isArray(b[1].y) ? b[1].y[0] : '*'; - return hnSort(ha, hb); - }); + ]); return out; } diff --git a/src/js/static-dnr-filtering.js b/src/js/static-dnr-filtering.js index 63639006585c2..9935fd161e45c 100644 --- a/src/js/static-dnr-filtering.js +++ b/src/js/static-dnr-filtering.js @@ -90,6 +90,39 @@ const keyFromSelector = selector => { /******************************************************************************/ +function addGenericCosmeticFilter(context, selector, isException) { + if ( selector === undefined ) { return; } + if ( selector.length <= 1 ) { return; } + if ( isException ) { + if ( context.genericCosmeticExceptions === undefined ) { + context.genericCosmeticExceptions = new Set(); + } + context.genericCosmeticExceptions.add(selector); + return; + } + if ( selector.charCodeAt(0) === 0x7B /* '{' */ ) { return; } + const key = keyFromSelector(selector); + if ( key === undefined ) { + if ( context.genericHighCosmeticFilters === undefined ) { + context.genericHighCosmeticFilters = new Set(); + } + context.genericHighCosmeticFilters.add(selector); + return; + } + const type = key.charCodeAt(0); + const hash = hashFromStr(type, key.slice(1)); + if ( context.genericCosmeticFilters === undefined ) { + context.genericCosmeticFilters = new Map(); + } + let bucket = context.genericCosmeticFilters.get(hash); + if ( bucket === undefined ) { + context.genericCosmeticFilters.set(hash, bucket = []); + } + bucket.push(selector); +} + +/******************************************************************************/ + function addExtendedToDNR(context, parser) { if ( parser.isExtendedFilter() === false ) { return false; } @@ -195,35 +228,8 @@ function addExtendedToDNR(context, parser) { // Generic cosmetic filtering if ( parser.hasOptions() === false ) { - const { compiled } = parser.result; - if ( compiled === undefined ) { return; } - if ( compiled.length <= 1 ) { return; } - if ( parser.isException() ) { - if ( context.genericCosmeticExceptions === undefined ) { - context.genericCosmeticExceptions = new Set(); - } - context.genericCosmeticExceptions.add(compiled); - return; - } - if ( compiled.charCodeAt(0) === 0x7B /* '{' */ ) { return; } - const key = keyFromSelector(compiled); - if ( key === undefined ) { - if ( context.genericHighCosmeticFilters === undefined ) { - context.genericHighCosmeticFilters = new Set(); - } - context.genericHighCosmeticFilters.add(compiled); - return; - } - const type = key.charCodeAt(0); - const hash = hashFromStr(type, key.slice(1)); - if ( context.genericCosmeticFilters === undefined ) { - context.genericCosmeticFilters = new Map(); - } - let bucket = context.genericCosmeticFilters.get(hash); - if ( bucket === undefined ) { - context.genericCosmeticFilters.set(hash, bucket = []); - } - bucket.push(compiled); + const { compiled, exception } = parser.result; + addGenericCosmeticFilter(context, compiled, exception); return; } @@ -234,26 +240,22 @@ function addExtendedToDNR(context, parser) { if ( context.specificCosmeticFilters === undefined ) { context.specificCosmeticFilters = new Map(); } + const { compiled, exception, raw } = parser.result; + if ( compiled === undefined ) { + context.specificCosmeticFilters.set(`Invalid filter: ...##${raw}`, { + rejected: true + }); + return; + } + let details = context.specificCosmeticFilters.get(compiled); for ( const { hn, not, bad } of parser.getExtFilterDomainIterator() ) { if ( bad ) { continue; } + if ( not && exception ) { continue; } if ( isRegex(hn) ) { continue; } - let { compiled, exception, raw } = parser.result; - if ( exception ) { continue; } - let rejected; - if ( compiled === undefined ) { - rejected = `Invalid filter: ${hn}##${raw}`; - } - if ( rejected ) { - compiled = rejected; - } - let details = context.specificCosmeticFilters.get(compiled); if ( details === undefined ) { - details = {}; - if ( rejected ) { details.rejected = true; } - context.specificCosmeticFilters.set(compiled, details); + context.specificCosmeticFilters.set(compiled, details = {}); } - if ( rejected ) { continue; } - if ( not ) { + if ( exception ) { if ( details.excludeMatches === undefined ) { details.excludeMatches = []; } @@ -270,6 +272,13 @@ function addExtendedToDNR(context, parser) { } details.matches.push(hn); } + if ( details === undefined ) { return; } + if ( exception ) { return; } + if ( compiled.startsWith('{') ) { return; } + if ( details.matches === undefined || details.matches.includes('*') ) { + addGenericCosmeticFilter(context, compiled, false); + details.matches = undefined; + } } /******************************************************************************/ From 6c6ac6c7a7bd6e08ba4e70fbd102e7f41af544ef Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 8 Dec 2024 16:58:23 -0500 Subject: [PATCH 517/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.zh_TW.txt | 14 ++++----- .../mv3/extension/_locales/el/messages.json | 4 +-- .../mv3/extension/_locales/es/messages.json | 4 +-- .../mv3/extension/_locales/hu/messages.json | 4 +-- .../mv3/extension/_locales/ka/messages.json | 22 +++++++------- .../mv3/extension/_locales/ko/messages.json | 22 +++++++------- .../extension/_locales/pt_PT/messages.json | 30 +++++++++---------- .../mv3/extension/_locales/sq/messages.json | 18 +++++------ .../extension/_locales/zh_TW/messages.json | 18 +++++------ src/_locales/hu/messages.json | 2 +- src/_locales/pt_PT/messages.json | 4 +-- 11 files changed, 71 insertions(+), 71 deletions(-) diff --git a/platform/mv3/description/webstore.zh_TW.txt b/platform/mv3/description/webstore.zh_TW.txt index 8af192573f3b8..ddc587c6f9762 100644 --- a/platform/mv3/description/webstore.zh_TW.txt +++ b/platform/mv3/description/webstore.zh_TW.txt @@ -1,6 +1,6 @@ uBO Lite (uBOL) 是款以 MV3 為基礎的「免權限」內容阻擋器。 -預設規則集對應了 uBlock Origin 的預設過濾集: +預設規則集對應着 uBlock Origin 的預設過濾集: - uBlock Origin 內建的過濾器清單 - EasyList @@ -9,19 +9,19 @@ uBO Lite (uBOL) 是款以 MV3 為基礎的「免權限」內容阻擋器。 您可以前往選項頁面(按下彈出面板的 **齒輪** 按鈕)啟用更多規則集。 -uBOL 是完全宣告式的,意即過濾過程中不需要持續性的 uBOL 處理程序參與,且以 CSS/JS 注入為基礎進行的內容過濾由可靠的瀏覽器執行,而非是擴充功能。 這就代表 uBOL 在內容阻擋過程不會佔用 CPU 和記憶體資源——除了和彈出面板或選項頁面互動的場景外,都不需要 uBOL 的 Service Worker 程序。 +uBOL 是完全宣告式的,意即過濾過程中不需要持續性的 uBOL 處理程序參與,且以 CSS/JS 注入為基礎的內容過濾由可靠的瀏覽器執行,而非是擴充功能。 這就代表 uBOL 在內容阻擋過程不會佔用 CPU 和記憶體資源——除了和彈出面板或選項頁面互動的場景外,都不需要 uBOL 的 Service Worker 程序。 -uBOL 在安裝期間不需要氾濫的「讀取與修改資料」權限,因此它出廠時的功能和 uBlock Origin 或其他在安裝期間要求「讀取與修改資料」權限的內容阻擋程式相比,會相對受限。 +uBOL 在安裝期間不需要廣泛的「讀取與修改資料」權限,因此它出廠時的功能和 uBlock Origin 或其他在安裝期間要求該權限的內容阻擋程式相比,相對受限。 -不過 uBOL 能讓你 **明確地** 在自選的特定網站授予額外的權限,使其在這些網站的過濾效果可以在元素過濾及 scripetlet 注入的加持下得到提升。 +不過 uBOL 能讓你 **明確地** 在自選的特定網站授予額外的權限,使其在這些網站的過濾效果可以在元素過濾及 scripetlet 注入的加持下提升。 -若要授予指定網站延伸權限,請開啟對話框並選擇更高的過濾模式,如「最佳化」或「完整」。 +若要授予指定網站延伸權限,請開啟彈出面板並選擇更佳的過濾模式,如「最佳」或「完整」。 -瀏覽器接著會警告您授予擴充功能請求的額外權限會帶來的後果,而你需要告訴瀏覽器要同意還是拒絕請求。 +瀏覽器接著會警告您授予擴充功能請求的額外權限所帶來的後果,而你需要告訴瀏覽器要同意還是拒絕。 如果你接受 uBOL 在目前網站請求的額外權限,其在這個網站的過濾效果將會更好。 -您可以在 uBOL 的選項頁面設定預設的過濾模式。 如果您選擇「最佳化」或「完整」為預設的模式,您需要授予 uBOL 讀取與修改所有網站資料的權限。 +您可以在 uBOL 的選項頁面設定預設的過濾模式。 如果您選擇「最佳」或「完整」為預設模式,您需要授予 uBOL 讀取與修改所有網站資料的權限。 注意這尚未完工,最終目標有: diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index 1bfb831e66ad6..66f33670c7be0 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Η σελίδα αποκλείστηκε λόγω αντιστοίχισης φίλτρου στη {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Η αποκλεισμένη σελίδα θέλει να κάνει ανακατεύθυνση σε άλλο ιστότοπο. Αν επιλέξετε να συνεχίσετε, θα μεταβείτε απευθείας στο: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 32fe1fc070f3c..10eec6a0d1a76 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "La página fue bloqueada debido a un filtro coincidente en {{listname}}.", + "message": "La página ha sido bloqueada como resultado de un filtro coincidente en {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "La página bloqueada quiere redirigir a otro sitio. Si eliges proceder, navegarás directamente a: {{url}}", + "message": "La página bloqueada quiere redirigir a otro sitio. Si eliges continuar, navegarás directamente a: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/hu/messages.json b/platform/mv3/extension/_locales/hu/messages.json index f6663ad3c65aa..9583d57488d17 100644 --- a/platform/mv3/extension/_locales/hu/messages.json +++ b/platform/mv3/extension/_locales/hu/messages.json @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Az oldal a(z) {{listname}} listában lévő illeszkedő szűrő miatt blokkolva lett.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "A blokkolt oldal egy másik webhelyre akarja átirányítani. Ha a folytatást választja, akkor közvetlenül ide fog navigálni: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/ka/messages.json b/platform/mv3/extension/_locales/ka/messages.json index c916896c69457..6b1e1608fb41f 100644 --- a/platform/mv3/extension/_locales/ka/messages.json +++ b/platform/mv3/extension/_locales/ka/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "მკაცრი შეზღუდვის ჩართვა", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "შეიზღუდა სავარაუდოდ არასასურველ გვერდებზე გადასვლა, საშუალება გეძლევათ, მაინც განაგრძოთ.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,39 +244,39 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "შეზღუდული გვერდი", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite ზღუდავს მოცემული გვერდის ჩატვირთვას:", "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "გვერდი შეიზღუდა ფილტრით {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "ეს შეზღუდული გვერდი ცდილობს თქვენს სხვა საიტზე გადაყვანას. თუ განაგრძობთ, გაიხსნება: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "პარამეტრების გარეშე", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "უკან დაბრუნება", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "ამ ფანჯრის დახურვა", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "აღარ მეცნობოს ამ საიტზე", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "გაგრძელება", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/ko/messages.json b/platform/mv3/extension/_locales/ko/messages.json index 66de739efbc37..a8a6767a081ed 100644 --- a/platform/mv3/extension/_locales/ko/messages.json +++ b/platform/mv3/extension/_locales/ko/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "엄격한 차단 켜기", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "잠재적으로 좋지 않은 사이트로의 접속을 차단하고, 사용자가 진행할지 선택하도록 합니다.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,39 +244,39 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "페이지 차단됨", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite가 다음 페이지를 불러오지 못하게 했습니다.", "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "이 페이지가 {{listname}} 내 필터링 항목에 해당하여 차단되었습니다.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "차단된 페이지에서 다른 사이트로 이동하려 합니다. 계속하시면, {{url}} 주소로 바로 이동합니다.", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "매개변수 없음", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "뒤로", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "창 닫기", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "다시는 이 사이트에 대해 경고하지 않기", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "계속", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index cc744201ba365..9be55f5d94ae5 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -112,7 +112,7 @@ "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "Para evitar sobrecarregar os voluntários com relatórios duplicados, por favor verifique se o problema ainda não foi relatado.", + "message": "Para evitar sobrecarregar os voluntários com relatórios duplicados, verifique se o problema ainda não foi relatado.", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { @@ -124,7 +124,7 @@ "description": "Label for the URL of the page" }, "supportS6Select1": { - "message": "A página web...", + "message": "A página web…", "description": "Label for widget to select type of issue" }, "supportS6Select1Option0": { @@ -140,7 +140,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option3": { - "message": "Deteta uBO Lite", + "message": "Deteta o uBO Lite", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { @@ -148,7 +148,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Falha quando o uBO Lite é ativado", + "message": "Falha quando o uBO Lite está ativado", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Ativar bloqueio estrito", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "A navegação para sites potencialmente indesejáveis será bloqueada e ser-lhe-á dada a opção de proceder.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,39 +244,39 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Página bloqueada", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "O uBO Lite impediu a seguinte página de ser carregada:", "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "A página foi bloqueada devido a um filtro correspondente em {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "A página bloqueada pretende redirecionar para outro site. Se optar por proceder, navegará diretamente para: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "sem parâmetros", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Voltar", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Fechar esta janela", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Não me avisar novamente acerca deste site", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Proceder", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/sq/messages.json b/platform/mv3/extension/_locales/sq/messages.json index 42a8679f0a2bd..9019b355488de 100644 --- a/platform/mv3/extension/_locales/sq/messages.json +++ b/platform/mv3/extension/_locales/sq/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Aktivizo bllokimin strikt", + "message": "Aktivizoj bllokimin strikt", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Lundrimi drejt faqeve potencialisht të padëshirueshme do të bllokohet dhe do t'ju ofrohet mundësia për të vazhduar.", + "message": "Uebsajtet potencialisht të padëshirueshme do të bllokohen dhe do t'ju jepet mundësia për të vazhduar.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -248,15 +248,15 @@ "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uMatrix ka penguar ngarkimin e faqes vijuese:", + "message": "uBO Lite pengoi hapjen e faqes vijuese:", "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "Faqja u bllokua për shkak të një filtri që përputhet në: {{listname}}.", + "message": "Faqja u bllokua për shkak se përputhet me filtrin në {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "Faqja e bllokuar do t'ju drejtojë në një uebsajt tjetër. Në rast se pranoni do të shkoni te: {{url}}", + "message": "Faqja e bllokuar do t'ju drejtojë në një uebsajt tjetër. Në rast se pranoni do të shkoni direkt te: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { @@ -264,19 +264,19 @@ "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Mbrapa", + "message": "Kthehem", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Mbyll këtë dritare", + "message": "Mbyll dritaren", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Mos më paralajmëro më për këtë faqe.", + "message": "Mos më lajmëro për këtë faqen", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Vazhdo", + "message": "Vazhdoj", "description": "A button to navigate to the blocked page" } } diff --git a/platform/mv3/extension/_locales/zh_TW/messages.json b/platform/mv3/extension/_locales/zh_TW/messages.json index 7a80c28a11484..d76680e6644f1 100644 --- a/platform/mv3/extension/_locales/zh_TW/messages.json +++ b/platform/mv3/extension/_locales/zh_TW/messages.json @@ -4,7 +4,7 @@ "description": "extension name." }, "extShortDesc": { - "message": "無須權限的內容阻擋器。安裝即可阻擋廣告、追蹤器、挖礦程式等網頁內容。", + "message": "一個無須任何權限的內容阻擋器。安裝即可阻擋廣告、追蹤器、挖礦程式等網頁內容。", "description": "this will be in the Chrome web store: must be 132 characters or less" }, "perRulesetStats": { @@ -112,7 +112,7 @@ "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { - "message": "為免給志願者帶來額外負擔,請先檢查問題是否被回報過,以免重複。", + "message": "為免增加志願者的負擔,請先確認該問題尚未被報告。", "description": "A paragraph in the filter issue reporter section" }, "supportFindSpecificButton": { @@ -144,11 +144,11 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option4": { - "message": "有隱私權問題", + "message": "存在隱私問題", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "開啟 uBO Lite 的時候運作不正常", + "message": "開啟 uBO Lite 的時候運作異常", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { @@ -172,7 +172,7 @@ "description": "The header text for the welcome message section" }, "firstRunDescription": { - "message": "您剛安裝了 uBO Lite。您可以在此處選擇會套用在所有網站上的預設過濾模式。\n\n預設將會使用基礎模式,因為其不需要讀取與變更資料的權限。若您信任 uBO Lite,您可以給予其讀取並變更在所有網站上資料的廣泛權限,以便為所有網站啟用進階過濾功能。", + "message": "您剛安裝了 uBO Lite。您可以在此處選擇會套用在所有網站上的預設過濾模式。\n\n預設情況下,會使用基礎模式,因為其不需要讀取與變更資料的權限。若您信任 uBO Lite,您可以授予其讀取並變更在所有網站上資料的廣泛權限,以便為所有網站啟用進階過濾功能。", "description": "Descriptive text shown at first install time only " }, "defaultFilteringModeSectionLabel": { @@ -180,7 +180,7 @@ "description": "The header text for the default filtering mode section" }, "defaultFilteringModeDescription": { - "message": "預設過濾模式將被每個網站的過濾模式覆寫。您可以根據在該網站上最有效的模式為任何指定的網站調整過濾模式。每種模式都有其優缺點。", + "message": "預設過濾模式將被每個網站的過濾模式覆寫。你可以根據每個網站的情況,調整該網站的過濾模式,以選擇最適合的模式。每種模式都有其優缺點。", "description": "This describes the default filtering mode setting" }, "filteringMode0Name": { @@ -204,11 +204,11 @@ "description": "This describes the 'basic' filtering mode" }, "optimalFilteringModeDescription": { - "message": "進階網路過濾以及來自選定過濾條件清單的特定擴展過濾條件。\n\n需要在所有網站上讀取並變更資料的廣泛權限。", + "message": "進階網路過濾以及來自選定過濾條件清單的特定擴展過濾。\n\n需要廣泛的權限以讀取和修改所有網站的數據。", "description": "This describes the 'optimal' filtering mode" }, "completeFilteringModeDescription": { - "message": "進階網路過濾以及來自選定過濾清單的特定與通用擴展過濾條件。\n\n需要在所有網站上讀取並變更資料的廣泛權限。\n\n通用擴展過濾可能會導致使用更多的網頁資源。", + "message": "進階網路過濾加上來自選定過濾清單的特定及通用擴展過濾。\n\n需要廣泛的權限以讀取和修改所有網站的數據。\n\n通用擴展過濾可能導致網頁資源使用量增加。", "description": "This describes the 'complete' filtering mode" }, "noFilteringModeDescription": { @@ -256,7 +256,7 @@ "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "被封鎖的網頁想要重新導向至其他網站。如果您選擇繼續,則會直接前往:{{url}}", + "message": "被阻擋的頁面試圖重定向到另一個網站。如果您選擇繼續,將直接導航至:{{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/src/_locales/hu/messages.json b/src/_locales/hu/messages.json index 062d1dae1c9c2..472701531c979 100644 --- a/src/_locales/hu/messages.json +++ b/src/_locales/hu/messages.json @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "A blokkolt oldal egy másik webhelyre akarja átirányítani. Ha a folytatást választja, akkor követlenül ide fog navigálni: {{url}}", + "message": "A blokkolt oldal egy másik webhelyre akarja átirányítani. Ha a folytatást választja, akkor közvetlenül ide fog navigálni: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { diff --git a/src/_locales/pt_PT/messages.json b/src/_locales/pt_PT/messages.json index 5298956affd17..0dd6035ce486e 100644 --- a/src/_locales/pt_PT/messages.json +++ b/src/_locales/pt_PT/messages.json @@ -1004,7 +1004,7 @@ "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option5": { - "message": "Falha quando o uBlock Origin é ativado", + "message": "Falha quando o uBlock Origin está ativado", "description": "An entry in the widget used to select the type of issue" }, "supportS6Select1Option6": { @@ -1192,7 +1192,7 @@ "description": "Button text to navigate to the blocked page" }, "docblockedRedirectPrompt": { - "message": "A página bloqueada pretende redirecionar para outro site. Se optar por continuar, navegará diretamente para: {{url}}", + "message": "A página bloqueada pretende redirecionar para outro site. Se optar por proceder, navegará diretamente para: {{url}}", "description": "Text warning about an incoming redirect" }, "cloudPush": { From b7441bb9c0954eb595cc6b3462e3b018ca6cebac Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Dec 2024 08:05:47 -0500 Subject: [PATCH 518/553] Fix regression in `set-constant`scriptlet Regression from https://github.com/gorhill/uBlock/commit/3417fe3d5d --- platform/mv3/extension/js/debug.js | 3 ++- platform/mv3/extension/js/ruleset-manager.js | 15 ++++++++++----- src/js/resources/set-constant.js | 1 - 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/platform/mv3/extension/js/debug.js b/platform/mv3/extension/js/debug.js index 0a6ecaffe70ee..4a0d54d81ca68 100644 --- a/platform/mv3/extension/js/debug.js +++ b/platform/mv3/extension/js/debug.js @@ -20,6 +20,7 @@ */ import { dnr } from './ext.js'; +import { getDynamicRules } from './ext-compat.js'; /******************************************************************************/ @@ -53,7 +54,7 @@ const getRuleset = async rulesetId => { } let rules; if ( rulesetId === dnr.DYNAMIC_RULESET_ID ) { - rules = await dnr.getDynamicRules().catch(( ) => undefined); + rules = await getDynamicRules().catch(( ) => undefined); } else { const response = await fetch(`/rulesets/main/${rulesetId}.json`).catch(( ) => undefined); if ( response === undefined ) { return; } diff --git a/platform/mv3/extension/js/ruleset-manager.js b/platform/mv3/extension/js/ruleset-manager.js index 04bfb3b6f241d..ca8f1239bfe2a 100644 --- a/platform/mv3/extension/js/ruleset-manager.js +++ b/platform/mv3/extension/js/ruleset-manager.js @@ -26,6 +26,11 @@ import { runtime, } from './ext.js'; +import { + getDynamicRules, + getSessionRules, +} from './ext-compat.js'; + import { localRead, localRemove, localWrite, sessionRead, sessionRemove, sessionWrite, @@ -363,8 +368,8 @@ async function commitStrictBlockRules() { beforePermanentRules, beforeTemporaryRules, ] = await Promise.all([ - dnr.getDynamicRules({ ruleIds: [ STRICTBLOCK_BASE_RULE_ID ] }), - dnr.getSessionRules({ ruleIds: [ STRICTBLOCK_BASE_RULE_ID ] }), + getDynamicRules({ ruleIds: [ STRICTBLOCK_BASE_RULE_ID ] }), + getSessionRules({ ruleIds: [ STRICTBLOCK_BASE_RULE_ID ] }), ]); if ( beforePermanentRules?.length ) { ubolLog(`Remove 1 DNR dynamic strictblock rule`); @@ -422,11 +427,11 @@ async function updateDynamicRules() { dynamicRuleIds, sessionRuleIds, ] = await Promise.all([ - dnr.getDynamicRules().then(rules => + getDynamicRules().then(rules => rules.map(rule => rule.id) .filter(id => id < TRUSTED_DIRECTIVE_BASE_RULE_ID) ), - dnr.getSessionRules().then(rules => rules.map(rule => rule.id)), + getSessionRules().then(rules => rules.map(rule => rule.id)), updateRegexRules(dynamicRules), updateRemoveparamRules(dynamicRules), updateRedirectRules(dynamicRules), @@ -475,7 +480,7 @@ async function updateDynamicRules() { /******************************************************************************/ async function filteringModesToDNR(modes) { - const trustedRules = await dnr.getDynamicRules({ + const trustedRules = await getDynamicRules({ ruleIds: [ TRUSTED_DIRECTIVE_BASE_RULE_ID+0 ], }); const trustedRule = trustedRules.length !== 0 && trustedRules[0] || undefined; diff --git a/src/js/resources/set-constant.js b/src/js/resources/set-constant.js index 66584fb81d3e6..127f27bbbe910 100644 --- a/src/js/resources/set-constant.js +++ b/src/js/resources/set-constant.js @@ -61,7 +61,6 @@ export function validateConstantFn(trusted, raw, extraArgs = {}) { } else if ( raw.startsWith('{') && raw.endsWith('}') ) { try { value = safe.JSON_parse(raw).value; } catch(ex) { return; } } - return raw; } else { return; } From fa87e6d8307b50ca59b6955c9f6db9d9f61f447b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Dec 2024 08:08:43 -0500 Subject: [PATCH 519/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 34da318f7a219..0ddc5cb2449d2 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.3.5 \ No newline at end of file +1.61.3.6 \ No newline at end of file From 7daa45e49f10f53c72a16d7c248b8e601c2e68f1 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Dec 2024 08:19:43 -0500 Subject: [PATCH 520/553] Revert "Fix regression in `set-constant`scriptlet" This reverts commit b7441bb9c0954eb595cc6b3462e3b018ca6cebac. --- platform/mv3/extension/js/debug.js | 3 +-- platform/mv3/extension/js/ruleset-manager.js | 15 +++++---------- src/js/resources/set-constant.js | 1 + 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/platform/mv3/extension/js/debug.js b/platform/mv3/extension/js/debug.js index 4a0d54d81ca68..0a6ecaffe70ee 100644 --- a/platform/mv3/extension/js/debug.js +++ b/platform/mv3/extension/js/debug.js @@ -20,7 +20,6 @@ */ import { dnr } from './ext.js'; -import { getDynamicRules } from './ext-compat.js'; /******************************************************************************/ @@ -54,7 +53,7 @@ const getRuleset = async rulesetId => { } let rules; if ( rulesetId === dnr.DYNAMIC_RULESET_ID ) { - rules = await getDynamicRules().catch(( ) => undefined); + rules = await dnr.getDynamicRules().catch(( ) => undefined); } else { const response = await fetch(`/rulesets/main/${rulesetId}.json`).catch(( ) => undefined); if ( response === undefined ) { return; } diff --git a/platform/mv3/extension/js/ruleset-manager.js b/platform/mv3/extension/js/ruleset-manager.js index ca8f1239bfe2a..04bfb3b6f241d 100644 --- a/platform/mv3/extension/js/ruleset-manager.js +++ b/platform/mv3/extension/js/ruleset-manager.js @@ -26,11 +26,6 @@ import { runtime, } from './ext.js'; -import { - getDynamicRules, - getSessionRules, -} from './ext-compat.js'; - import { localRead, localRemove, localWrite, sessionRead, sessionRemove, sessionWrite, @@ -368,8 +363,8 @@ async function commitStrictBlockRules() { beforePermanentRules, beforeTemporaryRules, ] = await Promise.all([ - getDynamicRules({ ruleIds: [ STRICTBLOCK_BASE_RULE_ID ] }), - getSessionRules({ ruleIds: [ STRICTBLOCK_BASE_RULE_ID ] }), + dnr.getDynamicRules({ ruleIds: [ STRICTBLOCK_BASE_RULE_ID ] }), + dnr.getSessionRules({ ruleIds: [ STRICTBLOCK_BASE_RULE_ID ] }), ]); if ( beforePermanentRules?.length ) { ubolLog(`Remove 1 DNR dynamic strictblock rule`); @@ -427,11 +422,11 @@ async function updateDynamicRules() { dynamicRuleIds, sessionRuleIds, ] = await Promise.all([ - getDynamicRules().then(rules => + dnr.getDynamicRules().then(rules => rules.map(rule => rule.id) .filter(id => id < TRUSTED_DIRECTIVE_BASE_RULE_ID) ), - getSessionRules().then(rules => rules.map(rule => rule.id)), + dnr.getSessionRules().then(rules => rules.map(rule => rule.id)), updateRegexRules(dynamicRules), updateRemoveparamRules(dynamicRules), updateRedirectRules(dynamicRules), @@ -480,7 +475,7 @@ async function updateDynamicRules() { /******************************************************************************/ async function filteringModesToDNR(modes) { - const trustedRules = await getDynamicRules({ + const trustedRules = await dnr.getDynamicRules({ ruleIds: [ TRUSTED_DIRECTIVE_BASE_RULE_ID+0 ], }); const trustedRule = trustedRules.length !== 0 && trustedRules[0] || undefined; diff --git a/src/js/resources/set-constant.js b/src/js/resources/set-constant.js index 127f27bbbe910..66584fb81d3e6 100644 --- a/src/js/resources/set-constant.js +++ b/src/js/resources/set-constant.js @@ -61,6 +61,7 @@ export function validateConstantFn(trusted, raw, extraArgs = {}) { } else if ( raw.startsWith('{') && raw.endsWith('}') ) { try { value = safe.JSON_parse(raw).value; } catch(ex) { return; } } + return raw; } else { return; } From 2ccb01973ee009e6a2e414cd178e2b9dfce6a230 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Dec 2024 08:22:21 -0500 Subject: [PATCH 521/553] Fix regression in `set-constant` scriptlet Regression from 3417fe3d5d --- src/js/resources/set-constant.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/js/resources/set-constant.js b/src/js/resources/set-constant.js index 66584fb81d3e6..127f27bbbe910 100644 --- a/src/js/resources/set-constant.js +++ b/src/js/resources/set-constant.js @@ -61,7 +61,6 @@ export function validateConstantFn(trusted, raw, extraArgs = {}) { } else if ( raw.startsWith('{') && raw.endsWith('}') ) { try { value = safe.JSON_parse(raw).value; } catch(ex) { return; } } - return raw; } else { return; } From 51ef43c0de1bf7f57b61a085c0d6ae1c3024d168 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Dec 2024 08:38:29 -0500 Subject: [PATCH 522/553] 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 f8302e8163f60..d01a946110734 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.3.5", + "version": "1.61.3.6", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b5/uBlock0_1.61.3b5.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b6/uBlock0_1.61.3b6.firefox.signed.xpi" } ] } From 20a570ebe8e4a7573e71ac854563124657e39408 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Dec 2024 09:42:46 -0500 Subject: [PATCH 523/553] [mv3] Make strict-blocking checkbox dependent on filtering mode Related feedback: https://github.com/uBlockOrigin/uBOL-home/issues/214#issuecomment-2528072997 --- platform/mv3/extension/css/settings.css | 5 +++-- platform/mv3/extension/dashboard.html | 4 ++-- platform/mv3/extension/js/settings.js | 7 ++++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/platform/mv3/extension/css/settings.css b/platform/mv3/extension/css/settings.css index 02eb600370a5d..36f9c3d6f7516 100644 --- a/platform/mv3/extension/css/settings.css +++ b/platform/mv3/extension/css/settings.css @@ -30,8 +30,9 @@ body[data-forbid~="filteringMode"] section[data-pane="settings"] > div:has(> h3[ display: none; } -#showBlockedCount:has(input[type="checkbox"][disabled]) { - opacity: 0.5; +label:has(input[type="checkbox"][disabled]), +label:has(input[type="checkbox"][disabled]) + legend { + filter: var(--checkbox-disabled-filter); } #defaultFilteringMode { diff --git a/platform/mv3/extension/dashboard.html b/platform/mv3/extension/dashboard.html index 5ac63f3d06d0f..8ef9799041a2e 100644 --- a/platform/mv3/extension/dashboard.html +++ b/platform/mv3/extension/dashboard.html @@ -31,8 +31,6 @@

-

-

@@ -90,6 +88,8 @@

+

+

diff --git a/platform/mv3/extension/js/settings.js b/platform/mv3/extension/js/settings.js index 5b73144cb3dc1..d924d6f59ae70 100644 --- a/platform/mv3/extension/js/settings.js +++ b/platform/mv3/extension/js/settings.js @@ -67,7 +67,12 @@ function renderWidgets() { } } - qs$('#strictBlockMode input[type="checkbox"]').checked = cachedRulesetData.strictBlockMode; + { + const input = qs$('#strictBlockMode input[type="checkbox"]'); + const canStrictBlock = cachedRulesetData.defaultFilteringMode > 1; + input.checked = canStrictBlock && cachedRulesetData.strictBlockMode; + dom.attr(input, 'disabled', canStrictBlock ? null : ''); + } { dom.prop('#developerMode input[type="checkbox"]', 'checked', From 09554384efc7cffcc0cdc42888595eae5015830b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Dec 2024 10:48:24 -0500 Subject: [PATCH 524/553] [mv3] Replace "30-day Phishing Domain List" with "Malicious URL Blocklist" As per team feedback. --- platform/mv3/make-rulesets.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index 9df90963cc7be..220a723f21487 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -1288,11 +1288,11 @@ async function main() { // Handpicked rulesets from abroad await rulesetFromURLs({ - id: 'nrd.30day.phishing', - name: '30-day Phishing Domain List', + id: 'urlhaus.full', + name: 'Malicious URL Blocklist', enabled: true, - urls: [ 'https://raw.githubusercontent.com/xRuffKez/NRD/refs/heads/main/lists/30-day_phishing/domains-only/nrd-phishing-30day.txt' ], - homeURL: 'https://github.com/xRuffKez/NRD?tab=readme-ov-file', + urls: [ 'https://malware-filter.gitlab.io/malware-filter/urlhaus-filter-domains.txt' ], + homeURL: 'https://gitlab.com/malware-filter/urlhaus-filter', }); await rulesetFromURLs({ From 738f93da28ccec836eb160805732e314c5d02d5c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 9 Dec 2024 10:52:07 -0500 Subject: [PATCH 525/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/extension/_locales/ar/messages.json | 2 +- platform/mv3/extension/_locales/fy/messages.json | 12 ++++++------ platform/mv3/extension/_locales/nl/messages.json | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index 6a2aac1b594a3..62bc98175dd32 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -256,7 +256,7 @@ "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "الصفحة المحظورة تريد إعادة التوجيه إلى موقع آخر. إذا اخترت المتابعة، فسوف تنتقل مباشرة إلى: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/fy/messages.json b/platform/mv3/extension/_locales/fy/messages.json index 64b72057bbfb3..2c09835ec4d26 100644 --- a/platform/mv3/extension/_locales/fy/messages.json +++ b/platform/mv3/extension/_locales/fy/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Strikte blokkearring ynskeakelje", + "message": "Strange blokkearring ynskeakelje", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigaasje nei in potinsjeel net-winske websites sil blokkearre wurde, en jo krije in opsje om troch te gean.", + "message": "Navigaasje nei potinsjeel net-winske websites wurdt blokkearre, en jo krije de opsje om troch te gean.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -248,15 +248,15 @@ "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite hat opkeard dat de folgjende side laden wurd:", + "message": "uBO Lite hat it laden fan de folgjende side opkeard:", "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "De side is blokkearre fanwegen in oerienkommend filter yn {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "De blokkearre side wol jo omliede nei in oare website. As jo trochgean, navigearje jo streekrjocht nei: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { @@ -268,7 +268,7 @@ "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Slút dit finster", + "message": "Dit finster slute", "description": "A button to close the current tab" }, "strictblockDontWarn": { diff --git a/platform/mv3/extension/_locales/nl/messages.json b/platform/mv3/extension/_locales/nl/messages.json index a170351aa536e..c567d2d6704ed 100644 --- a/platform/mv3/extension/_locales/nl/messages.json +++ b/platform/mv3/extension/_locales/nl/messages.json @@ -236,7 +236,7 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigatie naar mogelijk ongewenste websites wordt geblokkeerd, en nu krijgt de mogelijkheid om door te gaan.", + "message": "Navigatie naar mogelijk ongewenste websites wordt geblokkeerd, en u krijgt de mogelijkheid om door te gaan.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { From 0e1800e68df8c5e82bd5cd93309b2c31064468c6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 10 Dec 2024 10:16:35 -0500 Subject: [PATCH 526/553] [mv3] Fix using Optimal as default mode when hosts permission allows it Related issue: https://github.com/uBlockOrigin/uBOL-home/discussions/161 --- platform/mv3/extension/js/background.js | 18 ++++++++++++------ platform/mv3/extension/js/mode-manager.js | 5 +++-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index e250d1025ed96..ce8c0ea93bd10 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -93,7 +93,11 @@ async function hasGreatPowers(origin) { }); } -function hasOmnipotence() { +async function hasOmnipotence() { + const manifest = runtime.getManifest(); + const hasOmnipotence = Array.isArray(manifest.host_permissions) && + manifest.host_permissions.includes(''); + if ( hasOmnipotence ) { return true; } return browser.permissions.contains({ origins: [ '' ], }); @@ -436,13 +440,15 @@ async function start() { if ( afterLevel === MODE_OPTIMAL ) { updateDynamicRules(); registerInjectables(); + process.firstRun = false; } - } - const disableFirstRunPage = await adminRead('disableFirstRunPage'); - if ( disableFirstRunPage !== true ) { - runtime.openOptionsPage(); } else { - process.firstRun = false; + const disableFirstRunPage = await adminRead('disableFirstRunPage'); + if ( disableFirstRunPage !== true ) { + runtime.openOptionsPage(); + } else { + process.firstRun = false; + } } } diff --git a/platform/mv3/extension/js/mode-manager.js b/platform/mv3/extension/js/mode-manager.js index 3630925caad9a..a8af4bbb930fe 100644 --- a/platform/mv3/extension/js/mode-manager.js +++ b/platform/mv3/extension/js/mode-manager.js @@ -252,10 +252,11 @@ async function writeFilteringModeDetails(afterDetails) { localWrite('filteringModeDetails', data); sessionWrite('filteringModeDetails', data); readFilteringModeDetails.cache = unserializeModeDetails(data); - - Promise.all([ + return Promise.all([ getDefaultFilteringMode(), getTrustedSites(), + localWrite('filteringModeDetails', data), + sessionWrite('filteringModeDetails', data), ]).then(results => { broadcastMessage({ defaultFilteringMode: results[0], From f14257d813e548cd11aedc29a2919ef3f461f63e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 10 Dec 2024 10:22:38 -0500 Subject: [PATCH 527/553] [mv3] Minor visual fix in dashboard's Welcome section --- platform/mv3/extension/css/settings.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/platform/mv3/extension/css/settings.css b/platform/mv3/extension/css/settings.css index 36f9c3d6f7516..237fb8191984e 100644 --- a/platform/mv3/extension/css/settings.css +++ b/platform/mv3/extension/css/settings.css @@ -9,6 +9,12 @@ body.firstRun .firstRun { display: block; padding: 8px; } +body .firstRun > *:first-child { + margin-top: 0; + } +body .firstRun > *:last-child { + margin-bottom: 0; + } h3 { margin: 1em 0; } From 7ed34708441c6b6629bab80f87df24884b5b1d57 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 11 Dec 2024 08:47:10 -0500 Subject: [PATCH 528/553] Improve `trusted-suppress-native-method` scriptlet Add support for the `stack` parameter. --- src/js/resources/scriptlets.js | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/js/resources/scriptlets.js b/src/js/resources/scriptlets.js index f8a761990b946..99d55c12c54e0 100644 --- a/src/js/resources/scriptlets.js +++ b/src/js/resources/scriptlets.js @@ -431,7 +431,7 @@ function objectPruneFn( ? safe.String_split.call(rawNeedlePaths, / +/) : []; if ( stackNeedleDetails.matchAll !== true ) { - if ( matchesStackTrace(stackNeedleDetails, extraArgs.logstack) === false ) { + if ( matchesStackTraceFn(stackNeedleDetails, extraArgs.logstack) === false ) { return; } } @@ -531,13 +531,13 @@ function objectFindOwnerFn( builtinScriptlets.push({ name: 'matches-stack-trace.fn', - fn: matchesStackTrace, + fn: matchesStackTraceFn, dependencies: [ 'get-exception-token.fn', 'safe-self.fn', ], }); -function matchesStackTrace( +function matchesStackTraceFn( needleDetails, logLevel = '' ) { @@ -1169,13 +1169,13 @@ function abortOnStackTrace( let v = owner[chain]; Object.defineProperty(owner, chain, { get: function() { - if ( matchesStackTrace(needleDetails, extraArgs.log) ) { + if ( matchesStackTraceFn(needleDetails, extraArgs.log) ) { throw new ReferenceError(getExceptionToken()); } return v; }, set: function(a) { - if ( matchesStackTrace(needleDetails, extraArgs.log) ) { + if ( matchesStackTraceFn(needleDetails, extraArgs.log) ) { throw new ReferenceError(getExceptionToken()); } v = a; @@ -3447,6 +3447,7 @@ builtinScriptlets.push({ requiresTrust: true, fn: trustedSuppressNativeMethod, dependencies: [ + 'matches-stack-trace.fn', 'proxy-apply.fn', 'safe-self.fn', ], @@ -3458,9 +3459,8 @@ function trustedSuppressNativeMethod( stack = '' ) { if ( methodPath === '' ) { return; } - if ( stack !== '' ) { return; } const safe = safeSelf(); - const logPrefix = safe.makeLogPrefix('trusted-suppress-native-method', methodPath, signature, how); + const logPrefix = safe.makeLogPrefix('trusted-suppress-native-method', methodPath, signature, how, stack); const signatureArgs = safe.String_split.call(signature, /\s*\|\s*/).map(v => { if ( /^".*"$/.test(v) ) { return { type: 'pattern', re: safe.patternToRegex(v.slice(1, -1)) }; @@ -3478,6 +3478,7 @@ function trustedSuppressNativeMethod( return { type: 'exact', value: undefined }; } }); + const stackNeedle = safe.initPattern(stack, { canNegate: true }); proxyApplyFn(methodPath, function(context) { const { callArgs } = context; if ( signature === '' ) { @@ -3499,6 +3500,11 @@ function trustedSuppressNativeMethod( } } } + if ( stackNeedle.matchAll !== true ) { + if ( matchesStackTraceFn(stackNeedle) === false ) { + return context.reflect(); + } + } if ( how === 'debug' ) { debugger; // eslint-disable-line no-debugger return context.reflect(); From 2d400b566126a80a13f9197546fb6a2e2061a94d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 11 Dec 2024 08:49:44 -0500 Subject: [PATCH 529/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2f2928b71c2b..7f0bac98aae50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/7ed3470844) - [Improve `trusted-replace-argument` scriptlet](https://github.com/gorhill/uBlock/commit/3417fe3d5d) - [Block media elements unconditionally when max size is set to 0](https://github.com/gorhill/uBlock/commit/36db7f8327) - Regression from From d193ae7d2f1fdc0dbfcdecf0fb3de63b6611e09b Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 11 Dec 2024 08:50:30 -0500 Subject: [PATCH 530/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 0ddc5cb2449d2..5b477a8fa08cf 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.3.6 \ No newline at end of file +1.61.3.7 \ No newline at end of file From 42c23f10d42212a6a11e937e7d0c433b2b8c720a Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 11 Dec 2024 09:05:37 -0500 Subject: [PATCH 531/553] 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 d01a946110734..bf1ef1e0896a5 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.3.6", + "version": "1.61.3.7", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b6/uBlock0_1.61.3b6.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b7/uBlock0_1.61.3b7.firefox.signed.xpi" } ] } From 9b2cf0169a2f7e7c1096b56a70914695d5af585d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 12 Dec 2024 10:18:42 -0500 Subject: [PATCH 532/553] Improve `trusted-suppress-native-method` scriptlet Add ability to log stack trace when verbose mode is enabled. --- src/js/resources/scriptlets.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/resources/scriptlets.js b/src/js/resources/scriptlets.js index 99d55c12c54e0..aeb0f096180c4 100644 --- a/src/js/resources/scriptlets.js +++ b/src/js/resources/scriptlets.js @@ -3501,7 +3501,8 @@ function trustedSuppressNativeMethod( } } if ( stackNeedle.matchAll !== true ) { - if ( matchesStackTraceFn(stackNeedle) === false ) { + const logLevel = safe.logLevel > 1 ? 'all' : ''; + if ( matchesStackTraceFn(stackNeedle, logLevel) === false ) { return context.reflect(); } } From 25a4433e2a21c87871a17344cd94c4a74b6f651c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 12 Dec 2024 10:50:32 -0500 Subject: [PATCH 533/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 5b477a8fa08cf..8e0b6eb3d6b63 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.3.7 \ No newline at end of file +1.61.3.8 \ No newline at end of file From d51a01f0f8f344d0d4cb86daf6a766eaa5af4c36 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 12 Dec 2024 12:34:04 -0500 Subject: [PATCH 534/553] Add regional list for UKR Related discussion: https://github.com/uBlockOrigin/uBlock-issues/issues/2692 --- assets/assets.dev.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/assets/assets.dev.json b/assets/assets.dev.json index a51bc714c3933..6681c5c979e02 100644 --- a/assets/assets.dev.json +++ b/assets/assets.dev.json @@ -830,7 +830,7 @@ "off": true, "title": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek", - "lang": "be kk tt ru uk uz", + "lang": "be kk tt ru uz", "contentURL": "https://raw.githubusercontent.com/easylist/ruadlist/master/RuAdList-uBO.txt", "cdnURLs": [ "https://cdn.jsdelivr.net/gh/dimisa-RUAdList/RUAdListCDN@main/lists/ruadlist.ubo.min.txt", @@ -922,6 +922,16 @@ "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, + "UKR-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇺🇦ua: Ukrainian Ad List", + "tags": "ads ukraine україна", + "lang": "uk", + "contentURL": "https://raw.githubusercontent.com/ukrainianfilters/lists/main/ads/ads.txt", + "supportURL": "https://github.com/ukrainianfilters/lists" + }, "VIE-1": { "content": "filters", "group": "regions", From bdc67b1e7f77b604fdc7690169fb2acc544b344c Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 12 Dec 2024 12:40:33 -0500 Subject: [PATCH 535/553] 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 bf1ef1e0896a5..211c105732f59 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.3.7", + "version": "1.61.3.8", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b7/uBlock0_1.61.3b7.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b8/uBlock0_1.61.3b8.firefox.signed.xpi" } ] } From b7bacc0fc115d5d9cc977e7479207ed0157a5737 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 12 Dec 2024 19:47:48 -0500 Subject: [PATCH 536/553] Fix bad filter in urlhaus Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/256 --- platform/mv3/make-rulesets.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index 220a723f21487..1dc121d813889 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -1291,7 +1291,13 @@ async function main() { id: 'urlhaus.full', name: 'Malicious URL Blocklist', enabled: true, - urls: [ 'https://malware-filter.gitlab.io/malware-filter/urlhaus-filter-domains.txt' ], + urls: [ + 'https://malware-filter.gitlab.io/malware-filter/urlhaus-filter-domains.txt', + ], + filters: [ + // https://github.com/uBlockOrigin/uBOL-home/issues/256 + '192.168.1.1$badfilter', + ], homeURL: 'https://gitlab.com/malware-filter/urlhaus-filter', }); From 54ebea31f773497afdd5a235979195edfc2d73c2 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 12 Dec 2024 20:00:08 -0500 Subject: [PATCH 537/553] Use HOSTS version of "Malicious URL Blocklist" Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/256 --- assets/assets.json | 12 +++++++++++- platform/mv3/make-rulesets.js | 4 +--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/assets/assets.json b/assets/assets.json index 6449dbe932434..82b4505df0c81 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -830,7 +830,7 @@ "off": true, "title": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek", - "lang": "be kk tt ru uk uz", + "lang": "be kk tt ru uz", "contentURL": "https://raw.githubusercontent.com/easylist/ruadlist/master/RuAdList-uBO.txt", "cdnURLs": [ "https://cdn.jsdelivr.net/gh/dimisa-RUAdList/RUAdListCDN@main/lists/ruadlist.ubo.min.txt", @@ -922,6 +922,16 @@ "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, + "UKR-0": { + "content": "filters", + "group": "regions", + "off": true, + "title": "🇺🇦ua: Ukrainian Ad List", + "tags": "ads ukraine україна", + "lang": "uk", + "contentURL": "https://raw.githubusercontent.com/ukrainianfilters/lists/main/ads/ads.txt", + "supportURL": "https://github.com/ukrainianfilters/lists" + }, "VIE-1": { "content": "filters", "group": "regions", diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index 1dc121d813889..e23de3e44a1a6 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -1292,11 +1292,9 @@ async function main() { name: 'Malicious URL Blocklist', enabled: true, urls: [ - 'https://malware-filter.gitlab.io/malware-filter/urlhaus-filter-domains.txt', + 'https://malware-filter.gitlab.io/malware-filter/urlhaus-filter-hosts.txt', ], filters: [ - // https://github.com/uBlockOrigin/uBOL-home/issues/256 - '192.168.1.1$badfilter', ], homeURL: 'https://gitlab.com/malware-filter/urlhaus-filter', }); From b1936524f79c33b3d59cf9d561744409832b0f38 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Thu, 12 Dec 2024 20:06:15 -0500 Subject: [PATCH 538/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/description/webstore.be.txt | 6 +++--- platform/mv3/extension/_locales/be/messages.json | 6 +++--- platform/mv3/extension/_locales/pt_PT/messages.json | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/platform/mv3/description/webstore.be.txt b/platform/mv3/description/webstore.be.txt index c23daa3fb6dd8..d9749c59cca75 100644 --- a/platform/mv3/description/webstore.be.txt +++ b/platform/mv3/description/webstore.be.txt @@ -1,11 +1,11 @@ uBO Лайт (uBOL) гэта блакіроўшчык кантэнту з меншымі патрабаваннямі да дазволаў заснаваны на MV3 -The default ruleset corresponds to uBlock Origin's default filterset: +Прадвызначаны набор правіл адпавядае тыпавому набору фільтраў uBlock Origin: -- uBlock Origin's built-in filter lists +- Убудаваныя спісы фільтраў uBlock Origin - EasyList - EasyPrivacy -- Peter Lowe’s Ad and tracking server list +- Спіс сервераў рэкламы ды адсочвання ад Peter Lowe You can enable more rulesets by visiting the options page -- click the _Cogs_ icon in the popup panel. diff --git a/platform/mv3/extension/_locales/be/messages.json b/platform/mv3/extension/_locales/be/messages.json index ebed0a2a7309d..0063666a5c310 100644 --- a/platform/mv3/extension/_locales/be/messages.json +++ b/platform/mv3/extension/_locales/be/messages.json @@ -244,7 +244,7 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Старонка заблакавана", + "message": "Старонка заблакаваная", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { @@ -252,11 +252,11 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Старонка была заблакаваная, бо трапіла ў фільтр праз {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Заблакаваная старонка мае намер перанакіраваць на іншы сайт. Калі вырашыце працягнуць, вы пяройдзеце непасрэдна на: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { diff --git a/platform/mv3/extension/_locales/pt_PT/messages.json b/platform/mv3/extension/_locales/pt_PT/messages.json index 9be55f5d94ae5..d02147916eecf 100644 --- a/platform/mv3/extension/_locales/pt_PT/messages.json +++ b/platform/mv3/extension/_locales/pt_PT/messages.json @@ -108,7 +108,7 @@ "description": "Header of 'Report a filter issue' section in Support pane" }, "supportS3P1": { - "message": "Relate problemas de filtros em websites específicos no rastreador de problemas uBlockOrigin/uAssets. Requer uma conta no GitHub.", + "message": "Relate problemas de filtros em websites específicos no controlador de problemas uBlockOrigin/uAssets. Requer uma conta GitHub.", "description": "First paragraph of 'Filter issues' section in Support pane" }, "supportS6P1S1": { @@ -224,11 +224,11 @@ "description": "The header text for the 'Behavior' section" }, "autoReloadLabel": { - "message": "Recarrega automaticamente a página ao mudar o modo de filtragem", + "message": "Recarregar automaticamente a página ao mudar o modo de filtragem", "description": "Label for a checkbox in the options page" }, "showBlockedCountLabel": { - "message": "Mostra o número de pedidos bloqueados no ícone da barra de ferramentas", + "message": "Mostrar o número de pedidos bloqueados no ícone da barra de ferramentas", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { From 2b6d67b29a1270695a280ccd1e2e0dd68faee64e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 13 Dec 2024 08:30:27 -0500 Subject: [PATCH 539/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/extension/_locales/el/messages.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/mv3/extension/_locales/el/messages.json b/platform/mv3/extension/_locales/el/messages.json index 66f33670c7be0..5c69bd869de45 100644 --- a/platform/mv3/extension/_locales/el/messages.json +++ b/platform/mv3/extension/_locales/el/messages.json @@ -264,19 +264,19 @@ "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Επιστροφή", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Κλείσιμο του παραθύρου", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Να μην προειδοποιηθώ ξανά για αυτόν τον ιστότοπο", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Συνέχεια", "description": "A button to navigate to the blocked page" } } From 8ba71f09d756b96f081f423efb5006ce6b628974 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 13 Dec 2024 10:54:01 -0500 Subject: [PATCH 540/553] Improve quote usage in filter options and scriptlets Related feedback: https://github.com/uBlockOrigin/uBlock-issues/issues/760#issuecomment-2540436382 Using quotes in filter option values is meant to remove ambiguity when the value contains special characters. This was not working when the value started with `$`. For example, fixes usage of quotes in: $removeparam='$deep_link' Also, fixed logger output for scriptlets using empty parameters in quotes. --- src/js/scriptlet-filtering-core.js | 2 +- src/js/static-filtering-parser.js | 19 ++++++++----------- src/js/static-net-filtering.js | 2 +- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/js/scriptlet-filtering-core.js b/src/js/scriptlet-filtering-core.js index 907844fbc198a..0fec05c2ba7a2 100644 --- a/src/js/scriptlet-filtering-core.js +++ b/src/js/scriptlet-filtering-core.js @@ -99,7 +99,7 @@ const patchScriptlet = (content, arglist) => { }; const requote = s => { - if ( /^(["'`]).+\1$|,/.test(s) === false ) { return s; } + if ( /^(["'`]).*\1$|,|^$/.test(s) === false ) { return s; } if ( s.includes("'") === false ) { return `'${s}'`; } if ( s.includes('"') === false ) { return `"${s}"`; } if ( s.includes('`') === false ) { return `\`${s}\``; } diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index 2be165eb107ef..d3b4ca48416cf 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -1477,18 +1477,15 @@ export class AstFilterParser { if ( j === -1 ) { return end; } if ( (j+1) === end ) { return end; } for (;;) { - const before = s.charCodeAt(j-1); - if ( j !== start && before === 0x24 /* $ */ ) { return -1; } - const after = s.charCodeAt(j+1); - if ( - after !== 0x29 /* ) */ && - after !== 0x2F /* / */ && - after !== 0x7C /* | */ && - before !== 0x5C /* \ */ - ) { - return j; + const before = s.charAt(j-1); + if ( before === '$' ) { return -1; } + const after = s.charAt(j+1); + if ( ')/|'.includes(after) === false ) { + if ( before === '' || '"\'\\`'.includes(before) === false ) { + return j; + } } - if ( j <= start ) { break; } + if ( j === start ) { break; } j = s.lastIndexOf('$', j-1); if ( j === -1 ) { break; } } diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index f084180ffccf3..58b6570705c2d 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -419,7 +419,7 @@ class LogData { } static requote(s) { - if ( /^(["'`]).+\1$|,/.test(s) === false ) { return s; } + if ( /^\$|^(["'`]).*\1$|,/.test(s) === false ) { return s; } if ( s.includes("'") === false ) { return `'${s}'`; } if ( s.includes('"') === false ) { return `"${s}"`; } if ( s.includes('`') === false ) { return `\`${s}\``; } From 439d608d03cfc4c4d5f0a2c0fdebe72b10d36508 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 13 Dec 2024 11:15:36 -0500 Subject: [PATCH 541/553] Revert "Use HOSTS version of "Malicious URL Blocklist"" This reverts commit 54ebea31f773497afdd5a235979195edfc2d73c2. --- assets/assets.json | 12 +----------- platform/mv3/make-rulesets.js | 4 +++- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/assets/assets.json b/assets/assets.json index 82b4505df0c81..6449dbe932434 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -830,7 +830,7 @@ "off": true, "title": "🇷🇺ru 🇺🇦ua 🇺🇿uz 🇰🇿kz: RU AdList", "tags": "ads belarusian беларуская kazakh tatar russian русский ukrainian українська uzbek", - "lang": "be kk tt ru uz", + "lang": "be kk tt ru uk uz", "contentURL": "https://raw.githubusercontent.com/easylist/ruadlist/master/RuAdList-uBO.txt", "cdnURLs": [ "https://cdn.jsdelivr.net/gh/dimisa-RUAdList/RUAdListCDN@main/lists/ruadlist.ubo.min.txt", @@ -922,16 +922,6 @@ "supportURL": "https://github.com/AdguardTeam/AdguardFilters#adguard-filters", "instructionURL": "https://adguard.com/kb/general/ad-filtering/adguard-filters/" }, - "UKR-0": { - "content": "filters", - "group": "regions", - "off": true, - "title": "🇺🇦ua: Ukrainian Ad List", - "tags": "ads ukraine україна", - "lang": "uk", - "contentURL": "https://raw.githubusercontent.com/ukrainianfilters/lists/main/ads/ads.txt", - "supportURL": "https://github.com/ukrainianfilters/lists" - }, "VIE-1": { "content": "filters", "group": "regions", diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index e23de3e44a1a6..1dc121d813889 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -1292,9 +1292,11 @@ async function main() { name: 'Malicious URL Blocklist', enabled: true, urls: [ - 'https://malware-filter.gitlab.io/malware-filter/urlhaus-filter-hosts.txt', + 'https://malware-filter.gitlab.io/malware-filter/urlhaus-filter-domains.txt', ], filters: [ + // https://github.com/uBlockOrigin/uBOL-home/issues/256 + '192.168.1.1$badfilter', ], homeURL: 'https://gitlab.com/malware-filter/urlhaus-filter', }); From 0f373b7639215738f17a76ce88b9fa0b5abe5cc9 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 13 Dec 2024 11:18:18 -0500 Subject: [PATCH 542/553] Use HOSTS version of "Malicious URL Blocklist" Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/256 --- platform/mv3/make-rulesets.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index 1dc121d813889..e23de3e44a1a6 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -1292,11 +1292,9 @@ async function main() { name: 'Malicious URL Blocklist', enabled: true, urls: [ - 'https://malware-filter.gitlab.io/malware-filter/urlhaus-filter-domains.txt', + 'https://malware-filter.gitlab.io/malware-filter/urlhaus-filter-hosts.txt', ], filters: [ - // https://github.com/uBlockOrigin/uBOL-home/issues/256 - '192.168.1.1$badfilter', ], homeURL: 'https://gitlab.com/malware-filter/urlhaus-filter', }); From 65f64a58095de962dc13d5b1edb72be6d68508a8 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 13 Dec 2024 11:29:59 -0500 Subject: [PATCH 543/553] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f0bac98aae50..95caa55a11a3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- [Improve quote usage in filter options and scriptlets](https://github.com/gorhill/uBlock/commit/8ba71f09d7) - [Improve `trusted-suppress-native-method` scriptlet](https://github.com/gorhill/uBlock/commit/7ed3470844) - [Improve `trusted-replace-argument` scriptlet](https://github.com/gorhill/uBlock/commit/3417fe3d5d) - [Block media elements unconditionally when max size is set to 0](https://github.com/gorhill/uBlock/commit/36db7f8327) From 73b85efae2fa839f068c4237af0179fc1935f4f3 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 13 Dec 2024 11:31:31 -0500 Subject: [PATCH 544/553] New revision for dev build --- dist/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/version b/dist/version index 8e0b6eb3d6b63..08ceb89e82319 100644 --- a/dist/version +++ b/dist/version @@ -1 +1 @@ -1.61.3.8 \ No newline at end of file +1.61.3.9 \ No newline at end of file From fbe203c101b2dd5dd1fe3d4274827f95b80b1b13 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 13 Dec 2024 11:36:20 -0500 Subject: [PATCH 545/553] 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 211c105732f59..3d1dabb89b96e 100644 --- a/dist/firefox/updates.json +++ b/dist/firefox/updates.json @@ -3,9 +3,9 @@ "uBlock0@raymondhill.net": { "updates": [ { - "version": "1.61.3.8", + "version": "1.61.3.9", "browser_specific_settings": { "gecko": { "strict_min_version": "78.0" } }, - "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b8/uBlock0_1.61.3b8.firefox.signed.xpi" + "update_link": "https://github.com/gorhill/uBlock/releases/download/1.61.3b9/uBlock0_1.61.3b9.firefox.signed.xpi" } ] } From ac9e12e17c722bffe885343647d74a366d7c78b9 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 14 Dec 2024 08:45:17 -0500 Subject: [PATCH 546/553] [mv3] Add "Malware protection, security" section in "Filter lists" pane Additionally, add "Openphish Domain Blocklist" as stock list. --- .../mv3/extension/_locales/en/messages.json | 2 +- platform/mv3/extension/js/filter-lists.js | 5 +++ platform/mv3/make-rulesets.js | 36 ++++++++++++------- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/platform/mv3/extension/_locales/en/messages.json b/platform/mv3/extension/_locales/en/messages.json index ad9d26911371e..c40e17428ec7c 100644 --- a/platform/mv3/extension/_locales/en/messages.json +++ b/platform/mv3/extension/_locales/en/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/js/filter-lists.js b/platform/mv3/extension/js/filter-lists.js index daa647c5e28c9..2356d57ce13d7 100644 --- a/platform/mv3/extension/js/filter-lists.js +++ b/platform/mv3/extension/js/filter-lists.js @@ -218,6 +218,11 @@ export function renderFilterLists(rulesetData) { rulesetDetails.filter(ruleset => ruleset.id === 'default' ), + ], [ + 'malware', + rulesetDetails.filter(ruleset => + ruleset.group === 'malware' + ), ], [ 'annoyances', rulesetDetails.filter(ruleset => diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index e23de3e44a1a6..f2c62671f359e 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -1186,23 +1186,22 @@ async function main() { log(`Secret: ${secret}`); // Assemble all default lists as the default ruleset - const contentURLs = [ - 'https://ublockorigin.github.io/uAssets/filters/filters.min.txt', - 'https://ublockorigin.github.io/uAssets/filters/badware.min.txt', - 'https://ublockorigin.github.io/uAssets/filters/privacy.min.txt', - 'https://ublockorigin.github.io/uAssets/filters/unbreak.min.txt', - 'https://ublockorigin.github.io/uAssets/filters/quick-fixes.min.txt', - 'https://ublockorigin.github.io/uAssets/filters/ubol-filters.txt', - 'https://ublockorigin.github.io/uAssets/thirdparties/easylist.txt', - 'https://ublockorigin.github.io/uAssets/thirdparties/easyprivacy.txt', - 'https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext', - ]; await rulesetFromURLs({ id: 'default', name: 'Ads, trackers, miners, and more' , enabled: true, secret, - urls: contentURLs, + urls: [ + 'https://ublockorigin.github.io/uAssets/filters/filters.min.txt', + 'https://ublockorigin.github.io/uAssets/filters/badware.min.txt', + 'https://ublockorigin.github.io/uAssets/filters/privacy.min.txt', + 'https://ublockorigin.github.io/uAssets/filters/unbreak.min.txt', + 'https://ublockorigin.github.io/uAssets/filters/quick-fixes.min.txt', + 'https://ublockorigin.github.io/uAssets/filters/ubol-filters.txt', + 'https://ublockorigin.github.io/uAssets/thirdparties/easylist.txt', + 'https://ublockorigin.github.io/uAssets/thirdparties/easyprivacy.txt', + 'https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext', + ], dnrURL: 'https://ublockorigin.github.io/uAssets/dnr/default.json', homeURL: 'https://github.com/uBlockOrigin/uAssets', filters: [ @@ -1290,6 +1289,7 @@ async function main() { await rulesetFromURLs({ id: 'urlhaus.full', name: 'Malicious URL Blocklist', + group: 'malware', enabled: true, urls: [ 'https://malware-filter.gitlab.io/malware-filter/urlhaus-filter-hosts.txt', @@ -1298,6 +1298,18 @@ async function main() { ], homeURL: 'https://gitlab.com/malware-filter/urlhaus-filter', }); + await rulesetFromURLs({ + id: 'openphish.domains', + name: 'Openphish Domain Blocklist', + group: 'malware', + enabled: false, + urls: [ + 'https://raw.githubusercontent.com/stephenhawk8054/openphish-adblock/refs/heads/main/filters_init_domains.txt', + ], + filters: [ + ], + homeURL: 'https://github.com/stephenhawk8054/openphish-adblock', + }); await rulesetFromURLs({ id: 'stevenblack-hosts', From 5e0802fd6778641a615a618cf33a66dc5c8dd3b4 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 14 Dec 2024 08:53:15 -0500 Subject: [PATCH 547/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/cs/messages.json | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/platform/mv3/extension/_locales/cs/messages.json b/platform/mv3/extension/_locales/cs/messages.json index 585475287b5a5..3de9ca455861c 100644 --- a/platform/mv3/extension/_locales/cs/messages.json +++ b/platform/mv3/extension/_locales/cs/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Povolit přísné blokování", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "Navigace na potenciálně nežádoucí stránky bude zablokována a bude vám nabídnuta možnost pokračovat.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,39 +244,39 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Stránka zablokována", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite zabránil načtení následující stránky:", "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "Stránka byla zablokována z důvodu shodného filtru v {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { - "message": "The blocked page wants to redirect to another site. If you choose to proceed, you will navigate directly to: {{url}}", + "message": "Zablokovaná stránka vás chce přesměrovat na jiný web. Pokud se rozhodnete pokračovat, přejdete přímo na: {{url}}", "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "bez parametrů", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Zpět", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Zavřít toto okno", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Nevarujte mě znovu o této stránce", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Pokračovat", "description": "A button to navigate to the blocked page" } } From c2a4b72feed326aa84499827c1fd254e905ac487 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 14 Dec 2024 08:57:22 -0500 Subject: [PATCH 548/553] Import translation work from https://crowdin.com/project/ublock --- platform/mv3/extension/_locales/az/messages.json | 2 +- platform/mv3/extension/_locales/br_FR/messages.json | 2 +- platform/mv3/extension/_locales/cv/messages.json | 2 +- platform/mv3/extension/_locales/cy/messages.json | 2 +- platform/mv3/extension/_locales/eo/messages.json | 2 +- platform/mv3/extension/_locales/fa/messages.json | 2 +- platform/mv3/extension/_locales/gl/messages.json | 2 +- platform/mv3/extension/_locales/gu/messages.json | 2 +- platform/mv3/extension/_locales/kk/messages.json | 2 +- platform/mv3/extension/_locales/kn/messages.json | 2 +- platform/mv3/extension/_locales/lt/messages.json | 2 +- platform/mv3/extension/_locales/mk/messages.json | 2 +- platform/mv3/extension/_locales/ml/messages.json | 2 +- platform/mv3/extension/_locales/mr/messages.json | 2 +- platform/mv3/extension/_locales/ms/messages.json | 2 +- platform/mv3/extension/_locales/oc/messages.json | 2 +- platform/mv3/extension/_locales/pa/messages.json | 2 +- platform/mv3/extension/_locales/sl/messages.json | 2 +- platform/mv3/extension/_locales/so/messages.json | 2 +- platform/mv3/extension/_locales/sw/messages.json | 2 +- platform/mv3/extension/_locales/ta/messages.json | 2 +- platform/mv3/extension/_locales/te/messages.json | 2 +- platform/mv3/extension/_locales/th/messages.json | 2 +- platform/mv3/extension/_locales/ur/messages.json | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/platform/mv3/extension/_locales/az/messages.json b/platform/mv3/extension/_locales/az/messages.json index 8172ac24b5bf2..b0b311a8bb5af 100644 --- a/platform/mv3/extension/_locales/az/messages.json +++ b/platform/mv3/extension/_locales/az/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/br_FR/messages.json b/platform/mv3/extension/_locales/br_FR/messages.json index 31ae55bb1298b..1b3d92a2c42d5 100644 --- a/platform/mv3/extension/_locales/br_FR/messages.json +++ b/platform/mv3/extension/_locales/br_FR/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/cv/messages.json b/platform/mv3/extension/_locales/cv/messages.json index 515422f202c23..b5d2ec8498ea7 100644 --- a/platform/mv3/extension/_locales/cv/messages.json +++ b/platform/mv3/extension/_locales/cv/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/cy/messages.json b/platform/mv3/extension/_locales/cy/messages.json index e8f7e1cb5ba9a..3e444d525379e 100644 --- a/platform/mv3/extension/_locales/cy/messages.json +++ b/platform/mv3/extension/_locales/cy/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/eo/messages.json b/platform/mv3/extension/_locales/eo/messages.json index ed989e8b46d37..90e4a10343dfd 100644 --- a/platform/mv3/extension/_locales/eo/messages.json +++ b/platform/mv3/extension/_locales/eo/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/fa/messages.json b/platform/mv3/extension/_locales/fa/messages.json index e9b868325b9e9..743018c21a4cd 100644 --- a/platform/mv3/extension/_locales/fa/messages.json +++ b/platform/mv3/extension/_locales/fa/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/gl/messages.json b/platform/mv3/extension/_locales/gl/messages.json index 9afa714e8a941..c6e3cc2daa151 100644 --- a/platform/mv3/extension/_locales/gl/messages.json +++ b/platform/mv3/extension/_locales/gl/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/gu/messages.json b/platform/mv3/extension/_locales/gu/messages.json index 515422f202c23..b5d2ec8498ea7 100644 --- a/platform/mv3/extension/_locales/gu/messages.json +++ b/platform/mv3/extension/_locales/gu/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/kk/messages.json b/platform/mv3/extension/_locales/kk/messages.json index 515422f202c23..b5d2ec8498ea7 100644 --- a/platform/mv3/extension/_locales/kk/messages.json +++ b/platform/mv3/extension/_locales/kk/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/kn/messages.json b/platform/mv3/extension/_locales/kn/messages.json index 4eead835febb8..94a0f5288d013 100644 --- a/platform/mv3/extension/_locales/kn/messages.json +++ b/platform/mv3/extension/_locales/kn/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/lt/messages.json b/platform/mv3/extension/_locales/lt/messages.json index abdd54d2d3c21..964c21d1f5bb8 100644 --- a/platform/mv3/extension/_locales/lt/messages.json +++ b/platform/mv3/extension/_locales/lt/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/mk/messages.json b/platform/mv3/extension/_locales/mk/messages.json index 3a61406f87fec..39a5b44a517e6 100644 --- a/platform/mv3/extension/_locales/mk/messages.json +++ b/platform/mv3/extension/_locales/mk/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/ml/messages.json b/platform/mv3/extension/_locales/ml/messages.json index 9a5d77e6d00b4..2dd452d2c989f 100644 --- a/platform/mv3/extension/_locales/ml/messages.json +++ b/platform/mv3/extension/_locales/ml/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/mr/messages.json b/platform/mv3/extension/_locales/mr/messages.json index 515422f202c23..b5d2ec8498ea7 100644 --- a/platform/mv3/extension/_locales/mr/messages.json +++ b/platform/mv3/extension/_locales/mr/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/ms/messages.json b/platform/mv3/extension/_locales/ms/messages.json index c90d647d292dc..828adc67eef3d 100644 --- a/platform/mv3/extension/_locales/ms/messages.json +++ b/platform/mv3/extension/_locales/ms/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/oc/messages.json b/platform/mv3/extension/_locales/oc/messages.json index 515422f202c23..b5d2ec8498ea7 100644 --- a/platform/mv3/extension/_locales/oc/messages.json +++ b/platform/mv3/extension/_locales/oc/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/pa/messages.json b/platform/mv3/extension/_locales/pa/messages.json index dcd08462ffb0f..fbf91d2ece372 100644 --- a/platform/mv3/extension/_locales/pa/messages.json +++ b/platform/mv3/extension/_locales/pa/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/sl/messages.json b/platform/mv3/extension/_locales/sl/messages.json index 515422f202c23..b5d2ec8498ea7 100644 --- a/platform/mv3/extension/_locales/sl/messages.json +++ b/platform/mv3/extension/_locales/sl/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/so/messages.json b/platform/mv3/extension/_locales/so/messages.json index 515422f202c23..b5d2ec8498ea7 100644 --- a/platform/mv3/extension/_locales/so/messages.json +++ b/platform/mv3/extension/_locales/so/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/sw/messages.json b/platform/mv3/extension/_locales/sw/messages.json index 515422f202c23..b5d2ec8498ea7 100644 --- a/platform/mv3/extension/_locales/sw/messages.json +++ b/platform/mv3/extension/_locales/sw/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/ta/messages.json b/platform/mv3/extension/_locales/ta/messages.json index 515422f202c23..b5d2ec8498ea7 100644 --- a/platform/mv3/extension/_locales/ta/messages.json +++ b/platform/mv3/extension/_locales/ta/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/te/messages.json b/platform/mv3/extension/_locales/te/messages.json index 5f4823359b226..1dbee4ca9a2e2 100644 --- a/platform/mv3/extension/_locales/te/messages.json +++ b/platform/mv3/extension/_locales/te/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/th/messages.json b/platform/mv3/extension/_locales/th/messages.json index 31a0642920e39..fea659106cd36 100644 --- a/platform/mv3/extension/_locales/th/messages.json +++ b/platform/mv3/extension/_locales/th/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/ur/messages.json b/platform/mv3/extension/_locales/ur/messages.json index d620ff2b57c9e..97cf4fd512537 100644 --- a/platform/mv3/extension/_locales/ur/messages.json +++ b/platform/mv3/extension/_locales/ur/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Malware domains", + "message": "Malware protection, security", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { From c279cded17051ec9dcb92afbb829aee68df52ac6 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 14 Dec 2024 09:01:23 -0500 Subject: [PATCH 549/553] [mv3] Minor code review --- platform/mv3/extension/js/ruleset-manager.js | 22 ++++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/platform/mv3/extension/js/ruleset-manager.js b/platform/mv3/extension/js/ruleset-manager.js index 04bfb3b6f241d..4e3ab50b2e382 100644 --- a/platform/mv3/extension/js/ruleset-manager.js +++ b/platform/mv3/extension/js/ruleset-manager.js @@ -23,11 +23,8 @@ import { browser, dnr, i18n, - runtime, -} from './ext.js'; - -import { localRead, localRemove, localWrite, + runtime, sessionRead, sessionRemove, sessionWrite, } from './ext.js'; @@ -578,13 +575,17 @@ async function defaultRulesetsFromLanguage() { `\\b(${Array.from(langSet).join('|')})\\b` ); + const manifest = runtime.getManifest(); + const rulesets = manifest.declarative_net_request.rule_resources; const rulesetDetails = await getRulesetDetails(); const out = []; - for ( const [ id, details ] of rulesetDetails ) { - if ( details.enabled ) { + for ( const ruleset of rulesets ) { + const { id, enabled } = ruleset; + if ( enabled ) { out.push(id); continue; } + const details = rulesetDetails.get(id); if ( typeof details.lang !== 'string' ) { continue; } if ( reTargetLang.test(details.lang) === false ) { continue; } out.push(id); @@ -598,12 +599,15 @@ async function patchDefaultRulesets() { const [ oldDefaultIds = [], newDefaultIds, - newIds, ] = await Promise.all([ localRead('defaultRulesetIds'), defaultRulesetsFromLanguage(), - getRulesetDetails(), ]); + + const manifest = runtime.getManifest(); + const validIds = new Set( + manifest.declarative_net_request.rule_resources.map(r => r.id) + ); const toAdd = []; const toRemove = []; for ( const id of newDefaultIds ) { @@ -615,7 +619,7 @@ async function patchDefaultRulesets() { toRemove.push(id); } for ( const id of rulesetConfig.enabledRulesets ) { - if ( newIds.has(id) ) { continue; } + if ( validIds.has(id) ) { continue; } toRemove.push(id); } localWrite('defaultRulesetIds', newDefaultIds); From 9c75814525cad2ae4e963f0cb305b1c676a64308 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 14 Dec 2024 09:03:17 -0500 Subject: [PATCH 550/553] Use code quotes for filters in logger export feature --- src/js/logger-ui.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/logger-ui.js b/src/js/logger-ui.js index e76586a50f854..0b9c31dd99d57 100644 --- a/src/js/logger-ui.js +++ b/src/js/logger-ui.js @@ -2779,7 +2779,7 @@ const loggerStats = (( ) => { const outputOne = []; for ( let i = 0; i < fields.length; i++ ) { const field = fields[i]; - let code = /\b(?:www\.|https?:\/\/)/.test(field) ? '`' : ''; + const code = i === 1 || /\b(?:www\.|https?:\/\/)/.test(field) ? '`' : ''; outputOne.push(` ${code}${field.replace(/\|/g, '\\|')}${code} `); } outputAll.push(outputOne.join('|')); From d47876c54710e57dd099d522e6aeebc782392506 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 14 Dec 2024 11:00:21 -0500 Subject: [PATCH 551/553] Use combined list for UKR As per feedback: https://github.com/uBlockOrigin/uBlock-issues/issues/2692#issuecomment-2543153158 --- assets/assets.dev.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/assets.dev.json b/assets/assets.dev.json index 6681c5c979e02..aa529d23614af 100644 --- a/assets/assets.dev.json +++ b/assets/assets.dev.json @@ -926,10 +926,10 @@ "content": "filters", "group": "regions", "off": true, - "title": "🇺🇦ua: Ukrainian Ad List", + "title": "🇺🇦ua: Ukrainian Filters", "tags": "ads ukraine україна", "lang": "uk", - "contentURL": "https://raw.githubusercontent.com/ukrainianfilters/lists/main/ads/ads.txt", + "contentURL": "https://raw.githubusercontent.com/ukrainianfilters/lists/main/combined/uBO/uBO.txt", "supportURL": "https://github.com/ukrainianfilters/lists" }, "VIE-1": { From 9fbc23abfca5ed42caff357c12398ba4c7ec6181 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 15 Dec 2024 15:38:40 -0500 Subject: [PATCH 552/553] Import translation work from https://crowdin.com/project/ublock --- .../mv3/extension/_locales/ar/messages.json | 2 +- .../mv3/extension/_locales/de/messages.json | 2 +- .../mv3/extension/_locales/es/messages.json | 2 +- .../mv3/extension/_locales/it/messages.json | 18 +++++++++--------- src/_locales/br_FR/messages.json | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/platform/mv3/extension/_locales/ar/messages.json b/platform/mv3/extension/_locales/ar/messages.json index 62bc98175dd32..c4fd37b0e2c92 100644 --- a/platform/mv3/extension/_locales/ar/messages.json +++ b/platform/mv3/extension/_locales/ar/messages.json @@ -252,7 +252,7 @@ "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { - "message": "The page was blocked because of a matching filter in {{listname}}.", + "message": "تم حظر الصفحة بسبب وجود فلتر مطابق في {{listname}}.", "description": "Text informing about what is causing the page to be blocked" }, "strictblockRedirectSentence1": { diff --git a/platform/mv3/extension/_locales/de/messages.json b/platform/mv3/extension/_locales/de/messages.json index de200b1f5e779..22b4bb99bb3cb 100644 --- a/platform/mv3/extension/_locales/de/messages.json +++ b/platform/mv3/extension/_locales/de/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Domains mit Schadsoftware", + "message": "Schutz vor Schadsoftware, Sicherheit", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/es/messages.json b/platform/mv3/extension/_locales/es/messages.json index 10eec6a0d1a76..e17dfe967f5e4 100644 --- a/platform/mv3/extension/_locales/es/messages.json +++ b/platform/mv3/extension/_locales/es/messages.json @@ -60,7 +60,7 @@ "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupMalware": { - "message": "Dominios de malware", + "message": "Protección de malware, seguridad", "description": "Header for a ruleset section in 'Filter lists pane'" }, "3pGroupAnnoyances": { diff --git a/platform/mv3/extension/_locales/it/messages.json b/platform/mv3/extension/_locales/it/messages.json index 3a7da35ac8aa9..e454824ab0d3b 100644 --- a/platform/mv3/extension/_locales/it/messages.json +++ b/platform/mv3/extension/_locales/it/messages.json @@ -232,11 +232,11 @@ "description": "Label for a checkbox in the options page" }, "enableStrictBlockLabel": { - "message": "Enable strict blocking", + "message": "Abilita il blocco rigido", "description": "Label for a checkbox in the options page" }, "enableStrictBlockLegend": { - "message": "Navigation to potentially undesirable sites will be blocked, and you will be offered the option to proceed.", + "message": "La navigazione verso siti potenzialmente indesiderati verrà bloccata e ti verrà offerta la possibilità di procedere.", "description": "Label for a checkbox in the options page" }, "findListsPlaceholder": { @@ -244,11 +244,11 @@ "description": "Placeholder for the input field used to find lists" }, "strictblockTitle": { - "message": "Page blocked", + "message": "Pagina bloccata", "description": "Webpage title for the strict-blocked page" }, "strictblockSentence1": { - "message": "uBO Lite has prevented the following page from loading:", + "message": "uBO Lite ha impedito alla seguente pagina di caricarsi:", "description": "Sentence used in the strict-blocked page" }, "strictblockReasonSentence1": { @@ -260,23 +260,23 @@ "description": "Text warning about an incoming redirect" }, "strictblockNoParamsPrompt": { - "message": "without parameters", + "message": "senza parametri", "description": "Label to be used for the parameter-less URL" }, "strictblockBack": { - "message": "Go back", + "message": "Torna indietro", "description": "A button to go back to the previous webpage" }, "strictblockClose": { - "message": "Close this window", + "message": "Chiudi questa finestra", "description": "A button to close the current tab" }, "strictblockDontWarn": { - "message": "Don't warn me again about this site", + "message": "Non avvisarmi di nuovo riguardo questo sito", "description": "Label for checkbox in document-blocked page" }, "strictblockProceed": { - "message": "Proceed", + "message": "Procedi", "description": "A button to navigate to the blocked page" } } diff --git a/src/_locales/br_FR/messages.json b/src/_locales/br_FR/messages.json index abddf0af58f94..53d3ce41e38c9 100644 --- a/src/_locales/br_FR/messages.json +++ b/src/_locales/br_FR/messages.json @@ -1160,7 +1160,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": "Hag a vez kavet e-barzh:", + "message": "Hag a zo kavet e-barzh:", "description": "English: List of filter list names follows" }, "docblockedBack": { From 791a2b08e1a15c169c0a86130de769822628c81d Mon Sep 17 00:00:00 2001 From: Fanboynz Date: Tue, 17 Dec 2024 02:26:36 +1300 Subject: [PATCH 553/553] Add all/none in set-local/cookie (#3928) * Add all/none in set-local/cookie * Add functional cookie value --- src/js/resources/cookie.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/js/resources/cookie.js b/src/js/resources/cookie.js index 29ad7315cc805..df02ca2e93403 100644 --- a/src/js/resources/cookie.js +++ b/src/js/resources/cookie.js @@ -44,6 +44,7 @@ export function getSafeCookieValuesFn() { 'on', 'off', 'true', 't', 'false', 'f', 'yes', 'y', 'no', 'n', + 'all', 'none', 'functional', ]; } registerScriptlet(getSafeCookieValuesFn, {