Skip to content

Commit 22ffb57

Browse files
committed
Merge pull request #2415 from zpao/sync-internal
Sync internal
2 parents 8633699 + ff12423 commit 22ffb57

File tree

3 files changed

+49
-8
lines changed

3 files changed

+49
-8
lines changed

src/browser/eventPlugins/TapEventPlugin.js

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,15 @@ var dependencies = [
6262
topLevelTypes.topMouseUp
6363
];
6464

65+
var touchDependencies = [
66+
topLevelTypes.topTouchStart,
67+
topLevelTypes.topTouchCancel,
68+
topLevelTypes.topTouchEnd,
69+
topLevelTypes.topTouchMove
70+
];
71+
6572
if (EventPluginUtils.useTouchEvents) {
66-
dependencies.push(
67-
topLevelTypes.topTouchCancel,
68-
topLevelTypes.topTouchEnd,
69-
topLevelTypes.topTouchStart,
70-
topLevelTypes.topTouchMove
71-
);
73+
dependencies = dependencies.concat(touchDependencies);
7274
}
7375

7476
var eventTypes = {
@@ -81,6 +83,10 @@ var eventTypes = {
8183
}
8284
};
8385

86+
var usedTouch = false;
87+
var usedTouchTime = 0;
88+
var TOUCH_DELAY = 500;
89+
8490
var TapEventPlugin = {
8591

8692
tapMoveThreshold: tapMoveThreshold,
@@ -103,6 +109,17 @@ var TapEventPlugin = {
103109
if (!isStartish(topLevelType) && !isEndish(topLevelType)) {
104110
return null;
105111
}
112+
// on ios, there is a delay after touch event and synthetic
113+
// mouse events, so that user can perform double tap
114+
// solution: ignore mouse events following touchevent within small timeframe
115+
if (touchDependencies.indexOf(topLevelType) !== -1) {
116+
usedTouch = true;
117+
usedTouchTime = Date.now();
118+
} else {
119+
if (usedTouch && (Date.now() - usedTouchTime < TOUCH_DELAY)) {
120+
return;
121+
}
122+
}
106123
var event = null;
107124
var distance = getDistance(startCoords, nativeEvent);
108125
if (isEndish(topLevelType) && distance < tapMoveThreshold) {

src/core/__tests__/ReactPropTypes-test.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -407,8 +407,32 @@ describe('ReactPropTypes', function() {
407407
});
408408

409409
it('should still work for deprecated typechecks', function() {
410-
typeCheckPass(PropTypes.renderable, []);
411-
typeCheckPass(PropTypes.renderable.isRequired, []);
410+
// We can't use typeCheckPass here because the warning module may do
411+
// something different in some environments. Luckily they should be fine
412+
// if they detect that console.warn is spied upon.
413+
spyOn(console, 'warn');
414+
415+
// typeCheckPass(PropTypes.renderable, []);
416+
var error = PropTypes.renderable(
417+
{testProp: []},
418+
'testProp',
419+
'testComponent',
420+
ReactPropTypeLocations.prop
421+
);
422+
423+
expect(error).toBe(undefined);
424+
expect(console.warn.calls.length).toBe(1);
425+
426+
// typeCheckPass(PropTypes.renderable.isRequired, []);
427+
error = PropTypes.renderable.isRequired(
428+
{testProp: []},
429+
'testProp',
430+
'testComponent',
431+
ReactPropTypeLocations.prop
432+
);
433+
434+
expect(error).toBe(undefined);
435+
expect(console.warn.calls.length).toBe(1);
412436
});
413437
});
414438

File renamed without changes.

0 commit comments

Comments
 (0)