<!DOCTYPE html>
<title>Service Worker: check referer of fetch() with Referrer Policy</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
promise_test(function(t) {
    var SCOPE = 'resources/referrer-policy-iframe.html';
    var SCRIPT = 'resources/fetch-rewrite-worker-referrer-policy.js';
    var host_info = get_host_info();
    var body, unregister;

    body = service_worker_unregister_and_register(t, SCRIPT, SCOPE)
      .then(function(registration) {
          unregister = registration.unregister.bind(registration);
          return wait_for_state(t, registration.installing, 'activated');
        })
      .then(function() { return with_iframe(SCOPE); })
      .then(function(frame) {
          var channel = new MessageChannel();
          t.add_cleanup(function() {
              frame.remove();
            });

          return new Promise(function(resolve) {
              channel.port1.onmessage = resolve;
              frame.contentWindow.postMessage({},
                                              host_info['HTTPS_ORIGIN'],
                                              [channel.port2]);
            });
        })
      .then(function(e) {
          assert_equals(e.data.results, 'finish');
        });

      // Schedule un-registration to occur after test execution has completed,
      // without hiding test failure.
      return body
        .then(unregister, unregister)
        .then(function() { return body; });
  }, 'Verify the referer with a Referrer Policy');
</script>
