<!doctype html>
<title>ServiceWorker: worker objects have synced state</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="resources/test-helpers.js"></script>
<script>
// Tests that ServiceWorker objects representing the same Service Worker
// entity have the same state. JS-level equality is now required according to
// the spec.
promise_test(function(t) {
    var scope = 'resources/synced-state';
    var script = 'resources/empty-worker.js';
    var registration;
    return service_worker_unregister_and_register(t, script, scope)
      .then(function(r) {
          var step = 0;
          registration = r;
          add_completion_callback(function() { r.unregister(); });
          return new Promise(function(resolve) {
              r.installing.addEventListener('statechange', function(e) {
                  step++;
                  if (step == 1) {
                    assert_equals(e.currentTarget.state, 'installed',
                                  'original SW should be installed');
                    assert_equals(r.installing, null,
                                  'in installed, .installing should be null');
                    assert_equals(r.waiting.state, 'installed',
                                  'in installed, the state of .waiting ' +
                                  'should be installed');
                    assert_equals(r.active, null,
                                  'in installed, .active should be null');
                    assert_equals(r.waiting, e.currentTarget,
                                  '.waiting should be equal to the original ' +
                                  'SW in installed');
                  } else if (step == 2) {
                    assert_equals(e.currentTarget.state, 'activating',
                                  'original SW should be activating');
                    assert_equals(r.installing, null,
                                  'in activating, .installing should be null');
                    assert_equals(r.waiting, null,
                                  'in activating, .waiting should be null');
                    assert_equals(r.active.state, 'activating',
                                  'in activating, the state of .active ' +
                                  'should be activating');
                    assert_equals(r.active, e.currentTarget,
                                  '.active should be equal to the original ' +
                                  'SW in activating');
                  } else if (step == 3) {
                    assert_equals(e.currentTarget.state, 'activated',
                                  'original SW should be activated');
                    assert_equals(r.installing, null,
                                  'in activated, .installing should be null');
                    assert_equals(r.waiting, null,
                                  'in activated, .waiting should be null');
                    assert_equals(r.active.state, 'activated',
                                  'in activated, the state of .active should ' +
                                  'be activated');
                    assert_equals(r.active, e.currentTarget,
                                  '.active should be equal to the original ' +
                                  'SW in activated');
                    resolve();
                  }
                });
            });
        })
      .then(function() {
          return navigator.serviceWorker.getRegistration(scope);
        })
      .then(function(r) {
          assert_equals(r, registration, 'getRegistration should return the ' +
                                         'same object with the registered one');
        });
  }, 'worker objects for the same entity have the same state');
</script>
