@christian-bromann/webdriverio
Version:
A nodejs bindings implementation for selenium 2.0/webdriver
101 lines (90 loc) • 3.72 kB
JavaScript
(function(Hammer) {
'use strict';
/**
* enable multitouch on the desktop by pressing the shiftkey
* the other touch goes in the opposite direction so the center keeps at its place
* it's recommended to enable Hammer.debug.showTouches for this one
*
* @usage
* just call `Hammer.plugins.fakeMultitouch()` and you're done.
*/
Hammer.plugins.fakeMultitouch = function() {
// no need to fake it if it already is possible!
var maxTouchPoints = navigator.maxTouchPoints || navigator.msMaxTouchPoints;
if(Hammer.HAS_TOUCHEVENTS || (Hammer.HAS_POINTEREVENTS && maxTouchPoints > 1)) {
return;
}
// keeps the start position to keep it centered
var startPos = false;
/**
* overwrites Hammer.event.getTouchList.
* @method getTouchList
* @param {Event} ev
* @param {String} eventType
* @return {Array} Touches
*/
Hammer.event.getTouchList = function(ev, eventType) {
var touches = [];
var changedTouches = [];
// reset on start of a new touch
if(eventType == Hammer.EVENT_START) {
startPos = false;
}
// when the shift key is pressed, multitouch is possible on desktop
// why shift? because ctrl and alt are taken by osx and linux
if(ev.shiftKey) {
// on touchstart we store the position of the mouse for multitouch
if(!startPos) {
startPos = {
pageX: ev.pageX,
pageY: ev.pageY,
clientX: ev.clientX,
clientY: ev.clientY
};
// new touch came up
touches.trigger = Hammer.EVENT_TOUCH;
}
var distanceX = startPos.pageX - ev.pageX;
var distanceY = startPos.pageY - ev.pageY;
// fake second touch in the opposite direction
touches.push({
identifier: 1,
pageX: startPos.pageX - distanceX - 50,
pageY: startPos.pageY - distanceY + 50,
clientX: startPos.clientX - distanceX - 50,
clientY: startPos.clientY - distanceY + 50,
target: ev.target
}, {
identifier: 2,
pageX: startPos.pageX + distanceX + 50,
pageY: startPos.pageY + distanceY - 50,
clientX: startPos.clientX + distanceX + 50,
clientY: startPos.clientY + distanceY - 50,
target: ev.target
});
changedTouches = touches;
} else {
touches.push({
identifier: 1,
pageX: ev.pageX,
pageY: ev.pageY,
clientX: ev.clientX,
clientY: ev.clientY,
target: ev.target
});
// we came from multitouch, trigger a release event
// and use the changed touches from the multitouch
if(startPos) {
touches.trigger = Hammer.EVENT_RELEASE;
// use the touches as changedTouches, because we are in a move
} else {
changedTouches = touches;
}
startPos = false;
}
ev.touches = touches;
ev.changedTouches = changedTouches;
return touches;
};
};
})(window.Hammer);