<!DOCTYPE html>
<html>
<head>
<script src="resources/link-highlight-helper.js"></script>
<script src="../../resources/run-after-layout-and-paint.js"></script>
<link rel="stylesheet" type="text/css" href="resources/link-highlight-style.css">
</head>
<body onLoad="runTest();">
<iframe id="nestingFrame" src="resources/1-nested-frame-noncomposited.html" style="position: relative; left: 10px; top: 10px; width: 450px; height: 150px;"></iframe>
<div style="position: relative; left: 10px; top: 20px; will-change: transform;">
This test is successful if "Target Link" is covered by a green box with square corners,
and the outer frame is partially scrolled.
</div>
<script>
function runTest() {
    useMockHighlight();
    var nestingFrame = document.getElementById('nestingFrame');
    var targetFrame = nestingFrame.contentDocument.getElementById('targetFrame');
    var clientRect = targetFrame.contentDocument.getElementById('targetLink').getBoundingClientRect();
    x = (clientRect.left + clientRect.right) / 2;
    y = (clientRect.top + clientRect.bottom) / 2 + nestingFrame.getBoundingClientRect().top + targetFrame.getBoundingClientRect().top;
    if (window.testRunner)
        testRunner.waitUntilDone();

    if (window.eventSender && window.testRunner) {
        eventSender.gestureShowPress(x, y);
        runAfterLayoutAndPaint(function() {
            nestingFrame.style.willChange = "transform";
            runAfterLayoutAndPaint(function() {
                nestingFrame.contentWindow.scrollTo(0, 20);
                testRunner.notifyDone();
            });
        });
    } else {
        debug("This test requires DumpRenderTree.");
    }
}
</script>
</body>
</html>
