From 4113aa92d4971d79b00ae42761c5029c5ba72552 Mon Sep 17 00:00:00 2001 From: raunofreiberg Date: Fri, 10 Aug 2018 15:42:31 +0300 Subject: [PATCH 01/11] refactor: move getSafeValue to separate file --- .../src/client/ReactDOMFiberInput.js | 1 + packages/react-dom/src/client/getSafeValue.js | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 packages/react-dom/src/client/getSafeValue.js diff --git a/packages/react-dom/src/client/ReactDOMFiberInput.js b/packages/react-dom/src/client/ReactDOMFiberInput.js index 51bcf215021c9..0f15e7e97cd00 100644 --- a/packages/react-dom/src/client/ReactDOMFiberInput.js +++ b/packages/react-dom/src/client/ReactDOMFiberInput.js @@ -17,6 +17,7 @@ import {getFiberCurrentPropsFromNode} from './ReactDOMComponentTree'; import {getToStringValue, toString} from './ToStringValue'; import ReactControlledValuePropTypes from '../shared/ReactControlledValuePropTypes'; import * as inputValueTracking from './inputValueTracking'; +import getSafeValue from './getSafeValue'; import type {ToStringValue} from './ToStringValue'; diff --git a/packages/react-dom/src/client/getSafeValue.js b/packages/react-dom/src/client/getSafeValue.js new file mode 100644 index 0000000000000..71d79739b63e1 --- /dev/null +++ b/packages/react-dom/src/client/getSafeValue.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + */ + +export default function getSafeValue(value: *): * { + switch (typeof value) { + case 'boolean': + case 'number': + case 'object': + case 'string': + case 'undefined': + return value; + default: + // function, symbol are assigned as empty strings + return ''; + } +} From 57f34d65ef61b052a6590d9f4a908d55f354822d Mon Sep 17 00:00:00 2001 From: raunofreiberg Date: Fri, 10 Aug 2018 15:43:24 +0300 Subject: [PATCH 02/11] fix(?): ReactDOMFiberTextarea sanitization for symbols and functions --- .../src/__tests__/ReactDOMTextarea-test.js | 132 ++++++++++++++++-- .../src/client/ReactDOMFiberTextarea.js | 11 +- 2 files changed, 127 insertions(+), 16 deletions(-) diff --git a/packages/react-dom/src/__tests__/ReactDOMTextarea-test.js b/packages/react-dom/src/__tests__/ReactDOMTextarea-test.js index b2872d92b503f..586042a99cf9b 100644 --- a/packages/react-dom/src/__tests__/ReactDOMTextarea-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMTextarea-test.js @@ -20,6 +20,8 @@ describe('ReactDOMTextarea', () => { let renderTextarea; beforeEach(() => { + jest.resetModules(); + React = require('react'); ReactDOM = require('react-dom'); ReactDOMServer = require('react-dom/server'); @@ -200,18 +202,6 @@ describe('ReactDOMTextarea', () => { expect(node.value).toBe('0'); }); - it('should take updates to children in lieu of `defaultValue` for uncontrolled textarea', () => { - const container = document.createElement('div'); - - const node = ReactDOM.render(, container); - - expect(node.value).toBe('0'); - }); - it('should not incur unnecessary DOM mutations', () => { const container = document.createElement('div'); ReactDOM.render(, + container, + ), + ).toWarnDev('Use the `defaultValue` or `value` props'); + const node = container.firstChild; + + expect(node.value).toBe(''); + }); + + it('treats updated Symbol value as an empty string', () => { + const container = document.createElement('div'); + ReactDOM.render(, + container, + ), + ).toWarnDev('Use the `defaultValue` or `value` props'); + const node = container.firstChild; + + expect(node.value).toBe(''); + }); + + it('treats updated function value as an empty string', () => { + const container = document.createElement('div'); + ReactDOM.render(, container); + + expect(node.value).toBe('0'); + }); + it('should not incur unnecessary DOM mutations', () => { const container = document.createElement('div'); ReactDOM.render(