<!DOCTYPE html>
<title>Service Worker: the response of FetchEvent using XMLHttpRequest</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/fetch-response-xhr-iframe.https.html';
    var SCRIPT = 'resources/fetch-response-xhr-worker.js';
    var host_info = get_host_info();

    window.addEventListener('message', t.step_func(on_message), false);
    function on_message(e) {
      assert_equals(e.data.results, 'foo, bar');
      e.source.postMessage('ACK', host_info['HTTPS_ORIGIN']);
    }

    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) {
          var channel;

          t.add_cleanup(function() {
              frame.remove();
            });

          channel = new MessageChannel();
          var onPortMsg = new Promise(function(resolve) {
              channel.port1.onmessage = resolve;
            });

          frame.contentWindow.postMessage('START',
                                          host_info['HTTPS_ORIGIN'],
                                          [channel.port2]);

          return onPortMsg;
        })
      .then(function(e) {
          assert_equals(e.data.results, 'finish');
        });
  }, 'Verify the response of FetchEvent using XMLHttpRequest');
</script>
