blob: f3d6367fc895f3bf615b66bc45d42be560a0a4a0 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>touchscreen_test</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/filez/_main/third_party/js/qunit/qunit.css">
<script src="/filez/_main/third_party/js/qunit/qunit.js"></script>
<script src="/filez/_main/third_party/js/qunit/qunit_test_runner.js"></script>
<script src="test_bootstrap.js"></script>
<script type="text/javascript">
goog.require('bot.Touchscreen');
goog.require('bot.action');
goog.require('bot.dom');
goog.require('goog.Promise');
goog.require('goog.events');
goog.require('goog.events.EventType');
goog.require('goog.math.Coordinate');
goog.require('goog.userAgent');
</script>
<script type="text/javascript">
var captureTarget;
var target;
var lowerTarget;
var innerCaptureTarget;
var noTouchTarget;
var coordsTarget;
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.MSPOINTERCANCEL,
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');
captureTarget = document.getElementById('captureTarget');
innerCaptureTarget = document.getElementById('innerCaptureTarget');
noTouchTarget = document.getElementById('notouch');
coordsTarget = document.getElementById('coordsTarget');
}
function setUp() {
touchscreen = new bot.Touchscreen();
events = [];
goog.events.removeAll(target);
goog.events.removeAll(lowerTarget);
goog.events.removeAll(captureTarget);
goog.events.removeAll(innerCaptureTarget);
goog.events.removeAll(noTouchTarget);
goog.events.removeAll(coordsTarget);
goog.events.listen(target, TOUCH_EVENTS, function(e) {
events.push(e.type);
events.push(e.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(e.target);
});
goog.events.listen(captureTarget, TOUCH_EVENTS, function(e) {
if (e.type == goog.events.EventType.MSPOINTERDOWN) {
captureTarget.msSetPointerCapture(e.getBrowserEvent().pointerId);
}
events.push(e.type);
events.push(e.target);
});
goog.events.listen(noTouchTarget, TOUCH_EVENTS, function(e) {
events.push(e.type);
events.push(e.target);
});
goog.events.listen(coordsTarget, goog.events.EventType.TOUCHSTART,
function(e) {
var event = e.getBrowserEvent();
if (event.changedTouches.length == 1) {
events.push(event.changedTouches[0].clientX);
events.push(event.changedTouches[0].clientY);
events.push(event.changedTouches[0].pageX);
events.push(event.changedTouches[0].pageY);
}
});
}
function msPointerDownEvents(elem) {
return [goog.events.EventType.MOUSEMOVE, elem].concat(
[goog.events.EventType.MSPOINTEROVER, elem],
[goog.events.EventType.MOUSEOVER, elem],
[goog.events.EventType.MSPOINTERDOWN, elem],
[goog.events.EventType.MOUSEDOWN, elem]);
}
function msPointerMoveEvents(elem) {
return [goog.events.EventType.MSPOINTERMOVE, elem].concat(
[goog.events.EventType.MOUSEMOVE, elem]);
}
function msPointerUpEventsWithClick(elem) {
return [goog.events.EventType.MSPOINTERUP, elem].concat(
[goog.events.EventType.MOUSEUP, elem],
[goog.events.EventType.CLICK, elem],
[goog.events.EventType.MSPOINTEROUT, elem],
[goog.events.EventType.MOUSEOUT, elem]);
}
function msPointerUpEventsWithoutClick(elem) {
return [goog.events.EventType.MSPOINTERUP, elem].concat(
[goog.events.EventType.MOUSEUP, elem],
[goog.events.EventType.MSPOINTEROUT, elem],
[goog.events.EventType.MOUSEOUT, elem]);
}
function assertEvents(assert, var_args) {
var expectedEvents = goog.array.concat.apply(null,
Array.prototype.slice.call(arguments, 1));
assert.deepEqual(events, expectedEvents);
events = [];
}
QUnit.begin(function() {
setUpPage();
});
QUnit.testStart(function() {
setUp();
});
QUnit.test('touchScreenPress', function(assert) {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
assert.ok(true, 'Skipping: touch events not supported');
return;
}
touchscreen.move(target, new goog.math.Coordinate(0, 0));
touchscreen.press();
assert.ok(touchscreen.isPressed());
if (bot.userAgent.IE_DOC_10) {
assertEvents(assert, msPointerDownEvents(target));
} else {
assertEvents(assert, [goog.events.EventType.TOUCHSTART, target, 1]);
}
});
QUnit.test('touchScreen2FingerPress', function(assert) {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
assert.ok(true, 'Skipping: touch events not supported');
return;
}
touchscreen.move(target,
new goog.math.Coordinate(0, 0),
new goog.math.Coordinate(10, 10));
touchscreen.press(/* opt_press2 */ true);
assert.ok(touchscreen.isPressed());
if (bot.userAgent.IE_DOC_10) {
assertEvents(assert, msPointerDownEvents(target),
msPointerDownEvents(target));
} else {
assertEvents(assert, [goog.events.EventType.TOUCHSTART, target, 2]);
}
});
QUnit.test('touchScreen2FingerPinch', function(assert) {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
assert.ok(true, 'Skipping: touch events not supported');
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(assert, msPointerDownEvents(target),
msPointerDownEvents(target),
msPointerMoveEvents(target),
msPointerMoveEvents(target),
msPointerUpEventsWithClick(target),
msPointerUpEventsWithClick(target));
} else {
assertEvents(assert, [goog.events.EventType.TOUCHSTART, target, 2,
goog.events.EventType.TOUCHMOVE, target, 2,
goog.events.EventType.TOUCHEND, target, 2]);
}
});
QUnit.test('touchScreen2FingerPinchReleaseOnNoTouchElement', function(assert) {
if (!bot.userAgent.IE_DOC_10) {
assert.ok(true, 'Skipping: not IE 10');
return;
}
touchscreen.move(noTouchTarget,
new goog.math.Coordinate(0, 0),
new goog.math.Coordinate(0, 50));
touchscreen.press(/* opt_press2 */ true);
touchscreen.move(noTouchTarget,
new goog.math.Coordinate(0, 10),
new goog.math.Coordinate(0, 40));
touchscreen.release();
if (bot.userAgent.IE_DOC_10) {
assertEvents(assert, msPointerDownEvents(noTouchTarget),
[goog.events.EventType.MSPOINTEROUT, noTouchTarget,
goog.events.EventType.MOUSEOUT, noTouchTarget,
goog.events.EventType.MSPOINTERCANCEL, noTouchTarget]);
}
});
QUnit.test('touchScreen2FingerRotate', function(assert) {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
assert.ok(true, 'Skipping: touch events not supported');
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(assert, msPointerDownEvents(target),
msPointerDownEvents(target),
msPointerMoveEvents(target),
msPointerMoveEvents(target),
msPointerMoveEvents(target),
msPointerMoveEvents(target),
msPointerUpEventsWithClick(target),
msPointerUpEventsWithClick(target));
} else {
assertEvents(assert, [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 verifyTapEvents(assert, elem) {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
return false;
}
touchscreen.move(elem, new goog.math.Coordinate(0, 0));
touchscreen.press();
touchscreen.release();
assert.notOk(touchscreen.isPressed());
if (bot.userAgent.IE_DOC_10) {
assertEvents(assert, msPointerDownEvents(elem),
msPointerUpEventsWithClick(elem));
} else {
assertEvents(assert, [goog.events.EventType.TOUCHSTART, elem, 1,
goog.events.EventType.TOUCHEND, elem, 1,
goog.events.EventType.MOUSEMOVE, elem,
goog.events.EventType.MOUSEDOWN, elem,
goog.events.EventType.MOUSEUP, elem,
goog.events.EventType.CLICK, elem]);
}
return true;
}
QUnit.test('touchScreenRelease', function(assert) {
if (!verifyTapEvents(assert, target)) {
assert.ok(true, 'Skipping: touch events not supported');
}
});
QUnit.test('touchScreenReleaseOnNoTouchElement', function(assert) {
if (!bot.userAgent.IE_DOC_10) {
assert.ok(true, 'Skipping: not IE 10');
return;
}
verifyTapEvents(assert, noTouchTarget);
});
QUnit.test('touchScreenReleaseAfterMove', function(assert) {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
assert.ok(true, 'Skipping: touch events not supported');
return;
}
touchscreen.move(target, new goog.math.Coordinate(0, 0));
touchscreen.press();
touchscreen.move(target, new goog.math.Coordinate(10, 10));
touchscreen.release();
if (bot.userAgent.IE_DOC_10) {
assertEvents(assert, msPointerDownEvents(target),
msPointerMoveEvents(target),
msPointerUpEventsWithClick(target));
} else {
assertEvents(assert, [goog.events.EventType.TOUCHSTART, target, 1,
goog.events.EventType.TOUCHMOVE, target, 1,
goog.events.EventType.TOUCHEND, target, 1]);
}
});
QUnit.test('msSetPointerCapture', function(assert) {
if (!bot.userAgent.IE_DOC_10) {
assert.ok(true, 'Skipping: not IE 10');
return;
}
touchscreen.move(captureTarget, new goog.math.Coordinate(0, 0));
touchscreen.press();
touchscreen.move(lowerTarget, new goog.math.Coordinate(10, 10));
touchscreen.release();
assertEvents(assert, msPointerDownEvents(captureTarget),
msPointerMoveEvents(captureTarget),
msPointerUpEventsWithoutClick(captureTarget));
});
QUnit.test('bubblingMsSetPointerCapture', function(assert) {
if (!bot.userAgent.IE_DOC_10) {
assert.ok(true, 'Skipping: not IE 10');
return;
}
touchscreen.move(innerCaptureTarget, new goog.math.Coordinate(0, 0));
touchscreen.press();
touchscreen.move(lowerTarget, new goog.math.Coordinate(10, 10));
touchscreen.release();
assertEvents(assert, msPointerDownEvents(innerCaptureTarget),
msPointerMoveEvents(captureTarget),
msPointerUpEventsWithoutClick(captureTarget));
});
QUnit.test('clickDoesNotFireOnCapturedPointer', function(assert) {
if (!bot.userAgent.IE_DOC_10) {
assert.ok(true, 'Skipping: not IE 10');
return;
}
touchscreen.move(innerCaptureTarget, new goog.math.Coordinate(0, 0));
touchscreen.press();
touchscreen.move(innerCaptureTarget, new goog.math.Coordinate(10, 10));
touchscreen.release();
assertEvents(assert, msPointerDownEvents(innerCaptureTarget),
msPointerMoveEvents(captureTarget),
[goog.events.EventType.MSPOINTERUP, captureTarget],
[goog.events.EventType.MOUSEUP, captureTarget],
[goog.events.EventType.CLICK, innerCaptureTarget],
[goog.events.EventType.MSPOINTEROUT, captureTarget],
[goog.events.EventType.MOUSEOUT, captureTarget]);
});
QUnit.test('touchScreenReleaseAfterMoveOnNoTouchElement_IE', function(assert) {
if (!bot.userAgent.IE_DOC_10) {
assert.ok(true, 'Skipping: not IE 10');
return;
}
touchscreen.move(noTouchTarget, new goog.math.Coordinate(0, 0));
touchscreen.press();
touchscreen.move(noTouchTarget, new goog.math.Coordinate(10, 10));
touchscreen.move(noTouchTarget, new goog.math.Coordinate(20, 20));
touchscreen.release();
assertEvents(assert, msPointerDownEvents(noTouchTarget),
[goog.events.EventType.MSPOINTEROUT, noTouchTarget,
goog.events.EventType.MOUSEOUT, noTouchTarget,
goog.events.EventType.MSPOINTERCANCEL, noTouchTarget]);
});
QUnit.test('touchScreenReleaseAfterNewElement', function(assert) {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
assert.ok(true, 'Skipping: touch events not supported');
return;
}
touchscreen.move(target, new goog.math.Coordinate(0, 0));
touchscreen.press();
touchscreen.move(lowerTarget, new goog.math.Coordinate(0, 0));
touchscreen.release();
if (bot.userAgent.IE_DOC_10) {
assertEvents(assert, msPointerDownEvents(target),
msPointerMoveEvents(lowerTarget),
msPointerUpEventsWithoutClick(lowerTarget));
} else {
assertEvents(assert, [goog.events.EventType.TOUCHSTART, target, 1,
goog.events.EventType.TOUCHMOVE, target, 1,
goog.events.EventType.TOUCHEND, target, 1]);
}
});
QUnit.test('touchScreenMoveWithoutPress', function(assert) {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
assert.ok(true, 'Skipping: touch events not supported');
return;
}
touchscreen.move(target, new goog.math.Coordinate(0, 0));
assert.notOk(touchscreen.isPressed());
});
QUnit.test('touchScreenMoveWithPress', function(assert) {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
assert.ok(true, 'Skipping: touch events not supported');
return;
}
touchscreen.move(target, new goog.math.Coordinate(0, 0));
touchscreen.press();
touchscreen.move(target, new goog.math.Coordinate(20, 20));
assert.ok(touchscreen.isPressed());
if (bot.userAgent.IE_DOC_10) {
assertEvents(assert, msPointerDownEvents(target),
msPointerMoveEvents(target));
} else {
assertEvents(assert, [goog.events.EventType.TOUCHSTART, target, 1,
goog.events.EventType.TOUCHMOVE, target, 1]);
}
});
QUnit.test('exceptionReleasingWhenNotPressed', function(assert) {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
assert.ok(true, 'Skipping: touch events not supported');
return;
}
assert.throws(
goog.bind(touchscreen.release, touchscreen),
'Releasing when not pressed should throw an exception'
);
});
QUnit.test('exceptionPressedWhenAlreadyPressed', function(assert) {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
assert.ok(true, 'Skipping: touch events not supported');
return;
}
touchscreen.move(target, new goog.math.Coordinate(0, 0));
touchscreen.press();
assert.throws(
goog.bind(touchscreen.press, touchscreen),
'Pressing when already pressed should throw an exception'
);
});
QUnit.test('preventDefaultOnTouchstart', function(assert) {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
assert.ok(true, 'Skipping: touch events not supported');
return;
}
goog.events.listen(target, goog.events.EventType.TOUCHSTART, function(e) {
e.preventDefault();
});
touchscreen.move(target, new goog.math.Coordinate(0, 0));
touchscreen.press();
touchscreen.release();
if (bot.userAgent.IE_DOC_10) {
assertEvents(assert, msPointerDownEvents(target),
msPointerUpEventsWithClick(target));
} else {
assertEvents(assert, [goog.events.EventType.TOUCHSTART, target, 1,
goog.events.EventType.TOUCHEND, target, 1]);
}
});
QUnit.test('preventDefaultOnTouchend', function(assert) {
if (!bot.events.SUPPORTS_TOUCH_EVENTS) {
assert.ok(true, 'Skipping: touch events not supported');
return;
}
goog.events.listen(target, goog.events.EventType.TOUCHEND, function(e) {
e.preventDefault();
});
touchscreen.move(target, new goog.math.Coordinate(0, 0));
touchscreen.press();
touchscreen.release();
if (bot.userAgent.IE_DOC_10) {
assertEvents(assert, msPointerDownEvents(target),
msPointerUpEventsWithClick(target));
} else {
var expectedEvents = [goog.events.EventType.TOUCHSTART, target, 1,
goog.events.EventType.TOUCHEND, target, 1];
if (!bot.userAgent.IOS && !goog.userAgent.product.CHROME) {
expectedEvents.push(goog.events.EventType.MOUSEMOVE, target,
goog.events.EventType.MOUSEDOWN, target,
goog.events.EventType.MOUSEUP, target,
goog.events.EventType.CLICK, target);
}
assertEvents(assert, expectedEvents);
}
});
QUnit.test('touchEventCoords', function(assert) {
if (!bot.events.SUPPORTS_TOUCH_EVENTS || bot.userAgent.IE_DOC_10) {
assert.ok(true, 'Skipping: touch events not supported or IE 10');
return;
}
var done = assert.async();
window.scrollTo(20, 30);
goog.Promise.resolve().then(function() {
var coords = bot.dom.getClientRect(coordsTarget);
touchscreen.move(coordsTarget, new goog.math.Coordinate(0, 0));
touchscreen.press();
touchscreen.release();
assertEvents(assert, [coords.left, coords.top,
coords.left + 20, coords.top + 30]);
done();
});
});
</script>
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
TouchScreen Test.<br>
<div id="target"
style="background-color:blue;
width:200px;
height:100px;
-ms-touch-action:none">
touch here
</div>
<div id="lower"
style="background-color:red;
width:50px;
height:50px;
position relative;
top:25px;
-ms-touch-action:none">
lower
</div>
<div id="captureTarget"
style="background-color:green;
width:200px;
height:200px;
-ms-touch-action:none">
ie 10 target
<div id="innerCaptureTarget"
style="background-color:cyan;
width:100px;
height:50px;
-ms-touch-action:none">
inner ie 10 target
</div>
</div>
<div id="notouch"
style="background-color:green;
width:100px;
height:100px;
position relative;
top:50px;
-ms-touch-action:auto">
no touch
</div>
<div id="coordsTarget"
style="background-color:magenta;
width:8000px;
height:8000px;
-ms-touch-action:none">
coords target
</div>
</body>
</html>