<!DOCTYPE html>
<title>Service Worker: CORS XHR of fetch()</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?pipe=sub"></script>
<body>
<script>
promise_test(function(t) {
    var SCOPE = 'resources/fetch-cors-xhr-iframe.html';
    var SCRIPT = 'resources/fetch-rewrite-worker.js';
    var host_info = get_host_info();

    return login_https(t)
      .then(function() {
          return service_worker_unregister_and_register(t, SCRIPT, SCOPE);
        })
      .then(function(registration) {
          t.add_cleanup(function() {
              return service_worker_unregister(t, SCOPE);
            });

          return wait_for_state(t, registration.installing, 'activated');
        })
      .then(function() { return with_iframe(SCOPE); })
      .then(function(frame) {
          t.add_cleanup(function() {
              frame.remove();
            });

          return new Promise(function(resolve, reject) {
              var channel = new MessageChannel();
              channel.port1.onmessage = (event) => {
                  if (event.data === 'done') {
                    resolve();
                    return;
                  }
                  test(() => {
                    assert_true(event.data.result);
                  }, event.data.testName);
              };
              frame.contentWindow.postMessage({},
                                              host_info['HTTPS_ORIGIN'],
                                              [channel.port2]);
            });
        });
  }, 'Verify CORS XHR of fetch() in a Service Worker');
</script>
</body>
