From 17e703cb9692c26795c794a54e2239f603ee090d Mon Sep 17 00:00:00 2001 From: Sergei Startsev Date: Tue, 25 Sep 2018 18:24:23 +0300 Subject: [PATCH] Restore global window.event after event dispatching (#13688) (#13697) --- packages/shared/invokeGuardedCallbackImpl.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/shared/invokeGuardedCallbackImpl.js b/packages/shared/invokeGuardedCallbackImpl.js index 70cedd4cb32d2..74ec54c871b0b 100644 --- a/packages/shared/invokeGuardedCallbackImpl.js +++ b/packages/shared/invokeGuardedCallbackImpl.js @@ -98,6 +98,13 @@ if (__DEV__) { // browsers that support it. let windowEvent = window.event; + // Keeps track of the descriptor of window.event to restore it after event + // dispatching: https://github.com/facebook/react/issues/13688 + const windowEventDescriptor = Object.getOwnPropertyDescriptor( + window, + '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. @@ -172,6 +179,10 @@ if (__DEV__) { evt.initEvent(evtType, false, false); fakeNode.dispatchEvent(evt); + if (windowEventDescriptor) { + Object.defineProperty(window, 'event', windowEventDescriptor); + } + if (didError) { if (!didSetError) { // The callback errored, but the error event never fired.