<!DOCTYPE html>
<title>Service Worker: Registration using Link header</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<body>
<script>
function get_newest_worker(registration) {
  if (registration.installing)
    return registration.installing;
  if (registration.waiting)
    return registration.waiting;
  if (registration.active)
    return registration.active;
}

promise_test(function(t) {
    var scope = normalizeURL('resources/blank.html?fetch');
    var header = '<empty-worker.js>; rel=serviceworker; scope="' + scope + '"';
    var resource = 'resources/link-header.py?Link=' +
        encodeURIComponent(header);
    return with_iframe(scope)
      .then(frame =>
          Promise.all([frame.contentWindow.navigator.serviceWorker.ready,
                      fetch(resource)]))
      .then(([registration, response]) => {
          assert_equals(registration.scope, scope);
          assert_equals(get_newest_worker(registration).scriptURL,
                        normalizeURL('resources/empty-worker.js'));
          return registration.unregister();
        });
  }, 'fetch can trigger service worker installation');

promise_test(function(t) {
    var scope = normalizeURL('resources/blank.html?iframe');
    var header = '<empty-worker.js>; rel=serviceworker; scope="' + scope + '"';
    var resource = 'resources/link-header.py?Link=' +
        encodeURIComponent(header);
    return with_iframe(scope)
      .then(frame =>
          Promise.all([frame.contentWindow.navigator.serviceWorker.ready,
                       with_iframe(resource)]))
      .then(([registration, frame]) => {
          assert_equals(registration.scope, scope);
          assert_equals(get_newest_worker(registration).scriptURL,
                        normalizeURL('resources/empty-worker.js'));
          return registration.unregister();
        });
  }, 'An iframe can trigger service worker installation');

promise_test(function(t) {
    var scope = normalizeURL('resources/blank.html?css');
    var header = '<empty-worker.js>; rel=serviceworker; scope="' + scope + '"';
    var resource = 'resources/link-header.py?Link=' +
        encodeURIComponent(header);
    return with_iframe(scope)
      .then(frame => {
          var link = document.createElement('link');
          link.setAttribute('rel', 'stylesheet');
          link.setAttribute('type', 'text/css');
          link.setAttribute('href', resource);
          document.getElementsByTagName('head')[0].appendChild(link);
          return frame.contentWindow.navigator.serviceWorker.ready;
        })
      .then(registration => {
          assert_equals(registration.scope, scope);
          assert_equals(get_newest_worker(registration).scriptURL,
                        normalizeURL('resources/empty-worker.js'));
          return registration.unregister();
        });
  }, 'A stylesheet can trigger service worker installation');

</script>
