From af5748830ecdf9add29dcb92c5db39015b2397ed Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Tue, 30 Jun 2020 16:32:11 +0100 Subject: [PATCH] Also fix #16734 --- packages/shared/invokeGuardedCallbackImpl.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/shared/invokeGuardedCallbackImpl.js b/packages/shared/invokeGuardedCallbackImpl.js index 117663abc1f8..60e32e0a5528 100644 --- a/packages/shared/invokeGuardedCallbackImpl.js +++ b/packages/shared/invokeGuardedCallbackImpl.js @@ -116,12 +116,7 @@ if (__DEV__) { 'event', ); - // Create an event handler for our fake event. We will synchronously - // dispatch our fake event using `dispatchEvent`. Inside the handler, we - // call the user-provided callback. - const funcArgs = Array.prototype.slice.call(arguments, 3); - function callCallback() { - didCall = true; + function restoreAfterDispatch() { // We immediately remove the callback from event listeners so that // nested `invokeGuardedCallback` calls do not clash. Otherwise, a // nested call would trigger the fake event handlers of any call higher @@ -138,7 +133,15 @@ if (__DEV__) { ) { window.event = windowEvent; } + } + // Create an event handler for our fake event. We will synchronously + // dispatch our fake event using `dispatchEvent`. Inside the handler, we + // call the user-provided callback. + const funcArgs = Array.prototype.slice.call(arguments, 3); + function callCallback() { + didCall = true; + restoreAfterDispatch(); func.apply(context, funcArgs); didError = false; } @@ -195,7 +198,7 @@ if (__DEV__) { Object.defineProperty(window, 'event', windowEventDescriptor); } - if (didError) { + if (didCall && didError) { if (!didSetError) { // The callback errored, but the error event never fired. error = new Error( @@ -226,6 +229,7 @@ if (__DEV__) { // https://github.com/facebook/react/issues/16734 // https://github.com/facebook/react/issues/16585 // Fall back to the production implementation. + restoreAfterDispatch(); return invokeGuardedCallbackProd.apply(this, arguments); } };