Properly serialize CSS combinators according to position in selector · gorhill/uBlock@fbc7a0e (original) (raw)

`@@ -3364,7 +3364,7 @@ class ExtSelectorCompiler {

`

3364

3364

`` out.push(.${data.name});

``

3365

3365

`break;

`

3366

3366

`case 'Combinator':

`

3367

``

`` -

out.push(data.name === ' ' ? ' ' : ${data.name});

``

``

3367

`+

out.push(data.name);

`

3368

3368

`break;

`

3369

3369

`case 'Identifier':

`

3370

3370

`if ( this.reInvalidIdentifier.test(data.name) ) { return; }

`

`@@ -3436,14 +3436,35 @@ class ExtSelectorCompiler {

`

3436

3436

`return out.join('');

`

3437

3437

`}

`

3438

3438

``

``

3439

`+

astAppendPart(part, out) {

`

``

3440

`+

const { data } = part;

`

``

3441

`+

switch ( data.type ) {

`

``

3442

`+

case 'Combinator': {

`

``

3443

`+

const s = this.astSerializePart(part);

`

``

3444

`+

if ( s === undefined ) { return false; }

`

``

3445

`+

if ( out.length === 0 ) {

`

``

3446

`+

if ( s !== ' ' ) {

`

``

3447

`+

out.push(s, ' ');

`

``

3448

`+

}

`

``

3449

`+

} else {

`

``

3450

`+

out.push(' ');

`

``

3451

`+

if ( s !== ' ' ) {

`

``

3452

`+

out.push(s, ' ');

`

``

3453

`+

}

`

``

3454

`+

}

`

``

3455

`+

break;

`

``

3456

`+

}

`

``

3457

`+

}

`

``

3458

`+

return true;

`

``

3459

`+

}

`

``

3460

+

3439

3461

`astSerialize(parts, plainCSS = true) {

`

3440

3462

`const out = [];

`

3441

3463

`for ( const part of parts ) {

`

3442

3464

`const { data } = part;

`

3443

3465

`switch ( data.type ) {

`

3444

3466

`case 'AttributeSelector':

`

3445

3467

`case 'ClassSelector':

`

3446

``

`-

case 'Combinator':

`

3447

3468

`case 'Identifier':

`

3448

3469

`case 'IdSelector':

`

3449

3470

`case 'Nth':

`

`@@ -3455,6 +3476,9 @@ class ExtSelectorCompiler {

`

3455

3476

`out.push(s);

`

3456

3477

`break;

`

3457

3478

`}

`

``

3479

`+

case 'Combinator':

`

``

3480

`+

if ( this.astAppendPart(part, out) === false ) { return; }

`

``

3481

`+

break;

`

3458

3482

`case 'Raw':

`

3459

3483

`if ( plainCSS ) { return; }

`

3460

3484

`out.push(this.astSerializePart(part));

`

`@@ -3499,7 +3523,6 @@ class ExtSelectorCompiler {

`

3499

3523

`}

`

3500

3524

`case 'AttributeSelector':

`

3501

3525

`case 'ClassSelector':

`

3502

``

`-

case 'Combinator':

`

3503

3526

`case 'IdSelector':

`

3504

3527

`case 'PseudoClassSelector':

`

3505

3528

`case 'PseudoElementSelector':

`

`@@ -3509,6 +3532,10 @@ class ExtSelectorCompiler {

`

3509

3532

`prelude.push(component);

`

3510

3533

`break;

`

3511

3534

`}

`

``

3535

`+

case 'Combinator': {

`

``

3536

`+

if ( this.astAppendPart(part, prelude) === false ) { return; }

`

``

3537

`+

break;

`

``

3538

`+

}

`

3512

3539

`case 'ProceduralSelector': {

`

3513

3540

`if ( prelude.length !== 0 ) {

`

3514

3541

`let spath = prelude.join('');

`