From 7ddbc0089973e4cae7a7d1935b1158c8b3ea8b62 Mon Sep 17 00:00:00 2001 From: Udhav Sethi Date: Mon, 6 May 2019 15:47:30 +0530 Subject: [PATCH] Fix parsing for minified css with extra semicolons This fixes the scenario where extra semicolons are immediately followed (without whitespace) by a boundary token such as '}'. For the ruleset: .foo{bar:baz;;}div .qux{vim:fet;} Shady treats the first `}' as an extra token and adds div .qux rule under the .foo selector. --- src/shady-css/parser.ts | 2 +- src/test/fixtures.ts | 2 ++ src/test/parser-test.ts | 12 ++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/shady-css/parser.ts b/src/shady-css/parser.ts index 9310b80..037da4d 100644 --- a/src/shady-css/parser.ts +++ b/src/shady-css/parser.ts @@ -131,7 +131,7 @@ class Parser { } while (tokenizer.currentToken && - tokenizer.currentToken.is(TokenType.boundary)) { + tokenizer.currentToken.is(TokenType.semicolon)) { end = tokenizer.advance(); } diff --git a/src/test/fixtures.ts b/src/test/fixtures.ts index db841f1..41e7696 100644 --- a/src/test/fixtures.ts +++ b/src/test/fixtures.ts @@ -68,6 +68,8 @@ div { export const minifiedRuleset = '.foo{bar:baz}div .qux{vim:fet;}'; +export const minifiedRulesetWithExtraSemicolons = '.foo{bar:baz;;}div .qux{vim:fet;}'; + export const psuedoRuleset = '.foo:bar:not(#rif){baz:qux}'; export const dataUriRuleset = '.foo{bar:url(qux;gib)}'; diff --git a/src/test/parser-test.ts b/src/test/parser-test.ts index aded6c0..ca45cfe 100644 --- a/src/test/parser-test.ts +++ b/src/test/parser-test.ts @@ -183,6 +183,18 @@ describe('Parser', () => { ])) ])); }); + + it('can parse minified rulelists with extra semicolons', () => { + expect(parser.parse(fixtures.minifiedRulesetWithExtraSemicolons)) + .to.containSubset(nodeFactory.stylesheet([ + nodeFactory.ruleset( + '.foo', nodeFactory.rulelist([nodeFactory.declaration( + 'bar', nodeFactory.expression('baz'))])), + nodeFactory.ruleset( + 'div .qux', nodeFactory.rulelist([nodeFactory.declaration( + 'vim', nodeFactory.expression('fet'))])) + ])); + }); }); describe('when extracting ranges', () => {