<!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(event) {
  ++counter;
  if (counter == 2) {
    event.target.src = "javascript:alert(document.documentElement.outerHTML)";
  } else if (counter == 3) {
    frame = event.target;

    a = frame.contentDocument.createElement("a");
    a.href = cache_frame.src;
    a.click();

    showModalDialog(URL.createObjectURL(new Blob([`
      <script>
        timeout = 0;
        let intervalID = setInterval(() => {
          try {
            opener.frame.contentWindow.foo;
            timeout++;
            if (timeout == 200)
                throw "";
          } catch (e) {
            clearInterval(intervalID);

            window.close();
            if (window.testRunner)
              testRunner.abortModal();
          }
        }, 10);
      </scr` + "ipt>"], {type: "text/html"})));

      setTimeout(() => {
        setTimeout(() => {
          if (window.testRunner)
            testRunner.notifyDone();
        }, 0);
      }, 0);
  }
}

testButton.onclick = _ => {
  frame = document.body.appendChild(document.createElement("iframe"));
  frame.contentWindow.location = `javascript:'<b><p><iframe`
      + ` onload="top.run(event)"></iframe></b></p>'`;
}

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>
