<!DOCTYPE html>
<title>Cache.keys (checking request attributes that can be set only on service workers)</title>
<link rel="help" href="https://w3c.github.io/ServiceWorker/#cache-keys">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./../service-worker/resources/test-helpers.sub.js"></script>
<script>
const worker = './resources/cache-keys-attributes-for-service-worker.js';

function wait(ms) {
  return new Promise(resolve => step_timeout(resolve, ms));
}

promise_test(async (t) => {
    const scope = './resources/blank.html?name=isReloadNavigation';
    let frame;
    let reg;

    try {
      reg = await service_worker_unregister_and_register(t, worker, scope);
      await wait_for_state(t, reg.installing, 'activated');
      frame = await with_iframe(scope);
      assert_equals(frame.contentDocument.body.textContent,
                    'original: false, stored: false');
      await new Promise((resolve) => {
        frame.onload = resolve;
        frame.contentWindow.location.reload();
      });
      assert_equals(frame.contentDocument.body.textContent,
                    'original: true, stored: true');
    } finally {
      if (frame) {
        frame.remove();
      }
      if (reg) {
        await reg.unregister();
      }
    }
}, 'Request.IsReloadNavigation should persist.');

promise_test(async (t) => {
    const scope = './resources/blank.html?name=isHistoryNavigation';
    let frame;
    let reg;

    try {
      reg = await service_worker_unregister_and_register(t, worker, scope);
      await wait_for_state(t, reg.installing, 'activated');
      frame = await with_iframe(scope);
      assert_equals(frame.contentDocument.body.textContent,
                    'original: false, stored: false');
      // Use step_timeout(0) to ensure the history entry is created for Blink
      // and WebKit. See https://bugs.webkit.org/show_bug.cgi?id=42861.
      await wait(0);
      await new Promise((resolve) => {
        frame.onload = resolve;
        frame.src = '../resources/blank.html?ignore';
      });
      await wait(0);
      await new Promise((resolve) => {
        frame.onload = resolve;
        frame.contentWindow.history.go(-1);
      });
      assert_equals(frame.contentDocument.body.textContent,
                    'original: true, stored: true');
    } finally {
      if (frame) {
        frame.remove();
      }
      if (reg) {
        await reg.unregister();
      }
    }
}, 'Request.IsHistoryNavigation should persist.');
</script>
