Skip to content

Commit 4a83b80

Browse files
committed
[mv3] Properly enforce generic cosmetic exception filters
Related issue: - uBlockOrigin/uBOL-home#58
1 parent 4a570c1 commit 4a83b80

File tree

2 files changed

+35
-5
lines changed

2 files changed

+35
-5
lines changed

platform/mv3/make-rulesets.js

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -396,13 +396,26 @@ function loadAllSourceScriptlets() {
396396

397397
/******************************************************************************/
398398

399-
async function processGenericCosmeticFilters(assetDetails, bucketsMap) {
399+
async function processGenericCosmeticFilters(assetDetails, bucketsMap, exceptionSet) {
400400
if ( bucketsMap === undefined ) { return 0; }
401+
if ( exceptionSet ) {
402+
for ( const [ hash, selectors ] of bucketsMap ) {
403+
let i = selectors.length;
404+
while ( i-- ) {
405+
const selector = selectors[i];
406+
if ( exceptionSet.has(selector) === false ) { continue; }
407+
selectors.splice(i, 1);
408+
//log(`\tRemoving excepted generic filter ##${selector}`);
409+
}
410+
if ( selectors.length === 0 ) {
411+
bucketsMap.delete(hash);
412+
}
413+
}
414+
}
401415
if ( bucketsMap.size === 0 ) { return 0; }
402416
const bucketsList = Array.from(bucketsMap);
403417
const count = bucketsList.reduce((a, v) => a += v[1].length, 0);
404418
if ( count === 0 ) { return 0; }
405-
406419
const selectorLists = bucketsList.map(v => [ v[0], v[1].join(',') ]);
407420
const originalScriptletMap = await loadAllSourceScriptlets();
408421

@@ -427,8 +440,15 @@ async function processGenericCosmeticFilters(assetDetails, bucketsMap) {
427440

428441
/******************************************************************************/
429442

430-
async function processGenericHighCosmeticFilters(assetDetails, selectorSet) {
443+
async function processGenericHighCosmeticFilters(assetDetails, selectorSet, exceptionSet) {
431444
if ( selectorSet === undefined ) { return 0; }
445+
if ( exceptionSet ) {
446+
for ( const selector of selectorSet ) {
447+
if ( exceptionSet.has(selector) === false ) { continue; }
448+
selectorSet.delete(selector);
449+
//log(`\tRemoving excepted generic filter ##${selector}`);
450+
}
451+
}
432452
if ( selectorSet.size === 0 ) { return 0; }
433453
const selectorLists = Array.from(selectorSet).sort().join(',\n');
434454
const originalScriptletMap = await loadAllSourceScriptlets();
@@ -925,11 +945,13 @@ async function rulesetFromURLs(assetDetails) {
925945

926946
const genericCosmeticStats = await processGenericCosmeticFilters(
927947
assetDetails,
928-
results.genericCosmetic
948+
results.genericCosmetic,
949+
results.genericCosmeticExceptions
929950
);
930951
const genericHighCosmeticStats = await processGenericHighCosmeticFilters(
931952
assetDetails,
932-
results.genericHighCosmetic
953+
results.genericHighCosmetic,
954+
results.genericCosmeticExceptions
933955
);
934956
const specificCosmeticStats = await processCosmeticFilters(
935957
assetDetails,

src/js/static-dnr-filtering.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,13 @@ function addExtendedToDNR(context, parser) {
150150
const { compiled } = parser.result;
151151
if ( compiled === undefined ) { return; }
152152
if ( compiled.length <= 1 ) { return; }
153+
if ( parser.isException() ) {
154+
if ( context.genericCosmeticExceptions === undefined ) {
155+
context.genericCosmeticExceptions = new Set();
156+
}
157+
context.genericCosmeticExceptions.add(compiled);
158+
return;
159+
}
153160
if ( compiled.charCodeAt(0) === 0x7B /* '{' */ ) { return; }
154161
const key = keyFromSelector(compiled);
155162
if ( key === undefined ) {
@@ -298,6 +305,7 @@ async function dnrRulesetFromRawLists(lists, options = {}) {
298305
network: staticNetFilteringEngine.dnrFromCompiled('end', context),
299306
genericCosmetic: context.genericCosmeticFilters,
300307
genericHighCosmetic: context.genericHighCosmeticFilters,
308+
genericCosmeticExceptions: context.genericCosmeticExceptions,
301309
specificCosmetic: context.specificCosmeticFilters,
302310
scriptlet: context.scriptletFilters,
303311
};

0 commit comments

Comments
 (0)