<!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="resources/get-host-info.sub.js"></script>
<script src="resources/test-helpers.sub.js?pipe=sub"></script>
<script>
async_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');
      t.done();
    }

    service_worker_unregister_and_register(t, SCRIPT, SCOPE)
      .then(function(registration) {
          return wait_for_state(t, registration.installing, 'activated');
        })
      .then(function() { return with_iframe(SCOPE); })
      .then(function(frame) {
          var channel = new MessageChannel();
          channel.port1.onmessage = t.step_func(function(e) {
              assert_equals(e.data.results, 'finish');
              frame.remove();
              service_worker_unregister_and_done(t, SCOPE);
            });
          frame.contentWindow.postMessage({},
                                          host_info['HTTPS_ORIGIN'],
                                          [channel.port2]);
        })
      .catch(unreached_rejection(t));
  }, 'Verify the response of FetchEvent using XMLHttpRequest');
</script>
