Skip to content

Commit d723c58

Browse files
committed
Merge branch 'v5.0' into fix/AG-37909
2 parents 38b5522 + 6b1172a commit d723c58

File tree

11 files changed

+181
-28
lines changed

11 files changed

+181
-28
lines changed

CHANGELOG.md

+42-5
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,63 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## Unreleased
99

10+
### Added
11+
12+
- Unsafe dynamic rules limit for MV3.
13+
14+
### Changed
15+
16+
- Increased all dynamic rules limit to 30000 for MV3.
17+
1018
### Fixed
1119

1220
- A rule from a disabled filter list disables another rule [#3002].
1321
- Notify user that rule was not applied because of the chrome limitations [#3004].
14-
<!-- FIXME: probably released in v5.0.170, check later -->
15-
- Memory leak caused by multiple script injections on the same pages after a service worker or event page restart [#2594].
1622
- URI encoded `$removeparam` value is not removed in MV3 [#3014].
17-
- `$removeparam` fails to match encoded URL params in MV2 [#3015].
1823

1924
[#3002]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/3002
2025
[#3004]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/3004
21-
[#2594]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2594
2226
[#3014]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/3014
27+
28+
<!-- TODO: add release date -->
29+
## [4.4.48]
30+
31+
### Added
32+
33+
- Send `manifest_version` during issues reporting for MV2.
34+
35+
### Changed
36+
37+
- Updated [@adguard/agtree] to v2.1.3.
38+
- Updated [@adguard/tsurlfilter] to v3.0.7.
39+
- Updated [@adguard/tswebextension] to v2.0.7.
40+
41+
### Fixed
42+
43+
- Optimized performance of parsing uBlock filter parameters [#2962].
44+
- `$removeparam` fails to match encoded URL params in MV2 [#3015].
45+
- Memory leak caused by multiple script injections on the same pages
46+
after an event page in Firefox restarts in MV2 [#2594].
47+
48+
[4.4.48]: https://github.com/AdguardTeam/AdguardBrowserExtension/compare/v4.4.41...v4.4.48
49+
[#2962]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2962
2350
[#3015]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/3015
2451

52+
## [5.0.170] - 2024-10-30
53+
54+
### Fixed
55+
56+
- Memory leak caused by multiple script injections on the same pages
57+
after a service worker or event page restart in MV3 [#2594].
58+
59+
[5.0.170]: https://github.com/AdguardTeam/AdguardBrowserExtension/releases/tag/v5.0.170
60+
[#2594]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2594
61+
2562
## [5.0.162] - 2024-10-30
2663

2764
### Added
2865

29-
- Send `manifest_version` during issues reporting.
66+
- Send `manifest_version` during issues reporting for MV3.
3067

3168
[5.0.162]: https://github.com/AdguardTeam/AdguardBrowserExtension/releases/tag/v5.0.162
3269

Extension/_locales/en/messages.json

+9-2
Original file line numberDiff line numberDiff line change
@@ -813,8 +813,12 @@
813813
"options_rule_limits_dynamic_user_rules": {
814814
"message": "User-added rules, such as <user_rules>user rules<\/user_rules>, <allowlist>allowlisted websites<\/allowlist>, <custom_filters>custom filters<\/custom_filters>, and <quick_fixes>Quick Fixes filter<\/quick_fixes>"
815815
},
816+
"options_rule_limits_dynamic_unsafe": {
817+
"description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed",
818+
"message": "Unsafe dynamic rules (used for some advanced modifiers, such as $$redirect or $$cookie) — included in user-added rules"
819+
},
816820
"options_rule_limits_dynamic_regex": {
817-
"message": "Regex rules — included in the above"
821+
"message": "Regex rules — included in user-added rules"
818822
},
819823
"options_rule_limits_static_rulesets": {
820824
"message": "Static rulesets"
@@ -879,6 +883,9 @@
879883
"options_limits_warning_dynamic_rules": {
880884
"message": "You've reached the limit of user-added rules. %maximum% of %current% rules are enabled."
881885
},
886+
"options_limits_warning_dynamic_unsafe_rules": {
887+
"message": "You've reached the limit of user-added unsafe rules. %maximum% of %current% unsafe rules are enabled."
888+
},
882889
"options_limits_warning_dynamic_regex_rules": {
883890
"message": "You've reached the limit of user-added regex rules. %maximum% of %current% regex rules are enabled."
884891
},
@@ -1248,4 +1255,4 @@
12481255
"filtering_modal_declarative_rule": {
12491256
"message": "DNR rule:"
12501257
}
1251-
}
1258+
}

Extension/src/background/services/rules-limits/interface.ts

+15
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ export interface IRulesLimits {
3030
*/
3131
dynamicRulesMaximumCount: number;
3232

33+
/**
34+
* How many dynamic **unsafe** rules are enabled in the browser.
35+
*/
36+
dynamicRulesUnsafeEnabledCount: number;
37+
38+
/**
39+
* Maximum count of dynamic **unsafe** rules which can be enabled in the browser.
40+
*/
41+
dynamicRulesUnsafeMaximumCount: number;
42+
3343
/**
3444
* How many user regexp rules are enabled in the browser.
3545
*/
@@ -115,6 +125,11 @@ type InvalidResultData = {
115125
*/
116126
rulesCount?: CountData;
117127

128+
/**
129+
* Unsafe rules count data.
130+
*/
131+
rulesUnsafeCount?: CountData;
132+
118133
/**
119134
* Regex rules count data.
120135
*/

Extension/src/background/services/rules-limits/rules-limits-service-mv3.ts

+79-11
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import browser from 'webextension-polyfill';
2020

2121
import {
2222
TooManyRegexpRulesError,
23+
TooManyUnsafeRulesError,
2324
TooManyRulesError,
2425
RULE_SET_NAME_PREFIX,
2526
type ConfigurationResult,
@@ -57,9 +58,17 @@ import type {
5758
} from './interface';
5859

5960
const {
60-
MAX_NUMBER_OF_DYNAMIC_AND_SESSION_RULES,
61+
MAX_NUMBER_OF_DYNAMIC_RULES,
6162
MAX_NUMBER_OF_REGEX_RULES,
6263
MAX_NUMBER_OF_ENABLED_STATIC_RULESETS,
64+
65+
/**
66+
* @see {@link https://developer.chrome.com/docs/extensions/reference/api/declarativeNetRequest#property-MAX_NUMBER_OF_UNSAFE_DYNAMIC_RULES}
67+
*/
68+
// TODO: remove default value and following ts-ignore
69+
// when the value is available in webextension-polyfill
70+
// @ts-ignore
71+
MAX_NUMBER_OF_UNSAFE_DYNAMIC_RULES = 5000,
6372
} = browser.declarativeNetRequest;
6473

6574
/**
@@ -224,6 +233,19 @@ export class RulesLimitsService {
224233
}, 0);
225234
}
226235

236+
/**
237+
* Finds first found limitation error about unsafe rules limit.
238+
*
239+
* @param result Configuration result.
240+
* @returns Limitation error.
241+
*/
242+
private static getUnsafeRulesLimitExceedErr = (
243+
result: ConfigurationResult,
244+
): TooManyUnsafeRulesError | undefined => {
245+
return result.dynamicRules?.limitations
246+
.find((e) => e instanceof TooManyUnsafeRulesError);
247+
};
248+
227249
/**
228250
* Finds first found limitation error.
229251
*
@@ -254,7 +276,7 @@ export class RulesLimitsService {
254276
* How many dynamic rules are enabled.
255277
*
256278
* @param result Configuration result.
257-
* @returns Count of enabled user rules.
279+
* @returns Count of enabled dynamic rules.
258280
*/
259281
private static getDynamicRulesEnabledCount(result: ConfigurationResult): number {
260282
const rulesLimitExceedErr = RulesLimitsService.getRulesLimitExceedErr(result);
@@ -281,7 +303,7 @@ export class RulesLimitsService {
281303
*/
282304
private static getDynamicRulesMaximumCount(result: ConfigurationResult): number {
283305
const rulesLimitExceedErr = RulesLimitsService.getRulesLimitExceedErr(result);
284-
return rulesLimitExceedErr?.numberOfMaximumRules || MAX_NUMBER_OF_DYNAMIC_AND_SESSION_RULES;
306+
return rulesLimitExceedErr?.numberOfMaximumRules || MAX_NUMBER_OF_DYNAMIC_RULES;
285307
}
286308

287309
/**
@@ -290,10 +312,13 @@ export class RulesLimitsService {
290312
* @param result Configuration result.
291313
* @returns Number rules.
292314
*/
293-
private static getDynamicRulesRegexpsEnabledCount(result: ConfigurationResult): number {
294-
const regexpRulesLimitExceedErr = RulesLimitsService.getRegexpRulesLimitExceedErr(result);
315+
private static getDynamicRegexpRulesEnabledCount(result: ConfigurationResult): number {
295316
const regexpsCount = result.dynamicRules?.ruleSet.getRegexpRulesCount() || 0;
296-
return regexpsCount + (regexpRulesLimitExceedErr?.excludedRulesIds.length || 0);
317+
318+
const regexpRulesLimitExceedErr = RulesLimitsService.getRegexpRulesLimitExceedErr(result);
319+
const excludedRulesCount = regexpRulesLimitExceedErr?.excludedRulesIds.length || 0;
320+
321+
return regexpsCount + excludedRulesCount;
297322
}
298323

299324
/**
@@ -302,11 +327,37 @@ export class RulesLimitsService {
302327
* @param result Configuration result.
303328
* @returns Rules count.
304329
*/
305-
private static getDynamicRulesRegexpsMaximumCount(result: ConfigurationResult): number {
330+
private static getDynamicRegexpRulesMaximumCount(result: ConfigurationResult): number {
306331
const regexpRulesLimitExceedErr = RulesLimitsService.getRegexpRulesLimitExceedErr(result);
307332
return regexpRulesLimitExceedErr?.numberOfMaximumRules || MAX_NUMBER_OF_REGEX_RULES;
308333
}
309334

335+
/**
336+
* How many dynamic **unsafe** rules are enabled.
337+
*
338+
* @param result Configuration result.
339+
* @returns Count of enabled dynamic unsafe rules.
340+
*/
341+
private static getDynamicUnsafeRulesEnabledCount(result: ConfigurationResult): number {
342+
const unsafeRulesCount = result.dynamicRules?.ruleSet.getUnsafeRulesCount() || 0;
343+
344+
const unsafeRulesLimitExceedErr = RulesLimitsService.getUnsafeRulesLimitExceedErr(result);
345+
const excludedRulesCount = unsafeRulesLimitExceedErr?.excludedRulesIds.length || 0;
346+
347+
return unsafeRulesCount + excludedRulesCount;
348+
}
349+
350+
/**
351+
* Returns number of maximum possible dynamic **unsafe** rules.
352+
*
353+
* @param result Configuration result.
354+
* @returns Count of rules.
355+
*/
356+
private static getDynamicUnsafeRulesMaximumCount(result: ConfigurationResult): number {
357+
const rulesLimitExceedErr = RulesLimitsService.getUnsafeRulesLimitExceedErr(result);
358+
return rulesLimitExceedErr?.numberOfMaximumRules || MAX_NUMBER_OF_UNSAFE_DYNAMIC_RULES;
359+
}
360+
310361
/**
311362
* Returns filters which where enabled in the last configuration
312363
* before exceeding limits.
@@ -369,8 +420,10 @@ export class RulesLimitsService {
369420
return {
370421
dynamicRulesEnabledCount: RulesLimitsService.getDynamicRulesEnabledCount(result),
371422
dynamicRulesMaximumCount: RulesLimitsService.getDynamicRulesMaximumCount(result),
372-
dynamicRulesRegexpsEnabledCount: RulesLimitsService.getDynamicRulesRegexpsEnabledCount(result),
373-
dynamicRulesRegexpsMaximumCount: RulesLimitsService.getDynamicRulesRegexpsMaximumCount(result),
423+
dynamicRulesUnsafeEnabledCount: RulesLimitsService.getDynamicUnsafeRulesEnabledCount(result),
424+
dynamicRulesUnsafeMaximumCount: RulesLimitsService.getDynamicUnsafeRulesMaximumCount(result),
425+
dynamicRulesRegexpsEnabledCount: RulesLimitsService.getDynamicRegexpRulesEnabledCount(result),
426+
dynamicRulesRegexpsMaximumCount: RulesLimitsService.getDynamicRegexpRulesMaximumCount(result),
374427
staticFiltersEnabledCount: RulesLimitsService.getStaticEnabledFiltersCount(),
375428
staticFiltersMaximumCount: MAX_NUMBER_OF_ENABLED_STATIC_RULESETS,
376429
staticRulesEnabledCount,
@@ -602,8 +655,23 @@ export class RulesLimitsService {
602655
};
603656
}
604657

605-
const dynamicRulesRegexpsEnabledCount = RulesLimitsService.getDynamicRulesRegexpsEnabledCount(result);
606-
const dynamicRulesRegexpsMaximumCount = RulesLimitsService.getDynamicRulesRegexpsMaximumCount(result);
658+
const dynamicRulesUnsafeEnabledCount = RulesLimitsService.getDynamicUnsafeRulesEnabledCount(result);
659+
const dynamicUnsafeRegexpsMaximumCount = RulesLimitsService.getDynamicUnsafeRulesMaximumCount(result);
660+
if (dynamicRulesUnsafeEnabledCount > dynamicUnsafeRegexpsMaximumCount) {
661+
return {
662+
ok: false,
663+
data: {
664+
type: 'dynamic',
665+
rulesUnsafeCount: {
666+
current: dynamicRulesUnsafeEnabledCount,
667+
maximum: dynamicUnsafeRegexpsMaximumCount,
668+
},
669+
},
670+
};
671+
}
672+
673+
const dynamicRulesRegexpsEnabledCount = RulesLimitsService.getDynamicRegexpRulesEnabledCount(result);
674+
const dynamicRulesRegexpsMaximumCount = RulesLimitsService.getDynamicRegexpRulesMaximumCount(result);
607675
if (dynamicRulesRegexpsEnabledCount > dynamicRulesRegexpsMaximumCount) {
608676
return {
609677
ok: false,

Extension/src/pages/options/components/RulesLimits/RulesLimits.tsx

+17
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ export const RulesLimits = observer(() => {
5454
const {
5555
dynamicRulesEnabledCount,
5656
dynamicRulesMaximumCount,
57+
dynamicRulesUnsafeEnabledCount,
58+
dynamicRulesUnsafeMaximumCount,
5759
dynamicRulesRegexpsEnabledCount,
5860
dynamicRulesRegexpsMaximumCount,
5961
staticFiltersEnabledCount,
@@ -174,6 +176,21 @@ export const RulesLimits = observer(() => {
174176
})}
175177
</div>
176178
</div>
179+
<div className="rules-limits__group">
180+
<div className="rules-limits__text--gray">
181+
{translator.getMessage('options_rule_limits_dynamic_unsafe')}
182+
</div>
183+
<div className={getClassNamesForNumbers(
184+
dynamicRulesUnsafeEnabledCount,
185+
dynamicRulesUnsafeMaximumCount,
186+
)}
187+
>
188+
{reactTranslator.getMessage('options_rule_limits_numbers', {
189+
current: dynamicRulesUnsafeEnabledCount,
190+
maximum: dynamicRulesUnsafeMaximumCount,
191+
})}
192+
</div>
193+
</div>
177194
<div className="rules-limits__group">
178195
<div className="rules-limits__text--gray">
179196
{translator.getMessage('options_rule_limits_dynamic_regex')}

Extension/src/pages/options/components/Warnings/messages.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export const getStaticWarningMessage = (data: InvalidStaticResultData): string |
7373
* @returns Warning message or null if the data is invalid.
7474
*/
7575
export const getDynamicWarningMessage = (data: InvalidDynamicResultData): string | null => {
76-
const { rulesCount, rulesRegexpsCount } = data;
76+
const { rulesCount, rulesRegexpsCount, rulesUnsafeCount } = data;
7777

7878
if (rulesCount) {
7979
return translator.getMessage('options_limits_warning_dynamic_rules', {
@@ -89,5 +89,12 @@ export const getDynamicWarningMessage = (data: InvalidDynamicResultData): string
8989
});
9090
}
9191

92+
if (rulesUnsafeCount) {
93+
return translator.getMessage('options_limits_warning_dynamic_unsafe_rules', {
94+
current: rulesUnsafeCount.current,
95+
maximum: rulesUnsafeCount.maximum,
96+
});
97+
}
98+
9299
return null;
93100
};

Extension/src/pages/options/stores/SettingsStore.js

+2
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ const fetchDataWithRetry = async (fetchFunction) => {
107107
const DEFAULT_RULES_LIMITS = {
108108
dynamicRulesEnabledCount: 0,
109109
dynamicRulesMaximumCount: 0,
110+
dynamicRulesUnsafeEnabledCount: 0,
111+
dynamicRulesUnsafeMaximumCount: 0,
110112
dynamicRulesRegexpsEnabledCount: 0,
111113
dynamicRulesRegexpsMaximumCount: 0,
112114
staticFiltersEnabledCount: 0,

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ To show locales info run:
404404
| Browser | Version |
405405
|---------------------------- |:-------:|
406406
| Chromium-based browsers MV2 | 79 |
407-
| Chromium-based browsers MV3 | 118 |
407+
| Chromium-based browsers MV3 | 121 |
408408
| Firefox | 78 |
409409
| Firefox Mobile | 113 |
410410
| Opera | 67 |

package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "browser-extension",
3-
"version": "5.0.182",
3+
"version": "5.0.186",
44
"description": "AdGuard Extension",
55
"scripts": {
66
"dev": "cross-env BUILD_ENV=dev SWCRC= node -r @swc-node/register tools/bundle.ts",
@@ -111,8 +111,8 @@
111111
"@adguard/logger": "^1.1.1",
112112
"@adguard/scriptlets": "^1.12.1",
113113
"@adguard/translate": "^1.0.2",
114-
"@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/db2afe9ff8f8c2b36f8d5b5b99b1741396be9524/packages/tsurlfilter/tsurlfilter.tgz",
115-
"@adguard/tswebextension": "https://github.com/AdguardTeam/tsurlfilter/raw/db2afe9ff8f8c2b36f8d5b5b99b1741396be9524/packages/tswebextension/tswebextension.tgz",
114+
"@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/7cfbee202c9d0aefaebae5e8060016bcb5b7acd9/packages/tsurlfilter/tsurlfilter.tgz",
115+
"@adguard/tswebextension": "https://github.com/AdguardTeam/tsurlfilter/raw/7cfbee202c9d0aefaebae5e8060016bcb5b7acd9/packages/tswebextension/tswebextension.tgz",
116116
"@xstate/react": "^4.1.1",
117117
"ace-builds": "^1.8.1",
118118
"assert": "^2.0.0",

tools/bundle/chrome-mv3/manifest.chrome-mv3.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export const chromeMv3Manifest = {
3838
'host_permissions': [
3939
'<all_urls>',
4040
],
41-
'minimum_chrome_version': '118.0',
41+
'minimum_chrome_version': '121.0',
4242
'web_accessible_resources': [
4343
{
4444
'resources': ['web-accessible-resources/*'],

0 commit comments

Comments
 (0)