Skip to content

Commit 06be042

Browse files
committed
use node._valueTracker and add some test cases to make sure that value being tracked
1 parent 4e3a2de commit 06be042

File tree

1 file changed

+35
-25
lines changed

1 file changed

+35
-25
lines changed

packages/react-dom/src/__tests__/ReactDOMComponent-test.js

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99

1010
'use strict';
1111

12+
type ValueTracker = {
13+
getValue(): string,
14+
setValue(value: string): void,
15+
stopTracking(): void,
16+
};
17+
type WrapperState = {_valueTracker: ?ValueTracker};
18+
type ElementWithValueTracker = (HTMLInputElement | HTMLTextAreaElement) &
19+
WrapperState;
20+
1221
describe('ReactDOMComponent', () => {
1322
var React;
1423
var ReactTestUtils;
@@ -829,31 +838,8 @@ describe('ReactDOMComponent', () => {
829838

830839
describe('mountComponent', () => {
831840
var mountComponent;
832-
var getTracker = (node: any) => {
833-
var descriptor = Object.getOwnPropertyDescriptor(
834-
node.constructor.prototype,
835-
'value',
836-
);
837-
838-
var currentValue = '' + node.value;
839-
840-
Object.defineProperty(node, 'value', {
841-
enumerable: descriptor.enumerable,
842-
configurable: true,
843-
get: () => {
844-
return descriptor.get.call(this);
845-
},
846-
set: value => {
847-
currentValue = '' + value;
848-
descriptor.set.call(this, value);
849-
},
850-
});
851-
852-
return {
853-
getValue() {
854-
return currentValue;
855-
},
856-
};
841+
var getTracker = (node: ElementWithValueTracker): ?ValueTracker => {
842+
return node._valueTracker;
857843
};
858844

859845
beforeEach(() => {
@@ -1175,14 +1161,38 @@ describe('ReactDOMComponent', () => {
11751161
container,
11761162
);
11771163
var tracker = getTracker(inst);
1164+
expect(tracker).toBeTruthy();
1165+
expect(tracker.getValue()).toEqual('foo');
1166+
1167+
inst.defaultValue = 'new foo';
1168+
expect(tracker.getValue()).not.toEqual('new foo');
11781169
expect(tracker.getValue()).toEqual('foo');
1170+
1171+
inst.value = 'bar';
1172+
expect(tracker.getValue()).toEqual('bar');
1173+
1174+
// even if the value changes to empty string, should not return to defaultValue
1175+
inst.value = '';
1176+
expect(tracker.getValue()).toEqual('');
11791177
});
11801178

11811179
it('should track textarea values', () => {
11821180
var container = document.createElement('div');
11831181
var inst = ReactDOM.render(<textarea defaultValue="foo" />, container);
11841182
var tracker = getTracker(inst);
1183+
expect(tracker).toBeTruthy();
11851184
expect(tracker.getValue()).toEqual('foo');
1185+
1186+
inst.defaultValue = 'new foo';
1187+
expect(tracker.getValue()).not.toEqual('new foo');
1188+
expect(tracker.getValue()).toEqual('foo');
1189+
1190+
inst.value = 'bar';
1191+
expect(tracker.getValue()).toEqual('bar');
1192+
1193+
// even if the value changes to empty string, should not return to defaultValue
1194+
inst.value = '';
1195+
expect(tracker.getValue()).toEqual('');
11861196
});
11871197

11881198
it('should throw for children on void elements', () => {

0 commit comments

Comments
 (0)