<!DOCTYPE html>
<html>
<head>
<script src="../../../../resources/js-test-pre.js"></script>
<script src="resources/gesture-helpers.js"></script>
<style type="text/css">
#touchtarget {
  width: 100px;
  height: 100px;
  background: white;
  overflow:hidden;
}

::-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;
}

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

<table id="horizontal_table_to_fill">
  <tr id="firstrow">
    <td><div id="redbox"></div></td>
    <td><div id="greenbox"></div></td>
  </tr>
</table>

<table id="vertical_table_to_fill">
    <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 expectedGesturesTotal = 2;
var gesturesOccurred = 0;
var scrollAmountX = ['0', '0'];
var scrollAmountY = ['0', '0'];
var wheelEventsOccurred = 0;
var expectedWheelEventsOccurred = ['0', '0'];
var scrollEventsOccurred = 0;
var expectedScrollEventsOccurred = '0';
var scrolledElement = 'document.body'

// Always construct a page larger than the vertical height of the window.
function buildPage()
{
    // build vertical table
    var table = document.getElementById('vertical_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);
    }

    // build horizontal table
    var horizontalTable = document.getElementById('horizontal_table_to_fill');
    var tableRow = document.getElementById('firstrow');
    var targetWidth = document.body.offsetWidth;
    var cellPairWidth = horizontalTable.offsetWidth;
    numberOfReps = targetWidth / cellPairWidth * 2;
    for (i = 0; i < numberOfReps; i++) {
        var p = document.createElement('td');
        p.innerHTML = '<div id="redbox"></div>';
        tableRow.appendChild(p);
        var p = document.createElement('td');
        p.innerHTML = '<div id="greenbox"></div>';
        tableRow.appendChild(p);
    }

    window.addEventListener("scroll", recordScroll);
    window.addEventListener("mousewheel", recordWheel);
}

function firstGestureScroll()
{
    debug("first gesture");
    eventSender.gestureScrollBegin(95, 12);
    eventSender.gestureScrollUpdate(-55, -110);
    eventSender.gestureScrollEnd(0, 0);

    // Wait for layout.
    checkScrollOffset();
}

function secondGestureScroll()
{
    debug("second gesture");
    eventSender.gestureScrollBegin(12, 97);
    eventSender.gestureScrollUpdate(-42, -95);
    eventSender.gestureScrollEnd(0, 0);

    // Wait for layout.
    checkScrollOffset();

    // In this test we do not expect any scroll events to
    // be received by the event listener, so we signal
    // the end of the test by calling this function instead
    // of relying on recordScroll() to do it.
    finishTest();
}

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

function runTest()
{
    buildPage();
    if (window.eventSender) {
        description('This tests that a page cannot be scrolled with touch if its body has style overflow:hidden.');

        if (checkTestDependencies())
            firstGestureScroll();
        else
            exitIfNecessary();
    } else {
        debug("This test requires DumpRenderTree.  Touch scroll the red rect to log.");
    }
}

function finishTest()
{
    if (window.eventSender) {
        if (gesturesOccurred == expectedGesturesTotal) {
            shouldBe('scrollEventsOccurred', expectedScrollEventsOccurred);
            successfullyParsed = true;
            isSuccessfullyParsed();
            if (window.testRunner)
                testRunner.notifyDone();
        }
    }
}
</script>
</body>
</html>
