1
0
mirror of https://github.com/gorhill/uBlock.git synced 2024-09-15 15:32:28 +02:00

Allow domain= with entity values into pre-test buckets

Related commit:
- b265f2644d

Filters which have `domain=` option with an entity
value will no longer be prevented from joining
pre-test buckets.
This commit is contained in:
Raymond Hill 2020-11-14 07:04:21 -05:00
parent 56cd238ad4
commit 4afb3dc149
No known key found for this signature in database
GPG Key ID: 25E1490B761470C2
2 changed files with 70 additions and 10 deletions

View File

@ -139,8 +139,8 @@ const µBlock = (( ) => { // jshint ignore:line
// Read-only
systemSettings: {
compiledMagic: 33, // Increase when compiled format changes
selfieMagic: 33, // Increase when selfie format changes
compiledMagic: 34, // Increase when compiled format changes
selfieMagic: 34, // Increase when selfie format changes
},
// https://github.com/uBlockOrigin/uBlock-issues/issues/759#issuecomment-546654501

View File

@ -1223,7 +1223,7 @@ const filterOrigin = (( ) => {
compiledHit.push(FilterOriginHitSet.compile(hostnameHits.join('|')));
}
if ( compiledHit.length > 1 ) {
compiledHit[0] = FilterCompositeAny.compile(compiledHit.slice());
compiledHit[0] = FilterOriginHitAny.compile(compiledHit.slice());
compiledHit.length = 1;
}
const compiledMiss = [];
@ -1454,6 +1454,10 @@ const FilterOriginEntityHit = class {
this.entity = entity;
}
get domainOpt() {
return `${this.entity}.*`;
}
match() {
const entity = $docEntity.compute();
if ( entity === '' ) { return false; }
@ -1471,7 +1475,7 @@ const FilterOriginEntityHit = class {
}
logData(details) {
details.domains.push(`${this.entity}.*`);
details.domains.push(this.domainOpt);
}
static compile(entity) {
@ -1487,6 +1491,8 @@ const FilterOriginEntityHit = class {
}
};
FilterOriginEntityHit.prototype.hasOriginHit = true;
registerFilterClass(FilterOriginEntityHit);
/******************************************************************************/
@ -1513,10 +1519,52 @@ const FilterOriginEntityMiss = class extends FilterOriginEntityHit {
}
};
FilterOriginEntityMiss.prototype.hasOriginHit = false;
registerFilterClass(FilterOriginEntityMiss);
/******************************************************************************/
const FilterOriginHitSetTest = class extends FilterOriginHitSet {
constructor(domainOpt, hasEntity = undefined, oneOf = null) {
super(domainOpt, oneOf);
this.hasEntity = hasEntity === undefined
? domainOpt.indexOf('.*') !== -1
: hasEntity;
}
match() {
if ( this.oneOf === null ) {
this.oneOf = filterOrigin.trieContainer.fromIterable(
domainOptIterator.reset(this.domainOpt)
);
this.domainOpt = '';
}
return this.oneOf.matches($docHostname) !== -1 ||
this.hasEntity !== false &&
this.oneOf.matches(`${$docEntity.compute()}.*`) !== -1;
}
toSelfie() {
return [
this.fid,
this.domainOpt,
this.hasEntity,
this.oneOf !== null
? filterOrigin.trieContainer.compileOne(this.oneOf)
: null
];
}
static fromSelfie(args) {
return new FilterOriginHitSetTest(args[1], args[2], args[3]);
}
};
registerFilterClass(FilterOriginHitSetTest);
/******************************************************************************/
const FilterModifier = class {
constructor(actionBits, modifier, value) {
this.actionBits = actionBits;
@ -1681,7 +1729,17 @@ const FilterCollection = class {
/******************************************************************************/
const FilterCompositeAny = class extends FilterCollection {
const FilterOriginHitAny = class extends FilterCollection {
get domainOpt() {
const domainOpts = [];
this.forEach(iunit => {
const f = filterUnits[iunit];
if ( f.hasOriginHit !== true ) { return; }
domainOpts.push(f.domainOpt);
});
return domainOpts.join('|');
}
match() {
let i = this.i;
while ( i !== 0 ) {
@ -1692,22 +1750,24 @@ const FilterCompositeAny = class extends FilterCollection {
}
static compile(fdata) {
return super.compile(FilterCompositeAny, fdata);
return super.compile(FilterOriginHitAny, fdata);
}
static fromCompiled(args) {
return super.fromCompiled(args, new FilterCompositeAny());
return super.fromCompiled(args, new FilterOriginHitAny());
}
static fromSelfie(args, bucket) {
if ( bucket === undefined ) {
bucket = new FilterCompositeAny();
bucket = new FilterOriginHitAny();
}
return super.fromSelfie(args, bucket);
}
};
registerFilterClass(FilterCompositeAny);
FilterOriginHitAny.prototype.hasOriginHit = true;
registerFilterClass(FilterOriginHitAny);
/******************************************************************************/
@ -2210,7 +2270,7 @@ const FilterBucket = class extends FilterCollection {
i = inext;
}
bucket.originTestUnit =
filterUnitFromCtor(FilterOriginHitSet, domainOpts.join('|'));
filterUnitFromCtor(FilterOriginHitSetTest, domainOpts.join('|'));
return bucket;
}
};