Bug 1473362 [wpt PR 11778] - WPT tests for http-equiv Accept-CH-Lifetime, a=testonly
authorTarun Bansal <tbansal@chromium.org>
Sat, 07 Jul 2018 08:03:02 +0000
changeset 426163 a3eac0a0565a6d631a0aad81bdb5fde0659740c3
parent 426162 dc84ba57f9022e07760713c3186994c2ab22db6f
child 426164 674791fa7f042b28bc68052c5c06f0279bea8b26
push id34267
push userrgurzau@mozilla.com
push dateWed, 11 Jul 2018 22:05:21 +0000
treeherdermozilla-central@3aca103e4915 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerstestonly
bugs1473362, 11778, 852484, 1125212, 572706
milestone63.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1473362 [wpt PR 11778] - WPT tests for http-equiv Accept-CH-Lifetime, a=testonly Automatic update from web-platform-testsWPT 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} -- wpt-commits: f2fdea2d681d3618c7215e9333535c9585ec7171 wpt-pr: 11778
testing/web-platform/meta/MANIFEST.json
testing/web-platform/tests/client-hints/accept_ch.tentative.https.html
testing/web-platform/tests/client-hints/accept_ch_lifetime.tentative.https.html
testing/web-platform/tests/client-hints/accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html
testing/web-platform/tests/client-hints/accept_ch_lifetime_same_origin_iframe.tentative.https.html
testing/web-platform/tests/client-hints/accept_ch_lifetime_subresource.tentative.https.html
testing/web-platform/tests/client-hints/http_equiv_accept_ch_lifetime.tentative.https.html
testing/web-platform/tests/client-hints/http_equiv_accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html
testing/web-platform/tests/client-hints/http_equiv_accept_ch_lifetime_same_origin_iframe.tentative.https.html
testing/web-platform/tests/client-hints/http_equiv_accept_ch_lifetime_subresource.tentative.https.html
testing/web-platform/tests/client-hints/resources/do_not_expect_client_hints_headers.html
testing/web-platform/tests/client-hints/resources/expect_client_hints_headers.html
testing/web-platform/tests/client-hints/resources/http_equiv_accept_ch_lifetime.html
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -193801,16 +193801,21 @@
      {}
     ]
    ],
    "client-hints/resources/expect_client_hints_headers.html": [
     [
      {}
     ]
    ],
+   "client-hints/resources/http_equiv_accept_ch_lifetime.html": [
+    [
+     {}
+    ]
+   ],
    "clipboard-apis/META.yml": [
     [
      {}
     ]
    ],
    "common/META.yml": [
     [
      {}
@@ -313533,16 +313538,40 @@
     ]
    ],
    "client-hints/http_equiv_accept_ch.tentative.sub.https.html": [
     [
      "/client-hints/http_equiv_accept_ch.tentative.sub.https.html",
      {}
     ]
    ],
+   "client-hints/http_equiv_accept_ch_lifetime.tentative.https.html": [
+    [
+     "/client-hints/http_equiv_accept_ch_lifetime.tentative.https.html",
+     {}
+    ]
+   ],
+   "client-hints/http_equiv_accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html": [
+    [
+     "/client-hints/http_equiv_accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html",
+     {}
+    ]
+   ],
+   "client-hints/http_equiv_accept_ch_lifetime_same_origin_iframe.tentative.https.html": [
+    [
+     "/client-hints/http_equiv_accept_ch_lifetime_same_origin_iframe.tentative.https.html",
+     {}
+    ]
+   ],
+   "client-hints/http_equiv_accept_ch_lifetime_subresource.tentative.https.html": [
+    [
+     "/client-hints/http_equiv_accept_ch_lifetime_subresource.tentative.https.html",
+     {}
+    ]
+   ],
    "client-hints/http_equiv_accept_ch_malformed_header.tentative.https.html": [
     [
      "/client-hints/http_equiv_accept_ch_malformed_header.tentative.https.html",
      {}
     ]
    ],
    "clipboard-apis/async-interfaces.https.html": [
     [
@@ -420577,41 +420606,41 @@
    "ec820e569029ef412f776d35c4bc79a2a7ecf107",
    "testharness"
   ],
   "client-hints/accept_ch.http.html.headers": [
    "23aaa612f1b6ee417d31faec8399248c9bc7cffc",
    "support"
   ],
   "client-hints/accept_ch.tentative.https.html": [
-   "64f3e60bbc14c208a2fbe8193c694429fe394b31",
+   "812edca2d3fd438a13bcc05a6c7a722b467e000b",
    "testharness"
   ],
   "client-hints/accept_ch.tentative.sub.https.html": [
    "926500884d438811650ef7cca54f29d19ff03795",
    "testharness"
   ],
   "client-hints/accept_ch.tentative.sub.https.html.headers": [
    "23aaa612f1b6ee417d31faec8399248c9bc7cffc",
    "support"
   ],
   "client-hints/accept_ch_lifetime.tentative.https.html": [
-   "0e1756a8ea48e53011ada28ed0fa6070a0713691",
+   "4a0f40a61adfb2d4f5ab67244ebf98b4a66bf544",
    "testharness"
   ],
   "client-hints/accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html": [
-   "0006c59d1d9c305e94dfe60511c00539fb1f0887",
+   "c1c96cf6eac7da1368fcb41590efe3d60456692c",
    "testharness"
   ],
   "client-hints/accept_ch_lifetime_same_origin_iframe.tentative.https.html": [
-   "020fc61613776711177970917ddaacf3ed641a82",
+   "635b8d12d8d38f4f5be2b840e337a87cd63744ed",
    "testharness"
   ],
   "client-hints/accept_ch_lifetime_subresource.tentative.https.html": [
-   "b6235b48fa3132c5f5e0cb6187f25134abdee57e",
+   "6aeb04a3ad14e9efb9765b37a46ca73ca45cdd26",
    "testharness"
   ],
   "client-hints/accept_ch_malformed_header.https.html": [
    "fb5fa5837d4e3379384b6f409cd42c748dfa145f",
    "testharness"
   ],
   "client-hints/accept_ch_malformed_header.https.html.headers": [
    "e57611a23dbd0763e1d318af602f05a2593b149e",
@@ -420628,16 +420657,32 @@
   "client-hints/http_equiv_accept_ch.tentative.https.html": [
    "3d0aa253be8108f9b3aa6542d1eb5f8cafbb8e34",
    "testharness"
   ],
   "client-hints/http_equiv_accept_ch.tentative.sub.https.html": [
    "f404276fd8263be9f4fc2ecfc4f1d28ce0f62f6d",
    "testharness"
   ],
+  "client-hints/http_equiv_accept_ch_lifetime.tentative.https.html": [
+   "5881ee69c16a2990fd96bf201668900213f1c7d9",
+   "testharness"
+  ],
+  "client-hints/http_equiv_accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html": [
+   "e505202f4f86587242bdd546eb2686d20ea70899",
+   "testharness"
+  ],
+  "client-hints/http_equiv_accept_ch_lifetime_same_origin_iframe.tentative.https.html": [
+   "b1e602609e872b2e00f2086330450afae3764b17",
+   "testharness"
+  ],
+  "client-hints/http_equiv_accept_ch_lifetime_subresource.tentative.https.html": [
+   "bcba9e32ad82008f3fa391559f9bc8fbca9805fb",
+   "testharness"
+  ],
   "client-hints/http_equiv_accept_ch_malformed_header.tentative.https.html": [
    "17d80854b8a71289a1a1208984cca7021b51679a",
    "testharness"
   ],
   "client-hints/resources/accept_ch.html": [
    "a0a6d53c0c859bb62d38f1ad3a4eeac0abd50823",
    "support"
   ],
@@ -420649,21 +420694,25 @@
    "ddafc53ea37b3f557b518e65181fdafc161cde49",
    "support"
   ],
   "client-hints/resources/accept_ch_lifetime.html.headers": [
    "22488fcaec4a0a0f227b972ccc8c911e006f3286",
    "support"
   ],
   "client-hints/resources/do_not_expect_client_hints_headers.html": [
-   "0c036c2a388518922878380659da0f7e13d20543",
+   "3aa67914736b2aaf826a641ac3886bd1a07c37d5",
    "support"
   ],
   "client-hints/resources/expect_client_hints_headers.html": [
-   "1fcc20d9ff0da7712aeeaa10db51fffb2fd97c50",
+   "f3dad5b94c675e20a768bd1408efeb160f7a9344",
+   "support"
+  ],
+  "client-hints/resources/http_equiv_accept_ch_lifetime.html": [
+   "d892780f71f921b8fe8a068d417de63ee4a85600",
    "support"
   ],
   "clipboard-apis/META.yml": [
    "49ed5058494d23f4521a07000b533d463805f104",
    "support"
   ],
   "clipboard-apis/async-interfaces.https.html": [
    "ffc8726b7afa6dc3e58745bd0dac525a570970ef",
--- a/testing/web-platform/tests/client-hints/accept_ch.tentative.https.html
+++ b/testing/web-platform/tests/client-hints/accept_ch.tentative.https.html
@@ -32,33 +32,36 @@ 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");
 
-// 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")) {
       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 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>
--- a/testing/web-platform/tests/client-hints/accept_ch_lifetime.tentative.https.html
+++ b/testing/web-platform/tests/client-hints/accept_ch_lifetime.tentative.https.html
@@ -32,32 +32,36 @@ 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");
 
-// 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")) {
       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/accept_ch_lifetime.html");
+assert_not_equals(win, null, "Popup windows not allowed?");
+win.addEventListener('load', acceptChLifetimeLoaded, false);
+
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/client-hints/accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html
+++ b/testing/web-platform/tests/client-hints/accept_ch_lifetime_cross_origin_iframe.tentative.sub.https.html
@@ -34,35 +34,35 @@ 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");
 
-</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")) {
       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() {
+  // 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>
--- a/testing/web-platform/tests/client-hints/accept_ch_lifetime_same_origin_iframe.tentative.https.html
+++ b/testing/web-platform/tests/client-hints/accept_ch_lifetime_same_origin_iframe.tentative.https.html
@@ -34,34 +34,34 @@ 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");
 
-</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")) {
       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/accept_ch_lifetime.html"></iframe>
+
 </body>
 </html>
--- a/testing/web-platform/tests/client-hints/accept_ch_lifetime_subresource.tentative.https.html
+++ b/testing/web-platform/tests/client-hints/accept_ch_lifetime_subresource.tentative.https.html
@@ -42,32 +42,30 @@ promise_test(t => {
 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/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");
 
-// 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")) {
       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>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/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>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/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>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/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>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/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>
--- a/testing/web-platform/tests/client-hints/resources/do_not_expect_client_hints_headers.html
+++ b/testing/web-platform/tests/client-hints/resources/do_not_expect_client_hints_headers.html
@@ -4,19 +4,19 @@
 
 // This test checks if browser attaches the device-memory client hint in the
 // HTTP request headers.
 
 // echo_client_hints_received.py sets the response headers depending on the set
 // 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', '*');
   }
 });
 
 </script>
 </body>
 </html>
--- a/testing/web-platform/tests/client-hints/resources/expect_client_hints_headers.html
+++ b/testing/web-platform/tests/client-hints/resources/expect_client_hints_headers.html
@@ -4,19 +4,19 @@
 
 // This test checks if browser attaches the device-memory client hint in the
 // HTTP request headers.
 
 // echo_client_hints_received.py sets the response headers depending on the set
 // 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', '*');
   }
 });
 
 </script>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/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>