diff --git a/src/renderers/dom/client/wrappers/ReactDOMInput.js b/src/renderers/dom/client/wrappers/ReactDOMInput.js index 04814bd869df3..8d1ad6ec5506a 100644 --- a/src/renderers/dom/client/wrappers/ReactDOMInput.js +++ b/src/renderers/dom/client/wrappers/ReactDOMInput.js @@ -213,7 +213,17 @@ var ReactDOMInput = { } } else { if (props.value == null && props.defaultValue != null) { - node.defaultValue = '' + props.defaultValue; + // In Chrome, assigning defaultValue to certain input types triggers input validation. + // For number inputs, the display value loses trailing decimal points. For email inputs, + // Chrome raises "The specified value is not a valid email address". + // + // Here we check to see if the defaultValue has actually changed, avoiding these problems + // when the user is inputting text + // + // https://github.com/facebook/react/issues/7253 + if (node.defaultValue !== '' + props.defaultValue) { + node.defaultValue = '' + props.defaultValue; + } } if (props.checked == null && props.defaultChecked != null) { node.defaultChecked = !!props.defaultChecked; diff --git a/src/renderers/dom/client/wrappers/__tests__/ReactDOMInput-test.js b/src/renderers/dom/client/wrappers/__tests__/ReactDOMInput-test.js index 04a8b3a1f4def..a09d63b0608d4 100644 --- a/src/renderers/dom/client/wrappers/__tests__/ReactDOMInput-test.js +++ b/src/renderers/dom/client/wrappers/__tests__/ReactDOMInput-test.js @@ -51,6 +51,28 @@ describe('ReactDOMInput', () => { expect(node.value).toBe('0'); }); + it('only assigns defaultValue if it changes', () => { + class Test extends React.Component { + render() { + return (); + } + } + + var component = ReactTestUtils.renderIntoDocument(); + var node = ReactDOM.findDOMNode(component); + + Object.defineProperty(node, 'defaultValue', { + get() { + return '0'; + }, + set(value) { + throw new Error(`defaultValue was assigned ${value}, but it did not change!`); + }, + }); + + component.forceUpdate(); + }); + it('should display "true" for `defaultValue` of `true`', () => { var stub = ; stub = ReactTestUtils.renderIntoDocument(stub);