<!DOCTYPE html>
<meta charset="utf-8">
<title>service worker: activation</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<body>
<script>
// Returns {registration, iframe}, where |registration| has an active and
// waiting worker. The active worker controls |iframe| and has an inflight
// message event that can be finished by calling
// |registration.active.postMessage('go')|.
function setup_activation_test(t, scope, worker_url) {
  var registration;
  var iframe;
  return navigator.serviceWorker.getRegistration(scope)
    .then(r => {
        if (r)
          return r.unregister();
      })
    .then(() => {
        // Create an in-scope iframe. Do this prior to registration to avoid
        // racing between an update triggered by navigation and the update()
        // call below.
        return with_iframe(scope);
      })
    .then(f => {
        iframe = f;
        // Create an active worker.
        return navigator.serviceWorker.register(worker_url, { scope: scope });
      })
    .then(r => {
        registration = r;
        add_result_callback(() => registration.unregister());
        return wait_for_state(t, r.installing, 'activated');
      })
    .then(() => {
        // Check that the frame was claimed.
        assert_not_equals(
            iframe.contentWindow.navigator.serviceWorker.controller, null);
        // Create an in-flight request.
        registration.active.postMessage('wait');
        // Now there is both a controllee and an in-flight request.
        // Initiate an update.
        return registration.update();
      })
    .then(() => {
        // Wait for a waiting worker.
        return wait_for_state(t, registration.installing, 'installed');
      })
    .then(() => {
        return wait_for_activation_on_dummy_scope(t, self);
      })
    .then(() => {
        assert_not_equals(registration.waiting, null);
        assert_not_equals(registration.active, null);
        return Promise.resolve({registration: registration, iframe: iframe});
      });
}
promise_test(t => {
    var scope = 'resources/no-controllee';
    var worker_url = 'resources/mint-new-worker.py';
    var registration;
    var iframe;
    var new_worker;
    return setup_activation_test(t, scope, worker_url)
      .then(result => {
          registration = result.registration;
          iframe = result.iframe;
          // Finish the in-flight request.
          registration.active.postMessage('go');
          return wait_for_activation_on_dummy_scope(t, self);
        })
      .then(() => {
          // The new worker is still waiting. Remove the frame and it should
          // activate.
          new_worker = registration.waiting;
          assert_equals(new_worker.state, 'installed');
          var reached_active = wait_for_state(t, new_worker, 'activating');
          iframe.remove();
          return reached_active;
        })
      .then(() => {
          assert_equals(new_worker, registration.active);
        });
  }, 'loss of controllees triggers activation');
promise_test(t => {
    var scope = 'resources/no-request';
    var worker_url = 'resources/mint-new-worker.py';
    var registration;
    var iframe;
    var new_worker;
    return setup_activation_test(t, scope, worker_url)
      .then(result => {
          registration = result.registration;
          iframe = result.iframe;
          // Remove the iframe.
          iframe.remove();
          return new Promise(resolve => setTimeout(resolve, 0));
        })
      .then(() => {
          // Finish the request.
          new_worker = registration.waiting;
          var reached_active = wait_for_state(t, new_worker, 'activating');
          registration.active.postMessage('go');
          return reached_active;
        })
      .then(() => {
          assert_equals(registration.active, new_worker);
        });
  }, 'finishing a request triggers activation');
promise_test(t => {
    var scope = 'resources/skip-waiting';
    var worker_url = 'resources/mint-new-worker.py?skip-waiting';
    var registration;
    var iframe;
    var new_worker;
    return setup_activation_test(t, scope, worker_url)
      .then(result => {
          registration = result.registration;
          iframe = result.iframe;
          // Finish the request. The iframe does not need to be removed because
          // skipWaiting() was called.
          new_worker = registration.waiting;
          var reached_active = wait_for_state(t, new_worker, 'activating');
          registration.active.postMessage('go');
          return reached_active;
        })
      .then(() => {
          assert_equals(registration.active, new_worker);
          // Remove the iframe.
          iframe.remove();
        });
  }, 'skipWaiting bypasses no controllee requirement');

// This test is not really about activation, but otherwise is very
// similar to the other tests here.
promise_test(t => {
    var scope = 'resources/unregister';
    var worker_url = 'resources/mint-new-worker.py';
    var registration;
    var iframe;
    var new_worker;
    return setup_activation_test(t, scope, worker_url)
      .then(result => {
          registration = result.registration;
          iframe = result.iframe;
          // Remove the iframe.
          iframe.remove();
          return registration.unregister();
        })
      .then(() => {
          // The unregister operation should wait for the active worker to
          // finish processing its events before clearing the registration.
          new_worker = registration.waiting;
          var reached_redundant = wait_for_state(t, new_worker, 'redundant');
          registration.active.postMessage('go');
          return reached_redundant;
        })
      .then(() => {
          assert_equals(registration.installing, null);
          assert_equals(registration.waiting, null);
          assert_equals(registration.active, null);
        });
  }, 'finishing a request triggers unregister');
</script>
</body>
