<!DOCTYPE html>
<html>
<head>
<script src="../../../../resources/js-test-pre.js"></script>
<script src="resources/gesture-helpers.js"></script>
<style type="text/css">
::-webkit-scrollbar {
    width: 0px;
    height: 0px;
}

#greenbox {
  width: 100px;
  height: 100px;
  background: green;
  padding: 0px;
  margin: 0px;
}

#redbox {
  width: 100px;
  height: 100px;
  background: red;
  padding: 0px;
  margin: 0px;
}

#bluebox {
  width: 100px;
  height: 100px;
  background: blue;
  padding: 0px;
  margin: 0px;
}

#yellowbox {
  width: 100px;
  height: 100px;
  background: yellow;
  padding: 0px;
  margin: 0px;
}

#touchtargetdiv {
    width: 200px;
    height: 200px;
    overflow-y: scroll;
    overflow-x: scroll;
}

td {
  padding: 0px;
}
</style>
</head>
<body style="margin:0" onload="runTest();">

<div id="touchtargetdiv">
  <table border="0" cellspacing="0px" >
    <tr><td><div id="yellowbox"></div></td></tr>
    <tr><td><div id="bluebox"></div></td></tr>
    <tr><td><div id="yellowbox"></div></td></tr>
    <tr><td><div id="bluebox"></div></td></tr>
  </table>
</div>

<table id="table_to_fill" border="0" cellspacing="0px">
  <tr><td><div id="greenbox"></div></td></tr>
  <tr><td><div id="redbox"></div></td></tr>
</table>

<p id="description"></p>
<div id="console"></div>
<script type="text/javascript">

var touchtarget;
var expectedGesturesTotal = 2;
var gesturesOccurred = 0;
var scrollAmountX = ['0', '0'];
var scrollAmountY = ['0', '160'];
var wheelEventsOccurred = 0;
var expectedWheelEventsOccurred = ['0', '0'];
var scrollEventsOccurred = 0;
var scrolledElement = 'document.body'
var scrollEventsOccurred = 0;
var expectedScrollEventsOccurred = '1';

// Always construct a page larger than the vertical height of the window.
function buildPage()
{
    var table = document.getElementById('table_to_fill');
    var targetHeight = document.body.offsetHeight;
    var cellPairHeight = table.offsetHeight;
    var numberOfReps = targetHeight / cellPairHeight * 2;
    var i;
    for (i = 0; i < numberOfReps; i++) {
        var p = document.createElement('tr');
        p.innerHTML = '<td><div id="greenbox"></div></td>';
        table.appendChild(p);
        var p = document.createElement('tr');
        p.innerHTML = '<td><div id="redbox"></div></td>';
        table.appendChild(p);
    }
}

function firstGestureScroll()
{
    debug("first gesture");
    eventSender.gestureScrollBegin(10, 72);
    eventSender.gestureScrollUpdate(0, -110);
    eventSender.gestureScrollEnd(0, 0);

    // Wait for layout.
    checkScrollOffset();
}

function secondGestureScroll()
{
    debug("second gesture");
    eventSender.gestureScrollBegin(12, 40);
    eventSender.gestureScrollUpdate(0, -200);
    eventSender.gestureScrollUpdate(0, -160);
    eventSender.gestureScrollEnd(0, 0);

    // Wait for layout.
    checkScrollOffset();
}

if (window.testRunner)
    testRunner.waitUntilDone();

function runTest()
{
    buildPage();
    touchtarget = document.getElementById('touchtargetdiv');
    touchtarget.addEventListener("scroll", recordScroll);
    touchtarget.addEventListener("mousewheel", recordWheel);

    if (window.eventSender) {
        description('This tests that a gesture scroll is propagated from a div ' + 
                'to the page when the div has no remaining scroll offset.');
        if (checkTestDependencies())
            firstGestureScroll();
        else
            exitIfNecessary();
    } else {
        debug("This test requires DumpRenderTree.  Gesture-scroll the page to validate the implementation.");
    }
}
</script>



</body>
</html>
