<!DOCTYPE html>
<title>Service Worker: the body 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?pipe-sub"></script>
<script>
let frame;

// Set up the service worker and the frame.
promise_test(t => {
    const kScope = 'resources/fetch-request-xhr-iframe.https.html';
    const kScript = 'resources/fetch-request-xhr-worker.js';
    return service_worker_unregister_and_register(t, kScript, kScope)
      .then(registration => {
          promise_test(() => {
              return registration.unregister();
            }, 'restore global state');

          return wait_for_state(t, registration.installing, 'activated');
        })
      .then(() => {
          return with_iframe(kScope);
        })
      .then(f => {
          frame = f;
          add_completion_callback(() => { f.remove(); });
        });
  }, 'initialize global state');

// Run the tests.
promise_test(t => {
    return frame.contentWindow.get_header_test();
  }, 'event.request has the expected headers for same-origin GET.');

promise_test(t => {
    return frame.contentWindow.post_header_test();
  }, 'event.request has the expected headers for same-origin POST.');

promise_test(t => {
    return frame.contentWindow.cross_origin_get_header_test();
  }, 'event.request has the expected headers for cross-origin GET.');

promise_test(t => {
    return frame.contentWindow.cross_origin_post_header_test();
  }, 'event.request has the expected headers for cross-origin POST.');

promise_test(t => {
    return frame.contentWindow.string_test();
  }, 'FetchEvent#request.body contains XHR request data (string)');

promise_test(t => {
    return frame.contentWindow.blob_test();
  }, 'FetchEvent#request.body contains XHR request data (blob)');

promise_test(t => {
    return frame.contentWindow.custom_method_test();
  }, 'FetchEvent#request.method is set to XHR method');

promise_test(t => {
    return frame.contentWindow.options_method_test();
  }, 'XHR using OPTIONS method');

promise_test(t => {
    return frame.contentWindow.form_data_test();
  }, 'XHR with form data');

promise_test(t => {
    return frame.contentWindow.mode_credentials_test();
  }, 'XHR with mode/credentials set');

promise_test(t => {
    return frame.contentWindow.data_url_test();
  }, 'XHR to data URL');
</script>
