Ignore events on not-yet-mounted fibers (#9742)
This isn't necessarily what we want long-term especially with more async, but currently we crash in jsdom in some cases when an img load event gets dispatched synchronously. (Needed for FB-internal D5060180.)
Ben Alpert committed
May 26, 2017 at 16:46 UTC
ba7ba84ec3991001e481a181338eac37deb0aeac
1 file changed
+12
src/renderers/dom/shared/ReactDOMEventListener.js
+12
@@ -14,6 +14,7 @@
14
var EventListener = require('fbjs/lib/EventListener');
15
var PooledClass = require('PooledClass');
16
var ReactDOMComponentTree = require('ReactDOMComponentTree');
17
+var ReactFiberTreeReflection = require('ReactFiberTreeReflection');
18
var ReactGenericBatching = require('ReactGenericBatching');
19
var ReactTypeOfWork = require('ReactTypeOfWork');
20
@@ -178,6 +179,17 @@ var ReactDOMEventListener = {
179
var targetInst = ReactDOMComponentTree.getClosestInstanceFromNode(
180
nativeEventTarget,
181
);
182
+ if (
183
+ targetInst !== null &&
184
+ typeof targetInst.tag === 'number' &&
185
+ !ReactFiberTreeReflection.isFiberMounted(targetInst)
186
+ ) {
187
+ // If we get an event (ex: img onload) before committing that
188
+ // component's mount, ignore it for now (that is, treat it as if it was an
189
+ // event on a non-React tree). We might also consider queueing events and
190
+ // dispatching them after the mount.
191
+ targetInst = null;
192
+ }
193
194
var bookKeeping = TopLevelCallbackBookKeeping.getPooled(
195
topLevelType,