From 940208463e8ed6005a410354baa9f55f0749ad47 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Fri, 3 Apr 2020 16:00:53 +0100 Subject: [PATCH] Fix a broken test --- .../src/__tests__/ReactDOMInput-test.js | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/packages/react-dom/src/__tests__/ReactDOMInput-test.js b/packages/react-dom/src/__tests__/ReactDOMInput-test.js index 53559f6ae223b..7c36518857dae 100644 --- a/packages/react-dom/src/__tests__/ReactDOMInput-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMInput-test.js @@ -1625,15 +1625,39 @@ describe('ReactDOMInput', () => { const originalCreateElement = document.createElement; spyOnDevAndProd(document, 'createElement').and.callFake(function(type) { const el = originalCreateElement.apply(this, arguments); - let value = ''; + const getDefaultValue = Object.getOwnPropertyDescriptor( + HTMLInputElement.prototype, + 'defaultValue', + ).get; + const setDefaultValue = Object.getOwnPropertyDescriptor( + HTMLInputElement.prototype, + 'defaultValue', + ).set; + const getValue = Object.getOwnPropertyDescriptor( + HTMLInputElement.prototype, + 'value', + ).get; + const setValue = Object.getOwnPropertyDescriptor( + HTMLInputElement.prototype, + 'value', + ).set; if (type === 'input') { + Object.defineProperty(el, 'defaultValue', { + get: function() { + return getDefaultValue.call(this); + }, + set: function(val) { + log.push(`node.defaultValue = ${strify(val)}`); + setDefaultValue.call(this, val); + }, + }); Object.defineProperty(el, 'value', { get: function() { - return value; + return getValue.call(this); }, set: function(val) { - value = '' + val; log.push(`node.value = ${strify(val)}`); + setValue.call(this, val); }, }); spyOnDevAndProd(el, 'setAttribute').and.callFake(function(name, val) { @@ -1648,12 +1672,18 @@ describe('ReactDOMInput', () => { if (disableInputAttributeSyncing) { expect(log).toEqual([ 'node.setAttribute("type", "date")', - 'node.setAttribute("value", "1980-01-01")', + 'node.defaultValue = "1980-01-01"', + // TODO: it's possible this reintroduces the bug because we don't assign `value` at all. + // Need to check this on mobile Safari and Chrome. ]); } else { expect(log).toEqual([ 'node.setAttribute("type", "date")', + // value must be assigned before defaultValue. This fixes an issue where the + // visually displayed value of date inputs disappears on mobile Safari and Chrome: + // https://github.com/facebook/react/issues/7233 'node.value = "1980-01-01"', + 'node.defaultValue = "1980-01-01"', ]); } });