From 1a320ebbdb22427498811c9a63254856e0c0f468 Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Fri, 14 Jul 2017 10:05:50 -0400 Subject: [PATCH 1/3] Fix uncontrolled radios --- .../dom/client/__tests__/inputValueTracking-test.js | 8 ++------ src/renderers/dom/client/inputValueTracking.js | 2 +- src/renderers/dom/shared/ReactDOMComponent.js | 4 ++++ 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/renderers/dom/client/__tests__/inputValueTracking-test.js b/src/renderers/dom/client/__tests__/inputValueTracking-test.js index 103964cc1d74..e96a233ba80e 100644 --- a/src/renderers/dom/client/__tests__/inputValueTracking-test.js +++ b/src/renderers/dom/client/__tests__/inputValueTracking-test.js @@ -143,15 +143,11 @@ describe('inputValueTracking', function() { it('should stop tracking', function() { inputValueTracking.track(mockComponent); - expect(mockComponent._wrapperState.hasOwnProperty('valueTracker')).toBe( - true, - ); + expect(mockComponent._wrapperState.valueTracker).not.toEqual(null); inputValueTracking.stopTracking(mockComponent); - expect(mockComponent._wrapperState.hasOwnProperty('valueTracker')).toBe( - false, - ); + expect(mockComponent._wrapperState.valueTracker).toEqual(null); expect(input.hasOwnProperty('value')).toBe(false); }); diff --git a/src/renderers/dom/client/inputValueTracking.js b/src/renderers/dom/client/inputValueTracking.js index f0086f03a153..5b300d5d05f1 100644 --- a/src/renderers/dom/client/inputValueTracking.js +++ b/src/renderers/dom/client/inputValueTracking.js @@ -31,7 +31,7 @@ function attachTracker(inst, tracker) { } function detachTracker(inst) { - delete inst._wrapperState.valueTracker; + inst._wrapperState.valueTracker = null; } function getValueFromNode(node) { diff --git a/src/renderers/dom/shared/ReactDOMComponent.js b/src/renderers/dom/shared/ReactDOMComponent.js index 6c7a1ca8bd01..77d1df67aa5e 100644 --- a/src/renderers/dom/shared/ReactDOMComponent.js +++ b/src/renderers/dom/shared/ReactDOMComponent.js @@ -909,6 +909,10 @@ ReactDOMComponent.Mixin = { // happen after `_updateDOMProperties`. Otherwise HTML5 input validations // raise warnings and prevent the new value from being assigned. ReactDOMInput.updateWrapper(this); + + // We also check that we haven't missed a value update, such as a + // Radio group shifting the checked value to another named radio input. + inputValueTracking.updateValueIfChanged(this); break; case 'textarea': ReactDOMTextarea.updateWrapper(this); From ecba3d609c823f509e5384e4996d9fc84ce664cd Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Wed, 19 Jul 2017 11:32:45 -0400 Subject: [PATCH 2/3] cherry-pick regression test from master --- .../__tests__/inputValueTracking-test.js | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/renderers/dom/client/__tests__/inputValueTracking-test.js b/src/renderers/dom/client/__tests__/inputValueTracking-test.js index e96a233ba80e..2bf1e1bbac0d 100644 --- a/src/renderers/dom/client/__tests__/inputValueTracking-test.js +++ b/src/renderers/dom/client/__tests__/inputValueTracking-test.js @@ -11,6 +11,7 @@ 'use strict'; var React = require('React'); +var ReactDOM = require('ReactDOM'); var ReactTestUtils = require('ReactTestUtils'); var inputValueTracking = require('inputValueTracking'); @@ -151,4 +152,31 @@ describe('inputValueTracking', function() { expect(input.hasOwnProperty('value')).toBe(false); }); + + + it('does not crash for nodes with custom value property', () => { + // https://github.com/facebook/react/issues/10196 + try { + var originalCreateElement = document.createElement; + document.createElement = function() { + var node = originalCreateElement.apply(this, arguments); + Object.defineProperty(node, 'value', { + get() {}, + set() {}, + }); + return node; + }; + var div = document.createElement('div'); + // Mount + var node = ReactDOM.render(, div); + // Update + ReactDOM.render(, div); + // Change + ReactTestUtils.SimulateNative.change(node); + // Unmount + ReactDOM.unmountComponentAtNode(div); + } finally { + document.createElement = originalCreateElement; + } + }); }); From f89c6b2441965d0d102a5787fd7721256fa669bc Mon Sep 17 00:00:00 2001 From: Jason Quense Date: Wed, 19 Jul 2017 16:10:34 -0400 Subject: [PATCH 3/3] prettier --- src/renderers/dom/client/__tests__/inputValueTracking-test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/renderers/dom/client/__tests__/inputValueTracking-test.js b/src/renderers/dom/client/__tests__/inputValueTracking-test.js index 2bf1e1bbac0d..8d9c5c9671fb 100644 --- a/src/renderers/dom/client/__tests__/inputValueTracking-test.js +++ b/src/renderers/dom/client/__tests__/inputValueTracking-test.js @@ -153,7 +153,6 @@ describe('inputValueTracking', function() { expect(input.hasOwnProperty('value')).toBe(false); }); - it('does not crash for nodes with custom value property', () => { // https://github.com/facebook/react/issues/10196 try {