<!DOCTYPE html>
<title>Service Worker: the headers of FetchEvent shouldn't contain freshness headers</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js?pipe=sub"></script>
<script>
async_test(function(t) {
    var SCOPE = 'resources/fetch-request-no-freshness-headers-iframe.html';
    var SCRIPT = 'resources/fetch-request-no-freshness-headers-worker.js';
    var worker;
    service_worker_unregister_and_register(t, SCRIPT, SCOPE)
      .then(function(registration) {
          worker = registration.installing;
          return wait_for_state(t, worker, 'activated');
        })
      .then(function() { return with_iframe(SCOPE); })
      .then(function(frame) {
          return new Promise(function(resolve) {
              frame.onload = function() {
                  resolve(frame);
                };
              frame.contentWindow.location.reload();
            });
        })
      .then(function(frame) {
          return new Promise(function(resolve) {
              var channel = new MessageChannel();
              channel.port1.onmessage = t.step_func(function(msg) {
                  frame.remove();
                  resolve(msg);
                });
              worker.postMessage(
                {port: channel.port2}, [channel.port2]);
            });
        })
      .then(function(msg) {
          var freshness_headers = {
            'if-none-match': true,
            'if-modified-since': true
          };
          msg.data.requests.forEach(t.step_func(function(request) {
              request.headers.forEach(t.step_func(function(header) {
                  assert_false(
                      !!freshness_headers[header[0]],
                      header[0] + ' header must not be set in the ' +
                      'FetchEvent\'s request. (url = ' + request.url + ')');
                }));
            }))
          service_worker_unregister_and_done(t, SCOPE);
        })
      .catch(unreached_rejection(t));
  }, 'The headers of FetchEvent shouldn\'t contain freshness headers.');
</script>
