<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>

promise_test(t => {
  return new Promise(resolve => {
    window.addEventListener("DOMContentLoaded", resolve);
  });
}, "Wait for the DOM to be built.");

promise_test(async t => {
  let iframe = document.createElement("iframe");
  let iframe_loaded =  new Promise(resolve => iframe.onload = resolve);
  iframe.srcdoc = "loaded document";
  document.body.appendChild(iframe);

  // The about:srcdoc document can load.
  await iframe_loaded;
  assert_not_equals(iframe.contentDocument, null);
  assert_equals(iframe.contentDocument.body.innerText, "loaded document");

  t.done();
}, "about:srcdoc can always be embedded by a 'require-corp' document");

promise_test(async t => {
  let iframe_C = document.createElement("iframe");
  let iframe_B = document.createElement("iframe");
  iframe_B.srcdoc = "dummy content";
  iframe_C.src = "/common/blank.html";
  let iframe_B_loaded = new Promise(resolve => iframe_B.onload = resolve);
  let iframe_C_loaded = new Promise(resolve => iframe_C.onload = resolve);
  document.body.appendChild(iframe_B);

  // The about:srcdoc frame must be able to load.
  await iframe_B_loaded;
  assert_not_equals(iframe_B.contentDocument, null);
  assert_equals(iframe_B.contentDocument.body.innerText, "dummy content");
  iframe_B.contentDocument.body.appendChild(iframe_C);

  // The document nested under about:srcdoc must not load because it does not
  // specify the Cross-Origin-Embedder-Policy: require-corp header.
  // An error page must be displayed instead.
  await iframe_C_loaded;
  assert_equals(iframe_C.contentDocument, null);

  t.done();
}, "A(B(C)) A=require-corp, B=about:srcdoc, C=no-require-corp => C can't load");

</script>
