Skip to content

Commit 474723d

Browse files
committed
[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: uBlockOrigin/uBOL-home#556
1 parent 015ddcd commit 474723d

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

platform/mv3/extension/js/ruleset-manager.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,19 +168,20 @@ async function updateRegexRules(currentRules, addRules, removeRuleIds) {
168168

169169
async function updateDynamicRules() {
170170
const currentRules = await dnr.getDynamicRules();
171-
const addRules = [];
172-
const removeRuleIds = [];
173171

174172
// Remove potentially left-over rules from previous version
173+
const removeRuleIds = [];
175174
for ( const rule of currentRules ) {
176175
if ( rule.id >= SPECIAL_RULES_REALM ) { continue; }
177176
removeRuleIds.push(rule.id);
178177
rule.id = 0;
179178
}
180179

180+
const addRules = [];
181181
await updateRegexRules(currentRules, addRules, removeRuleIds);
182182
if ( addRules.length === 0 && removeRuleIds.length === 0 ) { return; }
183183

184+
const dynamicRegexCountBefore = dynamicRegexCount;
184185
dynamicRegexCount = 0;
185186
let ruleId = 1;
186187
for ( const rule of addRules ) {
@@ -190,6 +191,11 @@ async function updateDynamicRules() {
190191
if ( dynamicRegexCount !== 0 ) {
191192
ubolLog(`Using ${dynamicRegexCount}/${dnr.MAX_NUMBER_OF_REGEX_RULES} dynamic regex-based DNR rules`);
192193
}
194+
// If we increase the number of dynamic regex rules, reset session rules to
195+
// reduce risk of hitting maximum regex count
196+
if ( dynamicRegexCount > dynamicRegexCountBefore ) {
197+
await clearSessionRules();
198+
}
193199

194200
const response = {};
195201

@@ -339,8 +345,11 @@ async function updateSessionRules() {
339345
let regexCount = dynamicRegexCount;
340346
let ruleId = 1;
341347
for ( const rule of addRulesUnfiltered ) {
342-
if ( rule?.condition.regexFilter ) { regexCount += 1; }
343-
rule.id = regexCount < maxRegexCount ? ruleId++ : 0;
348+
rule.id = ruleId++;
349+
if ( Boolean(rule?.condition.regexFilter) === false ) { continue; }
350+
regexCount += 1;
351+
if ( regexCount < maxRegexCount ) { continue; }
352+
rule.id = 0;
344353
}
345354
sessionRegexCount = regexCount - dynamicRegexCount;
346355
const addRules = addRulesUnfiltered.filter(a => a.id !== 0);
@@ -367,6 +376,13 @@ async function updateSessionRules() {
367376
return response;
368377
}
369378

379+
async function clearSessionRules() {
380+
const currentRules = await dnr.getSessionRules();
381+
if ( currentRules.length === 0 ) { return; }
382+
const removeRuleIds = currentRules.map(a => a.id);
383+
return dnr.updateSessionRules({ removeRuleIds });
384+
}
385+
370386
/******************************************************************************/
371387

372388
async function getEffectiveSessionRules() {

0 commit comments

Comments
 (0)