123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- var el,
- hammer;
- module('Simultaenous recognition', {
- setup: function() {
- el = utils.createHitArea()
- },
- teardown: function() {
- hammer && hammer.destroy();
- }
- });
- asyncTest('should pinch and pan simultaneously be recognized when enabled', function() {
- expect(4);
- var panCount = 0,
- pinchCount = 0;
- hammer = new Hammer.Manager(el, {
- touchAction: 'none'
- });
- hammer.add(new Hammer.Pan({threshold: 5, pointers: 2}));
- var pinch = new Hammer.Pinch({ threshold: 0, pointers: 2});
- hammer.add(pinch);
- pinch.recognizeWith(hammer.get('pan'));
- hammer.on('panend', function() {
- panCount++;
- });
- hammer.on('pinchend', function() {
- pinchCount++;
- });
- var executeGesture = function(cb) {
- var event, touches;
- touches = [
- {clientX: 0, clientY: 10, identifier: 0, target: el },
- {clientX: 10, clientY: 10, identifier: 1, target: el }
- ];
- event = document.createEvent('Event');
- event.initEvent('touchstart', true, true);
- event.touches = touches;
- event.targetTouches = touches;
- event.changedTouches = touches;
- el.dispatchEvent(event);
- setTimeout(function() {
- touches = [
- {clientX: 10, clientY: 20, identifier: 0, target: el },
- {clientX: 20, clientY: 20, identifier: 1, target: el }
- ];
- event = document.createEvent('Event');
- event.initEvent('touchmove', true, true);
- event.touches = touches;
- event.targetTouches = touches;
- event.changedTouches = touches;
- el.dispatchEvent(event);
- }, 100);
- setTimeout(function() {
- touches = [
- {clientX: 20, clientY: 30, identifier: 0, target: el },
- {clientX: 40, clientY: 30, identifier: 1, target: el }
- ];
- event = document.createEvent('Event');
- event.initEvent('touchmove', true, true);
- event.touches = touches;
- event.targetTouches = touches;
- event.changedTouches = touches;
- el.dispatchEvent(event);
- event = document.createEvent('Event');
- event.initEvent('touchend', true, true);
- event.touches = touches;
- event.targetTouches = touches;
- event.changedTouches = touches;
- el.dispatchEvent(event);
- cb();
- }, 200);
- };
- // 2 gesture will be recognized
- executeGesture(function() {
- equal(panCount, 1);
- equal(pinchCount, 1);
- pinch.dropRecognizeWith(hammer.get('pan'));
- // only the pan gesture will be recognized
- executeGesture(function() {
- equal(panCount, 2);
- equal(pinchCount, 1);
- start();
- });
- });
- });
- test('the first gesture should block the following gestures (Tap & DoubleTap)', function() {
- expect(4);
- var tapCount = 0,
- doubleTapCount = 0;
- hammer = new Hammer.Manager(el, {
- touchAction: 'none'
- });
- var tap = new Hammer.Tap();
- var doubleTap = new Hammer.Tap({event: 'doubletap', taps: 2});
- hammer.add(tap);
- hammer.add(doubleTap);
- hammer.on('tap', function() {
- tapCount++;
- });
- hammer.on('doubletap', function() {
- doubleTapCount++;
- });
- utils.dispatchTouchEvent(el, 'start', 0, 10);
- utils.dispatchTouchEvent(el, 'end', 0, 10);
- utils.dispatchTouchEvent(el, 'start', 0, 10);
- utils.dispatchTouchEvent(el, 'end', 0, 10);
- equal(tapCount, 2, 'on a double tap gesture, the tap gesture is recognized twice');
- equal(doubleTapCount, 0, 'double tap gesture is not recognized because the prior tap gesture does not recognize it simultaneously');
- doubleTap.recognizeWith(hammer.get('tap'));
- utils.dispatchTouchEvent(el, 'start', 0, 10);
- utils.dispatchTouchEvent(el, 'end', 0, 10);
- utils.dispatchTouchEvent(el, 'start', 0, 10);
- utils.dispatchTouchEvent(el, 'end', 0, 10);
- equal(tapCount, 4);
- equal(doubleTapCount, 1, 'when the tap gesture is configured to work simultaneously, tap & doubleTap can be recognized simultaneously');
- });
- test('when disabled, the first gesture should not block gestures (Tap & DoubleTap )', function() {
- expect(4);
- var tapCount = 0,
- doubleTapCount = 0;
- hammer = new Hammer.Manager(el, {
- touchAction: 'none'
- });
- var tap = new Hammer.Tap();
- var doubleTap = new Hammer.Tap({event: 'doubletap', taps: 2});
- hammer.add(tap);
- hammer.add(doubleTap);
- hammer.on('tap', function() {
- tapCount++;
- });
- hammer.on('doubletap', function() {
- doubleTapCount++;
- });
- utils.dispatchTouchEvent(el, 'start', 0, 10);
- utils.dispatchTouchEvent(el, 'end', 0, 10);
- utils.dispatchTouchEvent(el, 'start', 0, 10);
- utils.dispatchTouchEvent(el, 'end', 0, 10);
- equal(tapCount, 2, 'on a double tap gesture, the tap gesture is recognized twice');
- equal(doubleTapCount, 0, 'double tap gesture is not recognized because the prior tap gesture does not recognize it simultaneously');
- hammer.get('tap').set({ enable: false });
- utils.dispatchTouchEvent(el, 'start', 0, 10);
- utils.dispatchTouchEvent(el, 'end', 0, 10);
- utils.dispatchTouchEvent(el, 'start', 0, 10);
- utils.dispatchTouchEvent(el, 'end', 0, 10);
- equal(tapCount, 2, 'tap gesture should not be recognized when the recognizer is disabled');
- equal(doubleTapCount, 1, 'when the tap gesture is disabled, doubleTap can be recognized');
- });
- test('the first gesture should block the following gestures (DoubleTap & Tap)', function() {
- expect(4);
- var tapCount = 0,
- doubleTapCount = 0;
- hammer = new Hammer.Manager(el, {
- touchAction: 'none'
- });
- var tap = new Hammer.Tap();
- var doubleTap = new Hammer.Tap({event: 'doubletap', taps: 2});
- hammer.add(doubleTap);
- hammer.add(tap);
- hammer.on('tap', function() {
- tapCount++;
- });
- hammer.on('doubletap', function() {
- doubleTapCount++;
- });
- utils.dispatchTouchEvent(el, 'start', 0, 10);
- utils.dispatchTouchEvent(el, 'end', 0, 10);
- utils.dispatchTouchEvent(el, 'start', 0, 10);
- utils.dispatchTouchEvent(el, 'end', 0, 10);
- equal(doubleTapCount, 1, 'double tap is recognized');
- equal(tapCount, 1, 'tap is detected, the doubletap is only catched by the doubletap recognizer');
- // doubletap and tap together
- doubleTap.recognizeWith(hammer.get('tap'));
- doubleTapCount = 0;
- tapCount = 0;
- utils.dispatchTouchEvent(el, 'start', 0, 10);
- utils.dispatchTouchEvent(el, 'end', 0, 10);
- utils.dispatchTouchEvent(el, 'start', 0, 10);
- utils.dispatchTouchEvent(el, 'end', 0, 10);
- equal(doubleTapCount, 1);
- equal(tapCount, 2, 'when the tap gesture is configured to work simultaneously, tap & doubleTap can be recognized simultaneously');
- });
|