From 49851ff1e557c9b6021dbcb9e21f9848bbbd81ba Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Mon, 16 Apr 2018 21:52:30 -0400 Subject: [PATCH 01/18] throw warning for falsey `value` prop --- packages/react-dom/src/shared/ReactControlledValuePropTypes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-dom/src/shared/ReactControlledValuePropTypes.js b/packages/react-dom/src/shared/ReactControlledValuePropTypes.js index 5b8dbdde2f262..a3dc7383d1cc1 100644 --- a/packages/react-dom/src/shared/ReactControlledValuePropTypes.js +++ b/packages/react-dom/src/shared/ReactControlledValuePropTypes.js @@ -25,7 +25,7 @@ if (__DEV__) { const propTypes = { value: function(props, propName, componentName) { if ( - !props[propName] || + !(propName in props) || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || From 32547ff3b67b4f7115e14210bf56ac3361d6b70e Mon Sep 17 00:00:00 2001 From: Nicole Levy Date: Mon, 16 Apr 2018 21:54:40 -0400 Subject: [PATCH 02/18] add nop onChange handler to tests for `value` prop --- .../__tests__/DOMPropertyOperations-test.js | 4 ++- .../src/__tests__/ReactDOMInput-test.js | 30 +++++++++---------- .../src/__tests__/ReactDOMSelect-test.js | 10 ++++--- .../src/__tests__/ReactDOMTextarea-test.js | 6 ++-- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/packages/react-dom/src/__tests__/DOMPropertyOperations-test.js b/packages/react-dom/src/__tests__/DOMPropertyOperations-test.js index aabb3e995f864..d93a4b071cfb8 100644 --- a/packages/react-dom/src/__tests__/DOMPropertyOperations-test.js +++ b/packages/react-dom/src/__tests__/DOMPropertyOperations-test.js @@ -9,6 +9,8 @@ 'use strict'; +const emptyFunction = require('fbjs/lib/emptyFunction'); + describe('DOMPropertyOperations', () => { let React; let ReactDOM; @@ -79,7 +81,7 @@ describe('DOMPropertyOperations', () => { it('should not remove empty attributes for special properties', () => { const container = document.createElement('div'); - ReactDOM.render(, container); + ReactDOM.render(, container); expect(container.firstChild.getAttribute('value')).toBe(''); expect(container.firstChild.value).toBe(''); }); diff --git a/packages/react-dom/src/__tests__/ReactDOMInput-test.js b/packages/react-dom/src/__tests__/ReactDOMInput-test.js index 03eed7bc1ec65..60b10c3cb1557 100644 --- a/packages/react-dom/src/__tests__/ReactDOMInput-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMInput-test.js @@ -475,7 +475,7 @@ describe('ReactDOMInput', () => { }); it('should display `value` of number 0', () => { - let stub = ; + let stub = ; stub = ReactTestUtils.renderIntoDocument(stub); const node = ReactDOM.findDOMNode(stub); @@ -625,8 +625,8 @@ describe('ReactDOMInput', () => { it('should properly transition from an empty value to 0', function() { const container = document.createElement('div'); - ReactDOM.render(, container); - ReactDOM.render(, container); + ReactDOM.render(, container); + ReactDOM.render(, container); const node = container.firstChild; @@ -637,8 +637,8 @@ describe('ReactDOMInput', () => { it('should properly transition from 0 to an empty value', function() { const container = document.createElement('div'); - ReactDOM.render(, container); - ReactDOM.render(, container); + ReactDOM.render(, container); + ReactDOM.render(, container); const node = container.firstChild; @@ -649,8 +649,8 @@ describe('ReactDOMInput', () => { it('should properly transition a text input from 0 to an empty 0.0', function() { const container = document.createElement('div'); - ReactDOM.render(, container); - ReactDOM.render(, container); + ReactDOM.render(, container); + ReactDOM.render(, container); const node = container.firstChild; @@ -661,8 +661,8 @@ describe('ReactDOMInput', () => { it('should properly transition a number input from "" to 0', function() { const container = document.createElement('div'); - ReactDOM.render(, container); - ReactDOM.render(, container); + ReactDOM.render(, container); + ReactDOM.render(, container); const node = container.firstChild; @@ -673,8 +673,8 @@ describe('ReactDOMInput', () => { it('should properly transition a number input from "" to "0"', function() { const container = document.createElement('div'); - ReactDOM.render(, container); - ReactDOM.render(, container); + ReactDOM.render(, container); + ReactDOM.render(, container); const node = container.firstChild; @@ -937,14 +937,14 @@ describe('ReactDOMInput', () => { it('should warn if value is null', () => { expect(() => - ReactTestUtils.renderIntoDocument(), + ReactTestUtils.renderIntoDocument(), ).toWarnDev( '`value` prop on `input` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', ); - ReactTestUtils.renderIntoDocument(); + ReactTestUtils.renderIntoDocument(); }); it('should warn if checked and defaultChecked props are specified', () => { @@ -1054,7 +1054,7 @@ describe('ReactDOMInput', () => { const container = document.createElement('div'); ReactDOM.render(stub, container); expect(() => - ReactDOM.render(, container), + ReactDOM.render(, container), ).toWarnDev( 'Warning: A component is changing an uncontrolled input of type text to be controlled. ' + 'Input elements should not switch from uncontrolled to controlled (or vice versa). ' + @@ -1065,7 +1065,7 @@ describe('ReactDOMInput', () => { }); it('should warn if uncontrolled input (value is null) switches to controlled', () => { - const stub = ; + const stub = ; const container = document.createElement('div'); expect(() => ReactDOM.render(stub, container)).toWarnDev( '`value` prop on `input` should not be null. ' + diff --git a/packages/react-dom/src/__tests__/ReactDOMSelect-test.js b/packages/react-dom/src/__tests__/ReactDOMSelect-test.js index 19b1e00be93ad..20b2a3a58e02a 100644 --- a/packages/react-dom/src/__tests__/ReactDOMSelect-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMSelect-test.js @@ -9,6 +9,8 @@ 'use strict'; +const emptyFunction = require('fbjs/lib/emptyFunction'); + describe('ReactDOMSelect', () => { let React; let ReactDOM; @@ -534,7 +536,7 @@ describe('ReactDOMSelect', () => { it('should warn if value is null', () => { expect(() => ReactTestUtils.renderIntoDocument( -