<!doctype html>
<meta charset=utf-8>
<title></title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<body>
<script>

promise_test(function(t) {
  var frame;
  var resource = 'simple.txt';

  var worker;
  var scope = 'resources/';
  var script = 'resources/claim-worker.js';

  return Promise.resolve()
    // Create the test iframe.
    .then(() => with_iframe('resources/blank.html'))
    .then(f => frame = f)

    // Check the controller and test with fetch.
    .then(() => assert_equals(frame.contentWindow.navigator.controller,
                              undefined,
                              'Should have no controller.'))
    .then(() => frame.contentWindow.fetch(resource))
    .then(response => response.text())
    .then(response_text => assert_equals(response_text,
                                         'a simple text file\n',
                                         'fetch() should not be intercepted.'))

    // Register a service worker.
    .then(() => service_worker_unregister_and_register(t, script, scope))
    .then(r => worker = r.installing)
    .then(() => wait_for_state(t, worker, 'activated'))

    // Let the service worker claim the iframe.
    .then(() => {
      var channel = new MessageChannel();
      var saw_message = new Promise(function(resolve) {
        channel.port1.onmessage = t.step_func(function(e) {
          assert_equals(e.data, 'PASS',
                        'Worker call to claim() should fulfill.');
          resolve();
        });
      });
      worker.postMessage({port: channel.port2}, [channel.port2]);
      return saw_message;
    })

    // Check the controller and test with fetch.
    .then(() => frame.contentWindow.navigator.serviceWorker.getRegistration(scope))
    .then(r => assert_equals(frame.contentWindow.navigator.serviceWorker.controller,
                             r.active,
                             'Test iframe should be claimed.'))
    .then(() => frame.contentWindow.fetch(resource))
    .then(response => response.text())
    .then(response_text => assert_equals(response_text,
                                         'Intercepted!',
                                         'fetch() should be intercepted.'))

    // Cleanup this testcase.
    .then(() => frame.remove())
    .then(() => service_worker_unregister_and_done(t, scope));
}, 'fetch() should be intercepted after the client is claimed.')

</script>
</body>
