From b9c959768c7ee43a0e1ec9a1ca84805246210040 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Thu, 10 Dec 2020 15:03:02 -0800 Subject: [PATCH] feat(selectors): optimize old->new conversion for css (#4672) --- src/server/common/selectorParser.ts | 23 ++++++++++++++++------- test/selectors-css.spec.ts | 14 ++++++++++++++ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/server/common/selectorParser.ts b/src/server/common/selectorParser.ts index b22c9a6474..b5e75c544b 100644 --- a/src/server/common/selectorParser.ts +++ b/src/server/common/selectorParser.ts @@ -63,21 +63,30 @@ export function parseSelector(selector: string, customNames: Set): Parse wrapInLight = true; name = name.substring(0, name.indexOf(':')); } - let simple: CSSSimpleSelector; if (name === 'css') { const parsed = parseCSS(part.body, customNames); parsed.names.forEach(name => names.add(name)); - simple = callWith('is', parsed.selector); + if (wrapInLight || parsed.selector.length > 1) { + let simple = callWith('is', parsed.selector); + if (wrapInLight) + simple = callWith('light', [simpleToComplex(simple)]); + result.simples.push({ selector: simple, combinator: '' }); + } else { + result.simples.push(...parsed.selector[0].simples); + } } else if (name === 'text') { - simple = textSelectorToSimple(part.body); + let simple = textSelectorToSimple(part.body); if (result.simples.length) result.simples[result.simples.length - 1].combinator = '>='; + if (wrapInLight) + simple = callWith('light', [simpleToComplex(simple)]); + result.simples.push({ selector: simple, combinator: '' }); } else { - simple = callWith(name, [part.body]); + let simple = callWith(name, [part.body]); + if (wrapInLight) + simple = callWith('light', [simpleToComplex(simple)]); + result.simples.push({ selector: simple, combinator: '' }); } - if (wrapInLight) - simple = callWith('light', [simpleToComplex(simple)]); - result.simples.push({ selector: simple, combinator: '' }); } return result; }; diff --git a/test/selectors-css.spec.ts b/test/selectors-css.spec.ts index fe75fd287c..a8b08ce860 100644 --- a/test/selectors-css.spec.ts +++ b/test/selectors-css.spec.ts @@ -146,6 +146,20 @@ it('should keep dom order with comma separated list', async ({page}) => { expect(await page.$$eval(`css=section >> *css=div,span >> css=y`, els => els.map(e => e.nodeName).join(','))).toBe('SPAN,DIV'); }); +it('should work with comma separated list in various positions', async ({page}) => { + await page.setContent(`
`); + expect(await page.$$eval(`css=span,div >> css=x,y`, els => els.map(e => e.nodeName).join(','))).toBe('X,Y'); + expect(await page.$$eval(`css=span,div >> css=x`, els => els.map(e => e.nodeName).join(','))).toBe('X'); + expect(await page.$$eval(`css=div >> css=x,y`, els => els.map(e => e.nodeName).join(','))).toBe('X,Y'); + expect(await page.$$eval(`css=div >> css=x`, els => els.map(e => e.nodeName).join(','))).toBe('X'); + + expect(await page.$$eval(`css=section >> css=div >> css=x`, els => els.map(e => e.nodeName).join(','))).toBe('X'); + expect(await page.$$eval(`css=section >> css=span >> css=div >> css=y`, els => els.map(e => e.nodeName).join(','))).toBe('Y'); + expect(await page.$$eval(`css=section >> css=div >> css=x,y`, els => els.map(e => e.nodeName).join(','))).toBe('X,Y'); + expect(await page.$$eval(`css=section >> css=div,span >> css=x,y`, els => els.map(e => e.nodeName).join(','))).toBe('X,Y'); + expect(await page.$$eval(`css=section >> css=span >> css=x,y`, els => els.map(e => e.nodeName).join(','))).toBe('X,Y'); +}); + it('should work with comma inside text', async ({page}) => { await page.setContent(`
`); expect(await page.$eval(`css=div[attr="hello,world!"]`, e => e.outerHTML)).toBe('
');