<!DOCTYPE html>
<title>Service Worker: Skip waiting</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="resources/test-helpers.js"></script>
<script>

promise_test(function(t) {
    var scope = 'resources/blank.html';
    var url1 = 'resources/empty.js';
    var url2 = 'resources/empty-worker.js';
    var url3 = 'resources/skip-waiting-worker.js';
    var frame, sw_registration, activated_worker, waiting_worker;
    return service_worker_unregister_and_register(t, url1, scope)
      .then(function(registration) {
          sw_registration = 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) {
          return wait_for_state(t, registration.installing, 'installed');
        })
      .then(function() {
          activated_worker = sw_registration.active;
          waiting_worker = sw_registration.waiting;
          assert_equals(activated_worker.scriptURL, normalizeURL(url1),
                        'Worker with url1 should be activated');
          assert_equals(waiting_worker.scriptURL, normalizeURL(url2),
                        'Worker with url2 should be waiting');
          return navigator.serviceWorker.register(url3, {scope: scope});
        })
      .then(function(registration) {
          return wait_for_state(t, registration.installing, 'activated');
        })
      .then(function() {
          assert_equals(activated_worker.state, 'redundant',
                        'Worker with url1 should be redundant');
          assert_equals(waiting_worker.state, 'redundant',
                        'Worker with url2 should be redundant');
          assert_equals(sw_registration.active.scriptURL, normalizeURL(url3),
                        'Worker with url3 should be activated');
          frame.remove();
          return service_worker_unregister_and_done(t, scope);
        });
  }, 'Test skipWaiting with both active and waiting workers');

</script>
