<!DOCTYPE html>
<meta charset="utf-8">
<title>Service Worker: Registration for iframe</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<body>
<script>

// Set script url and scope url relative to the iframe's document's url. Assert
// the implementation parses the urls against the iframe's document's url.
async_test(function(t) {
  const url = 'resources/blank.html';
  const iframe_scope = 'registration-with-valid-scope';
  const scope = normalizeURL('resources/' + iframe_scope);
  const iframe_script = 'empty-worker.js';
  const script = normalizeURL('resources/' + iframe_script);
  var frame;
  var registration;

  service_worker_unregister(t, scope)
    .then(function() { return with_iframe(url); })
    .then(function(f) {
        frame = f;
        return frame.contentWindow.navigator.serviceWorker.register(
            iframe_script,
            { scope: iframe_scope });
      })
    .then(function(r) {
        registration = r;
        return wait_for_state(t, r.installing, 'activated');
      })
    .then(function() {
        assert_equals(registration.scope, scope,
                      'registration\'s scope must be parsed against the ' +
                      '"relevant global object"');
        assert_equals(registration.active.scriptURL, script,
                      'worker\'s scriptURL must be parsed against the ' +
                      '"relevant global object"');
        return registration.unregister();
      })
    .then(function() {
        frame.remove();
        t.done();
      })
    .catch(unreached_rejection(t));
  }, 'register method should use the "relevant global object" to parse its ' +
     'scriptURL and scope - normal case');

// Set script url and scope url relative to the parent frame's document's url.
// Assert the implementation throws a TypeError exception.
async_test(function(t) {
  const url = 'resources/blank.html';
  const iframe_scope = 'resources/registration-with-scope-to-non-existing-url';
  const scope = normalizeURL('resources/' + iframe_scope);
  const script = 'resources/empty-worker.js';
  var frame;
  var registration;

  service_worker_unregister(t, scope)
    .then(function() { return with_iframe(url); })
    .then(function(f) {
        frame = f;
        return frame.contentWindow.navigator.serviceWorker.register(
            script,
            { scope: iframe_scope });
      })
    .then(
      function() {
        assert_unreached('register() should reject');
      },
      function(e) {
        assert_equals(e.name, 'TypeError',
                      'register method with scriptURL and scope parsed to ' +
                      'nonexistent location should reject with TypeError');
        frame.remove();
        t.done();
      })
    .catch(unreached_rejection(t));
  }, 'register method should use the "relevant global object" to parse its ' +
     'scriptURL and scope - error case');

// Set the scope url to a non-subdirectory of the script url. Assert the
// implementation throws a SecurityError exception.
async_test(function(t) {
  const url = 'resources/blank.html';
  const scope = 'registration-with-disallowed-scope';
  const iframe_scope = '../' + scope;
  const script = 'empty-worker.js';
  var frame;
  var registration;

  service_worker_unregister(t, scope)
    .then(function() { return with_iframe(url); })
    .then(function(f) {
        frame = f;
        return frame.contentWindow.navigator.serviceWorker.register(
            script,
            { scope: iframe_scope });
      })
    .then(
      function() {
        assert_unreached('register() should reject');
      },
      function(e) {
        assert_equals(e.name, 'SecurityError',
                      'The scope set to a non-subdirectory of the scriptURL ' +
                      'should reject with SecurityError');
        frame.remove();
        t.done();
      })
    .catch(unreached_rejection(t));
  }, 'A scope url should start with the given script url');

</script>
</body>
