blob: 4e577f85c382e9956cce4e1a130644e8d0d8116f [file] [log] [blame]
<html>
<head>
<style>
.box { border: 1px solid black; border-radius: 5px 5px; margin: 1em; max-width: 40em; }
</style>
<script src="../fast/js/resources/js-test-pre.js"></script>
</head>
<body onload="runTests()">
<div class=box id=mybox1>
Box with a local click handler.
</div>
<div class=box id=mybox2>
Box without a local click handler.
</div>
<script>
function monitor(e) { alert(e.target +( e.target.id ? ( ' #' + e.target.id) : '')); };
function doSomething(e) {};
var element = document.getElementById('mybox1');
element.addEventListener('click', doSomething, false);
element = document.body;
element.addEventListener('click', monitor, false);
</script>
<p id='description'></p>
<div id='console'></div>
<script>
var element;
var adjustedNode;
function findAbsolutePosition(node) {
var pos = new Object();
pos.left = 0; pos.top = 0;
do {
pos.left += node.offsetLeft;
pos.top += node.offsetTop;
} while (node = node.offsetParent);
return pos;
}
function testDirectTouch(element)
{
var pos = findAbsolutePosition(element);
var x = pos.left + element.clientWidth / 2 - 1;
var y = pos.top + element.clientHeight / 2 - 1;
var width = 3;
var height = 3;
var adjustedNode = internals.touchNodeAdjustedToBestClickableNode(x, y, width, height, document);
if (adjustedNode.nodeType == 3) // TEXT node
adjustedNode = adjustedNode.parentNode;
return adjustedNode;
}
function testDoubleTouch(element1, element2, offset)
{
var pos1 = findAbsolutePosition(element1);
var pos2 = findAbsolutePosition(element2);
// We assume the elements have the same x coord and width.
var x = pos1.left + element1.clientWidth/2 - 1;
var y1 = pos1.top + element1.clientHeight/2 + 1;
var y2 = pos2.top + element2.clientHeight/2 - 1;
var width = y2 - y1;
var height = y2 - y1;
var adjustedNode = internals.touchNodeAdjustedToBestClickableNode(x, y1, width, height, document);
if (adjustedNode.nodeType == 3) // TEXT node
adjustedNode = adjustedNode.parentNode;
return adjustedNode;
}
function testDirectTouches()
{
debug('Testing small direct hits.');
element = document.getElementById('mybox1');
adjustedNode = testDirectTouch(element);
shouldBe('adjustedNode.id', 'element.id');
element = document.getElementById('mybox2');
adjustedNode = testDirectTouch(element);
shouldBe('adjustedNode.id', 'element.id');
}
function testPreferedTouch()
{
debug('Testing prefered hits.');
element1 = document.getElementById('mybox1');
element2 = document.getElementById('mybox2');
adjustedNode = testDoubleTouch(element1, element2, 0);
shouldBe('adjustedNode.id', 'element1.id');
// First test was centered, now move the test closer to the wrong node, and ensure we still get the prefered node.
adjustedNode = testDoubleTouch(element1, element2, 5);
shouldBe('adjustedNode.id', 'element1.id');
adjustedNode = testDoubleTouch(element1, element2, 10);
shouldBe('adjustedNode.id', 'element1.id');
}
function runTests()
{
if (window.testRunner && window.internals && internals.touchNodeAdjustedToBestClickableNode) {
description('Test the case where a clickable target is nested inside a document that is monitoring clicks. The target with the local event-handler should be chosen if multiple targets are touched.');
testRunner.dumpAsText();
testRunner.waitUntilDone();
testDirectTouches();
testPreferedTouch();
isSuccessfullyParsed();
testRunner.notifyDone();
}
}
</script>
</body>
</html>