[react-events] Refine executeUserEventHandler (#16662)
Dominic Gannaway committed
Sep 5, 2019 at 00:36 UTC
e86146e714bb98e973404350069915bf2760a1bd
3 files changed
+18
-12
packages/legacy-events/ReactGenericBatching.js
+5
-2
@@ -9,7 +9,9 @@ import {
9
needsStateRestore,
10
restoreStateIfNeeded,
11
} from './ReactControlledComponent';
12
+
13
import {enableFlareAPI} from 'shared/ReactFeatureFlags';
14
+import {invokeGuardedCallbackAndCatchFirstError} from 'shared/ReactErrorUtils';
15
16
// Used as a way to call batchedUpdates when we don't have a reference to
17
// the renderer. Such as when we're dispatching events or if third party
@@ -76,11 +78,12 @@ export function batchedEventUpdates(fn, a, b) {
78
}
79
80
// This is for the React Flare event system
79
-export function executeUserEventHandler(fn: any => void, value: any): any {
81
+export function executeUserEventHandler(fn: any => void, value: any): void {
82
const previouslyInEventHandler = isInsideEventHandler;
83
try {
84
isInsideEventHandler = true;
83
- return fn(value);
85
+ const type = typeof value === 'object' && value !== null ? value.type : '';
86
+ invokeGuardedCallbackAndCatchFirstError(type, fn, undefined, value);
87
} finally {
88
isInsideEventHandler = previouslyInEventHandler;
89
}
packages/react-dom/src/events/DOMEventResponderSystem.js
+8
-5
@@ -92,27 +92,30 @@ const eventResponderContext: ReactDOMResponderContext = {
92
eventValue: any,
93
eventListener: any => void,
94
eventPriority: EventPriority,
95
- ): any {
95
+ ): void {
96
validateResponderContext();
97
validateEventValue(eventValue);
98
switch (eventPriority) {
99
case DiscreteEvent: {
100
flushDiscreteUpdatesIfNeeded(currentTimeStamp);
101
- return discreteUpdates(() =>
101
+ discreteUpdates(() =>
102
executeUserEventHandler(eventListener, eventValue),
103
);
104
+ break;
105
}
106
case UserBlockingEvent: {
107
if (enableUserBlockingEvents) {
107
- return runWithPriority(UserBlockingPriority, () =>
108
+ runWithPriority(UserBlockingPriority, () =>
109
executeUserEventHandler(eventListener, eventValue),
110
);
111
} else {
111
- return executeUserEventHandler(eventListener, eventValue);
112
+ executeUserEventHandler(eventListener, eventValue);
113
}
114
+ break;
115
}
116
case ContinuousEvent: {
115
- return executeUserEventHandler(eventListener, eventValue);
117
+ executeUserEventHandler(eventListener, eventValue);
118
+ break;
119
}
120
}
121
},
packages/react-events/src/dom/Keyboard.js
+5
-5
@@ -173,11 +173,11 @@ function dispatchKeyboardEvent(
173
type,
174
defaultPrevented,
175
);
176
- const shouldPropagate = context.dispatchEvent(
177
- syntheticEvent,
178
- listener,
179
- DiscreteEvent,
180
- );
176
+ let shouldPropagate;
177
+ const listenerWithReturnValue = e => {
178
+ shouldPropagate = listener(e);
179
+ };
180
+ context.dispatchEvent(syntheticEvent, listenerWithReturnValue, DiscreteEvent);
181
if (shouldPropagate) {
182
context.continuePropagation();
183
}