<!DOCTYPE html> <!-- webkit-test-runner [ ShouldIgnoreMetaViewport=true UsesBackForwardCache=true ] -->

<html>
<head>
     <script src="../../../resources/ui-helper.js"></script>
     <script>
     if (window.testRunner) {
         testRunner.dumpAsText();
         testRunner.waitUntilDone();
     }

     async function finishTest() {
         const appendOutput = message => {
             output.appendChild(document.createTextNode(message));
             output.appendChild(document.createElement("br"));
         };

         appendOutput(`window size: [${innerWidth}, ${innerHeight}]`);
         appendOutput(`zoom scale: ${(await UIHelper.zoomScale()).toFixed(2)}`);
         appendOutput("");
  
         await UIHelper.setAllowsViewportShrinkToFit(false);
         await Promise.all([UIHelper.ensureVisibleContentRectUpdate(), UIHelper.ensurePresentationUpdate()]);

         testRunner.notifyDone();
     }
     
     async function setUp() {
         await UIHelper.setAllowsViewportShrinkToFit(true);
         await Promise.all([UIHelper.ensureVisibleContentRectUpdate(), UIHelper.ensurePresentationUpdate()]);
     }

    window.addEventListener("pageshow", function(event) {
        alert("pageshow - " + (event.persisted ? "" : "not ") + "from cache");
        if (event.persisted)
            setTimeout(finishTest, 0);
        else
            setUp();
            
    }, false);

    // Force a back navigation back to this page.
    window.addEventListener("load", function(event) {
        setTimeout(function() {
            window.location.href = "resources/go-back.html";
        }, 0);
    }, false);    
    </script>
    
    <style>
        .wide {
            height: 1px;
            width: 1000px;
            background-color: gray;
        }
    </style>
</head>

<body>
<div class="wide"></div>
<pre id="output"></pre>
</body>
</html>
