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;
}