From fa7804124cf784f9f26fb6007cd985116c473b4c Mon Sep 17 00:00:00 2001 From: "temu.psc" Date: Thu, 18 May 2017 18:59:43 +0800 Subject: [PATCH 1/3] [#9712] fix value ".98" should not be equal to "0.98". --- .../number-inputs/NumberInputDecimal.js | 33 +++++++++++++++++++ .../fixtures/number-inputs/index.js | 15 +++++++++ scripts/fiber/tests-passing.txt | 1 + .../dom/fiber/wrappers/ReactDOMFiberInput.js | 5 ++- .../wrappers/__tests__/ReactDOMInput-test.js | 17 ++++++++++ .../stack/client/wrappers/ReactDOMInput.js | 5 ++- 6 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 fixtures/dom/src/components/fixtures/number-inputs/NumberInputDecimal.js diff --git a/fixtures/dom/src/components/fixtures/number-inputs/NumberInputDecimal.js b/fixtures/dom/src/components/fixtures/number-inputs/NumberInputDecimal.js new file mode 100644 index 00000000000..552deb04d7d --- /dev/null +++ b/fixtures/dom/src/components/fixtures/number-inputs/NumberInputDecimal.js @@ -0,0 +1,33 @@ +const React = window.React; + +import Fixture from '../../Fixture'; + +class NumberInputDecimal extends React.Component { + state = { value: '.98' }; + changeValue = () => { + this.setState({ + value: '0.98', + }); + } + render() { + const {value} = this.state; + return ( + +
{this.props.children}
+ +
+ { + this.setState({value: e.target.value}); + }} + /> + +
+
+ ); + } +} + +export default NumberInputDecimal; diff --git a/fixtures/dom/src/components/fixtures/number-inputs/index.js b/fixtures/dom/src/components/fixtures/number-inputs/index.js index 7900bd85943..953b8cf6115 100644 --- a/fixtures/dom/src/components/fixtures/number-inputs/index.js +++ b/fixtures/dom/src/components/fixtures/number-inputs/index.js @@ -3,6 +3,7 @@ const React = window.React; import FixtureSet from '../../FixtureSet'; import TestCase from '../../TestCase'; import NumberTestCase from './NumberTestCase'; +import NumberInputDecimal from './NumberInputDecimal'; function NumberInputs() { return ( @@ -158,6 +159,20 @@ function NumberInputs() { + + +
  • initial value is '.98'
  • +
  • setState to '0.98'
  • +
    + + + the input value should be '0.98'. + + +
    ); } diff --git a/scripts/fiber/tests-passing.txt b/scripts/fiber/tests-passing.txt index 2a5bbf480ec..90f7fe918c1 100644 --- a/scripts/fiber/tests-passing.txt +++ b/scripts/fiber/tests-passing.txt @@ -1477,6 +1477,7 @@ src/renderers/dom/shared/wrappers/__tests__/ReactDOMInput-test.js * does change the number 2 to "2.0" with no change handler * does change the string "2" to "2.0" with no change handler * changes the number 2 to "2.0" using a change handler +* does change the string ".98" to "0.98" with no change handler * should display `defaultValue` of number 0 * only assigns defaultValue if it changes * should display "true" for `defaultValue` of `true` diff --git a/src/renderers/dom/fiber/wrappers/ReactDOMFiberInput.js b/src/renderers/dom/fiber/wrappers/ReactDOMFiberInput.js index 41de9687e42..2fafb88d9f0 100644 --- a/src/renderers/dom/fiber/wrappers/ReactDOMFiberInput.js +++ b/src/renderers/dom/fiber/wrappers/ReactDOMFiberInput.js @@ -204,7 +204,10 @@ var ReactDOMInput = { var valueAsNumber = parseFloat(node.value, 10) || 0; // eslint-disable-next-line - if (value != valueAsNumber) { + if ( + value != valueAsNumber || + (value == valueAsNumber && node.value != value) + ) { // Cast `value` to a string to ensure the value is set correctly. While // browsers typically do this as necessary, jsdom doesn't. node.value = '' + value; diff --git a/src/renderers/dom/shared/wrappers/__tests__/ReactDOMInput-test.js b/src/renderers/dom/shared/wrappers/__tests__/ReactDOMInput-test.js index 19a38b9e182..07cc19213c4 100644 --- a/src/renderers/dom/shared/wrappers/__tests__/ReactDOMInput-test.js +++ b/src/renderers/dom/shared/wrappers/__tests__/ReactDOMInput-test.js @@ -233,6 +233,23 @@ describe('ReactDOMInput', () => { }); }); + it('does change the string ".98" to "0.98" with no change handler', () => { + class Stub extends React.Component { + state = { + value: '.98', + }; + render() { + return ; + } + } + + var stub = ReactTestUtils.renderIntoDocument(); + var node = ReactDOM.findDOMNode(stub); + stub.setState({value: '0.98'}); + + expect(node.value).toEqual('0.98'); + }); + it('should display `defaultValue` of number 0', () => { var stub = ; stub = ReactTestUtils.renderIntoDocument(stub); diff --git a/src/renderers/dom/stack/client/wrappers/ReactDOMInput.js b/src/renderers/dom/stack/client/wrappers/ReactDOMInput.js index b05ca82b352..7565543baf2 100644 --- a/src/renderers/dom/stack/client/wrappers/ReactDOMInput.js +++ b/src/renderers/dom/stack/client/wrappers/ReactDOMInput.js @@ -196,7 +196,10 @@ var ReactDOMInput = { var valueAsNumber = parseFloat(node.value, 10) || 0; // eslint-disable-next-line - if (value != valueAsNumber) { + if ( + value != valueAsNumber || + (value == valueAsNumber && node.value != value) + ) { // Cast `value` to a string to ensure the value is set correctly. While // browsers typically do this as necessary, jsdom doesn't. node.value = '' + value; From 2a8049bce56e5dbfd4e188cde4e56973bdb89cd4 Mon Sep 17 00:00:00 2001 From: "temu.psc" Date: Thu, 18 May 2017 19:21:01 +0800 Subject: [PATCH 2/3] fix eslint error --- src/renderers/dom/fiber/wrappers/ReactDOMFiberInput.js | 3 ++- src/renderers/dom/stack/client/wrappers/ReactDOMInput.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/renderers/dom/fiber/wrappers/ReactDOMFiberInput.js b/src/renderers/dom/fiber/wrappers/ReactDOMFiberInput.js index 2fafb88d9f0..7f7e002b1aa 100644 --- a/src/renderers/dom/fiber/wrappers/ReactDOMFiberInput.js +++ b/src/renderers/dom/fiber/wrappers/ReactDOMFiberInput.js @@ -203,9 +203,10 @@ var ReactDOMInput = { // Simulate `input.valueAsNumber`. IE9 does not support it var valueAsNumber = parseFloat(node.value, 10) || 0; - // eslint-disable-next-line if ( + // eslint-disable-next-line value != valueAsNumber || + // eslint-disable-next-line (value == valueAsNumber && node.value != value) ) { // Cast `value` to a string to ensure the value is set correctly. While diff --git a/src/renderers/dom/stack/client/wrappers/ReactDOMInput.js b/src/renderers/dom/stack/client/wrappers/ReactDOMInput.js index 7565543baf2..368d577b61f 100644 --- a/src/renderers/dom/stack/client/wrappers/ReactDOMInput.js +++ b/src/renderers/dom/stack/client/wrappers/ReactDOMInput.js @@ -195,9 +195,10 @@ var ReactDOMInput = { // Simulate `input.valueAsNumber`. IE9 does not support it var valueAsNumber = parseFloat(node.value, 10) || 0; - // eslint-disable-next-line if ( + // eslint-disable-next-line value != valueAsNumber || + // eslint-disable-next-line (value == valueAsNumber && node.value != value) ) { // Cast `value` to a string to ensure the value is set correctly. While From b31975f5db881959932c15aa28376c5d506f528e Mon Sep 17 00:00:00 2001 From: "temu.psc" Date: Thu, 8 Jun 2017 20:02:44 +0800 Subject: [PATCH 3/3] fix label error --- fixtures/dom/src/components/fixtures/number-inputs/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fixtures/dom/src/components/fixtures/number-inputs/index.js b/fixtures/dom/src/components/fixtures/number-inputs/index.js index 953b8cf6115..7e08aa22024 100644 --- a/fixtures/dom/src/components/fixtures/number-inputs/index.js +++ b/fixtures/dom/src/components/fixtures/number-inputs/index.js @@ -160,7 +160,7 @@ function NumberInputs() {