<!DOCTYPE html>
<!-- In Bug 1217367, we will try to merge update events for same registration
     if possible. This testcase is used to make sure the optimization algorithm
     doesn't go wrong. -->
<title>Service Worker: Trigger multiple updates</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 script = 'resources/update-nocookie-worker.py';
    var scope = 'resources/scope/update';
    var expected_url = normalizeURL(script);
    var registration;

    return service_worker_unregister_and_register(t, expected_url, scope)
      .then(function(r) {
          registration = r;
          return wait_for_state(t, registration.installing, 'activated');
        })
      .then(function() {
          // Test single update works before triggering multiple update events
          return Promise.all([registration.update(),
                              wait_for_update(t, registration)]);
        })
      .then(function() {
          assert_equals(registration.installing.scriptURL, expected_url,
                        'new installing should be set after update resolves.');
          assert_equals(registration.waiting, null,
                        'waiting should still be null after update resolves.');
          assert_equals(registration.active.scriptURL, expected_url,
                        'active should still exist after update found.');
          return wait_for_state(t, registration.installing, 'installed');
        })
      .then(function() {
          assert_equals(registration.installing, null,
                        'installing should be null after installing.');
          if (registration.waiting) {
            assert_equals(registration.waiting.scriptURL, expected_url,
                          'waiting should be set after installing.');
            assert_equals(registration.active.scriptURL, expected_url,
                          'active should still exist after installing.');
            return wait_for_state(t, registration.waiting, 'activated');
          }
        })
      .then(function() {
          // Test triggering multiple update events at the same time.
          var promiseList = [];
          const burstUpdateCount = 10;
          for (var i = 0; i < burstUpdateCount; i++) {
            promiseList.push(registration.update());
          }
          promiseList.push(wait_for_update(t, registration));
          return Promise.all(promiseList);
        })
      .then(function() {
          assert_equals(registration.installing.scriptURL, expected_url,
                        'new installing should be set after update resolves.');
          assert_equals(registration.waiting, null,
                        'waiting should still be null after update resolves.');
          assert_equals(registration.active.scriptURL, expected_url,
                        'active should still exist after update found.');
          return wait_for_state(t, registration.installing, 'installed');
        })
      .then(function() {
          assert_equals(registration.installing, null,
                        'installing should be null after installing.');
          if (registration.waiting) {
            assert_equals(registration.waiting.scriptURL, expected_url,
                          'waiting should be set after installing.');
            assert_equals(registration.active.scriptURL, expected_url,
                          'active should still exist after installing.');
            return wait_for_state(t, registration.waiting, 'activated');
          }
        })
      .then(function() {
          // Test update still works after handling update event burst.
          return Promise.all([registration.update(),
                              wait_for_update(t, registration)]);
        })
      .then(function() {
          assert_equals(registration.installing.scriptURL, expected_url,
                        'new installing should be set after update resolves.');
          assert_equals(registration.waiting, null,
                        'waiting should be null after activated.');
          assert_equals(registration.active.scriptURL, expected_url,
                        'active should still exist after update found.');

          return service_worker_unregister_and_done(t, scope);
        });
  }, 'Trigger multiple updates.');
</script>
