blob: 887d7f20ef6462e2ba1bf1ca0e6adca9f62a960f [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>touchscreen_test</title>
<script src="test_bootstrap.js"></script>
<script type="text/javascript">
goog.require('bot.Touchscreen');
goog.require('bot.action');
goog.require('goog.events');
goog.require('goog.events.EventType');
goog.require('goog.math.Coordinate');
goog.require('goog.testing.jsunit');
goog.require('goog.userAgent');
</script>
<script type="text/javascript">
var target;
var lowerTarget;
var touchscreen;
var events = [];
var TOUCH_EVENTS = [
goog.events.EventType.TOUCHSTART,
goog.events.EventType.TOUCHEND,
goog.events.EventType.TOUCHMOVE,
goog.events.EventType.MOUSEMOVE,
goog.events.EventType.MOUSEDOWN,
goog.events.EventType.MOUSEOUT,
goog.events.EventType.MOUSEOVER,
goog.events.EventType.MOUSEUP,
goog.events.EventType.CLICK,
goog.events.EventType.MSPOINTERDOWN,
goog.events.EventType.MSPOINTERMOVE,
goog.events.EventType.MSPOINTEROVER,
goog.events.EventType.MSPOINTEROUT,
goog.events.EventType.MSPOINTERUP
];
function setUpPage() {
target = document.getElementById('target');
lowerTarget = document.getElementById('lower');
goog.events.listen(target, TOUCH_EVENTS, function(e) {
events.push(e.type);
events.push(target);
if (e.type == goog.events.EventType.TOUCHSTART ||
e.type == goog.events.EventType.TOUCHEND ||
e.type == goog.events.EventType.TOUCHMOVE) {
var event = e.getBrowserEvent();
events.push(event.changedTouches.length);
}
});
goog.events.listen(lowerTarget, TOUCH_EVENTS, function(e) {
events.push(e.type);
events.push(target);
});
}
function setUp() {
touchscreen = new bot.Touchscreen();
events = [];
}
function msPointerDownEvents(elem) {
return [goog.events.EventType.MOUSEMOVE, target].concat(
[goog.events.EventType.MSPOINTEROVER, target],
[goog.events.EventType.MOUSEOVER, target],
[goog.events.EventType.MSPOINTERDOWN, target],
[goog.events.EventType.MOUSEDOWN, target]);
}
function msPointerMoveEvents(elem) {
return [goog.events.EventType.MSPOINTERMOVE, target].concat(
[goog.events.EventType.MOUSEMOVE, target]);
}
function msPointerUpEvents(elem) {
return [goog.events.EventType.MSPOINTERUP, target].concat(
[goog.events.EventType.MOUSEUP, target],
[goog.events.EventType.CLICK, target],
[goog.events.EventType.MSPOINTEROUT, target],
[goog.events.EventType.MOUSEOUT, target]);
}
function assertEvents(var_args) {
var expectedEvents = goog.array.concat.apply(null, arguments);
assertArrayEquals(expectedEvents, events);
events = [];
}
function testTouchScreenPress() {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
return;
}
touchscreen.move(target, new goog.math.Coordinate(0, 0));
touchscreen.press();
assertTrue(touchscreen.isPressed());
if (bot.userAgent.IE_DOC_10) {
assertEvents(msPointerDownEvents(target));
} else {
assertEvents([goog.events.EventType.TOUCHSTART, target, 1]);
}
}
function testTouchScreen2FingerPress() {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
return;
}
touchscreen.move(target,
new goog.math.Coordinate(0, 0),
new goog.math.Coordinate(10, 10));
touchscreen.press(/* opt_press2 */ true);
assertTrue(touchscreen.isPressed());
if (bot.userAgent.IE_DOC_10) {
assertEvents(msPointerDownEvents(target),
msPointerDownEvents(target));
} else {
assertEvents([goog.events.EventType.TOUCHSTART, target, 2]);
}
}
function testTouchScreen2FingerPinch() {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
return;
}
touchscreen.move(target,
new goog.math.Coordinate(0, 0),
new goog.math.Coordinate(0, 50));
touchscreen.press(/* opt_press2 */ true);
touchscreen.move(target,
new goog.math.Coordinate(0, 10),
new goog.math.Coordinate(0, 40));
touchscreen.release();
if (bot.userAgent.IE_DOC_10) {
assertEvents(msPointerDownEvents(target),
msPointerDownEvents(target),
msPointerMoveEvents(target),
msPointerMoveEvents(target),
msPointerUpEvents(target),
msPointerUpEvents(target));
} else {
assertEvents([goog.events.EventType.TOUCHSTART, target, 2,
goog.events.EventType.TOUCHMOVE, target, 2,
goog.events.EventType.TOUCHEND, target, 2]);
}
}
function testTouchScreen2FingerRotate() {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
return;
}
touchscreen.move(target,
new goog.math.Coordinate(0, 0),
new goog.math.Coordinate(0, 50));
touchscreen.press(/* opt_press2 */ true);
touchscreen.move(target, new goog.math.Coordinate(10, 40));
touchscreen.move(target, new goog.math.Coordinate(50, 50));
touchscreen.release();
if (bot.userAgent.IE_DOC_10) {
assertEvents(msPointerDownEvents(target),
msPointerDownEvents(target),
msPointerMoveEvents(target),
msPointerMoveEvents(target),
msPointerMoveEvents(target),
msPointerMoveEvents(target),
msPointerUpEvents(target),
msPointerUpEvents(target));
} else {
assertEvents([goog.events.EventType.TOUCHSTART, target, 2,
goog.events.EventType.TOUCHMOVE, target, 2,
goog.events.EventType.TOUCHMOVE, target, 2,
goog.events.EventType.TOUCHEND, target, 2]);
}
}
function testTouchScreenRelease() {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
return;
}
touchscreen.move(target, new goog.math.Coordinate(0, 0));
touchscreen.press();
touchscreen.release();
assertFalse(touchscreen.isPressed());
if (bot.userAgent.IE_DOC_10) {
assertEvents(msPointerDownEvents(target), msPointerUpEvents(target));
} else {
assertEvents([goog.events.EventType.TOUCHSTART, target, 1,
goog.events.EventType.TOUCHEND, target, 1,
goog.events.EventType.MOUSEMOVE, target,
goog.events.EventType.MOUSEDOWN, target,
goog.events.EventType.MOUSEUP, target,
goog.events.EventType.CLICK, target]);
}
}
function testTouchScreenReleaseAfterMove() {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
return;
}
touchscreen.move(target, new goog.math.Coordinate(0, 0));
touchscreen.press();
// After a move, the mouseclick should not happen.
touchscreen.move(target, new goog.math.Coordinate(10, 10));
touchscreen.release();
if (bot.userAgent.IE_DOC_10) {
assertEvents(msPointerDownEvents(target),
msPointerMoveEvents(target),
msPointerUpEvents(target));
} else {
assertEvents([goog.events.EventType.TOUCHSTART, target, 1,
goog.events.EventType.TOUCHMOVE, target, 1,
goog.events.EventType.TOUCHEND, target, 1]);
}
}
function testTouchScreenReleaseAfterNewElement() {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
return;
}
touchscreen.move(target, new goog.math.Coordinate(0, 0));
touchscreen.press();
// After moving to a new element, the touchmove and touchend
// events should fire on the element where the touch started.
touchscreen.move(lowerTarget, new goog.math.Coordinate(0, 0));
touchscreen.release();
if (bot.userAgent.IE_DOC_10) {
assertEvents(msPointerDownEvents(target),
msPointerMoveEvents(target),
msPointerUpEvents(lowerTarget));
} else {
assertEvents([goog.events.EventType.TOUCHSTART, target, 1,
goog.events.EventType.TOUCHMOVE, target, 1,
goog.events.EventType.TOUCHEND, target, 1]);
}
}
function testTouchScreenMoveWithoutPress() {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
return;
}
touchscreen.move(target, new goog.math.Coordinate(0, 0));
assertFalse(touchscreen.isPressed());
}
function testTouchScreenMoveWithPress() {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
return;
}
touchscreen.move(target, new goog.math.Coordinate(0, 0));
touchscreen.press();
touchscreen.move(target, new goog.math.Coordinate(20, 20));
assertTrue(touchscreen.isPressed());
if (bot.userAgent.IE_DOC_10) {
assertEvents(msPointerDownEvents(target),
msPointerMoveEvents(target));
} else {
assertEvents([goog.events.EventType.TOUCHSTART, target, 1,
goog.events.EventType.TOUCHMOVE, target, 1]);
}
}
function testExceptionReleasingWhenNotPressed() {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
return;
}
assertThrows('Releasing when not pressed should throw an exception',
goog.bind(touchscreen.release, touchscreen));
}
function testExceptionPressedWhenAlreadyPressed() {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
return;
}
touchscreen.move(target, new goog.math.Coordinate(0, 0));
touchscreen.press();
assertThrows('Pressing when already pressed should throw an exception',
goog.bind(touchscreen.press, touchscreen));
}
</script>
</head>
<body>
TouchScreen Test.<br>
<div id="target"
style="background-color:blue; width:200px; height:100px">
touch here
</div>
<div id="lower"
style="background-color:red;
width:50px;
height:50px;
position relative;
top:25px">
lower
</div>
</body>
</html>