Skip to content

Commit

Permalink
Merge branch 'v5.0' into fix/AG-37909
Browse files Browse the repository at this point in the history
  • Loading branch information
maximtop committed Nov 25, 2024
2 parents 38b5522 + 6b1172a commit d723c58
Show file tree
Hide file tree
Showing 11 changed files with 181 additions and 28 deletions.
47 changes: 42 additions & 5 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,63 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## Unreleased

### Added

- Unsafe dynamic rules limit for MV3.

### Changed

- Increased all dynamic rules limit to 30000 for MV3.

### Fixed

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

[#3002]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/3002
[#3004]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/3004
[#2594]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2594
[#3014]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/3014

<!-- TODO: add release date -->
## [4.4.48]

### Added

- Send `manifest_version` during issues reporting for MV2.

### Changed

- Updated [@adguard/agtree] to v2.1.3.
- Updated [@adguard/tsurlfilter] to v3.0.7.
- Updated [@adguard/tswebextension] to v2.0.7.

### Fixed

- Optimized performance of parsing uBlock filter parameters [#2962].
- `$removeparam` fails to match encoded URL params in MV2 [#3015].
- Memory leak caused by multiple script injections on the same pages
after an event page in Firefox restarts in MV2 [#2594].

[4.4.48]: https://github.com/AdguardTeam/AdguardBrowserExtension/compare/v4.4.41...v4.4.48
[#2962]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2962
[#3015]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/3015

## [5.0.170] - 2024-10-30

### Fixed

- Memory leak caused by multiple script injections on the same pages
after a service worker or event page restart in MV3 [#2594].

[5.0.170]: https://github.com/AdguardTeam/AdguardBrowserExtension/releases/tag/v5.0.170
[#2594]: https://github.com/AdguardTeam/AdguardBrowserExtension/issues/2594

## [5.0.162] - 2024-10-30

### Added

- Send `manifest_version` during issues reporting.
- Send `manifest_version` during issues reporting for MV3.

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

Expand Down
11 changes: 9 additions & 2 deletions Extension/_locales/en/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -813,8 +813,12 @@
"options_rule_limits_dynamic_user_rules": {
"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>"
},
"options_rule_limits_dynamic_unsafe": {
"description": "Note: First dollar sign is used to escape the second one, so eventually only one dollar sign will be displayed",
"message": "Unsafe dynamic rules (used for some advanced modifiers, such as $$redirect or $$cookie) — included in user-added rules"
},
"options_rule_limits_dynamic_regex": {
"message": "Regex rules — included in the above"
"message": "Regex rules — included in user-added rules"
},
"options_rule_limits_static_rulesets": {
"message": "Static rulesets"
Expand Down Expand Up @@ -879,6 +883,9 @@
"options_limits_warning_dynamic_rules": {
"message": "You've reached the limit of user-added rules. %maximum% of %current% rules are enabled."
},
"options_limits_warning_dynamic_unsafe_rules": {
"message": "You've reached the limit of user-added unsafe rules. %maximum% of %current% unsafe rules are enabled."
},
"options_limits_warning_dynamic_regex_rules": {
"message": "You've reached the limit of user-added regex rules. %maximum% of %current% regex rules are enabled."
},
Expand Down Expand Up @@ -1248,4 +1255,4 @@
"filtering_modal_declarative_rule": {
"message": "DNR rule:"
}
}
}
15 changes: 15 additions & 0 deletions Extension/src/background/services/rules-limits/interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,16 @@ export interface IRulesLimits {
*/
dynamicRulesMaximumCount: number;

/**
* How many dynamic **unsafe** rules are enabled in the browser.
*/
dynamicRulesUnsafeEnabledCount: number;

/**
* Maximum count of dynamic **unsafe** rules which can be enabled in the browser.
*/
dynamicRulesUnsafeMaximumCount: number;

/**
* How many user regexp rules are enabled in the browser.
*/
Expand Down Expand Up @@ -115,6 +125,11 @@ type InvalidResultData = {
*/
rulesCount?: CountData;

/**
* Unsafe rules count data.
*/
rulesUnsafeCount?: CountData;

/**
* Regex rules count data.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import browser from 'webextension-polyfill';

import {
TooManyRegexpRulesError,
TooManyUnsafeRulesError,
TooManyRulesError,
RULE_SET_NAME_PREFIX,
type ConfigurationResult,
Expand Down Expand Up @@ -57,9 +58,17 @@ import type {
} from './interface';

const {
MAX_NUMBER_OF_DYNAMIC_AND_SESSION_RULES,
MAX_NUMBER_OF_DYNAMIC_RULES,
MAX_NUMBER_OF_REGEX_RULES,
MAX_NUMBER_OF_ENABLED_STATIC_RULESETS,

/**
* @see {@link https://developer.chrome.com/docs/extensions/reference/api/declarativeNetRequest#property-MAX_NUMBER_OF_UNSAFE_DYNAMIC_RULES}
*/
// TODO: remove default value and following ts-ignore
// when the value is available in webextension-polyfill
// @ts-ignore
MAX_NUMBER_OF_UNSAFE_DYNAMIC_RULES = 5000,
} = browser.declarativeNetRequest;

/**
Expand Down Expand Up @@ -224,6 +233,19 @@ export class RulesLimitsService {
}, 0);
}

/**
* Finds first found limitation error about unsafe rules limit.
*
* @param result Configuration result.
* @returns Limitation error.
*/
private static getUnsafeRulesLimitExceedErr = (
result: ConfigurationResult,
): TooManyUnsafeRulesError | undefined => {
return result.dynamicRules?.limitations
.find((e) => e instanceof TooManyUnsafeRulesError);
};

/**
* Finds first found limitation error.
*
Expand Down Expand Up @@ -254,7 +276,7 @@ export class RulesLimitsService {
* How many dynamic rules are enabled.
*
* @param result Configuration result.
* @returns Count of enabled user rules.
* @returns Count of enabled dynamic rules.
*/
private static getDynamicRulesEnabledCount(result: ConfigurationResult): number {
const rulesLimitExceedErr = RulesLimitsService.getRulesLimitExceedErr(result);
Expand All @@ -281,7 +303,7 @@ export class RulesLimitsService {
*/
private static getDynamicRulesMaximumCount(result: ConfigurationResult): number {
const rulesLimitExceedErr = RulesLimitsService.getRulesLimitExceedErr(result);
return rulesLimitExceedErr?.numberOfMaximumRules || MAX_NUMBER_OF_DYNAMIC_AND_SESSION_RULES;
return rulesLimitExceedErr?.numberOfMaximumRules || MAX_NUMBER_OF_DYNAMIC_RULES;
}

/**
Expand All @@ -290,10 +312,13 @@ export class RulesLimitsService {
* @param result Configuration result.
* @returns Number rules.
*/
private static getDynamicRulesRegexpsEnabledCount(result: ConfigurationResult): number {
const regexpRulesLimitExceedErr = RulesLimitsService.getRegexpRulesLimitExceedErr(result);
private static getDynamicRegexpRulesEnabledCount(result: ConfigurationResult): number {
const regexpsCount = result.dynamicRules?.ruleSet.getRegexpRulesCount() || 0;
return regexpsCount + (regexpRulesLimitExceedErr?.excludedRulesIds.length || 0);

const regexpRulesLimitExceedErr = RulesLimitsService.getRegexpRulesLimitExceedErr(result);
const excludedRulesCount = regexpRulesLimitExceedErr?.excludedRulesIds.length || 0;

return regexpsCount + excludedRulesCount;
}

/**
Expand All @@ -302,11 +327,37 @@ export class RulesLimitsService {
* @param result Configuration result.
* @returns Rules count.
*/
private static getDynamicRulesRegexpsMaximumCount(result: ConfigurationResult): number {
private static getDynamicRegexpRulesMaximumCount(result: ConfigurationResult): number {
const regexpRulesLimitExceedErr = RulesLimitsService.getRegexpRulesLimitExceedErr(result);
return regexpRulesLimitExceedErr?.numberOfMaximumRules || MAX_NUMBER_OF_REGEX_RULES;
}

/**
* How many dynamic **unsafe** rules are enabled.
*
* @param result Configuration result.
* @returns Count of enabled dynamic unsafe rules.
*/
private static getDynamicUnsafeRulesEnabledCount(result: ConfigurationResult): number {
const unsafeRulesCount = result.dynamicRules?.ruleSet.getUnsafeRulesCount() || 0;

const unsafeRulesLimitExceedErr = RulesLimitsService.getUnsafeRulesLimitExceedErr(result);
const excludedRulesCount = unsafeRulesLimitExceedErr?.excludedRulesIds.length || 0;

return unsafeRulesCount + excludedRulesCount;
}

/**
* Returns number of maximum possible dynamic **unsafe** rules.
*
* @param result Configuration result.
* @returns Count of rules.
*/
private static getDynamicUnsafeRulesMaximumCount(result: ConfigurationResult): number {
const rulesLimitExceedErr = RulesLimitsService.getUnsafeRulesLimitExceedErr(result);
return rulesLimitExceedErr?.numberOfMaximumRules || MAX_NUMBER_OF_UNSAFE_DYNAMIC_RULES;
}

/**
* Returns filters which where enabled in the last configuration
* before exceeding limits.
Expand Down Expand Up @@ -369,8 +420,10 @@ export class RulesLimitsService {
return {
dynamicRulesEnabledCount: RulesLimitsService.getDynamicRulesEnabledCount(result),
dynamicRulesMaximumCount: RulesLimitsService.getDynamicRulesMaximumCount(result),
dynamicRulesRegexpsEnabledCount: RulesLimitsService.getDynamicRulesRegexpsEnabledCount(result),
dynamicRulesRegexpsMaximumCount: RulesLimitsService.getDynamicRulesRegexpsMaximumCount(result),
dynamicRulesUnsafeEnabledCount: RulesLimitsService.getDynamicUnsafeRulesEnabledCount(result),
dynamicRulesUnsafeMaximumCount: RulesLimitsService.getDynamicUnsafeRulesMaximumCount(result),
dynamicRulesRegexpsEnabledCount: RulesLimitsService.getDynamicRegexpRulesEnabledCount(result),
dynamicRulesRegexpsMaximumCount: RulesLimitsService.getDynamicRegexpRulesMaximumCount(result),
staticFiltersEnabledCount: RulesLimitsService.getStaticEnabledFiltersCount(),
staticFiltersMaximumCount: MAX_NUMBER_OF_ENABLED_STATIC_RULESETS,
staticRulesEnabledCount,
Expand Down Expand Up @@ -602,8 +655,23 @@ export class RulesLimitsService {
};
}

const dynamicRulesRegexpsEnabledCount = RulesLimitsService.getDynamicRulesRegexpsEnabledCount(result);
const dynamicRulesRegexpsMaximumCount = RulesLimitsService.getDynamicRulesRegexpsMaximumCount(result);
const dynamicRulesUnsafeEnabledCount = RulesLimitsService.getDynamicUnsafeRulesEnabledCount(result);
const dynamicUnsafeRegexpsMaximumCount = RulesLimitsService.getDynamicUnsafeRulesMaximumCount(result);
if (dynamicRulesUnsafeEnabledCount > dynamicUnsafeRegexpsMaximumCount) {
return {
ok: false,
data: {
type: 'dynamic',
rulesUnsafeCount: {
current: dynamicRulesUnsafeEnabledCount,
maximum: dynamicUnsafeRegexpsMaximumCount,
},
},
};
}

const dynamicRulesRegexpsEnabledCount = RulesLimitsService.getDynamicRegexpRulesEnabledCount(result);
const dynamicRulesRegexpsMaximumCount = RulesLimitsService.getDynamicRegexpRulesMaximumCount(result);
if (dynamicRulesRegexpsEnabledCount > dynamicRulesRegexpsMaximumCount) {
return {
ok: false,
Expand Down
17 changes: 17 additions & 0 deletions Extension/src/pages/options/components/RulesLimits/RulesLimits.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ export const RulesLimits = observer(() => {
const {
dynamicRulesEnabledCount,
dynamicRulesMaximumCount,
dynamicRulesUnsafeEnabledCount,
dynamicRulesUnsafeMaximumCount,
dynamicRulesRegexpsEnabledCount,
dynamicRulesRegexpsMaximumCount,
staticFiltersEnabledCount,
Expand Down Expand Up @@ -174,6 +176,21 @@ export const RulesLimits = observer(() => {
})}
</div>
</div>
<div className="rules-limits__group">
<div className="rules-limits__text--gray">
{translator.getMessage('options_rule_limits_dynamic_unsafe')}
</div>
<div className={getClassNamesForNumbers(
dynamicRulesUnsafeEnabledCount,
dynamicRulesUnsafeMaximumCount,
)}
>
{reactTranslator.getMessage('options_rule_limits_numbers', {
current: dynamicRulesUnsafeEnabledCount,
maximum: dynamicRulesUnsafeMaximumCount,
})}
</div>
</div>
<div className="rules-limits__group">
<div className="rules-limits__text--gray">
{translator.getMessage('options_rule_limits_dynamic_regex')}
Expand Down
9 changes: 8 additions & 1 deletion Extension/src/pages/options/components/Warnings/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export const getStaticWarningMessage = (data: InvalidStaticResultData): string |
* @returns Warning message or null if the data is invalid.
*/
export const getDynamicWarningMessage = (data: InvalidDynamicResultData): string | null => {
const { rulesCount, rulesRegexpsCount } = data;
const { rulesCount, rulesRegexpsCount, rulesUnsafeCount } = data;

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

if (rulesUnsafeCount) {
return translator.getMessage('options_limits_warning_dynamic_unsafe_rules', {
current: rulesUnsafeCount.current,
maximum: rulesUnsafeCount.maximum,
});
}

return null;
};
2 changes: 2 additions & 0 deletions Extension/src/pages/options/stores/SettingsStore.js
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,8 @@ const fetchDataWithRetry = async (fetchFunction) => {
const DEFAULT_RULES_LIMITS = {
dynamicRulesEnabledCount: 0,
dynamicRulesMaximumCount: 0,
dynamicRulesUnsafeEnabledCount: 0,
dynamicRulesUnsafeMaximumCount: 0,
dynamicRulesRegexpsEnabledCount: 0,
dynamicRulesRegexpsMaximumCount: 0,
staticFiltersEnabledCount: 0,
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,7 @@ To show locales info run:
| Browser | Version |
|---------------------------- |:-------:|
| Chromium-based browsers MV2 | 79 |
| Chromium-based browsers MV3 | 118 |
| Chromium-based browsers MV3 | 121 |
| Firefox | 78 |
| Firefox Mobile | 113 |
| Opera | 67 |
Expand Down
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "browser-extension",
"version": "5.0.182",
"version": "5.0.186",
"description": "AdGuard Extension",
"scripts": {
"dev": "cross-env BUILD_ENV=dev SWCRC= node -r @swc-node/register tools/bundle.ts",
Expand Down Expand Up @@ -111,8 +111,8 @@
"@adguard/logger": "^1.1.1",
"@adguard/scriptlets": "^1.12.1",
"@adguard/translate": "^1.0.2",
"@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/db2afe9ff8f8c2b36f8d5b5b99b1741396be9524/packages/tsurlfilter/tsurlfilter.tgz",
"@adguard/tswebextension": "https://github.com/AdguardTeam/tsurlfilter/raw/db2afe9ff8f8c2b36f8d5b5b99b1741396be9524/packages/tswebextension/tswebextension.tgz",
"@adguard/tsurlfilter": "https://github.com/AdguardTeam/tsurlfilter/raw/7cfbee202c9d0aefaebae5e8060016bcb5b7acd9/packages/tsurlfilter/tsurlfilter.tgz",
"@adguard/tswebextension": "https://github.com/AdguardTeam/tsurlfilter/raw/7cfbee202c9d0aefaebae5e8060016bcb5b7acd9/packages/tswebextension/tswebextension.tgz",
"@xstate/react": "^4.1.1",
"ace-builds": "^1.8.1",
"assert": "^2.0.0",
Expand Down
2 changes: 1 addition & 1 deletion tools/bundle/chrome-mv3/manifest.chrome-mv3.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export const chromeMv3Manifest = {
'host_permissions': [
'<all_urls>',
],
'minimum_chrome_version': '118.0',
'minimum_chrome_version': '121.0',
'web_accessible_resources': [
{
'resources': ['web-accessible-resources/*'],
Expand Down
Loading

0 comments on commit d723c58

Please sign in to comment.