<!DOCTYPE html>
<title>window.fence.getNestedConfigs() test</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/utils.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/get-host-info.sub.js"></script>

<body>
<script>
promise_test(async (t) => {
  const key = token();
  const urn = await generateURNFromFledge(
      "resources/get-nested-configs-inner.html", [key]);
  attachFencedFrame(urn);

  const response = await nextValueFromServer(key);
  const [length] = response.split(",");

  assert_equals(length, '40', 'There should be 40 nested configurations.');
}, 'getNestedConfigs() created by FLEDGE should return configurations');

for (const resolve_to_config of [true, false]) {
  promise_test(async (t) => {
    const key = token();
    const select_url_result = await runSelectURL(
        generateURL("resources/get-nested-configs-inner.html", [key]),
        [], resolve_to_config);
    attachFencedFrame(select_url_result);

    const response = await nextValueFromServer(key);
    const [length, first_url] = response.split(",");

    assert_equals(length, '0', 'There should be 0 nested configurations.');
  }, 'getNestedConfigs() from a fenced frame with the ' +
     (resolve_to_config ? 'config' : 'urn:uuid') +
     ' from sharedStroage.selectURL() should be empty');
}

promise_test(async (t) => {
  const key = token();
  const url = generateURL("resources/get-nested-configs-inner.html", [key]);
  attachFencedFrame(url, mode='default');

  const response = await nextValueFromServer(key);
  const [length, first_url] = response.split(",");

  assert_equals(length, '0', 'There should be 0 nested configurations.');
}, 'getNestedConfigs() from a default mode frame should be empty');

promise_test(async (t) => {
  const key = token();
  const urn = await generateURNFromFledge(
      "resources/get-nested-configs-nested-iframe.html", [key]);
  attachFencedFrame(urn);

  const response = await nextValueFromServer(key);
  const [length, first_url] = response.split(",");

  assert_equals(length, '40', 'There should be 40 nested configurations.');
}, 'getNestedConfigs() should work in a same-origin nested iframe');

promise_test(async (t) => {
  const key = token();

  const nested_url = generateURL("resources/embeddee.html", [key]);

  // Navigate a fenced frame to `navigate-nested-config.html`. That page will
  // in turn create a nested fenced frame which will be navigated to the URN of
  // the first item in the nested configs list, `nested_url`.
  const urn = await generateURNFromFledge(
      "resources/navigate-nested-config.html", [key],
      [nested_url]);
  attachFencedFrame(urn);

  const response = await nextValueFromServer(key);
  assert_equals(response, 'PASS', 'The nested URL should load.');
}, 'Nested configs created by FLEDGE should be navigable by fenced frame');

promise_test(async (t) => {
  const key = token();

  const nested_url = generateURL("resources/embeddee.html", [key]);

  // Navigate a fenced frame to `navigate-nested-config.html`. That page will
  // in turn create a nested fenced frame which will be navigated to the URN of
  // the first item in the nested configs list, `nested_url`.
  const urn = await generateURNFromFledge(
      "resources/navigate-nested-config.html", [key],
      [nested_url]);
  attachIFrame(urn);

  const response = await nextValueFromServer(key);
  assert_equals(response, 'PASS', 'The nested URL should load.');
}, 'Nested configs created by FLEDGE should be navigable by URN iframe');

promise_test(async (t) => {
  const key = token();

  const nested_url = generateURL("resources/embeddee.html", [key]);

  // Navigate a fenced frame to `navigate-nested-config.html`. That page will
  // in turn create a nested fenced frame which will be navigated to the URN of
  // the first item in the nested configs list, `nested_url`. Since this URN
  // is invalid, the navigation should gracefully fail.
  const urn = await generateURNFromFledge(
      "resources/navigate-nested-config.html", [key],
      []);
  attachFencedFrame(urn);

  // There is no API to observe whether the document in the FencedFrame loaded
  // or not. Instead, set up a timeout. If the document loads, "PASS" will be
  // sent to the server. Otherwise "BLOCKED" will be sent after 1 second.
  step_timeout(() => {
    writeValueToServer(key, "BLOCKED");
  }, 1000);

  const response = await nextValueFromServer(key);
  assert_equals(response, 'BLOCKED', 'The nested URL should not load.');
}, 'Navigating an invalid config should be handled gracefully');

</script>
</body>
</html>
