<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.src = "about:blank";
  document.body.appendChild(iframe);

  // The about:blank document can load.
  await iframe_loaded;
  assert_not_equals(iframe.contentDocument, null);

  t.done();
}, "about:blank 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.src = "about:blank";
  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:blank frame must be able to load.
  await iframe_B_loaded;
  assert_not_equals(iframe_B.contentDocument, null);
  iframe_B.contentDocument.body.appendChild(iframe_C);

  // The document nested under about:blank 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:blank, C=no-require-corp => C can't load");

</script>
