| Index: third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/fetch-event.https.html
 | 
| diff --git a/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/fetch-event.https.html b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/fetch-event.https.html
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..a9b0d6ca286e2e435cdee601809e88146e745b30
 | 
| --- /dev/null
 | 
| +++ b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/fetch-event.https.html
 | 
| @@ -0,0 +1,576 @@
 | 
| +<!DOCTYPE html>
 | 
| +<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"></script>
 | 
| +<body>
 | 
| +<script>
 | 
| +var worker = 'resources/fetch-event-test-worker.js';
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?string';
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() { return with_iframe(scope); })
 | 
| +      .then(function(frame) {
 | 
| +          assert_equals(
 | 
| +            frame.contentDocument.body.textContent,
 | 
| +            'Test string',
 | 
| +            'Service Worker should respond to fetch with a test string');
 | 
| +          assert_equals(
 | 
| +            frame.contentDocument.contentType,
 | 
| +            'text/plain',
 | 
| +            'The content type of the response created with a string should be text/plain');
 | 
| +          assert_equals(
 | 
| +            frame.contentDocument.characterSet,
 | 
| +            'UTF-8',
 | 
| +            'The character set of the response created with a string should be UTF-8');
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +        })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Service Worker responds to fetch event with string');
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?blob';
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() { return with_iframe(scope); })
 | 
| +      .then(function(frame) {
 | 
| +          assert_equals(
 | 
| +            frame.contentDocument.body.textContent,
 | 
| +            'Test blob',
 | 
| +            'Service Worker should respond to fetch with a test string');
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +        })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Service Worker responds to fetch event with blob body');
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?referrer';
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() { return with_iframe(scope); })
 | 
| +      .then(function(frame) {
 | 
| +          assert_equals(
 | 
| +            frame.contentDocument.body.textContent,
 | 
| +            'Referrer: ' + document.location.href,
 | 
| +            'Service Worker should respond to fetch with the referrer URL');
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +        })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Service Worker responds to fetch event with the referrer URL');
 | 
| +
 | 
| +function run_referrer_policy_tests(frame, referrer, href, origin) {
 | 
| +    return frame.contentWindow.fetch('resources/simple.html?referrerFull',
 | 
| +                                     {method: "GET", referrer: referrer})
 | 
| +      .then(function(response) { return response.text(); })
 | 
| +      .then(function(response_text) {
 | 
| +          assert_equals(
 | 
| +            response_text,
 | 
| +            'Referrer: ' + href + '\n' +
 | 
| +            'ReferrerPolicy: no-referrer-when-downgrade',
 | 
| +            'Service Worker should respond to fetch with the referrer URL when a member of RequestInit is present');
 | 
| +          var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
 | 
| +                         '/resources/simple.html?referrerFull';
 | 
| +          return frame.contentWindow.fetch(http_url,
 | 
| +                                           {method: "GET", referrer: referrer});
 | 
| +        })
 | 
| +      .then(function(response) { return response.text(); })
 | 
| +      .then(function(response_text) {
 | 
| +          assert_equals(
 | 
| +            response_text,
 | 
| +            'Referrer: about:client\n' +
 | 
| +            'ReferrerPolicy: no-referrer-when-downgrade',
 | 
| +            'Service Worker should respond to fetch with no referrer when a member of RequestInit is present with an HTTP request');
 | 
| +          return frame.contentWindow.fetch('resources/simple.html?referrerFull',
 | 
| +                                           {referrerPolicy: "", referrer: referrer});
 | 
| +        })
 | 
| +      .then(function(response) { return response.text(); })
 | 
| +      .then(function(response_text) {
 | 
| +          assert_equals(
 | 
| +            response_text,
 | 
| +            'Referrer: ' + href + '\n' +
 | 
| +            'ReferrerPolicy: no-referrer-when-downgrade',
 | 
| +            'Service Worker should respond to fetch with the referrer with ""');
 | 
| +          var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
 | 
| +                         '/resources/simple.html?referrerFull';
 | 
| +          return frame.contentWindow.fetch(http_url,
 | 
| +                                           {referrerPolicy: "", referrer: referrer});
 | 
| +        })
 | 
| +      .then(function(response) { return response.text(); })
 | 
| +      .then(function(response_text) {
 | 
| +          assert_equals(
 | 
| +            response_text,
 | 
| +            'Referrer: about:client\n' +
 | 
| +            'ReferrerPolicy: no-referrer-when-downgrade',
 | 
| +            'Service Worker should respond to fetch with no referrer with ""');
 | 
| +          return frame.contentWindow.fetch('resources/simple.html?referrerFull',
 | 
| +                                           {referrerPolicy: "origin", referrer: referrer});
 | 
| +        })
 | 
| +      .then(function(response) { return response.text(); })
 | 
| +      .then(function(response_text) {
 | 
| +          assert_equals(
 | 
| +            response_text,
 | 
| +            'Referrer: ' + origin + '/' + '\n' +
 | 
| +            'ReferrerPolicy: origin',
 | 
| +            'Service Worker should respond to fetch with the referrer origin with "origin" and a same origin request');
 | 
| +          var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
 | 
| +                         '/resources/simple.html?referrerFull';
 | 
| +          return frame.contentWindow.fetch(http_url,
 | 
| +                                           {referrerPolicy: "origin", referrer: referrer});
 | 
| +        })
 | 
| +      .then(function(response) { return response.text(); })
 | 
| +      .then(function(response_text) {
 | 
| +          assert_equals(
 | 
| +            response_text,
 | 
| +            'Referrer: ' + origin + '/' + '\n' +
 | 
| +            'ReferrerPolicy: origin',
 | 
| +            'Service Worker should respond to fetch with the referrer origin with "origin" and a cross origin request');
 | 
| +          return frame.contentWindow.fetch('resources/simple.html?referrerFull',
 | 
| +                                           {referrerPolicy: "origin-when-cross-origin", referrer: referrer});
 | 
| +        })
 | 
| +      .then(function(response) { return response.text(); })
 | 
| +      .then(function(response_text) {
 | 
| +          assert_equals(
 | 
| +            response_text,
 | 
| +            'Referrer: ' + href + '\n' +
 | 
| +            'ReferrerPolicy: origin-when-cross-origin',
 | 
| +            'Service Worker should respond to fetch with the referrer URL with "origin-when-cross-origin" and a same origin request');
 | 
| +          var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
 | 
| +                         '/resources/simple.html?referrerFull';
 | 
| +          return frame.contentWindow.fetch(http_url,
 | 
| +                                           {referrerPolicy: "origin-when-cross-origin", referrer: referrer});
 | 
| +        })
 | 
| +      .then(function(response) { return response.text(); })
 | 
| +      .then(function(response_text) {
 | 
| +          assert_equals(
 | 
| +            response_text,
 | 
| +            'Referrer: ' + origin + '/' + '\n' +
 | 
| +            'ReferrerPolicy: origin-when-cross-origin',
 | 
| +            'Service Worker should respond to fetch with the referrer origin with "origin-when-cross-origin" and a cross origin request');
 | 
| +          return frame.contentWindow.fetch('resources/simple.html?referrerFull',
 | 
| +                                           {referrerPolicy: "no-referrer-when-downgrade", referrer: referrer});
 | 
| +        })
 | 
| +      .then(function(response) { return response.text(); })
 | 
| +      .then(function(response_text) {
 | 
| +          assert_equals(
 | 
| +            response_text,
 | 
| +            'Referrer: ' + href + '\n' +
 | 
| +            'ReferrerPolicy: no-referrer-when-downgrade',
 | 
| +            'Service Worker should respond to fetch with no referrer with "no-referrer-when-downgrade" and a same origin request');
 | 
| +          var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
 | 
| +                         '/resources/simple.html?referrerFull';
 | 
| +          return frame.contentWindow.fetch(http_url,
 | 
| +                                           {referrerPolicy: "no-referrer-when-downgrade", referrer: referrer});
 | 
| +        })
 | 
| +      .then(function(response) { return response.text(); })
 | 
| +      .then(function(response_text) {
 | 
| +          assert_equals(
 | 
| +            response_text,
 | 
| +            'Referrer: about:client\n' +
 | 
| +            'ReferrerPolicy: no-referrer-when-downgrade',
 | 
| +            'Service Worker should respond to fetch with no referrer with "no-referrer-when-downgrade" and an HTTP request');
 | 
| +          var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
 | 
| +                         '/resources/simple.html?referrerFull';
 | 
| +          return frame.contentWindow.fetch(http_url, {referrerPolicy: "unsafe-url", referrer: referrer});
 | 
| +        })
 | 
| +      .then(function(response) { return response.text(); })
 | 
| +      .then(function(response_text) {
 | 
| +          assert_equals(
 | 
| +            response_text,
 | 
| +            'Referrer: ' + href + '\n' +
 | 
| +            'ReferrerPolicy: unsafe-url',
 | 
| +            'Service Worker should respond to fetch with no referrer with "unsafe-url"');
 | 
| +          return frame.contentWindow.fetch('resources/simple.html?referrerFull',
 | 
| +                                           {referrerPolicy: "no-referrer", referrer: referrer});
 | 
| +        })
 | 
| +      .then(function(response) { return response.text(); })
 | 
| +      .then(function(response_text) {
 | 
| +          assert_equals(
 | 
| +            response_text,
 | 
| +            'Referrer: about:client\n' +
 | 
| +            'ReferrerPolicy: no-referrer',
 | 
| +            'Service Worker should respond to fetch with no referrer URL with "no-referrer"');
 | 
| +        });
 | 
| +}
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?referrerPolicy';
 | 
| +    var frame;
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() { return with_iframe(scope); })
 | 
| +      .then(function(f) {
 | 
| +          frame = f;
 | 
| +          assert_equals(
 | 
| +            frame.contentDocument.body.textContent,
 | 
| +            'ReferrerPolicy: no-referrer-when-downgrade',
 | 
| +            'Service Worker should respond to fetch with the default referrer policy');
 | 
| +          // First, run the referrer policy tests without passing a referrer in RequestInit.
 | 
| +          return run_referrer_policy_tests(frame, undefined, frame.contentDocument.location.href,
 | 
| +                                           frame.contentDocument.location.origin);
 | 
| +        })
 | 
| +      .then(function() {
 | 
| +          // Now, run the referrer policy tests while passing a referrer in RequestInit.
 | 
| +          var referrer = get_host_info()['HTTPS_ORIGIN'] + base_path() + 'fake-referrer';
 | 
| +          return run_referrer_policy_tests(frame, 'fake-referrer', referrer,
 | 
| +                                           frame.contentDocument.location.origin);
 | 
| +        })
 | 
| +      .then(function() {
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +        })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Service Worker responds to fetch event with the referrer URL');
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?clientId';
 | 
| +    var frame;
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() { return with_iframe(scope); })
 | 
| +      .then(function(f) {
 | 
| +          frame = f;
 | 
| +          assert_equals(
 | 
| +            frame.contentDocument.body.textContent,
 | 
| +            'Client ID Not Found',
 | 
| +            'Service Worker should respond to fetch with a client id');
 | 
| +          return frame.contentWindow.fetch('resources/other.html?clientId');
 | 
| +        })
 | 
| +      .then(function(response) { return response.text(); })
 | 
| +      .then(function(response_text) {
 | 
| +          var new_client_id = response_text.substr(17);
 | 
| +          assert_equals(
 | 
| +            response_text.substr(0, 15),
 | 
| +            'Client ID Found',
 | 
| +            'Service Worker should respond to fetch with an existing client id');
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +        })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Service Worker responds to fetch event with an existing client id');
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?ignore';
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() { return with_iframe(scope); })
 | 
| +      .then(function(frame) {
 | 
| +          assert_equals(frame.contentDocument.body.textContent,
 | 
| +                        'Here\'s a simple html file.\n',
 | 
| +                        'Response should come from fallback to native fetch');
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +        })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Service Worker does not respond to fetch event');
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?null';
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() { return with_iframe(scope); })
 | 
| +      .then(function(frame) {
 | 
| +          assert_equals(frame.contentDocument.body.textContent,
 | 
| +                        '',
 | 
| +                        'Response should be the empty string');
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +        })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Service Worker responds to fetch event with null response body');
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?fetch';
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() { return with_iframe(scope); })
 | 
| +      .then(function(frame) {
 | 
| +          assert_equals(frame.contentDocument.body.textContent,
 | 
| +                        'Here\'s an other html file.\n',
 | 
| +                        'Response should come from fetched other file');
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +        })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Service Worker fetches other file in fetch event');
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?form-post';
 | 
| +    var frame_name = 'xhr-post-frame';
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function(sw) {
 | 
| +         return new Promise(function(resolve) {
 | 
| +            var frame = document.createElement('iframe');
 | 
| +            frame.name = frame_name;
 | 
| +            document.body.appendChild(frame);
 | 
| +            var form = document.createElement('form');
 | 
| +            form.target = frame_name;
 | 
| +            form.action = scope;
 | 
| +            form.method = 'post';
 | 
| +            var input1 = document.createElement('input');
 | 
| +            input1.type = 'text';
 | 
| +            input1.value = 'testValue1';
 | 
| +            input1.name = 'testName1'
 | 
| +            form.appendChild(input1);
 | 
| +            var input2 = document.createElement('input');
 | 
| +            input2.type = 'text';
 | 
| +            input2.value = 'testValue2';
 | 
| +            input2.name = 'testName2'
 | 
| +            form.appendChild(input2);
 | 
| +            document.body.appendChild(form);
 | 
| +            frame.onload = function() {
 | 
| +              document.body.removeChild(form);
 | 
| +              resolve(frame);
 | 
| +            };
 | 
| +            form.submit();
 | 
| +          });
 | 
| +        })
 | 
| +      .then(function(frame) {
 | 
| +          assert_equals(frame.contentDocument.body.textContent,
 | 
| +                        'POST:application/x-www-form-urlencoded:' +
 | 
| +                        'testName1=testValue1&testName2=testValue2');
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +        })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Service Worker responds to fetch event with POST form');
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?multiple-respond-with';
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() { return with_iframe(scope); })
 | 
| +      .then(function(frame) {
 | 
| +          assert_equals(
 | 
| +            frame.contentDocument.body.textContent,
 | 
| +            '(0)(1)[InvalidStateError](2)[InvalidStateError]',
 | 
| +            'Multiple calls of respondWith must throw InvalidStateErrors.');
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +        })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Multiple calls of respondWith must throw InvalidStateErrors');
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?used-check';
 | 
| +    var first_frame;
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() { return with_iframe(scope); })
 | 
| +      .then(function(frame) {
 | 
| +          assert_equals(frame.contentDocument.body.textContent,
 | 
| +                        'Here\'s an other html file.\n',
 | 
| +                        'Response should come from fetched other file');
 | 
| +          first_frame = frame;
 | 
| +          return with_iframe(scope);
 | 
| +        })
 | 
| +      .then(function(frame) {
 | 
| +          // When we access to the scope in the second time, the content of the
 | 
| +          // response is generated inside the ServiceWorker. The body contains
 | 
| +          // the value of bodyUsed of the first response which is already
 | 
| +          // consumed by FetchEvent.respondWith method.
 | 
| +          assert_equals(
 | 
| +            frame.contentDocument.body.textContent,
 | 
| +            'bodyUsed: true',
 | 
| +            'event.respondWith must set the used flag.');
 | 
| +          first_frame.remove();
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +        })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Service Worker event.respondWith must set the used flag');
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?fragment-check';
 | 
| +    var fragment = '#/some/fragment';
 | 
| +    var first_frame;
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() { return with_iframe(scope + fragment); })
 | 
| +      .then(function(frame) {
 | 
| +          assert_equals(
 | 
| +            frame.contentDocument.body.textContent,
 | 
| +            'Fragment Not Found',
 | 
| +            'Service worker should not expose URL fragments.');
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +        })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Service Worker must not expose FetchEvent URL fragments.');
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?cache';
 | 
| +    var frame;
 | 
| +    var cacheTypes = [
 | 
| +      undefined, 'default', 'no-store', 'reload', 'no-cache', 'force-cache', 'only-if-cached'
 | 
| +    ];
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() { return with_iframe(scope); })
 | 
| +      .then(function(f) {
 | 
| +          frame = f;
 | 
| +          assert_equals(frame.contentWindow.document.body.textContent, 'default');
 | 
| +          var tests = cacheTypes.map(function(type) {
 | 
| +            return new Promise(function(resolve, reject) {
 | 
| +                var init = {cache: type};
 | 
| +                if (type === 'only-if-cached') {
 | 
| +                  // For privacy reasons, for the time being, only-if-cached
 | 
| +                  // requires the mode to be same-origin.
 | 
| +                  init.mode = 'same-origin';
 | 
| +                }
 | 
| +                return frame.contentWindow.fetch(scope + '=' + type, init)
 | 
| +                  .then(function(response) { return response.text(); })
 | 
| +                  .then(function(response_text) {
 | 
| +                      var expected = (type === undefined) ? 'default' : type;
 | 
| +                      assert_equals(response_text, expected,
 | 
| +                                    'Service Worker should respond to fetch with the correct type');
 | 
| +                    })
 | 
| +                  .then(resolve)
 | 
| +                  .catch(reject);
 | 
| +              });
 | 
| +          });
 | 
| +        })
 | 
| +      .then(function() {
 | 
| +          return new Promise(function(resolve, reject) {
 | 
| +            frame.addEventListener('load', function onLoad() {
 | 
| +              frame.removeEventListener('load', onLoad);
 | 
| +              try {
 | 
| +                assert_equals(frame.contentWindow.document.body.textContent,
 | 
| +                              'no-cache');
 | 
| +                resolve();
 | 
| +              } catch (e) {
 | 
| +                reject(e);
 | 
| +              }
 | 
| +            });
 | 
| +            frame.contentWindow.location.reload();
 | 
| +          });
 | 
| +        })
 | 
| +      .then(function() {
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +        })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Service Worker responds to fetch event with the correct cache types');
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?eventsource';
 | 
| +    var frame;
 | 
| +
 | 
| +    function test_eventsource(opts) {
 | 
| +      return new Promise(function(resolve, reject) {
 | 
| +        var eventSource = new frame.contentWindow.EventSource(scope, opts);
 | 
| +        eventSource.addEventListener('message', function(msg) {
 | 
| +          eventSource.close();
 | 
| +          try {
 | 
| +            var data = JSON.parse(msg.data);
 | 
| +            assert_equals(data.mode, 'cors',
 | 
| +                          'EventSource should make CORS requests.');
 | 
| +            assert_equals(data.cache, 'no-store',
 | 
| +                          'EventSource should bypass the http cache.');
 | 
| +            var expectedCredentials = opts.withCredentials ? 'include'
 | 
| +                                                           : 'same-origin';
 | 
| +            assert_equals(data.credentials, expectedCredentials,
 | 
| +                          'EventSource should pass correct credentials mode.');
 | 
| +            resolve();
 | 
| +          } catch (e) {
 | 
| +            reject(e);
 | 
| +          }
 | 
| +        });
 | 
| +        eventSource.addEventListener('error', function(e) {
 | 
| +          eventSource.close();
 | 
| +          reject('The EventSource fired an error event.');
 | 
| +        });
 | 
| +      });
 | 
| +    }
 | 
| +
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() { return with_iframe(scope); })
 | 
| +      .then(function(f) {
 | 
| +          frame = f;
 | 
| +          return test_eventsource({ withCredentials: false });
 | 
| +        })
 | 
| +      .then(function() {
 | 
| +          return test_eventsource({ withCredentials: true });
 | 
| +        })
 | 
| +      .then(function() {
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +        })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Service Worker should intercept EventSource');
 | 
| +
 | 
| +async_test(function(t) {
 | 
| +    var scope = 'resources/simple.html?integrity';
 | 
| +    var frame;
 | 
| +    var integrity_metadata = 'gs0nqru8KbsrIt5YToQqS9fYao4GQJXtcId610g7cCU=';
 | 
| +
 | 
| +    service_worker_unregister_and_register(t, worker, scope)
 | 
| +      .then(function(reg) {
 | 
| +          return wait_for_state(t, reg.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() { return with_iframe(scope); })
 | 
| +      .then(function(f) {
 | 
| +          frame = f;
 | 
| +          // A request has associated integrity metadata (a string).
 | 
| +          // Unless stated otherwise, it is the empty string.
 | 
| +          assert_equals(
 | 
| +            frame.contentDocument.body.textContent, '');
 | 
| +
 | 
| +          return new Promise(function(resolve, reject) {
 | 
| +              return frame.contentWindow.fetch(scope,
 | 
| +                {'integrity': integrity_metadata})
 | 
| +                .then(function(response) {
 | 
| +                    return response.text();
 | 
| +                })
 | 
| +                .then(function(response_text) {
 | 
| +                    // Should get the same integrity metadata.
 | 
| +                    assert_equals(response_text, integrity_metadata,
 | 
| +                                  'Service Worker should respond to fetch with the correct integrity');
 | 
| +                })
 | 
| +                .then(resolve())
 | 
| +                .catch(reject());
 | 
| +          });
 | 
| +        })
 | 
| +      .then(function() {
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister_and_done(t, scope);
 | 
| +      })
 | 
| +      .catch(unreached_rejection(t));
 | 
| +  }, 'Service Worker responds to fetch event with the correct integrity_metadata');
 | 
| +
 | 
| +</script>
 | 
| +</body>
 | 
| 
 |