WPT tests for http-equiv Accept-CH-Lifetime

WPT tests are added for:
(i) When ACL http-equiv header is sent by a same-origin iframe.
(ii) When ACL http-equiv header is sent by a cross-origin iframe.
(iii) When ACL http-equiv header is sent by a subresource.
(iv) When ACL http-equiv header is sent on the main frame.

Change-Id: Ie4adce0c1b5983a66ce3dce7bb6b77e30f63c03a
Bug: 852484
Reviewed-on: https://chromium-review.googlesource.com/1125212
Reviewed-by: Yoav Weiss <yoav@yoav.ws>
Commit-Queue: Tarun Bansal <tbansal@chromium.org>
Cr-Commit-Position: refs/heads/master@{#572706}
diff --git a/client-hints/accept_ch.tentative.https.html b/client-hints/accept_ch.tentative.https.html
index 3f38574..b8379de 100644
--- a/client-hints/accept_ch.tentative.https.html
+++ b/client-hints/accept_ch.tentative.https.html
@@ -37,15 +37,6 @@
   });
 }, "Precondition: Test that the browser does not have client hints preferences cached");
 
-// Fetching this webpage should NOT cause user-agent to persist client hint
-// preferences for the origin.
-var win = window.open("resources/accept_ch.html");
-assert_not_equals(win, null, "Popup windows not allowed?");
-
-// Open a new window. Verify that the user agent does not attach the client
-// hints.
-var verify_win = window.open("resources/do_not_expect_client_hints_headers.html");
-assert_not_equals(verify_win, null, "Popup windows not allowed?");
 async_test(t => {
   window.addEventListener('message', function(e) {
     if(!e.source.location.pathname.includes("do_not_expect_client_hints_headers.html")) {
@@ -58,7 +49,19 @@
   })
 }, "Loading of resources/do_not_expect_client_hints_headers.html did not finish.");
 
-</script>
+function acceptChLoaded() {
+  // Open a new window. Verify that the user agent does not attach the client
+  // hints.
+  var verify_win = window.open("do_not_expect_client_hints_headers.html");
+  assert_not_equals(verify_win, null, "Popup windows not allowed?");
+}
 
+// Fetching this webpage should NOT cause user-agent to persist client hint
+// preferences for the origin.
+var win = window.open("resources/accept_ch.html");
+assert_not_equals(win, null, "Popup windows not allowed?");
+win.addEventListener('load', acceptChLoaded, false);
+
+</script>
 </body>
 </html>
diff --git a/client-hints/accept_ch_lifetime.tentative.https.html b/client-hints/accept_ch_lifetime.tentative.https.html
index 8065cf1..0055b13 100644
--- a/client-hints/accept_ch_lifetime.tentative.https.html
+++ b/client-hints/accept_ch_lifetime.tentative.https.html
@@ -37,14 +37,6 @@
   });
 }, "Precondition: Test that the browser does not have client hints preferences cached");
 
-// Fetching this webpage should cause user-agent to persist client hint
-// preferences for the origin.
-var win = window.open("resources/accept_ch_lifetime.html");
-assert_not_equals(win, null, "Popup windows not allowed?");
-
-// Open a new window. Verify that the user agent attaches the client hints.
-var verify_win = window.open("resources/expect_client_hints_headers.html");
-assert_not_equals(verify_win, null, "Popup windows not allowed?");
 async_test(t => {
   window.addEventListener('message', function(e) {
     if(!e.source.location.pathname.includes("expect_client_hints_headers.html")) {
@@ -58,6 +50,18 @@
 }, "Loading of resources/expect_client_hints_headers.html did not finish.");
 
 
+function acceptChLifetimeLoaded() {
+  // Open a new window. Verify that the user agent attaches the client hints.
+  var verify_win = window.open("expect_client_hints_headers.html");
+  assert_not_equals(verify_win, null, "Popup windows not allowed?");
+}
+
+// Fetching this webpage should cause user-agent to persist client hint
+// preferences for the origin.
+var win = window.open("resources/accept_ch_lifetime.html");
+assert_not_equals(win, null, "Popup windows not allowed?");
+win.addEventListener('load', acceptChLifetimeLoaded, false);
+
 </script>
 </body>
 </html>
diff --git a/client-hints/accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html b/client-hints/accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html
index 38e28e3..8273ac7 100644
--- a/client-hints/accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html
+++ b/client-hints/accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html
@@ -39,18 +39,6 @@
   });
 }, "Precondition: Test that the browser does not have client hints preferences cached");
 
-</script>
-
-<!-- Fetching this webpage should NOT cause user-agent to persist client hint
- preferences for the origin.-->
-<iframe src="https://{{hosts[][www]}}:{{ports[https][0]}}/client-hints/resources/accept_ch_lifetime.html"></iframe>
-
-<script>
-// Open a new window. Verify that the user agent does not attach the client
-// hints.
-var win = window.open("resources/do_not_expect_client_hints_headers.html");
-assert_not_equals(win, null, "Popup windows not allowed?");
-
 async_test(t => {
   window.addEventListener('message', function(e) {
     if(!e.source.location.pathname.includes("do_not_expect_client_hints_headers.html")) {
@@ -63,6 +51,18 @@
   })
 }, "Loading of resources/do_not_expect_client_hints_headers.html did not finish.");
 
+function acceptChLifetimeLoaded() {
+  // Open a new window. Verify that the user agent does not attach the client
+  // hints.
+  var verify_win = window.open("resources/do_not_expect_client_hints_headers.html");
+  assert_not_equals(verify_win, null, "Popup windows not allowed?");
+}
+
 </script>
+
+<!-- Fetching this webpage should NOT cause user-agent to persist client hint
+ preferences for the origin.-->
+<iframe onload="acceptChLifetimeLoaded()" src="https://{{hosts[][www]}}:{{ports[https][0]}}/client-hints/resources/accept_ch_lifetime.html"></iframe>
+
 </body>
 </html>
diff --git a/client-hints/accept_ch_lifetime_same_origin_iframe.tentative.https.html b/client-hints/accept_ch_lifetime_same_origin_iframe.tentative.https.html
index ca5a2b5..4d339b6 100644
--- a/client-hints/accept_ch_lifetime_same_origin_iframe.tentative.https.html
+++ b/client-hints/accept_ch_lifetime_same_origin_iframe.tentative.https.html
@@ -39,16 +39,6 @@
   });
 }, "Precondition: Test that the browser does not have client hints preferences cached");
 
-</script>
-
-<!-- Fetching this webpage should cause user-agent to persist client hint
- preferences for the origin.-->
-<iframe src="resources/accept_ch_lifetime.html"></iframe>
-
-<script>
-// Open a new window. Verify that the user agent attaches the client hints.
-var win = window.open("resources/expect_client_hints_headers.html");
-assert_not_equals(win, null, "Popup windows not allowed?");
 async_test(t => {
   window.addEventListener('message', function(e) {
     if(!e.source.location.pathname.includes("expect_client_hints_headers.html")) {
@@ -61,7 +51,17 @@
   })
 }, "Loading of resources/expect_client_hints_headers.html did not finish.");
 
+function acceptChLifetimeLoaded() {
+  // Open a new window. Verify that the user agent attaches the client hints.
+  var verify_win = window.open("resources/expect_client_hints_headers.html");
+  assert_not_equals(verify_win, null, "Popup windows not allowed?");
+}
 
 </script>
+
+<!-- Fetching this webpage should cause user-agent to persist client hint
+ preferences for the origin.-->
+<iframe onload="acceptChLifetimeLoaded()" src="resources/accept_ch_lifetime.html"></iframe>
+
 </body>
 </html>
diff --git a/client-hints/accept_ch_lifetime_subresource.tentative.https.html b/client-hints/accept_ch_lifetime_subresource.tentative.https.html
index c37dd94..e386429 100644
--- a/client-hints/accept_ch_lifetime_subresource.tentative.https.html
+++ b/client-hints/accept_ch_lifetime_subresource.tentative.https.html
@@ -47,13 +47,13 @@
     // Verify that the browser did not include client hints in the request
     // headers.
     assert_false(r.headers.has("device-memory-received"), "device-memory-received");
+    // Open a new window. Verify that the user agent does not attach the client
+    // hints.
+    var win = window.open("resources/do_not_expect_client_hints_headers.html");
+    assert_not_equals(win, null, "Popup windows not allowed?");
   });
 }, "Test receiving Accept-CH-Lifetime header");
 
-// Open a new window. Verify that the user agent does not attach the client
-// hints.
-var win = window.open("resources/do_not_expect_client_hints_headers.html");
-assert_not_equals(win, null, "Popup windows not allowed?");
 async_test(t => {
   window.addEventListener('message', function(e) {
     if(!e.source.location.pathname.includes("do_not_expect_client_hints_headers.html")) {
@@ -66,8 +66,6 @@
   })
 }, "Loading of resources/do_not_expect_client_hints_headers.html did not finish.");
 
-
 </script>
-
 </body>
 </html>
diff --git a/client-hints/http_equiv_accept_ch_lifetime.tentative.https.html b/client-hints/http_equiv_accept_ch_lifetime.tentative.https.html
new file mode 100644
index 0000000..73ca1fc
--- /dev/null
+++ b/client-hints/http_equiv_accept_ch_lifetime.tentative.https.html
@@ -0,0 +1,66 @@
+<html>
+<title>Accept-CH-Lifetime test</title>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<!--
+Apart from this webpage, the test opens two more html web page. One test is run
+in this web page, and two in the other web pages.
+-->
+
+<script>
+
+// This test fetches resources/http_equiv_accept_ch_lifetime.html. The response
+// to that webpage contains Accept-CH and Accept-CH-Lifetime http-equiv headers.
+// Fetching that webpage should cause the user-agent to persist origin
+// preferences for the client hints specified in Accept-CH header for a
+// duration specified in the Accept-CH-Lifetime header.
+
+// Next, to verify if the origin preferences were persisted by the user
+// agent, this test fetches resources/expect_client_hints_headers.html
+// in a new window. Fetching of resources/expect_client_hints_headers.html
+// verifies that the user agent actually sends the client hints in the request
+// headers.
+
+// Test is marked as tentative until https://github.com/whatwg/fetch/issues/726
+// is resolved.
+
+// First, verify the initial state to make sure that the browser does not have
+// client hints preferences cached from a previous run of the test.
+promise_test(t => {
+  return fetch("echo_client_hints_received.py").then(r => {
+    assert_equals(r.status, 200)
+    // Verify that the browser did not include client hints in the request
+    // headers when fetching echo_client_hints_received.py.
+    assert_false(r.headers.has("device-memory-received"), "device-memory-received");
+  });
+}, "Precondition: Test that the browser does not have client hints preferences cached");
+
+async_test(t => {
+  window.addEventListener('message', function(e) {
+    if(!e.source.location.pathname.includes("expect_client_hints_headers.html")) {
+      return;
+    }
+    if(typeof e.data != "string")
+      return;
+    assert_equals(e.data, "PASS");
+    t.done();
+})
+}, "Loading of resources/expect_client_hints_headers.html did not finish.");
+
+function acceptChLifetimeLoaded() {
+  // Open a new window. Verify that the user agent attaches the client hints.
+  var verify_win = window.open("expect_client_hints_headers.html");
+  assert_not_equals(verify_win, null, "Popup windows not allowed?");
+}
+
+// Fetching this webpage should cause user-agent to persist client hint
+// preferences for the origin.
+var win = window.open("resources/http_equiv_accept_ch_lifetime.html");
+assert_not_equals(win, null, "Popup windows not allowed?");
+win.addEventListener('load', acceptChLifetimeLoaded, false);
+
+</script>
+</body>
+</html>
diff --git a/client-hints/http_equiv_accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html b/client-hints/http_equiv_accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html
new file mode 100644
index 0000000..ab878f8
--- /dev/null
+++ b/client-hints/http_equiv_accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html
@@ -0,0 +1,66 @@
+<html>
+<title>Accept-CH-Lifetime test with cross-origin iframe</title>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<!--
+Apart from this webpage, the test opens another html web page. One test is run
+in this web page, and another in the second web page.
+-->
+
+<script>
+
+// This test fetches resources/http_equiv_accept_ch_lifetime.html in a cross
+// origin iframe. The response to that webpage contains Accept-CH and
+// Accept-CH-Lifetime http-equiv headers.
+
+// Fetching that webpage should NOT cause the user-agent to persist origin
+// preferences for the client hints specified.
+
+// Next, to verify if the origin preferences were NOT persisted by the user
+// agent, this test fetches resources/do_not_expect_client_hints_headers.html
+// in a new window. Fetching of
+// resources/do_not_expect_client_hints_headers.html
+// verifies that the user agent did not actually sent the client hints in the
+// request headers.
+
+// Test is marked as tentative until https://github.com/whatwg/fetch/issues/726
+// is resolved.
+
+// First, verify the initial state to make sure that the browser does not have
+// client hints preferences cached from a previous run of the test.
+promise_test(t => {
+  return fetch("echo_client_hints_received.py").then(r => {
+    assert_equals(r.status, 200)
+    // Verify that the browser did not include client hints in the request
+    // headers when fetching echo_client_hints_received.py.
+    assert_false(r.headers.has("device-memory-received"), "device-memory-received");
+  });
+}, "Precondition: Test that the browser does not have client hints preferences cached");
+
+async_test(t => {
+  window.addEventListener('message', function(e) {
+    if(!e.source.location.pathname.includes("do_not_expect_client_hints_headers.html")) {
+      return;
+    }
+    if(typeof e.data != "string")
+      return;
+    assert_equals(e.data, "PASS");
+    t.done();
+  })
+}, "Loading of resources/do_not_expect_client_hints_headers.html did not finish.");
+
+function acceptChLifetimeLoaded() {
+  var verify_win = window.open("resources/do_not_expect_client_hints_headers.html");
+  assert_not_equals(verify_win, null, "Popup windows not allowed?");
+}
+
+</script>
+
+<!-- Fetching this webpage should NOT cause user-agent to persist client hint
+ preferences for the origin.-->
+<iframe onload="acceptChLifetimeLoaded()" src="https://{{hosts[][www]}}:{{ports[https][0]}}/client-hints/resources/http_equiv_accept_ch_lifetime.html"></iframe>
+
+</body>
+</html>
diff --git a/client-hints/http_equiv_accept_ch_lifetime_same_origin_iframe.tentative.https.html b/client-hints/http_equiv_accept_ch_lifetime_same_origin_iframe.tentative.https.html
new file mode 100644
index 0000000..9f7d1f3
--- /dev/null
+++ b/client-hints/http_equiv_accept_ch_lifetime_same_origin_iframe.tentative.https.html
@@ -0,0 +1,67 @@
+<html>
+<title>Accept-CH-Lifetime test with same-origin iframe</title>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<!--
+Apart from this webpage, the test opens another html web page. One test is run
+in this web page, and another in the second web page.
+-->
+
+<script>
+
+// This test fetches resources/http_equiv_accept_ch_lifetime.html in a same
+// origin iframe. The response to that webpage contains Accept-CH and
+// Accept-CH-Lifetime http-equiv headers.
+
+// Fetching that webpage should cause the user-agent to persist origin
+// preferences for the client hints specified in Accept-CH header for a
+// duration specified in the Accept-CH-Lifetime header.
+
+// Next, to verify if the origin preferences were persisted by the user
+// agent, this test fetches resources/expect_client_hints_headers.html
+// in a new window. Fetching of resources/expect_client_hints_headers.html
+// verifies that the user agent actually sends the client hints in the request
+// headers.
+
+// Test is marked as tentative until https://github.com/whatwg/fetch/issues/726
+// is resolved.
+
+// First, verify the initial state to make sure that the browser does not have
+// client hints preferences cached from a previous run of the test.
+promise_test(t => {
+  return fetch("echo_client_hints_received.py").then(r => {
+    assert_equals(r.status, 200)
+    // Verify that the browser did not include client hints in the request
+    // headers when fetching echo_client_hints_received.py.
+    assert_false(r.headers.has("device-memory-received"), "device-memory-received");
+  });
+}, "Precondition: Test that the browser does not have client hints preferences cached");
+
+async_test(t => {
+  window.addEventListener('message', function(e) {
+    if(!e.source.location.pathname.includes("expect_client_hints_headers.html")) {
+      return;
+    }
+    if(typeof e.data != "string")
+      return;
+    assert_equals(e.data, "PASS");
+    t.done();
+  })
+}, "Loading of resources/expect_client_hints_headers.html did not finish.");
+
+function acceptChLifetimeLoaded() {
+  // Open a new window. Verify that the user agent attaches the client hints.
+  var verify_win = window.open("resources/expect_client_hints_headers.html");
+  assert_not_equals(verify_win, null, "Popup windows not allowed?");
+}
+
+</script>
+
+<!-- Fetching this webpage should cause user-agent to persist client hint
+ preferences for the origin.-->
+<iframe onload="acceptChLifetimeLoaded()" src="resources/http_equiv_accept_ch_lifetime.html"></iframe>
+
+</body>
+</html>
diff --git a/client-hints/http_equiv_accept_ch_lifetime_subresource.tentative.https.html b/client-hints/http_equiv_accept_ch_lifetime_subresource.tentative.https.html
new file mode 100644
index 0000000..17f287d
--- /dev/null
+++ b/client-hints/http_equiv_accept_ch_lifetime_subresource.tentative.https.html
@@ -0,0 +1,74 @@
+<html>
+<title>Accept-CH-Lifetime test with subresource</title>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<!--
+Apart from this webpage, the test opens another html web page. One test is run
+in this web page, and another in the second web page.
+-->
+
+<script>
+
+// This test fetches resources/http_equiv_accept_ch_lifetime.html as a
+// subresource. The response to that webpage contains Accept-CH and
+// Accept-CH-Lifetime http-equiv headers.
+
+// Fetching that webpage as a subresource should NOT cause the user-agent to
+// persist origin preferences for the client hints specified in Accept-CH
+// header.
+
+// Next, to verify if the origin preferences were not persisted by the user
+// agent, this test fetches resources/do_not_expect_client_hints_headers.html
+// in a new window. Fetching of
+// resources/do_not_expect_client_hints_headers.html verifies that the user
+// agent does not send the client hints in the request headers.
+
+// Test is marked as tentative until https://github.com/whatwg/fetch/issues/726
+// is resolved.
+
+// First, verify the initial state to make sure that the browser does not have
+// client hints preferences cached from a previous run of the test.
+promise_test(t => {
+  return fetch("echo_client_hints_received.py").then(r => {
+    assert_equals(r.status, 200)
+    // Verify that the browser did not include client hints in the request
+    // headers when fetching echo_client_hints_received.py.
+    assert_false(r.headers.has("device-memory-received"), "device-memory-received");
+  });
+}, "Precondition: Test that the browser does not have client hints preferences cached");
+
+promise_test(t => {
+  // Fetching this web page as a subresource should NOT cause user-agent to
+  // persist client hint preferences for the origin.
+  return fetch("resources/http_equiv_accept_ch_lifetime.html").then(r => {
+    assert_equals(r.status, 200)
+    // Verify that the browser did not include client hints in the request
+    // headers.
+    assert_false(r.headers.has("device-memory-received"), "device-memory-received");
+
+    // Open a new window. Verify that the user agent does not attach the client
+    // hints.
+    var win = window.open("resources/do_not_expect_client_hints_headers.html");
+    assert_not_equals(win, null, "Popup windows not allowed?");
+
+  });
+}, "Test receiving Accept-CH-Lifetime header");
+
+async_test(t => {
+  window.addEventListener('message', function(e) {
+    if(!e.source.location.pathname.includes("do_not_expect_client_hints_headers.html")) {
+      return;
+    }
+    if(typeof e.data != "string")
+      return;
+    assert_equals(e.data, "PASS");
+    t.done();
+  })
+}, "Loading of resources/do_not_expect_client_hints_headers.html did not finish.");
+
+
+</script>
+</body>
+</html>
diff --git a/client-hints/resources/do_not_expect_client_hints_headers.html b/client-hints/resources/do_not_expect_client_hints_headers.html
index 31da74b..b3cf5df 100644
--- a/client-hints/resources/do_not_expect_client_hints_headers.html
+++ b/client-hints/resources/do_not_expect_client_hints_headers.html
@@ -9,11 +9,11 @@
 // of client hints it receives in the request headers.
 
 fetch("../echo_client_hints_received.py").then(r => {
-  if(r.status == 200 && r.headers.has("device-memory-received") != "device-memory-received") {
+  if(r.status == 200 && !r.headers.has("device-memory-received")) {
     window.top.opener.postMessage('PASS', '*');
   }
   else {
-    window.top.opener.postMessage('FAIL '+ ex.message, '*');
+    window.top.opener.postMessage('FAIL', '*');
   }
 });
 
diff --git a/client-hints/resources/expect_client_hints_headers.html b/client-hints/resources/expect_client_hints_headers.html
index 12d61e9..8e64b19 100644
--- a/client-hints/resources/expect_client_hints_headers.html
+++ b/client-hints/resources/expect_client_hints_headers.html
@@ -9,11 +9,11 @@
 // of client hints it receives in the request headers.
 
 fetch("../echo_client_hints_received.py").then(r => {
-  if(r.status == 200 && r.headers.has("device-memory-received") == "device-memory-received") {
+  if(r.status == 200 && r.headers.has("device-memory-received")) {
     window.top.opener.postMessage('PASS', '*');
   }
   else {
-    window.top.opener.postMessage('FAIL '+ ex.message, '*');
+    window.top.opener.postMessage('FAIL', '*');
   }
 });
 
diff --git a/client-hints/resources/http_equiv_accept_ch_lifetime.html b/client-hints/resources/http_equiv_accept_ch_lifetime.html
new file mode 100644
index 0000000..2dd1806
--- /dev/null
+++ b/client-hints/resources/http_equiv_accept_ch_lifetime.html
@@ -0,0 +1,6 @@
+<html>
+<meta http-equiv="Accept-CH" content="device-memory">
+<meta http-equiv="Accept-CH-Lifetime" content="5">
+<body>
+</body>
+</html>