Skip to content

Commit f1c2d3b

Browse files
committed
fix remove non-existant recognizer
* When removing a recognizer, make sure it exists before removal. If recognizer has not been registered to manager inArray will return -1. The negative index passed to Array.splice will remove last element of the recognizers array.
1 parent 189098f commit f1c2d3b

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

src/manager.js

+11-3
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,19 @@ Manager.prototype = {
171171
return this;
172172
}
173173

174-
var recognizers = this.recognizers;
175174
recognizer = this.get(recognizer);
176-
recognizers.splice(inArray(recognizers, recognizer), 1);
177175

178-
this.touchAction.update();
176+
// let's make sure this recognizer exists
177+
if (recognizer) {
178+
var recognizers = this.recognizers;
179+
var index = inArray(recognizers, recognizer);
180+
181+
if (index !== -1) {
182+
recognizers.splice(index, 1);
183+
this.touchAction.update();
184+
}
185+
}
186+
179187
return this;
180188
},
181189

tests/unit/test_hammer.js

+14
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,17 @@ test('Hammer.Manager accepts recognizers as arrays.', function() {
143143
equal(2, Object.keys(recognizerActual.simultaneous).length);
144144
equal(1, recognizerActual.requireFail.length);
145145
});
146+
147+
/*
148+
* Removing a recognizer which cannot be found would errantly remove the last recognizer in the
149+
* manager's list.
150+
*/
151+
test('Remove non-existent recognizer.', function() {
152+
expect(1);
153+
154+
hammer = new Hammer(el, {recognizers: []});
155+
hammer.add(new Hammer.Swipe());
156+
hammer.remove('tap');
157+
158+
equal(1, hammer.recognizers.length);
159+
});

0 commit comments

Comments
 (0)