diff --git a/experimental/css-has-pseudo/CHANGELOG.md b/experimental/css-has-pseudo/CHANGELOG.md index 9dea9776d..cabe2b1d1 100644 --- a/experimental/css-has-pseudo/CHANGELOG.md +++ b/experimental/css-has-pseudo/CHANGELOG.md @@ -1,6 +1,11 @@ # Changes to CSS Has Pseudo -### Unreleased +### 0.1.1 (January 5, 2022) + +- Added : support for id and tag selector specificity. +- Changed : hover tracking now also uses `leave` events for correct style re-calcs. + +### 0.1.0 (January 4, 2022) Tracking initial implementation of `:has()` pseudo-class in Safari Technology Preview. This is a breaking change and affects both the generated CSS and the client side polyfill. diff --git a/experimental/css-has-pseudo/README-BROWSER.md b/experimental/css-has-pseudo/README-BROWSER.md index 9d92bb87b..00e6a658c 100644 --- a/experimental/css-has-pseudo/README-BROWSER.md +++ b/experimental/css-has-pseudo/README-BROWSER.md @@ -92,8 +92,8 @@ ECMA Script: [git-img]: https://img.shields.io/badge/support-chat-blue.svg [git-url]: https://gitter.im/postcss/postcss -[npm-img]: https://img.shields.io/npm/v/css-has-pseudo.svg -[npm-url]: https://www.npmjs.com/package/css-has-pseudo +[npm-img]: https://img.shields.io/npm/v/@csstools/css-has-pseudo-experimental.svg +[npm-url]: https://www.npmjs.com/package/@csstools/css-has-pseudo-experimental [EXPERIMENTAL CSS Has Pseudo]: https://github.com/csstools/postcss-plugins/tree/main/experimental/css-has-pseudo [Selectors Level 4]: https://drafts.csswg.org/selectors-4/#has diff --git a/experimental/css-has-pseudo/README-POSTCSS.md b/experimental/css-has-pseudo/README-POSTCSS.md index 5e62f5096..91cca9d79 100644 --- a/experimental/css-has-pseudo/README-POSTCSS.md +++ b/experimental/css-has-pseudo/README-POSTCSS.md @@ -97,8 +97,8 @@ plugins: [ [git-img]: https://img.shields.io/badge/support-chat-blue.svg [git-url]: https://gitter.im/postcss/postcss -[npm-img]: https://img.shields.io/npm/v/css-has-pseudo.svg -[npm-url]: https://www.npmjs.com/package/css-has-pseudo +[npm-img]: https://img.shields.io/npm/v/@csstools/css-has-pseudo-experimental.svg +[npm-url]: https://www.npmjs.com/package/@csstools/css-has-pseudo-experimental [PostCSS]: https://github.com/postcss/postcss [EXPERIMENTAL CSS Has Pseudo]: https://github.com/csstools/postcss-plugins/tree/main/experimental/css-has-pseudo diff --git a/experimental/css-has-pseudo/README.md b/experimental/css-has-pseudo/README.md index 91b0ebbdf..71520bd7f 100644 --- a/experimental/css-has-pseudo/README.md +++ b/experimental/css-has-pseudo/README.md @@ -111,8 +111,8 @@ plugins: [ [git-img]: https://img.shields.io/badge/support-chat-blue.svg [git-url]: https://gitter.im/postcss/postcss -[npm-img]: https://img.shields.io/npm/v/css-has-pseudo.svg -[npm-url]: https://www.npmjs.com/package/css-has-pseudo +[npm-img]: https://img.shields.io/npm/v/@csstools/css-has-pseudo-experimental.svg +[npm-url]: https://www.npmjs.com/package/@csstools/css-has-pseudo-experimental [EXPERIMENTAL CSS Has Pseudo]: https://github.com/csstools/postcss-plugins/tree/main/experimental/css-has-pseudo [Mutation Observer polyfill]: https://github.com/webmodules/mutation-observer diff --git a/experimental/css-has-pseudo/TODO.md b/experimental/css-has-pseudo/TODO.md index 254b2c69c..35c5106fb 100644 --- a/experimental/css-has-pseudo/TODO.md +++ b/experimental/css-has-pseudo/TODO.md @@ -8,6 +8,10 @@ Can we safely use `:not(#does-not-exist)`/`:not(does-not-exist)` as prefixes for see : https://drafts.csswg.org/selectors-4/#specificity-rules +### Update 1 : + +This has been implemented. +Still needs to be documented. ## Plugin order : diff --git a/experimental/css-has-pseudo/src/browser.js b/experimental/css-has-pseudo/src/browser.js index 06dad0113..4598a2421 100644 --- a/experimental/css-has-pseudo/src/browser.js +++ b/experimental/css-has-pseudo/src/browser.js @@ -83,6 +83,16 @@ export default function cssHasPseudo(document, options) { document.addEventListener('input', transformObservedItemsThrottled); document.addEventListener('change', transformObservedItemsThrottled, true); + if (options.hover) { + if ('onpointerenter' in document) { + document.addEventListener('pointerenter', transformObservedItemsThrottled, true); + document.addEventListener('pointerleave', transformObservedItemsThrottled, true); + } else { + document.addEventListener('mouseover', transformObservedItemsThrottled, true); + document.addEventListener('mouseout', transformObservedItemsThrottled, true); + } + } + // observe Javascript setters that effect pseudo-selectors if ('defineProperty' in Object && 'getOwnPropertyDescriptor' in Object && 'hasOwnProperty' in Object) { try { @@ -144,14 +154,6 @@ export default function cssHasPseudo(document, options) { } } - if (options.hover) { - if ('onpointerenter' in document) { - document.addEventListener('pointerenter', transformObservedItemsThrottled, true); - } else { - document.addEventListener('mouseover', transformObservedItemsThrottled, true); - } - } - let transformObservedItemsThrottledBusy = false; function transformObservedItemsThrottled() { if (transformObservedItemsThrottledBusy) { diff --git a/experimental/css-has-pseudo/src/index.js b/experimental/css-has-pseudo/src/index.js index b2be00f6b..8bc745839 100644 --- a/experimental/css-has-pseudo/src/index.js +++ b/experimental/css-has-pseudo/src/index.js @@ -6,6 +6,11 @@ const creator = (/** @type {{ preserve: true | false }} */ opts) => { /** Whether the original rule should be preserved. */ const shouldPreserve = Boolean('preserve' in opts ? opts.preserve : true); + const doesNotExistName = opts.doesNotExistName ?? 'does-not-exist'; + + const doesNotExistId = ':not(#' + doesNotExistName + ')'; + const doesNotExistClass = ':not(.' + doesNotExistName + ')'; + const doesNotExistTag = ':not(' + doesNotExistName + ')'; return { postcssPlugin: 'css-has-pseudo-experimental', @@ -19,8 +24,6 @@ const creator = (/** @type {{ preserve: true | false }} */ opts) => { return selector; } - let specificity = 1; - let selectorAST; try { selectorAST = parser().astSync(selector); @@ -42,16 +45,22 @@ const creator = (/** @type {{ preserve: true | false }} */ opts) => { return selector; } + const encodedSelector = '[' + encodeCSS(selector) + ']'; const abcSpecificity = selectorSpecificity(selectorAST); - specificity = Math.max(1, abcSpecificity.b); - let encodedSelectorWithBSpecificty = ''; - const encodedSelector = '[' + encodeCSS(selector) + ']'; - for (let i = 0; i < specificity; i++) { - encodedSelectorWithBSpecificty += encodedSelector; + let encodedSelectorWithSpecificity = encodedSelector; + for (let i = 0; i < abcSpecificity.a; i++) { + encodedSelectorWithSpecificity += doesNotExistId; + } + const bSpecificity = Math.max(1, abcSpecificity.b) - 1; + for (let i = 0; i < bSpecificity; i++) { + encodedSelectorWithSpecificity += doesNotExistClass; + } + for (let i = 0; i < abcSpecificity.c; i++) { + encodedSelectorWithSpecificity += doesNotExistTag; } - return encodedSelectorWithBSpecificty; + return encodedSelectorWithSpecificity; }); if (selectors.join(',') === rule.selectors.join(',')) { @@ -79,7 +88,13 @@ function selectorSpecificity(node) { let b = 0; let c = 0; - if (node.type === 'id') { + if (node.type == 'universal') { + return { + a: 0, + b: 0, + c: 0, + }; + } else if (node.type === 'id') { a += 1; } else if (node.type === 'tag') { c += 1; diff --git a/experimental/css-has-pseudo/test/_browser.html b/experimental/css-has-pseudo/test/_browser.html index 8243f0361..c2d4d9e70 100644 --- a/experimental/css-has-pseudo/test/_browser.html +++ b/experimental/css-has-pseudo/test/_browser.html @@ -6,7 +6,7 @@ - + diff --git a/experimental/css-has-pseudo/test/basic.css b/experimental/css-has-pseudo/test/basic.css index 34fe5828d..f23fbd200 100644 --- a/experimental/css-has-pseudo/test/basic.css +++ b/experimental/css-has-pseudo/test/basic.css @@ -118,3 +118,7 @@ body:not(:has(:focus)) { .a, .x:has(> .b) { order: 29; } + +.x:has(> .b *) { + order: 30; +} diff --git a/experimental/css-has-pseudo/test/basic.expect.css b/experimental/css-has-pseudo/test/basic.expect.css index edee2893c..6973ab07d 100644 --- a/experimental/css-has-pseudo/test/basic.expect.css +++ b/experimental/css-has-pseudo/test/basic.expect.css @@ -6,7 +6,7 @@ order: 1; } -[a\:has\(\%3E\%20img\)] { +[a\:has\(\%3E\%20img\)]:not(does-not-exist):not(does-not-exist) { order: 2; } @@ -14,7 +14,7 @@ a:has(> img) { order: 2; } -[h1\:has\(\%2B\%20p\)] { +[h1\:has\(\%2B\%20p\)]:not(does-not-exist):not(does-not-exist) { order: 3; } @@ -22,7 +22,7 @@ h1:has(+ p) { order: 3; } -[h1\:has\(\~\%20p\)] { +[h1\:has\(\~\%20p\)]:not(does-not-exist):not(does-not-exist) { order: 4; } @@ -30,7 +30,7 @@ h1:has(~ p) { order: 4; } -[section\:not\(\:has\(h1\,\%20h2\,\%20h3\,\%20h4\,\%20h5\,\%20h6\)\)] { +[section\:not\(\:has\(h1\,\%20h2\,\%20h3\,\%20h4\,\%20h5\,\%20h6\)\)]:not(does-not-exist):not(does-not-exist) { order: 5; } @@ -38,7 +38,7 @@ section:not(:has(h1, h2, h3, h4, h5, h6)) { order: 5; } -[body\:has\(\:focus\)] { +[body\:has\(\:focus\)]:not(does-not-exist) { order: 6; } @@ -46,7 +46,7 @@ body:has(:focus) { order: 6; } -[body\:not\(\:has\(\:focus\)\)] { +[body\:not\(\:has\(\:focus\)\)]:not(does-not-exist) { order: 7; } @@ -67,7 +67,7 @@ body:not(:has(:focus)) { order: 9; } -[\.x\:has\(\%3E\%20\.a\:hover\)][\.x\:has\(\%3E\%20\.a\:hover\)][\.x\:has\(\%3E\%20\.a\:hover\)] { +[\.x\:has\(\%3E\%20\.a\:hover\)]:not(.does-not-exist):not(.does-not-exist) { order: 10; } @@ -75,7 +75,7 @@ body:not(:has(:focus)) { order: 10; } -[\.x\:has\(\%3E\%20\%23a\:hover\)][\.x\:has\(\%3E\%20\%23a\:hover\)] { +[\.x\:has\(\%3E\%20\%23a\:hover\)]:not(#does-not-exist):not(.does-not-exist) { order: 11; } @@ -83,7 +83,7 @@ body:not(:has(:focus)) { order: 11; } -[\.x\:has\(\%3E\%20\[a\]\:hover\)][\.x\:has\(\%3E\%20\[a\]\:hover\)][\.x\:has\(\%3E\%20\[a\]\:hover\)] { +[\.x\:has\(\%3E\%20\[a\]\:hover\)]:not(.does-not-exist):not(.does-not-exist) { order: 12; } @@ -91,7 +91,7 @@ body:not(:has(:focus)) { order: 12; } -[\.x\:has\(\%3E\%20\[a\%3D\%22b\%22\]\:hover\)][\.x\:has\(\%3E\%20\[a\%3D\%22b\%22\]\:hover\)][\.x\:has\(\%3E\%20\[a\%3D\%22b\%22\]\:hover\)] { +[\.x\:has\(\%3E\%20\[a\%3D\%22b\%22\]\:hover\)]:not(.does-not-exist):not(.does-not-exist) { order: 13; } @@ -99,7 +99,7 @@ body:not(:has(:focus)) { order: 13; } -[\.x\:has\(\%3E\%20\[a\%3D\%22\:has\(\.x\)\%22\]\:hover\)][\.x\:has\(\%3E\%20\[a\%3D\%22\:has\(\.x\)\%22\]\:hover\)][\.x\:has\(\%3E\%20\[a\%3D\%22\:has\(\.x\)\%22\]\:hover\)] { +[\.x\:has\(\%3E\%20\[a\%3D\%22\:has\(\.x\)\%22\]\:hover\)]:not(.does-not-exist):not(.does-not-exist) { order: 14; } @@ -107,7 +107,7 @@ body:not(:has(:focus)) { order: 14; } -[\.x\:has\(\%3E\%20\[\%5C\:has\%5C\(\%5C\%253E\%5C\%2520\%5C\.a\%5C\:hover\%5C\)\]\:hover\)][\.x\:has\(\%3E\%20\[\%5C\:has\%5C\(\%5C\%253E\%5C\%2520\%5C\.a\%5C\:hover\%5C\)\]\:hover\)][\.x\:has\(\%3E\%20\[\%5C\:has\%5C\(\%5C\%253E\%5C\%2520\%5C\.a\%5C\:hover\%5C\)\]\:hover\)] { +[\.x\:has\(\%3E\%20\[\%5C\:has\%5C\(\%5C\%253E\%5C\%2520\%5C\.a\%5C\:hover\%5C\)\]\:hover\)]:not(.does-not-exist):not(.does-not-exist) { order: 15; } @@ -115,7 +115,7 @@ body:not(:has(:focus)) { order: 15; } -[\.x\:has\(\%3E\%20\:\:before\:hover\)][\.x\:has\(\%3E\%20\:\:before\:hover\)] { +[\.x\:has\(\%3E\%20\:\:before\:hover\)]:not(.does-not-exist):not(does-not-exist) { order: 16; /* not allowed by spec but encoding should work */ } @@ -123,7 +123,7 @@ body:not(:has(:focus)) { order: 16; /* not allowed by spec but encoding should work */ } -[\.x\:has\(\%3E\%20\.a\:has\(\%20\%2B\%20\.b\)\)][\.x\:has\(\%3E\%20\.a\:has\(\%20\%2B\%20\.b\)\)][\.x\:has\(\%3E\%20\.a\:has\(\%20\%2B\%20\.b\)\)] { +[\.x\:has\(\%3E\%20\.a\:has\(\%20\%2B\%20\.b\)\)]:not(.does-not-exist):not(.does-not-exist) { order: 17; } @@ -131,7 +131,7 @@ body:not(:has(:focus)) { order: 17; } -[\.x\:has\(\%3E\%20__foo\)] { +[\.x\:has\(\%3E\%20__foo\)]:not(does-not-exist) { order: 18; } @@ -139,7 +139,7 @@ body:not(:has(:focus)) { order: 18; } -[\.x\:has\(\%3E\%20\:--foo\)][\.x\:has\(\%3E\%20\:--foo\)] { +[\.x\:has\(\%3E\%20\:--foo\)]:not(.does-not-exist) { order: 19; } @@ -155,7 +155,7 @@ body:not(:has(:focus)) { order: 20; } -[\.x\:has\(\%3E\%20\.y\%20\*\)][\.x\:has\(\%3E\%20\.y\%20\*\)] { +[\.x\:has\(\%3E\%20\.y\%20\*\)]:not(.does-not-exist) { order: 21; } @@ -163,7 +163,7 @@ body:not(:has(:focus)) { order: 21; } -[\.a\:not\(\:has\(\%3E\%20\.b\)\)][\.a\:not\(\:has\(\%3E\%20\.b\)\)] { +[\.a\:not\(\:has\(\%3E\%20\.b\)\)]:not(.does-not-exist) { order: 22; } @@ -171,7 +171,7 @@ body:not(:has(:focus)) { order: 22; } -[\.x\:has\(\~\%20\.y\:has\(\.g\%20\.h\)\%20\.i\)][\.x\:has\(\~\%20\.y\:has\(\.g\%20\.h\)\%20\.i\)][\.x\:has\(\~\%20\.y\:has\(\.g\%20\.h\)\%20\.i\)][\.x\:has\(\~\%20\.y\:has\(\.g\%20\.h\)\%20\.i\)][\.x\:has\(\~\%20\.y\:has\(\.g\%20\.h\)\%20\.i\)] { +[\.x\:has\(\~\%20\.y\:has\(\.g\%20\.h\)\%20\.i\)]:not(.does-not-exist):not(.does-not-exist):not(.does-not-exist):not(.does-not-exist) { order: 23; } @@ -179,7 +179,7 @@ body:not(:has(:focus)) { order: 23; } -[\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)] { +[\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)]:not(.does-not-exist):not(.does-not-exist):not(.does-not-exist) { order: 24; } @@ -187,7 +187,7 @@ body:not(:has(:focus)) { order: 24; } -[\.x\:has\(\%3E\%20\.a\)\%20\.b][\.x\:has\(\%3E\%20\.a\)\%20\.b][\.x\:has\(\%3E\%20\.a\)\%20\.b] { +[\.x\:has\(\%3E\%20\.a\)\%20\.b]:not(.does-not-exist):not(.does-not-exist) { order: 24; } @@ -195,7 +195,7 @@ body:not(:has(:focus)) { order: 24; } -[\.x\:has\(\%3E\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\)][\.x\:has\(\%3E\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\)] { +[\.x\:has\(\%3E\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\)]:not(.does-not-exist) { order: 25; } @@ -203,7 +203,7 @@ body:not(:has(:focus)) { order: 25; } -[\.x\:has\(\%3E\%20\.a\)][\.x\:has\(\%3E\%20\.a\)], [\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.b\)] { +[\.x\:has\(\%3E\%20\.a\)]:not(.does-not-exist), [\.x\:has\(\%3E\%20\.b\)]:not(.does-not-exist) { order: 26; } @@ -211,7 +211,7 @@ body:not(:has(:focus)) { order: 26; } -[\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)] { +[\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)]:not(.does-not-exist):not(.does-not-exist):not(.does-not-exist) { order: 27; } @@ -219,7 +219,7 @@ body:not(:has(:focus)) { order: 27; } -[\.x\:has\(\%3E\%20\.a\)][\.x\:has\(\%3E\%20\.a\)], .b { +[\.x\:has\(\%3E\%20\.a\)]:not(.does-not-exist), .b { order: 28; } @@ -227,10 +227,18 @@ body:not(:has(:focus)) { order: 28; } -.a, [\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.b\)] { +.a, [\.x\:has\(\%3E\%20\.b\)]:not(.does-not-exist) { order: 29; } .a, .x:has(> .b) { order: 29; } + +[\.x\:has\(\%3E\%20\.b\%20\*\)]:not(.does-not-exist) { + order: 30; +} + +.x:has(> .b *) { + order: 30; +} diff --git a/experimental/css-has-pseudo/test/basic.preserve.expect.css b/experimental/css-has-pseudo/test/basic.preserve.expect.css index 04814701c..4560adb47 100644 --- a/experimental/css-has-pseudo/test/basic.preserve.expect.css +++ b/experimental/css-has-pseudo/test/basic.preserve.expect.css @@ -2,27 +2,27 @@ order: 1; } -[a\:has\(\%3E\%20img\)] { +[a\:has\(\%3E\%20img\)]:not(does-not-exist):not(does-not-exist) { order: 2; } -[h1\:has\(\%2B\%20p\)] { +[h1\:has\(\%2B\%20p\)]:not(does-not-exist):not(does-not-exist) { order: 3; } -[h1\:has\(\~\%20p\)] { +[h1\:has\(\~\%20p\)]:not(does-not-exist):not(does-not-exist) { order: 4; } -[section\:not\(\:has\(h1\,\%20h2\,\%20h3\,\%20h4\,\%20h5\,\%20h6\)\)] { +[section\:not\(\:has\(h1\,\%20h2\,\%20h3\,\%20h4\,\%20h5\,\%20h6\)\)]:not(does-not-exist):not(does-not-exist) { order: 5; } -[body\:has\(\:focus\)] { +[body\:has\(\:focus\)]:not(does-not-exist) { order: 6; } -[body\:not\(\:has\(\:focus\)\)] { +[body\:not\(\:has\(\:focus\)\)]:not(does-not-exist) { order: 7; } @@ -35,43 +35,43 @@ order: 9; } -[\.x\:has\(\%3E\%20\.a\:hover\)][\.x\:has\(\%3E\%20\.a\:hover\)][\.x\:has\(\%3E\%20\.a\:hover\)] { +[\.x\:has\(\%3E\%20\.a\:hover\)]:not(.does-not-exist):not(.does-not-exist) { order: 10; } -[\.x\:has\(\%3E\%20\%23a\:hover\)][\.x\:has\(\%3E\%20\%23a\:hover\)] { +[\.x\:has\(\%3E\%20\%23a\:hover\)]:not(#does-not-exist):not(.does-not-exist) { order: 11; } -[\.x\:has\(\%3E\%20\[a\]\:hover\)][\.x\:has\(\%3E\%20\[a\]\:hover\)][\.x\:has\(\%3E\%20\[a\]\:hover\)] { +[\.x\:has\(\%3E\%20\[a\]\:hover\)]:not(.does-not-exist):not(.does-not-exist) { order: 12; } -[\.x\:has\(\%3E\%20\[a\%3D\%22b\%22\]\:hover\)][\.x\:has\(\%3E\%20\[a\%3D\%22b\%22\]\:hover\)][\.x\:has\(\%3E\%20\[a\%3D\%22b\%22\]\:hover\)] { +[\.x\:has\(\%3E\%20\[a\%3D\%22b\%22\]\:hover\)]:not(.does-not-exist):not(.does-not-exist) { order: 13; } -[\.x\:has\(\%3E\%20\[a\%3D\%22\:has\(\.x\)\%22\]\:hover\)][\.x\:has\(\%3E\%20\[a\%3D\%22\:has\(\.x\)\%22\]\:hover\)][\.x\:has\(\%3E\%20\[a\%3D\%22\:has\(\.x\)\%22\]\:hover\)] { +[\.x\:has\(\%3E\%20\[a\%3D\%22\:has\(\.x\)\%22\]\:hover\)]:not(.does-not-exist):not(.does-not-exist) { order: 14; } -[\.x\:has\(\%3E\%20\[\%5C\:has\%5C\(\%5C\%253E\%5C\%2520\%5C\.a\%5C\:hover\%5C\)\]\:hover\)][\.x\:has\(\%3E\%20\[\%5C\:has\%5C\(\%5C\%253E\%5C\%2520\%5C\.a\%5C\:hover\%5C\)\]\:hover\)][\.x\:has\(\%3E\%20\[\%5C\:has\%5C\(\%5C\%253E\%5C\%2520\%5C\.a\%5C\:hover\%5C\)\]\:hover\)] { +[\.x\:has\(\%3E\%20\[\%5C\:has\%5C\(\%5C\%253E\%5C\%2520\%5C\.a\%5C\:hover\%5C\)\]\:hover\)]:not(.does-not-exist):not(.does-not-exist) { order: 15; } -[\.x\:has\(\%3E\%20\:\:before\:hover\)][\.x\:has\(\%3E\%20\:\:before\:hover\)] { +[\.x\:has\(\%3E\%20\:\:before\:hover\)]:not(.does-not-exist):not(does-not-exist) { order: 16; /* not allowed by spec but encoding should work */ } -[\.x\:has\(\%3E\%20\.a\:has\(\%20\%2B\%20\.b\)\)][\.x\:has\(\%3E\%20\.a\:has\(\%20\%2B\%20\.b\)\)][\.x\:has\(\%3E\%20\.a\:has\(\%20\%2B\%20\.b\)\)] { +[\.x\:has\(\%3E\%20\.a\:has\(\%20\%2B\%20\.b\)\)]:not(.does-not-exist):not(.does-not-exist) { order: 17; } -[\.x\:has\(\%3E\%20__foo\)] { +[\.x\:has\(\%3E\%20__foo\)]:not(does-not-exist) { order: 18; } -[\.x\:has\(\%3E\%20\:--foo\)][\.x\:has\(\%3E\%20\:--foo\)] { +[\.x\:has\(\%3E\%20\:--foo\)]:not(.does-not-exist) { order: 19; } @@ -79,42 +79,46 @@ order: 20; } -[\.x\:has\(\%3E\%20\.y\%20\*\)][\.x\:has\(\%3E\%20\.y\%20\*\)] { +[\.x\:has\(\%3E\%20\.y\%20\*\)]:not(.does-not-exist) { order: 21; } -[\.a\:not\(\:has\(\%3E\%20\.b\)\)][\.a\:not\(\:has\(\%3E\%20\.b\)\)] { +[\.a\:not\(\:has\(\%3E\%20\.b\)\)]:not(.does-not-exist) { order: 22; } -[\.x\:has\(\~\%20\.y\:has\(\.g\%20\.h\)\%20\.i\)][\.x\:has\(\~\%20\.y\:has\(\.g\%20\.h\)\%20\.i\)][\.x\:has\(\~\%20\.y\:has\(\.g\%20\.h\)\%20\.i\)][\.x\:has\(\~\%20\.y\:has\(\.g\%20\.h\)\%20\.i\)][\.x\:has\(\~\%20\.y\:has\(\.g\%20\.h\)\%20\.i\)] { +[\.x\:has\(\~\%20\.y\:has\(\.g\%20\.h\)\%20\.i\)]:not(.does-not-exist):not(.does-not-exist):not(.does-not-exist):not(.does-not-exist) { order: 23; } -[\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)] { +[\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)]:not(.does-not-exist):not(.does-not-exist):not(.does-not-exist) { order: 24; } -[\.x\:has\(\%3E\%20\.a\)\%20\.b][\.x\:has\(\%3E\%20\.a\)\%20\.b][\.x\:has\(\%3E\%20\.a\)\%20\.b] { +[\.x\:has\(\%3E\%20\.a\)\%20\.b]:not(.does-not-exist):not(.does-not-exist) { order: 24; } -[\.x\:has\(\%3E\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\)][\.x\:has\(\%3E\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\)] { +[\.x\:has\(\%3E\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\)]:not(.does-not-exist) { order: 25; } -[\.x\:has\(\%3E\%20\.a\)][\.x\:has\(\%3E\%20\.a\)], [\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.b\)] { +[\.x\:has\(\%3E\%20\.a\)]:not(.does-not-exist), [\.x\:has\(\%3E\%20\.b\)]:not(.does-not-exist) { order: 26; } -[\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)] { +[\.x\:has\(\%3E\%20\.a\)\%20\~\%20\.x\:has\(\%3E\%20\.b\)]:not(.does-not-exist):not(.does-not-exist):not(.does-not-exist) { order: 27; } -[\.x\:has\(\%3E\%20\.a\)][\.x\:has\(\%3E\%20\.a\)], .b { +[\.x\:has\(\%3E\%20\.a\)]:not(.does-not-exist), .b { order: 28; } -.a, [\.x\:has\(\%3E\%20\.b\)][\.x\:has\(\%3E\%20\.b\)] { +.a, [\.x\:has\(\%3E\%20\.b\)]:not(.does-not-exist) { order: 29; } + +[\.x\:has\(\%3E\%20\.b\%20\*\)]:not(.does-not-exist) { + order: 30; +} diff --git a/experimental/css-has-pseudo/test/browser.expect.css b/experimental/css-has-pseudo/test/browser.expect.css index 3079a8bb3..02219f78f 100644 --- a/experimental/css-has-pseudo/test/browser.expect.css +++ b/experimental/css-has-pseudo/test/browser.expect.css @@ -1,87 +1,87 @@ /* https://github.com/web-platform-tests/wpt/blob/master/css/selectors/invalidation/has-pseudo-class.html */ -[\%23d_main\:has\(input\)\%20div] { +[\%23d_main\:has\(input\)\%20div]:not(#does-not-exist):not(does-not-exist):not(does-not-exist) { color: grey } -[\%23d_main\:has\(\%23d_checkbox\:checked\)\%3E\%23d_subject] { +[\%23d_main\:has\(\%23d_checkbox\:checked\)\%3E\%23d_subject]:not(#does-not-exist):not(#does-not-exist):not(#does-not-exist) { color: red } -[\%23d_main\:has\(\%23d_option\:checked\)\%3E\%23d_subject] { +[\%23d_main\:has\(\%23d_option\:checked\)\%3E\%23d_subject]:not(#does-not-exist):not(#does-not-exist):not(#does-not-exist) { color: red } -[\%23d_main\:has\(\%23d_checkbox\:disabled\)\%3E\%23d_subject] { +[\%23d_main\:has\(\%23d_checkbox\:disabled\)\%3E\%23d_subject]:not(#does-not-exist):not(#does-not-exist):not(#does-not-exist) { color: green } -[\%23d_main\:has\(\%23d_option\:disabled\)\%3E\%20\:is\(\%23d_subject\,\%20\%23d_subject2\)] { +[\%23d_main\:has\(\%23d_option\:disabled\)\%3E\%20\:is\(\%23d_subject\,\%20\%23d_subject2\)]:not(#does-not-exist):not(#does-not-exist):not(#does-not-exist) { color: green } -[\%23d_main\:has\(\%23d_optgroup\:disabled\)\%3E\%23d_subject] { +[\%23d_main\:has\(\%23d_optgroup\:disabled\)\%3E\%23d_subject]:not(#does-not-exist):not(#does-not-exist):not(#does-not-exist) { color: blue } -[\%23d_main\:not\(\:has\(\%23d_checkbox\:enabled\)\)\%3E\%23d_subject3] { +[\%23d_main\:not\(\:has\(\%23d_checkbox\:enabled\)\)\%3E\%23d_subject3]:not(#does-not-exist):not(#does-not-exist):not(#does-not-exist) { color: green } -[\%23d_main\:not\(\:has\(\%23d_option\:enabled\)\)\%20\:is\(\%23d_subject3\,\%20\%23d_subject4\)] { +[\%23d_main\:not\(\:has\(\%23d_option\:enabled\)\)\%20\:is\(\%23d_subject3\,\%20\%23d_subject4\)]:not(#does-not-exist):not(#does-not-exist):not(#does-not-exist) { color: green } -[\%23d_main\:not\(\:has\(\%23d_optgroup\:enabled\)\)\%3E\%23d_subject3] { +[\%23d_main\:not\(\:has\(\%23d_optgroup\:enabled\)\)\%3E\%23d_subject3]:not(#does-not-exist):not(#does-not-exist):not(#does-not-exist) { color: blue } /* https://github.com/web-platform-tests/wpt/blob/master/css/selectors/invalidation/has-in-ancestor-position.html */ -[div\:has\(\.c_test\)\%20\%23c_subject] { +[div\:has\(\.c_test\)\%20\%23c_subject]:not(#does-not-exist):not(does-not-exist) { background-color: red } -[div\:has\(\%3E\%20\.c_test\)\%20\%23c_subject] { +[div\:has\(\%3E\%20\.c_test\)\%20\%23c_subject]:not(#does-not-exist):not(does-not-exist) { background-color: green } -[div\:has\(\~\%20\.c_test\)\%20\%23c_subject] { +[div\:has\(\~\%20\.c_test\)\%20\%23c_subject]:not(#does-not-exist):not(does-not-exist) { background-color: yellow } -[div\:has\(\%2B\%20\.c_test\)\%20\%23c_subject] { +[div\:has\(\%2B\%20\.c_test\)\%20\%23c_subject]:not(#does-not-exist):not(does-not-exist) { background-color: blue } -[div\:has\(\~\%20div\%20\.c_test\)\%20\%23c_subject] { +[div\:has\(\~\%20div\%20\.c_test\)\%20\%23c_subject]:not(#does-not-exist):not(does-not-exist):not(does-not-exist) { background-color: purple } -[div\:has\(\%2B\%20div\%20\.c_test\)\%20\%23c_subject] { +[div\:has\(\%2B\%20div\%20\.c_test\)\%20\%23c_subject]:not(#does-not-exist):not(does-not-exist):not(does-not-exist) { background-color: pink } /* https://github.com/web-platform-tests/wpt/blob/master/css/selectors/invalidation/has-in-adjacent-position.html */ -[div\:has\(\.a_test\)\%2B\%23a_subject] { +[div\:has\(\.a_test\)\%2B\%23a_subject]:not(#does-not-exist):not(does-not-exist) { background-color: red; } -[div\:has\(\%3E\%20\.a_test\)\%2B\%23a_subject] { +[div\:has\(\%3E\%20\.a_test\)\%2B\%23a_subject]:not(#does-not-exist):not(does-not-exist) { background-color: green; } -[div\:has\(\~\%20\.a_test\)\%2B\%23a_subject] { +[div\:has\(\~\%20\.a_test\)\%2B\%23a_subject]:not(#does-not-exist):not(does-not-exist) { background-color: yellow; } -[div\:has\(\%2B\%20\.a_test\)\%2B\%23a_subject] { +[div\:has\(\%2B\%20\.a_test\)\%2B\%23a_subject]:not(#does-not-exist):not(does-not-exist) { background-color: blue; } -[div\:has\(\~\%20div\%20\.a_test\)\%2B\%23a_subject] { +[div\:has\(\~\%20div\%20\.a_test\)\%2B\%23a_subject]:not(#does-not-exist):not(does-not-exist):not(does-not-exist) { background-color: purple; } -[div\:has\(\%2B\%20div\%20\.a_test\)\%2B\%23a_subject] { +[div\:has\(\%2B\%20div\%20\.a_test\)\%2B\%23a_subject]:not(#does-not-exist):not(does-not-exist):not(does-not-exist) { background-color: pink; } @@ -95,22 +95,22 @@ main { padding: 5px; } -[\.b_subject\:has\(\%3E\%20\.b_child\)][\.b_subject\:has\(\%3E\%20\.b_child\)] { +[\.b_subject\:has\(\%3E\%20\.b_child\)]:not(.does-not-exist) { background-color: red; } -[\.b_subject\:has\(\.b_descendant\)][\.b_subject\:has\(\.b_descendant\)] { +[\.b_subject\:has\(\.b_descendant\)]:not(.does-not-exist) { background-color: green; } -[\.b_subject\:has\(\[attrname\%3Db_descendant\]\)][\.b_subject\:has\(\[attrname\%3Db_descendant\]\)] { +[\.b_subject\:has\(\[attrname\%3Db_descendant\]\)]:not(.does-not-exist) { background-color: blue; } -[\.b_subject\:has\(\%23b_div_descendant\)] { +[\.b_subject\:has\(\%23b_div_descendant\)]:not(#does-not-exist) { background-color: yellow; } -[\.b_subject\:has\(b_descendant\)] { +[\.b_subject\:has\(b_descendant\)]:not(does-not-exist) { background-color: yellowgreen; } diff --git a/experimental/css-has-pseudo/test/generated-selector-cases.expect.css b/experimental/css-has-pseudo/test/generated-selector-cases.expect.css index f7d8ec0cd..c96ad37ca 100644 --- a/experimental/css-has-pseudo/test/generated-selector-cases.expect.css +++ b/experimental/css-has-pseudo/test/generated-selector-cases.expect.css @@ -1,72 +1,72 @@ -[\:has\(\.foo\)\:has\(\.foo\)][\:has\(\.foo\)\:has\(\.foo\)] { +[\:has\(\.foo\)\:has\(\.foo\)]:not(.does-not-exist) { order: 0; } -[\:has\(\.foo\)\:has\(\.foo\)][\:has\(\.foo\)\:has\(\.foo\)] { +[\:has\(\.foo\)\:has\(\.foo\)]:not(.does-not-exist) { order: 1; } -[\:has\(\.foo\)\%20\:has\(\.foo\)][\:has\(\.foo\)\%20\:has\(\.foo\)] { +[\:has\(\.foo\)\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 2; } -[\:has\(\.foo\)\%20\:has\(\.foo\)][\:has\(\.foo\)\%20\:has\(\.foo\)] { +[\:has\(\.foo\)\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 3; } -[\:has\(\.foo\)\%20\%20\:has\(\.foo\)][\:has\(\.foo\)\%20\%20\:has\(\.foo\)] { +[\:has\(\.foo\)\%20\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 4; } -[\:has\(\.foo\)\%20\%20\:has\(\.foo\)][\:has\(\.foo\)\%20\%20\:has\(\.foo\)] { +[\:has\(\.foo\)\%20\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 5; } -[\:has\(\.foo\)\%2B\:has\(\.foo\)][\:has\(\.foo\)\%2B\:has\(\.foo\)] { +[\:has\(\.foo\)\%2B\:has\(\.foo\)]:not(.does-not-exist) { order: 6; } -[\:has\(\.foo\)\%2B\:has\(\.foo\)][\:has\(\.foo\)\%2B\:has\(\.foo\)] { +[\:has\(\.foo\)\%2B\:has\(\.foo\)]:not(.does-not-exist) { order: 7; } -[\:has\(\.foo\)\%20\%2B\%20\:has\(\.foo\)][\:has\(\.foo\)\%20\%2B\%20\:has\(\.foo\)] { +[\:has\(\.foo\)\%20\%2B\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 8; } -[\:has\(\.foo\)\%20\%2B\%20\:has\(\.foo\)][\:has\(\.foo\)\%20\%2B\%20\:has\(\.foo\)] { +[\:has\(\.foo\)\%20\%2B\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 9; } -[\:has\(\.foo\)\~\:has\(\.foo\)][\:has\(\.foo\)\~\:has\(\.foo\)] { +[\:has\(\.foo\)\~\:has\(\.foo\)]:not(.does-not-exist) { order: 10; } -[\:has\(\.foo\)\~\:has\(\.foo\)][\:has\(\.foo\)\~\:has\(\.foo\)] { +[\:has\(\.foo\)\~\:has\(\.foo\)]:not(.does-not-exist) { order: 11; } -[\:has\(\.foo\)\%20\~\%20\:has\(\.foo\)][\:has\(\.foo\)\%20\~\%20\:has\(\.foo\)] { +[\:has\(\.foo\)\%20\~\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 12; } -[\:has\(\.foo\)\%20\~\%20\:has\(\.foo\)][\:has\(\.foo\)\%20\~\%20\:has\(\.foo\)] { +[\:has\(\.foo\)\%20\~\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 13; } -[\:has\(\.foo\)\%3E\:has\(\.foo\)][\:has\(\.foo\)\%3E\:has\(\.foo\)] { +[\:has\(\.foo\)\%3E\:has\(\.foo\)]:not(.does-not-exist) { order: 14; } -[\:has\(\.foo\)\%3E\:has\(\.foo\)][\:has\(\.foo\)\%3E\:has\(\.foo\)] { +[\:has\(\.foo\)\%3E\:has\(\.foo\)]:not(.does-not-exist) { order: 15; } -[\:has\(\.foo\)\%20\%3E\%20\:has\(\.foo\)][\:has\(\.foo\)\%20\%3E\%20\:has\(\.foo\)] { +[\:has\(\.foo\)\%20\%3E\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 16; } -[\:has\(\.foo\)\%20\%3E\%20\:has\(\.foo\)][\:has\(\.foo\)\%20\%3E\%20\:has\(\.foo\)] { +[\:has\(\.foo\)\%20\%3E\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 17; } @@ -78,75 +78,75 @@ order: 19; } -[button\:has\(\.foo\)] { +[button\:has\(\.foo\)]:not(does-not-exist) { order: 20; } -[\:has\(\.foo\)button] { +[\:has\(\.foo\)button]:not(does-not-exist) { order: 21; } -[button\%20\:has\(\.foo\)] { +[button\%20\:has\(\.foo\)]:not(does-not-exist) { order: 22; } -[\:has\(\.foo\)\%20button] { +[\:has\(\.foo\)\%20button]:not(does-not-exist) { order: 23; } -[button\%20\%20\:has\(\.foo\)] { +[button\%20\%20\:has\(\.foo\)]:not(does-not-exist) { order: 24; } -[\:has\(\.foo\)\%20\%20button] { +[\:has\(\.foo\)\%20\%20button]:not(does-not-exist) { order: 25; } -[button\%2B\:has\(\.foo\)] { +[button\%2B\:has\(\.foo\)]:not(does-not-exist) { order: 26; } -[\:has\(\.foo\)\%2Bbutton] { +[\:has\(\.foo\)\%2Bbutton]:not(does-not-exist) { order: 27; } -[button\%20\%2B\%20\:has\(\.foo\)] { +[button\%20\%2B\%20\:has\(\.foo\)]:not(does-not-exist) { order: 28; } -[\:has\(\.foo\)\%20\%2B\%20button] { +[\:has\(\.foo\)\%20\%2B\%20button]:not(does-not-exist) { order: 29; } -[button\~\:has\(\.foo\)] { +[button\~\:has\(\.foo\)]:not(does-not-exist) { order: 30; } -[\:has\(\.foo\)\~button] { +[\:has\(\.foo\)\~button]:not(does-not-exist) { order: 31; } -[button\%20\~\%20\:has\(\.foo\)] { +[button\%20\~\%20\:has\(\.foo\)]:not(does-not-exist) { order: 32; } -[\:has\(\.foo\)\%20\~\%20button] { +[\:has\(\.foo\)\%20\~\%20button]:not(does-not-exist) { order: 33; } -[button\%3E\:has\(\.foo\)] { +[button\%3E\:has\(\.foo\)]:not(does-not-exist) { order: 34; } -[\:has\(\.foo\)\%3Ebutton] { +[\:has\(\.foo\)\%3Ebutton]:not(does-not-exist) { order: 35; } -[button\%20\%3E\%20\:has\(\.foo\)] { +[button\%20\%3E\%20\:has\(\.foo\)]:not(does-not-exist) { order: 36; } -[\:has\(\.foo\)\%20\%3E\%20button] { +[\:has\(\.foo\)\%20\%3E\%20button]:not(does-not-exist) { order: 37; } @@ -158,75 +158,75 @@ button, [\:has\(\.foo\)] { order: 39; } -[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\:has\(\.foo\)][\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\:has\(\.foo\)] { +[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\:has\(\.foo\)]:not(.does-not-exist) { order: 40; } -[\:has\(\.foo\)\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4][\:has\(\.foo\)\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4] { +[\:has\(\.foo\)\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4]:not(.does-not-exist) { order: 41; } -[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\:has\(\.foo\)][\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\:has\(\.foo\)] { +[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 42; } -[\:has\(\.foo\)\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4][\:has\(\.foo\)\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4] { +[\:has\(\.foo\)\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4]:not(.does-not-exist) { order: 43; } -[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\%20\:has\(\.foo\)][\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\%20\:has\(\.foo\)] { +[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 44; } -[\:has\(\.foo\)\%20\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4][\:has\(\.foo\)\%20\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4] { +[\:has\(\.foo\)\%20\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4]:not(.does-not-exist) { order: 45; } -[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%2B\:has\(\.foo\)][\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%2B\:has\(\.foo\)] { +[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%2B\:has\(\.foo\)]:not(.does-not-exist) { order: 46; } -[\:has\(\.foo\)\%2B\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4][\:has\(\.foo\)\%2B\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4] { +[\:has\(\.foo\)\%2B\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4]:not(.does-not-exist) { order: 47; } -[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\%2B\%20\:has\(\.foo\)][\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\%2B\%20\:has\(\.foo\)] { +[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\%2B\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 48; } -[\:has\(\.foo\)\%20\%2B\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4][\:has\(\.foo\)\%20\%2B\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4] { +[\:has\(\.foo\)\%20\%2B\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4]:not(.does-not-exist) { order: 49; } -[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\~\:has\(\.foo\)][\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\~\:has\(\.foo\)] { +[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\~\:has\(\.foo\)]:not(.does-not-exist) { order: 50; } -[\:has\(\.foo\)\~\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4][\:has\(\.foo\)\~\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4] { +[\:has\(\.foo\)\~\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4]:not(.does-not-exist) { order: 51; } -[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\~\%20\:has\(\.foo\)][\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\~\%20\:has\(\.foo\)] { +[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\~\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 52; } -[\:has\(\.foo\)\%20\~\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4][\:has\(\.foo\)\%20\~\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4] { +[\:has\(\.foo\)\%20\~\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4]:not(.does-not-exist) { order: 53; } -[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%3E\:has\(\.foo\)][\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%3E\:has\(\.foo\)] { +[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%3E\:has\(\.foo\)]:not(.does-not-exist) { order: 54; } -[\:has\(\.foo\)\%3E\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4][\:has\(\.foo\)\%3E\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4] { +[\:has\(\.foo\)\%3E\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4]:not(.does-not-exist) { order: 55; } -[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\%3E\%20\:has\(\.foo\)][\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\%3E\%20\:has\(\.foo\)] { +[\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4\%20\%3E\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 56; } -[\:has\(\.foo\)\%20\%3E\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4][\:has\(\.foo\)\%20\%3E\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4] { +[\:has\(\.foo\)\%20\%3E\%20\.\%F0\%9F\%A7\%91\%F0\%9F\%8F\%BE\%E2\%80\%8D\%F0\%9F\%8E\%A4]:not(.does-not-exist) { order: 57; } @@ -238,75 +238,75 @@ button, [\:has\(\.foo\)] { order: 59; } -[\.foo\:has\(\.foo\)][\.foo\:has\(\.foo\)] { +[\.foo\:has\(\.foo\)]:not(.does-not-exist) { order: 60; } -[\:has\(\.foo\)\.foo][\:has\(\.foo\)\.foo] { +[\:has\(\.foo\)\.foo]:not(.does-not-exist) { order: 61; } -[\.foo\%20\:has\(\.foo\)][\.foo\%20\:has\(\.foo\)] { +[\.foo\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 62; } -[\:has\(\.foo\)\%20\.foo][\:has\(\.foo\)\%20\.foo] { +[\:has\(\.foo\)\%20\.foo]:not(.does-not-exist) { order: 63; } -[\.foo\%20\%20\:has\(\.foo\)][\.foo\%20\%20\:has\(\.foo\)] { +[\.foo\%20\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 64; } -[\:has\(\.foo\)\%20\%20\.foo][\:has\(\.foo\)\%20\%20\.foo] { +[\:has\(\.foo\)\%20\%20\.foo]:not(.does-not-exist) { order: 65; } -[\.foo\%2B\:has\(\.foo\)][\.foo\%2B\:has\(\.foo\)] { +[\.foo\%2B\:has\(\.foo\)]:not(.does-not-exist) { order: 66; } -[\:has\(\.foo\)\%2B\.foo][\:has\(\.foo\)\%2B\.foo] { +[\:has\(\.foo\)\%2B\.foo]:not(.does-not-exist) { order: 67; } -[\.foo\%20\%2B\%20\:has\(\.foo\)][\.foo\%20\%2B\%20\:has\(\.foo\)] { +[\.foo\%20\%2B\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 68; } -[\:has\(\.foo\)\%20\%2B\%20\.foo][\:has\(\.foo\)\%20\%2B\%20\.foo] { +[\:has\(\.foo\)\%20\%2B\%20\.foo]:not(.does-not-exist) { order: 69; } -[\.foo\~\:has\(\.foo\)][\.foo\~\:has\(\.foo\)] { +[\.foo\~\:has\(\.foo\)]:not(.does-not-exist) { order: 70; } -[\:has\(\.foo\)\~\.foo][\:has\(\.foo\)\~\.foo] { +[\:has\(\.foo\)\~\.foo]:not(.does-not-exist) { order: 71; } -[\.foo\%20\~\%20\:has\(\.foo\)][\.foo\%20\~\%20\:has\(\.foo\)] { +[\.foo\%20\~\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 72; } -[\:has\(\.foo\)\%20\~\%20\.foo][\:has\(\.foo\)\%20\~\%20\.foo] { +[\:has\(\.foo\)\%20\~\%20\.foo]:not(.does-not-exist) { order: 73; } -[\.foo\%3E\:has\(\.foo\)][\.foo\%3E\:has\(\.foo\)] { +[\.foo\%3E\:has\(\.foo\)]:not(.does-not-exist) { order: 74; } -[\:has\(\.foo\)\%3E\.foo][\:has\(\.foo\)\%3E\.foo] { +[\:has\(\.foo\)\%3E\.foo]:not(.does-not-exist) { order: 75; } -[\.foo\%20\%3E\%20\:has\(\.foo\)][\.foo\%20\%3E\%20\:has\(\.foo\)] { +[\.foo\%20\%3E\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 76; } -[\:has\(\.foo\)\%20\%3E\%20\.foo][\:has\(\.foo\)\%20\%3E\%20\.foo] { +[\:has\(\.foo\)\%20\%3E\%20\.foo]:not(.does-not-exist) { order: 77; } @@ -318,75 +318,75 @@ button, [\:has\(\.foo\)] { order: 79; } -[\%23foo\:has\(\.foo\)] { +[\%23foo\:has\(\.foo\)]:not(#does-not-exist) { order: 80; } -[\:has\(\.foo\)\%23foo] { +[\:has\(\.foo\)\%23foo]:not(#does-not-exist) { order: 81; } -[\%23foo\%20\:has\(\.foo\)] { +[\%23foo\%20\:has\(\.foo\)]:not(#does-not-exist) { order: 82; } -[\:has\(\.foo\)\%20\%23foo] { +[\:has\(\.foo\)\%20\%23foo]:not(#does-not-exist) { order: 83; } -[\%23foo\%20\%20\:has\(\.foo\)] { +[\%23foo\%20\%20\:has\(\.foo\)]:not(#does-not-exist) { order: 84; } -[\:has\(\.foo\)\%20\%20\%23foo] { +[\:has\(\.foo\)\%20\%20\%23foo]:not(#does-not-exist) { order: 85; } -[\%23foo\%2B\:has\(\.foo\)] { +[\%23foo\%2B\:has\(\.foo\)]:not(#does-not-exist) { order: 86; } -[\:has\(\.foo\)\%2B\%23foo] { +[\:has\(\.foo\)\%2B\%23foo]:not(#does-not-exist) { order: 87; } -[\%23foo\%20\%2B\%20\:has\(\.foo\)] { +[\%23foo\%20\%2B\%20\:has\(\.foo\)]:not(#does-not-exist) { order: 88; } -[\:has\(\.foo\)\%20\%2B\%20\%23foo] { +[\:has\(\.foo\)\%20\%2B\%20\%23foo]:not(#does-not-exist) { order: 89; } -[\%23foo\~\:has\(\.foo\)] { +[\%23foo\~\:has\(\.foo\)]:not(#does-not-exist) { order: 90; } -[\:has\(\.foo\)\~\%23foo] { +[\:has\(\.foo\)\~\%23foo]:not(#does-not-exist) { order: 91; } -[\%23foo\%20\~\%20\:has\(\.foo\)] { +[\%23foo\%20\~\%20\:has\(\.foo\)]:not(#does-not-exist) { order: 92; } -[\:has\(\.foo\)\%20\~\%20\%23foo] { +[\:has\(\.foo\)\%20\~\%20\%23foo]:not(#does-not-exist) { order: 93; } -[\%23foo\%3E\:has\(\.foo\)] { +[\%23foo\%3E\:has\(\.foo\)]:not(#does-not-exist) { order: 94; } -[\:has\(\.foo\)\%3E\%23foo] { +[\:has\(\.foo\)\%3E\%23foo]:not(#does-not-exist) { order: 95; } -[\%23foo\%20\%3E\%20\:has\(\.foo\)] { +[\%23foo\%20\%3E\%20\:has\(\.foo\)]:not(#does-not-exist) { order: 96; } -[\:has\(\.foo\)\%20\%3E\%20\%23foo] { +[\:has\(\.foo\)\%20\%3E\%20\%23foo]:not(#does-not-exist) { order: 97; } @@ -398,75 +398,75 @@ button, [\:has\(\.foo\)] { order: 99; } -[__foo\:has\(\.foo\)] { +[__foo\:has\(\.foo\)]:not(does-not-exist) { order: 100; } -[\:has\(\.foo\)__foo] { +[\:has\(\.foo\)__foo]:not(does-not-exist) { order: 101; } -[__foo\%20\:has\(\.foo\)] { +[__foo\%20\:has\(\.foo\)]:not(does-not-exist) { order: 102; } -[\:has\(\.foo\)\%20__foo] { +[\:has\(\.foo\)\%20__foo]:not(does-not-exist) { order: 103; } -[__foo\%20\%20\:has\(\.foo\)] { +[__foo\%20\%20\:has\(\.foo\)]:not(does-not-exist) { order: 104; } -[\:has\(\.foo\)\%20\%20__foo] { +[\:has\(\.foo\)\%20\%20__foo]:not(does-not-exist) { order: 105; } -[__foo\%2B\:has\(\.foo\)] { +[__foo\%2B\:has\(\.foo\)]:not(does-not-exist) { order: 106; } -[\:has\(\.foo\)\%2B__foo] { +[\:has\(\.foo\)\%2B__foo]:not(does-not-exist) { order: 107; } -[__foo\%20\%2B\%20\:has\(\.foo\)] { +[__foo\%20\%2B\%20\:has\(\.foo\)]:not(does-not-exist) { order: 108; } -[\:has\(\.foo\)\%20\%2B\%20__foo] { +[\:has\(\.foo\)\%20\%2B\%20__foo]:not(does-not-exist) { order: 109; } -[__foo\~\:has\(\.foo\)] { +[__foo\~\:has\(\.foo\)]:not(does-not-exist) { order: 110; } -[\:has\(\.foo\)\~__foo] { +[\:has\(\.foo\)\~__foo]:not(does-not-exist) { order: 111; } -[__foo\%20\~\%20\:has\(\.foo\)] { +[__foo\%20\~\%20\:has\(\.foo\)]:not(does-not-exist) { order: 112; } -[\:has\(\.foo\)\%20\~\%20__foo] { +[\:has\(\.foo\)\%20\~\%20__foo]:not(does-not-exist) { order: 113; } -[__foo\%3E\:has\(\.foo\)] { +[__foo\%3E\:has\(\.foo\)]:not(does-not-exist) { order: 114; } -[\:has\(\.foo\)\%3E__foo] { +[\:has\(\.foo\)\%3E__foo]:not(does-not-exist) { order: 115; } -[__foo\%20\%3E\%20\:has\(\.foo\)] { +[__foo\%20\%3E\%20\:has\(\.foo\)]:not(does-not-exist) { order: 116; } -[\:has\(\.foo\)\%20\%3E\%20__foo] { +[\:has\(\.foo\)\%20\%3E\%20__foo]:not(does-not-exist) { order: 117; } @@ -478,75 +478,75 @@ __foo, [\:has\(\.foo\)] { order: 119; } -[\:--foo\:has\(\.foo\)][\:--foo\:has\(\.foo\)] { +[\:--foo\:has\(\.foo\)]:not(.does-not-exist) { order: 120; } -[\:has\(\.foo\)\:--foo][\:has\(\.foo\)\:--foo] { +[\:has\(\.foo\)\:--foo]:not(.does-not-exist) { order: 121; } -[\:--foo\%20\:has\(\.foo\)][\:--foo\%20\:has\(\.foo\)] { +[\:--foo\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 122; } -[\:has\(\.foo\)\%20\:--foo][\:has\(\.foo\)\%20\:--foo] { +[\:has\(\.foo\)\%20\:--foo]:not(.does-not-exist) { order: 123; } -[\:--foo\%20\%20\:has\(\.foo\)][\:--foo\%20\%20\:has\(\.foo\)] { +[\:--foo\%20\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 124; } -[\:has\(\.foo\)\%20\%20\:--foo][\:has\(\.foo\)\%20\%20\:--foo] { +[\:has\(\.foo\)\%20\%20\:--foo]:not(.does-not-exist) { order: 125; } -[\:--foo\%2B\:has\(\.foo\)][\:--foo\%2B\:has\(\.foo\)] { +[\:--foo\%2B\:has\(\.foo\)]:not(.does-not-exist) { order: 126; } -[\:has\(\.foo\)\%2B\:--foo][\:has\(\.foo\)\%2B\:--foo] { +[\:has\(\.foo\)\%2B\:--foo]:not(.does-not-exist) { order: 127; } -[\:--foo\%20\%2B\%20\:has\(\.foo\)][\:--foo\%20\%2B\%20\:has\(\.foo\)] { +[\:--foo\%20\%2B\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 128; } -[\:has\(\.foo\)\%20\%2B\%20\:--foo][\:has\(\.foo\)\%20\%2B\%20\:--foo] { +[\:has\(\.foo\)\%20\%2B\%20\:--foo]:not(.does-not-exist) { order: 129; } -[\:--foo\~\:has\(\.foo\)][\:--foo\~\:has\(\.foo\)] { +[\:--foo\~\:has\(\.foo\)]:not(.does-not-exist) { order: 130; } -[\:has\(\.foo\)\~\:--foo][\:has\(\.foo\)\~\:--foo] { +[\:has\(\.foo\)\~\:--foo]:not(.does-not-exist) { order: 131; } -[\:--foo\%20\~\%20\:has\(\.foo\)][\:--foo\%20\~\%20\:has\(\.foo\)] { +[\:--foo\%20\~\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 132; } -[\:has\(\.foo\)\%20\~\%20\:--foo][\:has\(\.foo\)\%20\~\%20\:--foo] { +[\:has\(\.foo\)\%20\~\%20\:--foo]:not(.does-not-exist) { order: 133; } -[\:--foo\%3E\:has\(\.foo\)][\:--foo\%3E\:has\(\.foo\)] { +[\:--foo\%3E\:has\(\.foo\)]:not(.does-not-exist) { order: 134; } -[\:has\(\.foo\)\%3E\:--foo][\:has\(\.foo\)\%3E\:--foo] { +[\:has\(\.foo\)\%3E\:--foo]:not(.does-not-exist) { order: 135; } -[\:--foo\%20\%3E\%20\:has\(\.foo\)][\:--foo\%20\%3E\%20\:has\(\.foo\)] { +[\:--foo\%20\%3E\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 136; } -[\:has\(\.foo\)\%20\%3E\%20\:--foo][\:has\(\.foo\)\%20\%3E\%20\:--foo] { +[\:has\(\.foo\)\%20\%3E\%20\:--foo]:not(.does-not-exist) { order: 137; } @@ -558,75 +558,75 @@ __foo, [\:has\(\.foo\)] { order: 139; } -[\[foo\%3D\%22baz\%22\]\:has\(\.foo\)][\[foo\%3D\%22baz\%22\]\:has\(\.foo\)] { +[\[foo\%3D\%22baz\%22\]\:has\(\.foo\)]:not(.does-not-exist) { order: 140; } -[\:has\(\.foo\)\[foo\%3D\%22baz\%22\]][\:has\(\.foo\)\[foo\%3D\%22baz\%22\]] { +[\:has\(\.foo\)\[foo\%3D\%22baz\%22\]]:not(.does-not-exist) { order: 141; } -[\[foo\%3D\%22baz\%22\]\%20\:has\(\.foo\)][\[foo\%3D\%22baz\%22\]\%20\:has\(\.foo\)] { +[\[foo\%3D\%22baz\%22\]\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 142; } -[\:has\(\.foo\)\%20\[foo\%3D\%22baz\%22\]][\:has\(\.foo\)\%20\[foo\%3D\%22baz\%22\]] { +[\:has\(\.foo\)\%20\[foo\%3D\%22baz\%22\]]:not(.does-not-exist) { order: 143; } -[\[foo\%3D\%22baz\%22\]\%20\%20\:has\(\.foo\)][\[foo\%3D\%22baz\%22\]\%20\%20\:has\(\.foo\)] { +[\[foo\%3D\%22baz\%22\]\%20\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 144; } -[\:has\(\.foo\)\%20\%20\[foo\%3D\%22baz\%22\]][\:has\(\.foo\)\%20\%20\[foo\%3D\%22baz\%22\]] { +[\:has\(\.foo\)\%20\%20\[foo\%3D\%22baz\%22\]]:not(.does-not-exist) { order: 145; } -[\[foo\%3D\%22baz\%22\]\%2B\:has\(\.foo\)][\[foo\%3D\%22baz\%22\]\%2B\:has\(\.foo\)] { +[\[foo\%3D\%22baz\%22\]\%2B\:has\(\.foo\)]:not(.does-not-exist) { order: 146; } -[\:has\(\.foo\)\%2B\[foo\%3D\%22baz\%22\]][\:has\(\.foo\)\%2B\[foo\%3D\%22baz\%22\]] { +[\:has\(\.foo\)\%2B\[foo\%3D\%22baz\%22\]]:not(.does-not-exist) { order: 147; } -[\[foo\%3D\%22baz\%22\]\%20\%2B\%20\:has\(\.foo\)][\[foo\%3D\%22baz\%22\]\%20\%2B\%20\:has\(\.foo\)] { +[\[foo\%3D\%22baz\%22\]\%20\%2B\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 148; } -[\:has\(\.foo\)\%20\%2B\%20\[foo\%3D\%22baz\%22\]][\:has\(\.foo\)\%20\%2B\%20\[foo\%3D\%22baz\%22\]] { +[\:has\(\.foo\)\%20\%2B\%20\[foo\%3D\%22baz\%22\]]:not(.does-not-exist) { order: 149; } -[\[foo\%3D\%22baz\%22\]\~\:has\(\.foo\)][\[foo\%3D\%22baz\%22\]\~\:has\(\.foo\)] { +[\[foo\%3D\%22baz\%22\]\~\:has\(\.foo\)]:not(.does-not-exist) { order: 150; } -[\:has\(\.foo\)\~\[foo\%3D\%22baz\%22\]][\:has\(\.foo\)\~\[foo\%3D\%22baz\%22\]] { +[\:has\(\.foo\)\~\[foo\%3D\%22baz\%22\]]:not(.does-not-exist) { order: 151; } -[\[foo\%3D\%22baz\%22\]\%20\~\%20\:has\(\.foo\)][\[foo\%3D\%22baz\%22\]\%20\~\%20\:has\(\.foo\)] { +[\[foo\%3D\%22baz\%22\]\%20\~\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 152; } -[\:has\(\.foo\)\%20\~\%20\[foo\%3D\%22baz\%22\]][\:has\(\.foo\)\%20\~\%20\[foo\%3D\%22baz\%22\]] { +[\:has\(\.foo\)\%20\~\%20\[foo\%3D\%22baz\%22\]]:not(.does-not-exist) { order: 153; } -[\[foo\%3D\%22baz\%22\]\%3E\:has\(\.foo\)][\[foo\%3D\%22baz\%22\]\%3E\:has\(\.foo\)] { +[\[foo\%3D\%22baz\%22\]\%3E\:has\(\.foo\)]:not(.does-not-exist) { order: 154; } -[\:has\(\.foo\)\%3E\[foo\%3D\%22baz\%22\]][\:has\(\.foo\)\%3E\[foo\%3D\%22baz\%22\]] { +[\:has\(\.foo\)\%3E\[foo\%3D\%22baz\%22\]]:not(.does-not-exist) { order: 155; } -[\[foo\%3D\%22baz\%22\]\%20\%3E\%20\:has\(\.foo\)][\[foo\%3D\%22baz\%22\]\%20\%3E\%20\:has\(\.foo\)] { +[\[foo\%3D\%22baz\%22\]\%20\%3E\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 156; } -[\:has\(\.foo\)\%20\%3E\%20\[foo\%3D\%22baz\%22\]][\:has\(\.foo\)\%20\%3E\%20\[foo\%3D\%22baz\%22\]] { +[\:has\(\.foo\)\%20\%3E\%20\[foo\%3D\%22baz\%22\]]:not(.does-not-exist) { order: 157; } @@ -718,75 +718,75 @@ __foo, [\:has\(\.foo\)] { order: 179; } -[\:hover\:has\(\.foo\)][\:hover\:has\(\.foo\)] { +[\:hover\:has\(\.foo\)]:not(.does-not-exist) { order: 180; } -[\:has\(\.foo\)\:hover][\:has\(\.foo\)\:hover] { +[\:has\(\.foo\)\:hover]:not(.does-not-exist) { order: 181; } -[\:hover\%20\:has\(\.foo\)][\:hover\%20\:has\(\.foo\)] { +[\:hover\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 182; } -[\:has\(\.foo\)\%20\:hover][\:has\(\.foo\)\%20\:hover] { +[\:has\(\.foo\)\%20\:hover]:not(.does-not-exist) { order: 183; } -[\:hover\%20\%20\:has\(\.foo\)][\:hover\%20\%20\:has\(\.foo\)] { +[\:hover\%20\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 184; } -[\:has\(\.foo\)\%20\%20\:hover][\:has\(\.foo\)\%20\%20\:hover] { +[\:has\(\.foo\)\%20\%20\:hover]:not(.does-not-exist) { order: 185; } -[\:hover\%2B\:has\(\.foo\)][\:hover\%2B\:has\(\.foo\)] { +[\:hover\%2B\:has\(\.foo\)]:not(.does-not-exist) { order: 186; } -[\:has\(\.foo\)\%2B\:hover][\:has\(\.foo\)\%2B\:hover] { +[\:has\(\.foo\)\%2B\:hover]:not(.does-not-exist) { order: 187; } -[\:hover\%20\%2B\%20\:has\(\.foo\)][\:hover\%20\%2B\%20\:has\(\.foo\)] { +[\:hover\%20\%2B\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 188; } -[\:has\(\.foo\)\%20\%2B\%20\:hover][\:has\(\.foo\)\%20\%2B\%20\:hover] { +[\:has\(\.foo\)\%20\%2B\%20\:hover]:not(.does-not-exist) { order: 189; } -[\:hover\~\:has\(\.foo\)][\:hover\~\:has\(\.foo\)] { +[\:hover\~\:has\(\.foo\)]:not(.does-not-exist) { order: 190; } -[\:has\(\.foo\)\~\:hover][\:has\(\.foo\)\~\:hover] { +[\:has\(\.foo\)\~\:hover]:not(.does-not-exist) { order: 191; } -[\:hover\%20\~\%20\:has\(\.foo\)][\:hover\%20\~\%20\:has\(\.foo\)] { +[\:hover\%20\~\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 192; } -[\:has\(\.foo\)\%20\~\%20\:hover][\:has\(\.foo\)\%20\~\%20\:hover] { +[\:has\(\.foo\)\%20\~\%20\:hover]:not(.does-not-exist) { order: 193; } -[\:hover\%3E\:has\(\.foo\)][\:hover\%3E\:has\(\.foo\)] { +[\:hover\%3E\:has\(\.foo\)]:not(.does-not-exist) { order: 194; } -[\:has\(\.foo\)\%3E\:hover][\:has\(\.foo\)\%3E\:hover] { +[\:has\(\.foo\)\%3E\:hover]:not(.does-not-exist) { order: 195; } -[\:hover\%20\%3E\%20\:has\(\.foo\)][\:hover\%20\%3E\%20\:has\(\.foo\)] { +[\:hover\%20\%3E\%20\:has\(\.foo\)]:not(.does-not-exist) { order: 196; } -[\:has\(\.foo\)\%20\%3E\%20\:hover][\:has\(\.foo\)\%20\%3E\%20\:hover] { +[\:has\(\.foo\)\%20\%3E\%20\:hover]:not(.does-not-exist) { order: 197; } @@ -798,75 +798,75 @@ __foo, [\:has\(\.foo\)] { order: 199; } -[\:\:before\:has\(\.foo\)] { +[\:\:before\:has\(\.foo\)]:not(does-not-exist) { order: 200; } -[\:has\(\.foo\)\:\:before] { +[\:has\(\.foo\)\:\:before]:not(does-not-exist) { order: 201; } -[\:\:before\%20\:has\(\.foo\)] { +[\:\:before\%20\:has\(\.foo\)]:not(does-not-exist) { order: 202; } -[\:has\(\.foo\)\%20\:\:before] { +[\:has\(\.foo\)\%20\:\:before]:not(does-not-exist) { order: 203; } -[\:\:before\%20\%20\:has\(\.foo\)] { +[\:\:before\%20\%20\:has\(\.foo\)]:not(does-not-exist) { order: 204; } -[\:has\(\.foo\)\%20\%20\:\:before] { +[\:has\(\.foo\)\%20\%20\:\:before]:not(does-not-exist) { order: 205; } -[\:\:before\%2B\:has\(\.foo\)] { +[\:\:before\%2B\:has\(\.foo\)]:not(does-not-exist) { order: 206; } -[\:has\(\.foo\)\%2B\:\:before] { +[\:has\(\.foo\)\%2B\:\:before]:not(does-not-exist) { order: 207; } -[\:\:before\%20\%2B\%20\:has\(\.foo\)] { +[\:\:before\%20\%2B\%20\:has\(\.foo\)]:not(does-not-exist) { order: 208; } -[\:has\(\.foo\)\%20\%2B\%20\:\:before] { +[\:has\(\.foo\)\%20\%2B\%20\:\:before]:not(does-not-exist) { order: 209; } -[\:\:before\~\:has\(\.foo\)] { +[\:\:before\~\:has\(\.foo\)]:not(does-not-exist) { order: 210; } -[\:has\(\.foo\)\~\:\:before] { +[\:has\(\.foo\)\~\:\:before]:not(does-not-exist) { order: 211; } -[\:\:before\%20\~\%20\:has\(\.foo\)] { +[\:\:before\%20\~\%20\:has\(\.foo\)]:not(does-not-exist) { order: 212; } -[\:has\(\.foo\)\%20\~\%20\:\:before] { +[\:has\(\.foo\)\%20\~\%20\:\:before]:not(does-not-exist) { order: 213; } -[\:\:before\%3E\:has\(\.foo\)] { +[\:\:before\%3E\:has\(\.foo\)]:not(does-not-exist) { order: 214; } -[\:has\(\.foo\)\%3E\:\:before] { +[\:has\(\.foo\)\%3E\:\:before]:not(does-not-exist) { order: 215; } -[\:\:before\%20\%3E\%20\:has\(\.foo\)] { +[\:\:before\%20\%3E\%20\:has\(\.foo\)]:not(does-not-exist) { order: 216; } -[\:has\(\.foo\)\%20\%3E\%20\:\:before] { +[\:has\(\.foo\)\%20\%3E\%20\:\:before]:not(does-not-exist) { order: 217; } @@ -894,11 +894,11 @@ foo[baz=":has(.foo)"] { order: 223; } -[\:--\:has\(\.foo\)][\:--\:has\(\.foo\)] { +[\:--\:has\(\.foo\)]:not(.does-not-exist) { order: 224; } -[__\:has\(\.foo\)] { +[__\:has\(\.foo\)]:not(does-not-exist) { order: 225; }