<!DOCTYPE html>
<html>
<body>
<b>This test passes if it does not alert the fail.html's content when clicking the button.</b><br>
<input id="testButton" type="button" value="Click me"></input>
<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.setCanOpenWindows();
    testRunner.waitUntilDone();
}

let counter = 0;
function run() {
  if (++counter == 2) {
    parent_frame = frame.contentDocument.querySelector("iframe");
    frame1 = parent_frame.appendChild(document.createElement("iframe"));
    frame2 = parent_frame.appendChild(document.createElement("iframe"));
    frame1.src = "javascript:top.runChild()";
  }
}

let child_counter = 0;
function runChild() {
  if (++child_counter == 2) {
    parent_frame.appendChild(frame2);

    a = frame2.contentDocument.createElement("a");
    a.href = cache_frame.src;
    a.click();
    
    showModalDialog(URL.createObjectURL(new Blob([`
      <script>
        let intervalID = setInterval(() => {
          try {
            opener.frame.document.foo;
          } catch (e) {
            clearInterval(intervalID);

            window.close();
            if (window.testRunner)
              testRunner.abortModal();
          }
        }, 100);
      </scr` + "ipt>"], {type: "text/html"})));
    frame2.src = "javascript:alert(document.documentElement.outerHTML)";
  }
}

testButton.onclick = _ => {
  frame = document.body.appendChild(document.createElement("iframe"));
  frame.contentWindow.location = `javascript:'<b><p><iframe`
      + ` src="javascript:top.run()"></iframe></b></p>'`;
  setTimeout(() => {
        setTimeout(() => {
            if (window.testRunner)
                testRunner.notifyDone();
        }, 0);
    }, 0);
}

cache_frame = document.body.appendChild(document.createElement("iframe"));
cache_frame.src = "http://localhost:8000/security/resources/fail.html";
cache_frame.style.display = "none";

onload = function() {
    if (!window.internals)
       return;

    internals.withUserGesture(() => {
        testButton.click();
    });
}
</script>
</body>
</html>
