From 393fd90f9d0e0326d559e9761c705c6ae30222de Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 20 Aug 2023 10:41:43 -0400 Subject: [PATCH] Disallow trailing CSS universal selector unless properly separated Related discussion: https://www.reddit.com/r/uBlockOrigin/comments/15tzgud/ads_on_twitterx_again/jwn8bkj/ --- src/js/static-filtering-parser.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/js/static-filtering-parser.js b/src/js/static-filtering-parser.js index ffe5ed12e..55414d941 100644 --- a/src/js/static-filtering-parser.js +++ b/src/js/static-filtering-parser.js @@ -3437,11 +3437,11 @@ class ExtSelectorCompiler { } astAppendPart(part, out) { + const s = this.astSerializePart(part); + if ( s === undefined ) { return false; } const { data } = part; switch ( data.type ) { - case 'Combinator': { - const s = this.astSerializePart(part); - if ( s === undefined ) { return false; } + case 'Combinator': if ( out.length === 0 ) { if ( s !== ' ' ) { out.push(s, ' '); @@ -3453,7 +3453,14 @@ class ExtSelectorCompiler { } } break; - } + // csstree parses `.promoted*` as valid + case 'TypeSelector': + if ( s === '*' && out.length !== 0 ) { + const before = out[out.length-1]; + if ( before.endsWith(' ') === false ) { return false; } + } + out.push('*'); + break; } return true; } @@ -3469,14 +3476,14 @@ class ExtSelectorCompiler { case 'IdSelector': case 'Nth': case 'PseudoClassSelector': - case 'PseudoElementSelector': - case 'TypeSelector': { + case 'PseudoElementSelector': { const s = this.astSerializePart(part); - if ( typeof s !== 'string' ) { return; } + if ( s === undefined ) { return; } out.push(s); break; } case 'Combinator': + case 'TypeSelector': if ( this.astAppendPart(part, out) === false ) { return; } break; case 'Raw':