<!DOCTYPE html>
<title>Sub Apps: Error cases for add()</title>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<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({}));
}, "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({}));
}, "API is only supported in top-level browsing contexts.");

promise_test(async t => {
  const url = '/sub-app';

  let subapp = {
    [url]: { "installURL": url }
  };

  await promise_rejects_dom(t, 'NotAllowedError', navigator.subApps.add(subapp));
}, 'Missing user activation.');

promise_test(async t => {
  const base_url = '/sub-app-';

  let add_call_params = {};
  for (let i = 0; i < 8; i++) {
    const url = base_url + i;
    add_call_params[url] = { "installURL": url };
  }

  await test_driver.bless("installing subapps", async function () {
    await promise_rejects_dom(t, 'DataError', navigator.subApps.add(add_call_params));
  });
}, 'Too many subapps at once.');

promise_test(async t => {
  const full_url = document.location.origin + '/sub-app';

  let add_call_params = {
    [full_url]: { installURL: full_url },
  };

  await test_driver.bless("installing subapps", async function () {
    await promise_rejects_dom(t, 'NotSupportedError', navigator.subApps.add(add_call_params));
  });
}, 'API supports only root-relative paths.');

promise_test(async t => {
  const url_1 = '/sub-app-1';
  const url_2 = '/sub-app-2';

  let add_call_params = {
    [url_1]: {installURL: url_1},
    [url_2]: {installURL: url_2},
  };

  let mocked_response = [
    { "manifestIdPath": url_1, "resultCode": Status.FAILURE },
    { "manifestIdPath": url_2, "resultCode": Status.FAILURE }
  ];

  let expected_results = {
    [url_1]: "failure",
    [url_2]: "failure",
  };

  await test_driver.bless("installing a subapp", async function () {
    await subapps_add_expect_reject_with_result(t, add_call_params, mocked_response, expected_results);
  });
}, 'Service failed to add two sub-apps.');

promise_test(async t => {
  const url_1 = '/sub-app-1';
  const url_2 = '/sub-app-2';

  let add_call_params = {
    [url_1]: {installURL: url_1},
    [url_2]: {installURL: url_2},
  };

  let mocked_response = [
    { "manifestIdPath": url_1, "resultCode": Status.SUCCESS },
    { "manifestIdPath": url_2, "resultCode": Status.FAILURE }
  ];

  let expected_results = {
    [url_1]: "success",
    [url_2]: "failure",
  };

  await test_driver.bless("installing a subapp", async function () {
    await subapps_add_expect_reject_with_result(t, add_call_params, mocked_response, expected_results);
  });
}, 'Service added one sub-app failed to add another sub-app.');

</script>