<!DOCTYPE html>
<title>Service Worker: claim client using registration</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>

promise_test(function(t) {
    var scope = 'resources/';
    var frame_url = 'resources/blank.html?using-different-registration';
    var url1 = 'resources/empty.js';
    var url2 = 'resources/claim-worker.js';
    var worker, sw_registration, frame;
    return service_worker_unregister_and_register(t, url1, scope)
      .then(function(registration) {
          return wait_for_state(t, registration.installing, 'activated');
        })
      .then(function() {
          return with_iframe(frame_url);
        })
      .then(function(f) {
          frame = f;
          return navigator.serviceWorker.register(url2, {scope: frame_url});
        })
      .then(function(registration) {
          worker = registration.installing;
          sw_registration = registration;
          return wait_for_state(t, registration.installing, 'activated');
        })
      .then(function() {
          var saw_controllerchanged = new Promise(function(resolve) {
              frame.contentWindow.navigator.serviceWorker.oncontrollerchange =
                  function() { resolve(); }
            });
          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 Promise.all([saw_controllerchanged, saw_message]);
        })
      .then(function() {
          assert_equals(
              frame.contentWindow.navigator.serviceWorker.controller.scriptURL,
              normalizeURL(url2),
              'Frame1 controller scriptURL should be changed to url2');
          frame.remove();
          return sw_registration.unregister();
        })
      .then(function() {
          return service_worker_unregister_and_done(t, scope);
        });
  }, 'Test worker claims client which is using another registration');

promise_test(function(t) {
    var scope = 'resources/blank.html?using-same-registration';
    var url1 = 'resources/empty.js';
    var url2 = 'resources/claim-worker.js';
    var frame, worker;
    return service_worker_unregister_and_register(t, url1, scope)
      .then(function(registration) {
          return wait_for_state(t, registration.installing, 'activated');
        })
      .then(function() {
          return with_iframe(scope);
        })
      .then(function(f) {
          frame = f;
          return navigator.serviceWorker.register(url2, {scope: scope});
        })
      .then(function(registration) {
          worker = registration.installing;
          return wait_for_state(t, registration.installing, 'installed');
        })
      .then(function() {
          var channel = new MessageChannel();
          var saw_message = new Promise(function(resolve) {
              channel.port1.onmessage = t.step_func(function(e) {
                  assert_equals(e.data, 'FAIL: exception: InvalidStateError',
                                'Worker call to claim() should reject with ' +
                                'InvalidStateError');
                  resolve();
                });
            });
          worker.postMessage({port: channel.port2}, [channel.port2]);
          return saw_message;
        })
      .then(function() {
          frame.remove();
          return service_worker_unregister_and_done(t, scope);
        });
  }, 'Test for the waiting worker claims a client which is using the the ' +
     'same registration');

</script>
