Correct style sharing handling for any element that considered `:has()` in selector matching.

For any element that anchors a `:has()` selector (i.e. Matches a selector that
contains a `:has()` on its rightmost side), we prevent style sharing altogether,
as evaluation of the `:has()` selector is required in the first place to
determine style sharing.

On the other hand, any element matching a rule containing `:has()` without
anchoring it can do style sharing for siblings, but not cousins.

Differential Revision: https://phabricator.services.mozilla.com/D176836

bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1793012
gecko-commit: 895d9ffe6269bcd7fcd19a447d765d35055fb554
gecko-reviewers: emilio
diff --git a/css/selectors/has-style-sharing-001-ref.html b/css/selectors/has-style-sharing-001-ref.html
new file mode 100644
index 0000000..6013cb4
--- /dev/null
+++ b/css/selectors/has-style-sharing-001-ref.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#relational">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1793012">
+<meta name="assert" content="Ensure that style sharing optimizations do not interfere with :has() selector matching.">
+<style>
+div {
+  background: blue;
+  padding: 1em;
+  margin: 1em;
+}
+
+span {
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+  background-color: pink;
+}
+</style>
+<div style="background: green;"><span></span></div>
+<div></div>
diff --git a/css/selectors/has-style-sharing-001.html b/css/selectors/has-style-sharing-001.html
new file mode 100644
index 0000000..bf45e98
--- /dev/null
+++ b/css/selectors/has-style-sharing-001.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#relational">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1793012">
+<link rel="match" href="has-style-sharing-001-ref.html">
+<meta name="assert" content="Ensure that style sharing optimizations do not interfere with :has() selector matching.">
+<style>
+div {
+  background: blue;
+  padding: 1em;
+  margin: 1em;
+}
+
+:has(> span) {
+  background: green;
+}
+
+span {
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+  background-color: pink;
+}
+</style>
+<div><span></span></div>
+<div></div>
diff --git a/css/selectors/has-style-sharing-002-ref.html b/css/selectors/has-style-sharing-002-ref.html
new file mode 100644
index 0000000..c916ab0
--- /dev/null
+++ b/css/selectors/has-style-sharing-002-ref.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#relational">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1793012">
+<meta name="assert" content="Ensure that style sharing optimizations do not interfere with :has() selector matching.">
+<style>
+div {
+  background: blue;
+  padding: 1em;
+  margin: 1em;
+}
+
+span {
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+  background-color: pink;
+}
+</style>
+<div></div>
+<div style="background: green;"><span></span></div>
diff --git a/css/selectors/has-style-sharing-002.html b/css/selectors/has-style-sharing-002.html
new file mode 100644
index 0000000..630a136
--- /dev/null
+++ b/css/selectors/has-style-sharing-002.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#relational">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1793012">
+<link rel="match" href="has-style-sharing-002-ref.html">
+<meta name="assert" content="Ensure that style sharing optimizations do not interfere with :has() selector matching.">
+<style>
+div {
+  background: blue;
+  padding: 1em;
+  margin: 1em;
+}
+
+:has(> span) {
+  background: green;
+}
+
+span {
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+  background-color: pink;
+}
+</style>
+<div></div>
+<div><span></span></div>
diff --git a/css/selectors/has-style-sharing-003-ref.html b/css/selectors/has-style-sharing-003-ref.html
new file mode 100644
index 0000000..36aae7a
--- /dev/null
+++ b/css/selectors/has-style-sharing-003-ref.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#relational">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1793012">
+<meta name="assert" content="Ensure that style sharing optimizations do not interfere with :has() selector matching.">
+<style>
+div {
+  background: blue;
+  margin: 1em;
+  padding: 1em;
+}
+
+span {
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+}
+
+.has-b {
+  background: green;
+}
+
+.b {
+  background: purple;
+}
+</style>
+
+<div><span class="has-b"></span><span class="a"></span></div>
+<div><span class="b"></span><span></span></div>
diff --git a/css/selectors/has-style-sharing-003.html b/css/selectors/has-style-sharing-003.html
new file mode 100644
index 0000000..480a23e
--- /dev/null
+++ b/css/selectors/has-style-sharing-003.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#relational">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1793012">
+<link rel="match" href="has-style-sharing-003-ref.html">
+<meta name="assert" content="Ensure that style sharing optimizations do not interfere with :has() selector matching.">
+<style>
+div {
+  background: blue;
+  margin: 1em;
+  padding: 1em;
+}
+
+span {
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+}
+
+:has(> .a) .b {
+  background: green;
+}
+
+.b {
+  background: purple;
+}
+</style>
+
+<div><span class="b"></span><span class="a"></span></div>
+<div><span class="b"></span><span></span></div>
diff --git a/css/selectors/has-style-sharing-004-ref.html b/css/selectors/has-style-sharing-004-ref.html
new file mode 100644
index 0000000..f710924
--- /dev/null
+++ b/css/selectors/has-style-sharing-004-ref.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#relational">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1793012">
+<meta name="assert" content="Ensure that style sharing optimizations do not interfere with :has() selector matching.">
+<style>
+div {
+  background: blue;
+  margin: 1em;
+  padding: 1em;
+}
+
+span {
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+}
+
+.has-b {
+  background: green;
+}
+
+.b {
+  background: purple;
+}
+</style>
+
+<div><span class="b"></span><span></span></div>
+<div><span class="has-b"></span><span class="a"></span></div>
diff --git a/css/selectors/has-style-sharing-004.html b/css/selectors/has-style-sharing-004.html
new file mode 100644
index 0000000..c0879f7
--- /dev/null
+++ b/css/selectors/has-style-sharing-004.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#relational">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1793012">
+<link rel="match" href="has-style-sharing-004-ref.html">
+<meta name="assert" content="Ensure that style sharing optimizations do not interfere with :has() selector matching.">
+<style>
+div {
+  background: blue;
+  margin: 1em;
+  padding: 1em;
+}
+
+span {
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+}
+
+:has(> .a) .b {
+  background: green;
+}
+
+.b {
+  background: purple;
+}
+</style>
+
+<div><span class="b"></span><span></span></div>
+<div><span class="b"></span><span class="a"></span></div>
diff --git a/css/selectors/has-style-sharing-005-ref.html b/css/selectors/has-style-sharing-005-ref.html
new file mode 100644
index 0000000..eb95d47
--- /dev/null
+++ b/css/selectors/has-style-sharing-005-ref.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#relational">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1793012">
+<meta name="assert" content="Ensure that style sharing optimizations do not interfere with :has() selector matching.">
+<style>
+div {
+  background: blue;
+  margin: 1em;
+  padding: 1em;
+}
+
+span {
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+}
+
+.has-c {
+  background: green;
+}
+
+.c {
+  background: purple;
+}
+</style>
+<div><span class="b"><span class="has-c"></span></span><span class="a"></span></div>
+<div><span class="b"><span class="c"></span></span><span></span></div>
diff --git a/css/selectors/has-style-sharing-005.html b/css/selectors/has-style-sharing-005.html
new file mode 100644
index 0000000..d6b05fc
--- /dev/null
+++ b/css/selectors/has-style-sharing-005.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#relational">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1793012">
+<link rel="match" href="has-style-sharing-005-ref.html">
+<meta name="assert" content="Ensure that style sharing optimizations do not interfere with :has() selector matching.">
+<style>
+div {
+  background: blue;
+  margin: 1em;
+  padding: 1em;
+}
+
+span {
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+}
+
+:has(> .a) .b .c {
+  background: green;
+}
+
+.c {
+  background: purple;
+}
+</style>
+<div><span class="b"><span class="c"></span></span><span class="a"></span></div>
+<div><span class="b"><span class="c"></span></span><span></span></div>
diff --git a/css/selectors/has-style-sharing-006-ref.html b/css/selectors/has-style-sharing-006-ref.html
new file mode 100644
index 0000000..4c03f21
--- /dev/null
+++ b/css/selectors/has-style-sharing-006-ref.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#relational">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1793012">
+<meta name="assert" content="Ensure that style sharing optimizations do not interfere with :has() selector matching.">
+<style>
+div {
+  background: blue;
+  margin: 1em;
+  padding: 1em;
+}
+
+span {
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+}
+
+.has-c {
+  background: green;
+}
+
+.c {
+  background: purple;
+}
+</style>
+<div><span class="b"><span class="c"></span></span><span></span></div>
+<div><span class="b"><span class="has-c"></span></span><span class="a"></span></div>
diff --git a/css/selectors/has-style-sharing-006.html b/css/selectors/has-style-sharing-006.html
new file mode 100644
index 0000000..e0d824f
--- /dev/null
+++ b/css/selectors/has-style-sharing-006.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<link rel="author" title="David Shin" href="mailto:dshin@mozilla.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#relational">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1793012">
+<link rel="match" href="has-style-sharing-006-ref.html">
+<meta name="assert" content="Ensure that style sharing optimizations do not interfere with :has() selector matching.">
+<style>
+div {
+  background: blue;
+  margin: 1em;
+  padding: 1em;
+}
+
+span {
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+}
+
+:has(> .a) .b .c {
+  background: green;
+}
+
+.c {
+  background: purple;
+}
+</style>
+<div><span class="b"><span class="c"></span></span><span></span></div>
+<div><span class="b"><span class="c"></span></span><span class="a"></span></div>