<!doctype html>
<meta charset=utf-8>
<title></title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="resources/testharness-helpers.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script>

/*
 * @param bolean cors
 *   Determine wether the imported script should be a cross origin script.
 * @param string main
 *   Decide the content of the main script, where 'default' is for constant
 *   content while 'time' is for time-variant content.
 * @param string imported
 *   Decide the content of the imported script, where 'default' is for constant
 *   content while 'time' is for time-variant content.
 */
const settings = [{cors: false, main: 'default', imported: 'default'},
                  {cors: false, main: 'default', imported: 'time'   },
                  {cors: false, main: 'time',    imported: 'default'},
                  {cors: false, main: 'time',    imported: 'time'   },
                  {cors: true,  main: 'default', imported: 'default'},
                  {cors: true,  main: 'default', imported: 'time'   },
                  {cors: true,  main: 'time',    imported: 'default'},
                  {cors: true,  main: 'time',    imported: 'time'   }];

const host_info = get_host_info();
settings.reduce((p, s) => {
  return p.then(promise_test(function(t) {
    var path = !s.cors ? ''
                       : host_info.HTTPS_REMOTE_ORIGIN +
                         '/service-workers/service-worker/resources/';
    var script = 'resources/bytecheck-worker.py' +
                 '?main=' + s.main +
                 '&imported=' + s.imported +
                 '&path=' + path;
    var scope = 'resources/blank.html';

    var swr, sw;
    return Promise.resolve()
      // Register a service worker.
      .then(_ => service_worker_unregister_and_register(t, script, scope))
      .then(r => {
        t.add_cleanup(() => service_worker_unregister(t, scope));
        swr = r;
        return wait_for_update(t, swr);
      })
      .then(w => sw = w)
      .then(_ => wait_for_state(t, sw, 'activated'))
      .then(_ => assert_array_equals([swr.active,
                                      swr.waiting,
                                      swr.installing],
                                     [sw, null, null]))

      // Update the service worker registration.
      .then(_ => swr.update())
      .then(_ => {
         // If there should be a new service worker.
         if (s.main === 'time' || s.imported === 'time') {
           return wait_for_update(t, swr);
         }
         // Otherwise, make sure there is no newly created service worker.
         assert_array_equals([swr.active,
                              swr.waiting,
                              swr.installing],
                             [sw, null, null]);
      });
  }, `Test(cors: ${s.cors}, main: ${s.main}, imported: ${s.imported})`));
}, Promise.resolve());

</script>
