From c4a2425eca4e2b093213f6d4a5f35469f9850a62 Mon Sep 17 00:00:00 2001 From: Sam Beveridge Date: Fri, 12 Feb 2016 14:00:15 -0700 Subject: [PATCH] Fix for issue/6027. ReactDOMSelect's _handleChange function tries to set this._wrapperState.pendingUpdate = true after executing the onChange function. However, if the select was removed as a result of said fuction, this._wrapperState would be null. Resulting in an Uncaught TypeError: Cannot set property 'pendingUpdate' of null. --- .../dom/client/wrappers/ReactDOMSelect.js | 4 +++- .../wrappers/__tests__/ReactDOMSelect-test.js | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/renderers/dom/client/wrappers/ReactDOMSelect.js b/src/renderers/dom/client/wrappers/ReactDOMSelect.js index 23462d61d4..1ca932836d 100644 --- a/src/renderers/dom/client/wrappers/ReactDOMSelect.js +++ b/src/renderers/dom/client/wrappers/ReactDOMSelect.js @@ -236,7 +236,9 @@ function _handleChange(event) { var props = this._currentElement.props; var returnValue = LinkedValueUtils.executeOnChange(props, event); - this._wrapperState.pendingUpdate = true; + if (this._rootNodeID && this._wrapperState.pendingUpdate) { + this._wrapperState.pendingUpdate = true; + } ReactUpdates.asap(updateOptionsIfPendingUpdateAndMounted, this); return returnValue; } diff --git a/src/renderers/dom/client/wrappers/__tests__/ReactDOMSelect-test.js b/src/renderers/dom/client/wrappers/__tests__/ReactDOMSelect-test.js index 4d9472472e..97736bc99a 100644 --- a/src/renderers/dom/client/wrappers/__tests__/ReactDOMSelect-test.js +++ b/src/renderers/dom/client/wrappers/__tests__/ReactDOMSelect-test.js @@ -517,4 +517,24 @@ describe('ReactDOMSelect', function() { ); expect(console.error.argsForCall.length).toBe(1); }); + + it('should be able to safely remove select onChange', function() { + function changeView() { + ReactDOM.unmountComponentAtNode(container); + } + + var container = document.createElement('div'); + var stub = + ; + stub = ReactDOM.render(stub, container); + var node = ReactDOM.findDOMNode(stub); + + expect(() => ReactTestUtils.Simulate.change(node)).not.toThrow( + "Cannot set property 'pendingUpdate' of null" + ); + }); });