<!DOCTYPE html>
<title>Sub Apps: Error cases for add()</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/subapps-helpers.js"></script>

<body></body>

<script>

promise_test(async t => {
  const iframe = document.createElement('iframe');
  document.body.appendChild(iframe);

  const iframeNavigator = iframe.contentWindow.navigator;
  const iframeDOMException = iframe.contentWindow.DOMException;

  // Detach the frame.
  iframe.remove();

  // At this point the iframe is detached and unloaded, and its execution
  // context is gone.
  await promise_rejects_dom(t, 'NotFoundError', iframeDOMException, iframeNavigator.subApps.add('app'));
}, "The object is no longer associated to a document.");

promise_test(async t => {
  const iframe = document.createElement('iframe');
  document.body.appendChild(iframe);

  const iframeNavigator = iframe.contentWindow.navigator;
  const iframeDOMException = iframe.contentWindow.DOMException;
  t.add_cleanup(() => iframe.remove());

  await promise_rejects_dom(t, 'InvalidStateError', iframeDOMException, iframeNavigator.subApps.add('app'));
}, "API is only supported in top-level browsing contexts.");

promise_test(t => {
  return promise_rejects_dom(t, 'URLMismatchError', navigator.subApps.add(
                             'https://some.other.origin/'));
}, 'Wrong origin URL argument.');

promise_test(async t => {
  t.add_cleanup(async () => {
      await mockSubAppsService.reset();
      mockSubAppsService = null;
  });
  await createMockSubAppsService(Status.FAILURE);
  return promise_rejects_dom(t, 'OperationError', navigator.subApps.add(
                             '/sub-app'));
}, 'Service failed to add sub-app.');

</script>
