<!DOCTYPE html>
<title>Service Worker: Skip waiting using registration</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
'use strict';

promise_test(function(t) {
    var scope = 'resources/blank.html?skip-waiting-using-registration';
    var url1 = 'resources/empty.js';
    var url2 = 'resources/skip-waiting-worker.js';
    var frame, frame_sw, sw_registration, oncontrollerchanged;
    var saw_controllerchanged = new Promise(function(resolve) {
        oncontrollerchanged = function(e) {
            resolve(e);
          };
        })
      .then(function(e) {
          assert_equals(e.type, 'controllerchange',
                        'Event name should be "controllerchange"');
          assert_true(
              e.target instanceof frame.contentWindow.ServiceWorkerContainer,
              'Event target should be a ServiceWorkerContainer');
          assert_equals(e.target.controller.state, 'activating',
                        'Controller state should be activating');
          assert_equals(
              frame_sw.controller.scriptURL, normalizeURL(url2),
              'Controller scriptURL should change to the second one');
        });

    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) {
          t.add_cleanup(function() {
              f.remove();
            });
          frame = f;
          frame_sw = f.contentWindow.navigator.serviceWorker;
          assert_equals(
              frame_sw.controller.scriptURL, normalizeURL(url1),
              'Document controller scriptURL should equal to the first one');
          frame_sw.oncontrollerchange = t.step_func(oncontrollerchanged);
          return navigator.serviceWorker.register(url2, {scope: scope});
        })
      .then(function(registration) {
          sw_registration = registration;
          t.add_cleanup(function() {
              registration.unregister();
            });
          return saw_controllerchanged;
        })
      .then(function() {
          assert_not_equals(sw_registration.active, null,
                            'Registration active worker should not be null');
          fetch_tests_from_worker(sw_registration.active);
        });
  }, 'Test skipWaiting while a client is using the registration');

</script>
