mirror of
https://github.com/openseadragon/openseadragon.git
synced 2025-02-07 18:39:23 +03:00
Merge pull request #930 from dlukez/master
Handle simultaneous touch events
This commit is contained in:
commit
436ff0d086
@ -1357,11 +1357,11 @@
|
|||||||
* @private
|
* @private
|
||||||
* @inner
|
* @inner
|
||||||
*/
|
*/
|
||||||
function capturePointer( tracker, pointerType ) {
|
function capturePointer( tracker, pointerType, pointerCount ) {
|
||||||
var pointsList = tracker.getActivePointersListByType( pointerType ),
|
var pointsList = tracker.getActivePointersListByType( pointerType ),
|
||||||
eventParams;
|
eventParams;
|
||||||
|
|
||||||
pointsList.captureCount++;
|
pointsList.captureCount += (pointerCount || 1);
|
||||||
|
|
||||||
if ( pointsList.captureCount === 1 ) {
|
if ( pointsList.captureCount === 1 ) {
|
||||||
if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
|
if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
|
||||||
@ -1400,11 +1400,11 @@
|
|||||||
* @private
|
* @private
|
||||||
* @inner
|
* @inner
|
||||||
*/
|
*/
|
||||||
function releasePointer( tracker, pointerType ) {
|
function releasePointer( tracker, pointerType, pointerCount ) {
|
||||||
var pointsList = tracker.getActivePointersListByType( pointerType ),
|
var pointsList = tracker.getActivePointersListByType( pointerType ),
|
||||||
eventParams;
|
eventParams;
|
||||||
|
|
||||||
pointsList.captureCount--;
|
pointsList.captureCount -= (pointerCount || 1);
|
||||||
|
|
||||||
if ( pointsList.captureCount === 0 ) {
|
if ( pointsList.captureCount === 0 ) {
|
||||||
if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
|
if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
|
||||||
@ -2074,7 +2074,7 @@
|
|||||||
|
|
||||||
if ( updatePointersDown( tracker, event, gPoints, 0 ) ) { // 0 means primary button press/release or touch contact
|
if ( updatePointersDown( tracker, event, gPoints, 0 ) ) { // 0 means primary button press/release or touch contact
|
||||||
$.stopEvent( event );
|
$.stopEvent( event );
|
||||||
capturePointer( tracker, 'touch' );
|
capturePointer( tracker, 'touch', touchCount );
|
||||||
}
|
}
|
||||||
|
|
||||||
$.cancelEvent( event );
|
$.cancelEvent( event );
|
||||||
@ -2128,7 +2128,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ( updatePointersUp( tracker, event, gPoints, 0 ) ) {
|
if ( updatePointersUp( tracker, event, gPoints, 0 ) ) {
|
||||||
releasePointer( tracker, 'touch' );
|
releasePointer( tracker, 'touch', touchCount );
|
||||||
}
|
}
|
||||||
|
|
||||||
// simulate touchleave on our tracked element
|
// simulate touchleave on our tracked element
|
||||||
|
@ -53,6 +53,7 @@
|
|||||||
<!-- Helpers -->
|
<!-- Helpers -->
|
||||||
<script src="/test/helpers/legacy.mouse.shim.js"></script>
|
<script src="/test/helpers/legacy.mouse.shim.js"></script>
|
||||||
<script src="/test/helpers/test.js"></script>
|
<script src="/test/helpers/test.js"></script>
|
||||||
|
<script src="/test/helpers/touch.js"></script>
|
||||||
|
|
||||||
<!-- Modules -->
|
<!-- Modules -->
|
||||||
<!-- Polyfill must be inserted first because it is testing functions
|
<!-- Polyfill must be inserted first because it is testing functions
|
||||||
|
134
test/helpers/touch.js
Normal file
134
test/helpers/touch.js
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/* global TouchUtil, $ */
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
var touches,
|
||||||
|
identifier,
|
||||||
|
target;
|
||||||
|
|
||||||
|
// ----------
|
||||||
|
window.TouchUtil = {
|
||||||
|
reset: function () {
|
||||||
|
touches = [];
|
||||||
|
identifier = 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
initTracker: function ( tracker ) {
|
||||||
|
// for testing in other touch-enabled browsers
|
||||||
|
if ( !('ontouchstart' in window) ) {
|
||||||
|
tracker.setTracking( false );
|
||||||
|
OpenSeadragon.MouseTracker.subscribeEvents.push( 'touchstart', 'touchend' );
|
||||||
|
tracker.setTracking( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
target = tracker.element;
|
||||||
|
},
|
||||||
|
|
||||||
|
resetTracker: function ( tracker ) {
|
||||||
|
// for testing in other touch-enabled browsers
|
||||||
|
if ( !('ontouchstart' in window) ) {
|
||||||
|
tracker.setTracking( false );
|
||||||
|
['touchstart', 'touchend'].forEach(function ( type ) {
|
||||||
|
var index = OpenSeadragon.MouseTracker.subscribeEvents.indexOf( type );
|
||||||
|
if ( index > -1 ) {
|
||||||
|
OpenSeadragon.MouseTracker.subscribeEvents.splice( index, 1 );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
tracker.setTracking( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
target = null;
|
||||||
|
},
|
||||||
|
|
||||||
|
start: function () {
|
||||||
|
var touch,
|
||||||
|
event,
|
||||||
|
newTouches = [];
|
||||||
|
|
||||||
|
for ( var i = 0; i < arguments.length; i++ ) {
|
||||||
|
touch = createTouch(
|
||||||
|
target.offsetLeft + arguments[ i ][ 0 ],
|
||||||
|
target.offsetTop + arguments[ i ][ 1 ]
|
||||||
|
);
|
||||||
|
|
||||||
|
touches.push( touch );
|
||||||
|
newTouches.push( touch );
|
||||||
|
}
|
||||||
|
|
||||||
|
event = createTouchEvent( 'touchstart', newTouches );
|
||||||
|
target.dispatchEvent( event );
|
||||||
|
return newTouches.length === 1 ? newTouches[ 0 ] : newTouches;
|
||||||
|
},
|
||||||
|
|
||||||
|
end: function ( changedTouches ) {
|
||||||
|
if ( !$.isArray( changedTouches ) ) {
|
||||||
|
changedTouches = [ changedTouches ];
|
||||||
|
}
|
||||||
|
|
||||||
|
var event;
|
||||||
|
touches = touches.filter(function ( touch ) {
|
||||||
|
return changedTouches.indexOf( touch ) === -1;
|
||||||
|
});
|
||||||
|
|
||||||
|
event = createTouchEvent( 'touchend', changedTouches );
|
||||||
|
target.dispatchEvent( event );
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----------
|
||||||
|
function createTouch( x, y ) {
|
||||||
|
try {
|
||||||
|
// new spec
|
||||||
|
return new Touch({
|
||||||
|
identifier: identifier++,
|
||||||
|
target: target,
|
||||||
|
pageX: target.offsetLeft + x,
|
||||||
|
pageY: target.offsetTop + y
|
||||||
|
} );
|
||||||
|
} catch (e) {
|
||||||
|
// legacy
|
||||||
|
return document.createTouch( window, target, identifier++, x, y, x, y );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function createTouchList( touches ) {
|
||||||
|
// legacy
|
||||||
|
return document.createTouchList.apply( document, touches );
|
||||||
|
}
|
||||||
|
|
||||||
|
function createTouchEvent( type, changedTouches ) {
|
||||||
|
try {
|
||||||
|
// new spec
|
||||||
|
return new TouchEvent( type, {
|
||||||
|
view: window,
|
||||||
|
bubbles: true,
|
||||||
|
cancelable: true,
|
||||||
|
touches: touches,
|
||||||
|
targetTouches: touches,
|
||||||
|
changedTouches: changedTouches
|
||||||
|
} );
|
||||||
|
} catch (e) {
|
||||||
|
// legacy
|
||||||
|
var touchEvent = document.createEvent( 'TouchEvent' );
|
||||||
|
var touch1 = changedTouches[ 0 ];
|
||||||
|
touchEvent.initTouchEvent(
|
||||||
|
createTouchList( touches ), // touches
|
||||||
|
createTouchList( touches ), // targetTouches
|
||||||
|
createTouchList( changedTouches ), // changedTouches
|
||||||
|
type, // type
|
||||||
|
window, // view
|
||||||
|
touch1.screenX, // screenX
|
||||||
|
touch1.screenY, // screenY
|
||||||
|
touch1.clientX, // clientX
|
||||||
|
touch1.clientY, // clientY
|
||||||
|
false, // ctrlKey
|
||||||
|
false, // altKey
|
||||||
|
false, // shiftKey
|
||||||
|
false // metaKey
|
||||||
|
);
|
||||||
|
return touchEvent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
})();
|
@ -1,4 +1,4 @@
|
|||||||
/* global module, asyncTest, $, ok, equal, notEqual, start, test, Util, testLog */
|
/* global module, asyncTest, $, ok, equal, notEqual, start, test, TouchUtil, Util, testLog */
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
var viewer;
|
var viewer;
|
||||||
@ -677,6 +677,82 @@
|
|||||||
viewer.open( '/test/data/testpattern.dzi' );
|
viewer.open( '/test/data/testpattern.dzi' );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
// ----------
|
||||||
|
if ('TouchEvent' in window) {
|
||||||
|
asyncTest( 'MouseTracker: touch events', function () {
|
||||||
|
var $canvas = $( viewer.element ).find( '.openseadragon-canvas' ).not( '.navigator .openseadragon-canvas' ),
|
||||||
|
tracker = viewer.innerTracker,
|
||||||
|
touches;
|
||||||
|
|
||||||
|
var reset = function () {
|
||||||
|
touches = [];
|
||||||
|
TouchUtil.reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
var assessTouchExpectations = function ( expected ) {
|
||||||
|
var pointersList = tracker.getActivePointersListByType( 'touch' );
|
||||||
|
if ('captureCount' in expected) {
|
||||||
|
equal( pointersList.captureCount, expected.captureCount, expected.description + 'Pointer capture count matches expected (' + expected.captureCount + ')' );
|
||||||
|
}
|
||||||
|
if ('contacts' in expected) {
|
||||||
|
equal( pointersList.contacts, expected.contacts, expected.description + 'Pointer contact count matches expected (' + expected.contacts + ')' );
|
||||||
|
}
|
||||||
|
if ('trackedPointers' in expected) {
|
||||||
|
equal( pointersList.getLength(), expected.trackedPointers, expected.description + 'Tracked pointer count matches expected (' + expected.trackedPointers + ')' );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var onOpen = function ( event ) {
|
||||||
|
viewer.removeHandler( 'open', onOpen );
|
||||||
|
|
||||||
|
TouchUtil.initTracker( tracker );
|
||||||
|
|
||||||
|
// start-end-end (multi-touch start event)
|
||||||
|
reset();
|
||||||
|
touches = TouchUtil.start( [0,0], [20,20] );
|
||||||
|
assessTouchExpectations({
|
||||||
|
description: 'start-end-end (multi-touch start event) [capture]: ',
|
||||||
|
captureCount: 2,
|
||||||
|
contacts: 2,
|
||||||
|
trackedPointers: 2
|
||||||
|
});
|
||||||
|
TouchUtil.end( touches[1] );
|
||||||
|
TouchUtil.end( touches[0] );
|
||||||
|
assessTouchExpectations({
|
||||||
|
description: 'start-end-end (multi-touch start event) [release]: ',
|
||||||
|
captureCount: 0,
|
||||||
|
contacts: 0,
|
||||||
|
trackedPointers: 0
|
||||||
|
});
|
||||||
|
|
||||||
|
// start-start-end (multi-touch end event)
|
||||||
|
reset();
|
||||||
|
touches.push( TouchUtil.start([0, 0]) );
|
||||||
|
touches.push( TouchUtil.start([20, 20]) );
|
||||||
|
assessTouchExpectations({
|
||||||
|
description: 'start-start-end (multi-touch end event) [capture]: ',
|
||||||
|
captureCount: 2,
|
||||||
|
contacts: 2,
|
||||||
|
trackedPointers: 2
|
||||||
|
});
|
||||||
|
TouchUtil.end( touches );
|
||||||
|
assessTouchExpectations({
|
||||||
|
description: 'start-start-end (multi-touch end event) [release]: ',
|
||||||
|
captureCount: 0,
|
||||||
|
contacts: 0,
|
||||||
|
trackedPointers: 0
|
||||||
|
});
|
||||||
|
|
||||||
|
TouchUtil.resetTracker( tracker );
|
||||||
|
viewer.close();
|
||||||
|
start();
|
||||||
|
};
|
||||||
|
|
||||||
|
viewer.addHandler( 'open', onOpen );
|
||||||
|
viewer.open( '/test/data/testpattern.dzi' );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
// ----------
|
// ----------
|
||||||
asyncTest('Viewer: preventDefaultAction', function() {
|
asyncTest('Viewer: preventDefaultAction', function() {
|
||||||
var $canvas = $(viewer.element).find('.openseadragon-canvas')
|
var $canvas = $(viewer.element).find('.openseadragon-canvas')
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
<script src="/build/openseadragon/openseadragon.js"></script>
|
<script src="/build/openseadragon/openseadragon.js"></script>
|
||||||
<script src="/test/helpers/legacy.mouse.shim.js"></script>
|
<script src="/test/helpers/legacy.mouse.shim.js"></script>
|
||||||
<script src="/test/helpers/test.js"></script>
|
<script src="/test/helpers/test.js"></script>
|
||||||
|
<script src="/test/helpers/touch.js"></script>
|
||||||
|
|
||||||
<!-- Polyfill must be inserted first because it is testing functions
|
<!-- Polyfill must be inserted first because it is testing functions
|
||||||
reassignments which could be done by other test. -->
|
reassignments which could be done by other test. -->
|
||||||
|
Loading…
x
Reference in New Issue
Block a user