From 474723d9ca1c4c5c4d1f06c8eb62d7b1c5fcc531 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 28 Nov 2025 13:29:59 -0500 Subject: [PATCH] [mv3] Improve management of regex-based rules - Make place for more dynamic regex-based rules when there is a risk session regex-based rules could interfere - Do not prune `allow` strict-block rules as they do not contribute toward the overall regex-based rule count Possibly related issue: https://github.com/uBlockOrigin/uBOL-home/issues/556 --- platform/mv3/extension/js/ruleset-manager.js | 24 ++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/platform/mv3/extension/js/ruleset-manager.js b/platform/mv3/extension/js/ruleset-manager.js index b6393ea06..3bbdca991 100644 --- a/platform/mv3/extension/js/ruleset-manager.js +++ b/platform/mv3/extension/js/ruleset-manager.js @@ -168,19 +168,20 @@ async function updateRegexRules(currentRules, addRules, removeRuleIds) { async function updateDynamicRules() { const currentRules = await dnr.getDynamicRules(); - const addRules = []; - const removeRuleIds = []; // Remove potentially left-over rules from previous version + const removeRuleIds = []; for ( const rule of currentRules ) { if ( rule.id >= SPECIAL_RULES_REALM ) { continue; } removeRuleIds.push(rule.id); rule.id = 0; } + const addRules = []; await updateRegexRules(currentRules, addRules, removeRuleIds); if ( addRules.length === 0 && removeRuleIds.length === 0 ) { return; } + const dynamicRegexCountBefore = dynamicRegexCount; dynamicRegexCount = 0; let ruleId = 1; for ( const rule of addRules ) { @@ -190,6 +191,11 @@ async function updateDynamicRules() { if ( dynamicRegexCount !== 0 ) { ubolLog(`Using ${dynamicRegexCount}/${dnr.MAX_NUMBER_OF_REGEX_RULES} dynamic regex-based DNR rules`); } + // If we increase the number of dynamic regex rules, reset session rules to + // reduce risk of hitting maximum regex count + if ( dynamicRegexCount > dynamicRegexCountBefore ) { + await clearSessionRules(); + } const response = {}; @@ -339,8 +345,11 @@ async function updateSessionRules() { let regexCount = dynamicRegexCount; let ruleId = 1; for ( const rule of addRulesUnfiltered ) { - if ( rule?.condition.regexFilter ) { regexCount += 1; } - rule.id = regexCount < maxRegexCount ? ruleId++ : 0; + rule.id = ruleId++; + if ( Boolean(rule?.condition.regexFilter) === false ) { continue; } + regexCount += 1; + if ( regexCount < maxRegexCount ) { continue; } + rule.id = 0; } sessionRegexCount = regexCount - dynamicRegexCount; const addRules = addRulesUnfiltered.filter(a => a.id !== 0); @@ -367,6 +376,13 @@ async function updateSessionRules() { return response; } +async function clearSessionRules() { + const currentRules = await dnr.getSessionRules(); + if ( currentRules.length === 0 ) { return; } + const removeRuleIds = currentRules.map(a => a.id); + return dnr.updateSessionRules({ removeRuleIds }); +} + /******************************************************************************/ async function getEffectiveSessionRules() {