<!-- webkit-test-runner [ enableBackForwardCache=true ] -->
<!DOCTYPE html>
<html>
<body>
<p>This test passes if it does not print an ALERT with "secret data".</p>
<script>
if (window.testRunner) {
  testRunner.dumpAsText();
  testRunner.waitUntilDone();
  testRunner.setCanOpenWindows();
}

function createURL(data, type = 'text/html') {
  return URL.createObjectURL(new Blob([data], {type: type}));
}

victim_url = 'http://localhost:8000/security/resources/navigate-when-restoring-cached-page-victim.html?' + Math.random();

cache_frame = document.body.appendChild(document.createElement('iframe'));
cache_frame.style.display = 'none';
cache_frame.src = victim_url;

function runTest()
{
  if (window.testRunner && !testRunner.isWebKit2 && !window.internals) {
    // This test does not run (times out) on WebKit1 and requires internals API.
    testRunner.notifyDone();
    return;
  }

  showModalDialog(createURL(`
    <script>
      onmessage = e => {
        w.close();
        if (window.testRunner)
          testRunner.abortModal();
        alert(e.data);
        if (window.testRunner)
          testRunner.notifyDone();
      }
      
      ${createURL}
      
      w = open('about:blank');
      if (w == null) {
        alert('coudn\\'t open enough windows, try again');
        close();
        if (window.testRunner) {
          testRunner.abortModal();
          testRunner.notifyDone();
        }
      }
      w.history.pushState('', '');
      
      cached_doc = w.document;
      setTimeout(() => {
        w.location = 'about:blank';
        interval_id = setInterval(() => {
          if (cached_doc == w.document)
            return;
          
          clearInterval(interval_id);

          // Prevent entering PageCache.
          if (w.internals)
            w.internals.preventDocumentForEnteringBackForwardCache();

          child_frame = w.document.body.appendChild(document.createElement('iframe'));
          child_frame.contentWindow.onunload = () => {
            child_frame.contentWindow.onunload = null;
            
            a = w.document.createElement('a');
            a.href = '${victim_url}';
            a.click();

            showModalDialog(createURL('<script>timeout = 100; setInterval(() => { if (!--timeout || opener.child_loaded) { close(); if (window.testRunner) testRunner.abortModal(); } }, 1)</sc' + 'ript>'));

            if (!window.child_loaded && window.testRunner) {
              testRunner.abortModal();
              testRunner.notifyDone();
            }
          }
          
          w.history.back();
        }, 0);
      }, 0); 
    </scr` + `ipt>`));
}

onload = function() {
  setTimeout(() => {
    if (window.internals)
      internals.withUserGesture(runTest);
    else
      onclick = runTest;
  }, 0);
}
</script>
</body>
</html>
