diff --git a/css/css-scoping/slotted-has-001.html b/css/css-scoping/slotted-has-001.html
new file mode 100644
index 00000000000000..f70bac7eca386d
--- /dev/null
+++ b/css/css-scoping/slotted-has-001.html
@@ -0,0 +1,26 @@
+
+
+
:has-slotted
+
+
+Test passes if there is a filled green square.
+
\ No newline at end of file
diff --git a/css/css-scoping/slotted-has-002.html b/css/css-scoping/slotted-has-002.html
new file mode 100644
index 00000000000000..9ecbea5d413f92
--- /dev/null
+++ b/css/css-scoping/slotted-has-002.html
@@ -0,0 +1,26 @@
+
+
+:has-slotted
+
+
+Test passes if there is a filled green square.
+
\ No newline at end of file
diff --git a/css/css-scoping/slotted-has-003.html b/css/css-scoping/slotted-has-003.html
new file mode 100644
index 00000000000000..1ea412492c567e
--- /dev/null
+++ b/css/css-scoping/slotted-has-003.html
@@ -0,0 +1,26 @@
+
+
+:has-slotted
+
+
+Test passes if there is a filled green square.
+
\ No newline at end of file
diff --git a/css/css-scoping/slotted-has-004.html b/css/css-scoping/slotted-has-004.html
new file mode 100644
index 00000000000000..adf50da13a95a5
--- /dev/null
+++ b/css/css-scoping/slotted-has-004.html
@@ -0,0 +1,26 @@
+
+
+:has-slotted
+
+
+Test passes if there is a filled green square.
+
\ No newline at end of file
diff --git a/css/selectors/parsing/parse-slotted.html b/css/selectors/parsing/parse-slotted.html
index 4b7b4a3b56fd05..47fafdf2b35d6f 100644
--- a/css/selectors/parsing/parse-slotted.html
+++ b/css/selectors/parsing/parse-slotted.html
@@ -14,6 +14,7 @@
test_valid_selector('::slotted(:not(:nth-last-of-type(2)):not([slot="foo"]))');
test_valid_selector("::slotted(:first-child)");
test_valid_selector("::slotted(:hover)");
+ test_valid_selector("::slotted(:has(:first-child:last-child))");
test_invalid_selector("::slotted");
test_invalid_selector("::slotted()");
test_invalid_selector("::slotted(0)");