[@container] Test invalidation of font-relative units separately

This WPT changed both the root font and non-root font at the same,
which means one invalidation mechanism may overlap. Test each unit
separately instead.

Bug: 1339808
Change-Id: I18fcef9f92358c437bb5c547132f8a5348c0d39f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3726452
Commit-Queue: Anders Hartvoll Ruud <andruud@chromium.org>
Reviewed-by: Rune Lillesveen <futhark@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1018645}
diff --git a/css/css-contain/container-queries/font-relative-units-dynamic.html b/css/css-contain/container-queries/font-relative-units-dynamic.html
index 63e17c9..e9f2e11 100644
--- a/css/css-contain/container-queries/font-relative-units-dynamic.html
+++ b/css/css-contain/container-queries/font-relative-units-dynamic.html
@@ -4,50 +4,130 @@
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="support/cq-testcommon.js"></script>
+<script>
+
+setup(() => assert_implements_container_queries());
+
+// Inflate a <template> subtree into #main, run the test function,
+// then clean up.
+function test_template(template_element, test_fn, description) {
+  test((t) => {
+    assert_equals(template_element.tagName, "TEMPLATE");
+    t.add_cleanup(() => main.replaceChildren());
+    main.append(template_element.content.cloneNode(true));
+    test_fn(t);
+  }, description);
+}
+
+const green = "rgb(0, 128, 0)";
+const red = "rgb(255, 0, 0)";
+
+</script>
+
 <style>
-  :root { font-size: 10px; }
-  :root.larger { font-size: 50px; }
-  body.larger { font-size: 20px; }
+  main {
+    color: red;
+  }
   #container {
     container-type: inline-size;
     width: 100px;
-    color: red;
   }
-  @container (width: 5em) {
-    #em_test { color: green }
-  }
-  @container (width: 2rem) {
-    #rem_test { color: green }
-  }
-  @container (max-width: 15ex) {
-    #ex_test { color: green }
-  }
-  @container (max-width: 15ch) {
-    #ch_test { color: green }
+  #container > div {
+    font-size: 16px;
   }
 </style>
-<div id="container">
-  <div id="em_test"></div>
-  <div id="rem_test"></div>
-  <div id="ex_test"></div>
-  <div id="ch_test"></div>
-</div>
+
+<main id=main>
+</main>
+
+<template>
+  <style>
+    main { font-size: 10px; }
+    main.larger { font-size: 20px; }
+    @container (width: 5em) {
+      #test { color: green }
+    }
+  </style>
+  <div id="container">
+    <div>
+      <div id="test"></div>
+    </div>
+  </div>
+</template>
 <script>
-  setup(() => assert_implements_container_queries());
+test_template(document.currentScript.previousElementSibling, (t) => {
+  t.add_cleanup(() => main.classList.remove("larger"));
+  assert_equals(getComputedStyle(main.querySelector("#test")).color, red);
+  main.classList.add("larger");
+  assert_equals(getComputedStyle(main.querySelector("#test")).color, green);
+}, 'em units respond to changes');
+</script>
 
-  const green = "rgb(0, 128, 0)";
-  const red = "rgb(255, 0, 0)";
+<template>
+  <style>
+    :root { font-size: 10px; }
+    :root.larger { font-size: 50px; }
+    @container (width: 2rem) {
+      #test { color: green }
+    }
+  </style>
+  <div id="container">
+    <div>
+      <div id="test"></div>
+    </div>
+  </div>
+</template>
+<script>
+test_template(document.currentScript.previousElementSibling, (t) => {
+  t.add_cleanup(() => document.documentElement.classList.remove("larger"));
+  assert_equals(getComputedStyle(main.querySelector("#test")).color, red);
+  document.documentElement.classList.add("larger");
+  assert_equals(getComputedStyle(main.querySelector("#test")).color, green);
+}, 'rem units respond to changes');
+</script>
 
-  test(() => assert_equals(getComputedStyle(em_test).color, red), "em relative before change");
-  test(() => assert_equals(getComputedStyle(rem_test).color, red), "rem relative before change");
-  test(() => assert_equals(getComputedStyle(ex_test).color, red), "ex relative before change");
-  test(() => assert_equals(getComputedStyle(ch_test).color, red), "ch relative before change");
+<template>
+  <style>
+    main { font-size: 10px; }
+    main.larger { font-size: 20px; }
+    @container (width <= 15ex) {
+      #test { color: green }
+    }
+  </style>
+  <div id="container">
+    <div>
+      <div id="test"></div>
+    </div>
+  </div>
+</template>
+<script>
+test_template(document.currentScript.previousElementSibling, (t) => {
+  t.add_cleanup(() => main.classList.remove("larger"));
+  assert_equals(getComputedStyle(main.querySelector("#test")).color, red);
+  main.classList.add("larger");
+  assert_equals(getComputedStyle(main.querySelector("#test")).color, green);
+}, 'ex units respond to changes');
+</script>
 
-  document.documentElement.className = "larger";
-  document.body.className = "larger";
-
-  test(() => assert_equals(getComputedStyle(em_test).color, green), "em relative after change");
-  test(() => assert_equals(getComputedStyle(rem_test).color, green), "rem relative after change");
-  test(() => assert_equals(getComputedStyle(ex_test).color, green), "ex relative after change");
-  test(() => assert_equals(getComputedStyle(ch_test).color, green), "ch relative after change");
+<template>
+  <style>
+    main { font-size: 10px; }
+    main.larger { font-size: 20px; }
+    @container (width <= 15ch) {
+      #test { color: green }
+    }
+  </style>
+  <div id="container">
+    <div>
+      <div id="test"></div>
+    </div>
+  </div>
+</template>
+<script>
+test_template(document.currentScript.previousElementSibling, (t) => {
+  t.add_cleanup(() => main.classList.remove("larger"));
+  assert_equals(getComputedStyle(main.querySelector("#test")).color, red);
+  main.classList.add("larger");
+  assert_equals(getComputedStyle(main.querySelector("#test")).color, green);
+}, 'ch units respond to changes');
 </script>