<!DOCTYPE html>

<html>
<head>
    <style type="text/css" media="screen">
      body {
        height: 2200px;
      }
      
      .fixed {
        position: fixed;
        top: 0;
        left: 0;
        margin: 10px;
        height: 50px;
        background-color: rgba(0, 128, 0, 0.8);
        border: 2px solid black;
        -webkit-box-shadow: 0 0 10px black;
      }
      
      .top, .bottom {
        width: 96%;
      }

      .left {
        top: 200px;
        left: 10px;
        width: 150px;
        height: 300px;
      }

      .right {
        top: 200px;
        left: auto;
        right: 10px;
        width: 150px;
        height: 300px;
      }
      
      .bottom {
        top: auto;
        bottom: 10px;
      }
      
    </style>
    <script>
      if (window.testRunner) {
        testRunner.waitUntilDone();
        testRunner.dumpAsText();
      }
        if (window.internals) {
            window.internals.setHeaderHeight(100);
            window.internals.setFooterHeight(100);
        }

      function doScroll()
      {
        window.setTimeout(function() {
          window.scrollTo(0, 200);
          if (window.testRunner) {
            document.getElementById('results').innerText = window.internals.scrollingStateTreeAsText();
            testRunner.notifyDone();
          }
        }, 10);
      }
      
      window.addEventListener('load', doScroll, false);
    </script>
</head>
<body>

<pre id="results"></pre>

<div class="fixed top">
  This is the top bar.
</div>
<div class="fixed left">
  This is the left bar.
</div>
<div class="fixed right">
  This is the right bar.
</div>
<div class="fixed bottom">
  This is the bottom bar.
</div>

</body>
</html>
