[@scope] Add WPT for nth-child invalidation in @scope

Bug: 1450473
Change-Id: I20785a1e5a3840b4a407a3bcdd226a6f4fef410e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4778618
Commit-Queue: Anders Hartvoll Ruud <andruud@chromium.org>
Reviewed-by: Rune Lillesveen <futhark@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1183557}
diff --git a/css/css-cascade/scope-invalidation.html b/css/css-cascade/scope-invalidation.html
index b8b82c4..d53257e 100644
--- a/css/css-cascade/scope-invalidation.html
+++ b/css/css-cascade/scope-invalidation.html
@@ -625,3 +625,158 @@
   assert_not_green(inner_a);
 }, ':not(scope) in limit ancestor');
 </script>
+
+<template>
+  <style>
+    @scope (:nth-child(2n of .a)) {
+      :scope { background-color: green; }
+    }
+  </style>
+  <div id=wrapper>
+    <div class=a></div>
+    <div></div>
+    <div class=a></div>
+    <div></div>
+    <div class=a></div>
+    <div></div>
+    <div class=a></div>
+    <div></div>
+  </div>
+</template>
+<script>
+test_scope_invalidation(document.currentScript, () => {
+  let e = main.querySelectorAll('#wrapper > div');
+  assert_equals(e.length, 8);
+
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>
+  // <div></div>
+  assert_not_green(e[0]);
+  assert_not_green(e[1]);
+  assert_green(e[2]);
+  assert_not_green(e[3]);
+  assert_not_green(e[4]);
+  assert_not_green(e[5]);
+  assert_green(e[6]);
+  assert_not_green(e[7]);
+
+  e[1].classList.add('a');
+  // <div class=a></div>
+  // <div class=a></div>
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>
+  // <div></div>
+  assert_not_green(e[0]);
+  assert_green(e[1]);
+  assert_not_green(e[2]);
+  assert_not_green(e[3]);
+  assert_green(e[4]);
+  assert_not_green(e[5]);
+  assert_not_green(e[6]);
+  assert_not_green(e[7]);
+
+  e[1].classList.remove('a');
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>
+  // <div></div>
+  assert_not_green(e[0]);
+  assert_not_green(e[1]);
+  assert_green(e[2]);
+  assert_not_green(e[3]);
+  assert_not_green(e[4]);
+  assert_not_green(e[5]);
+  assert_green(e[6]);
+  assert_not_green(e[7]);
+}, ':nth-child() in scope root');
+</script>
+
+<template>
+  <style>
+    @scope (#wrapper) to (:nth-child(4n of .a)) {
+      div { background-color: green; }
+    }
+  </style>
+  <div id=wrapper>
+    <div class=a></div>
+    <div></div>
+    <div class=a></div>
+    <div></div>
+    <div class=a></div>
+    <div></div>
+    <div class=a></div>
+    <div></div>
+  </div>
+</template>
+<script>
+test_scope_invalidation(document.currentScript, () => {
+  let e = main.querySelectorAll('#wrapper > div');
+  assert_equals(e.length, 8);
+
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>  <= limit
+  // <div></div>
+  assert_green(e[0]);
+  assert_green(e[1]);
+  assert_green(e[2]);
+  assert_green(e[3]);
+  assert_green(e[4]);
+  assert_green(e[5]);
+  assert_not_green(e[6]);
+  assert_green(e[7]);
+
+  e[1].classList.add('a');
+  // <div class=a></div>
+  // <div class=a></div>
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>  <= limit
+  // <div></div>
+  // <div class=a></div>
+  // <div></div>
+  assert_green(e[0]);
+  assert_green(e[1]);
+  assert_green(e[2]);
+  assert_green(e[3]);
+  assert_not_green(e[4]);
+  assert_green(e[5]);
+  assert_green(e[6]);
+  assert_green(e[7]);
+
+  e[1].classList.remove('a');
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>
+  // <div></div>
+  // <div class=a></div>  <= limit
+  // <div></div>
+  assert_green(e[0]);
+  assert_green(e[1]);
+  assert_green(e[2]);
+  assert_green(e[3]);
+  assert_green(e[4]);
+  assert_green(e[5]);
+  assert_not_green(e[6]);
+  assert_green(e[7]);
+}, ':nth-child() in scope limit');
+
+</script>