Skip to content

Commit 7bf686b

Browse files
authored
Add component stack to ReactControlledValuePropTypes (facebook#9435)
1 parent 1447d9f commit 7bf686b

File tree

8 files changed

+38
-29
lines changed

8 files changed

+38
-29
lines changed

src/renderers/dom/fiber/wrappers/ReactDOMFiberInput.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ var ReactDOMInput = {
9494
ReactControlledValuePropTypes.checkPropTypes(
9595
'input',
9696
props,
97-
getCurrentFiberOwnerName(),
97+
getCurrentFiberStackAddendum,
9898
);
9999

100100
if (

src/renderers/dom/fiber/wrappers/ReactDOMFiberSelect.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ var ReactControlledValuePropTypes = require('ReactControlledValuePropTypes');
2323
var {getCurrentFiberOwnerName} = require('ReactDebugCurrentFiber');
2424
var warning = require('fbjs/lib/warning');
2525

26+
if (__DEV__) {
27+
var {getCurrentFiberStackAddendum} = require('ReactDebugCurrentFiber');
28+
}
29+
2630
var didWarnValueDefaultValue = false;
2731

2832
function getDeclarationErrorAddendum() {
@@ -42,7 +46,7 @@ function checkSelectPropTypes(props) {
4246
ReactControlledValuePropTypes.checkPropTypes(
4347
'select',
4448
props,
45-
getCurrentFiberOwnerName(),
49+
getCurrentFiberStackAddendum,
4650
);
4751

4852
for (var i = 0; i < valuePropNames.length; i++) {

src/renderers/dom/fiber/wrappers/ReactDOMFiberTextarea.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,14 @@ type TextAreaWithWrapperState = HTMLTextAreaElement & {
1919
};
2020

2121
var ReactControlledValuePropTypes = require('ReactControlledValuePropTypes');
22-
var {getCurrentFiberOwnerName} = require('ReactDebugCurrentFiber');
2322

2423
var invariant = require('fbjs/lib/invariant');
2524
var warning = require('fbjs/lib/warning');
2625

26+
if (__DEV__) {
27+
var {getCurrentFiberStackAddendum} = require('ReactDebugCurrentFiber');
28+
}
29+
2730
var didWarnValDefaultVal = false;
2831

2932
/**
@@ -69,7 +72,7 @@ var ReactDOMTextarea = {
6972
ReactControlledValuePropTypes.checkPropTypes(
7073
'textarea',
7174
props,
72-
getCurrentFiberOwnerName(),
75+
getCurrentFiberStackAddendum,
7376
);
7477
if (
7578
props.value !== undefined &&

src/renderers/dom/shared/utils/ReactControlledValuePropTypes.js

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,19 +61,13 @@ var propTypes = {
6161
};
6262

6363
var loggedTypeFailures = {};
64-
function getDeclarationErrorAddendum(ownerName) {
65-
if (ownerName) {
66-
return '\n\nCheck the render method of `' + ownerName + '`.';
67-
}
68-
return '';
69-
}
7064

7165
/**
7266
* Provide a linked `value` attribute for controlled forms. You should not use
7367
* this outside of the ReactDOM controlled form components.
7468
*/
7569
var ReactControlledValuePropTypes = {
76-
checkPropTypes: function(tagName, props, ownerName) {
70+
checkPropTypes: function(tagName, props, getStack) {
7771
for (var propName in propTypes) {
7872
if (propTypes.hasOwnProperty(propName)) {
7973
var error = propTypes[propName](
@@ -90,8 +84,7 @@ var ReactControlledValuePropTypes = {
9084
// same error.
9185
loggedTypeFailures[error.message] = true;
9286

93-
var addendum = getDeclarationErrorAddendum(ownerName);
94-
warning(false, 'Failed form propType: %s%s', error.message, addendum);
87+
warning(false, 'Failed form propType: %s%s', error.message, getStack());
9588
}
9689
}
9790
},

src/renderers/dom/shared/wrappers/__tests__/ReactDOMInput-test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,13 @@ describe('ReactDOMInput', () => {
642642
<input type="text" value="zoink" readOnly={false} />,
643643
);
644644
expectDev(console.error.calls.count()).toBe(1);
645+
expectDev(normalizeCodeLocInfo(console.error.calls.argsFor(0)[0])).toBe(
646+
'Warning: Failed form propType: You provided a `value` prop to a form ' +
647+
'field without an `onChange` handler. This will render a read-only ' +
648+
'field. If the field should be mutable use `defaultValue`. ' +
649+
'Otherwise, set either `onChange` or `readOnly`.\n' +
650+
' in input (at **)',
651+
);
645652
});
646653

647654
it('should have a this value of undefined if bind is not used', () => {

src/renderers/dom/stack/client/wrappers/ReactDOMInput.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,8 @@ var ReactDOMInput = {
8383
mountWrapper: function(inst, props) {
8484
if (__DEV__) {
8585
var owner = inst._currentElement._owner;
86-
ReactControlledValuePropTypes.checkPropTypes(
87-
'input',
88-
props,
89-
owner ? owner.getName() : null,
90-
);
86+
ReactControlledValuePropTypes.checkPropTypes('input', props, () =>
87+
getStackAddendumByID(inst._debugID));
9188

9289
if (
9390
props.checked !== undefined &&

src/renderers/dom/stack/client/wrappers/ReactDOMSelect.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ var ReactDOMComponentTree = require('ReactDOMComponentTree');
1616

1717
var warning = require('fbjs/lib/warning');
1818

19+
if (__DEV__) {
20+
var {
21+
getStackAddendumByID,
22+
} = require('ReactGlobalSharedState').ReactComponentTreeHook;
23+
}
24+
1925
var didWarnValueDefaultValue = false;
2026

2127
function getDeclarationErrorAddendum(owner) {
@@ -36,11 +42,8 @@ var valuePropNames = ['value', 'defaultValue'];
3642
*/
3743
function checkSelectPropTypes(inst, props) {
3844
var owner = inst._currentElement._owner;
39-
ReactControlledValuePropTypes.checkPropTypes(
40-
'select',
41-
props,
42-
owner ? owner.getName() : null,
43-
);
45+
ReactControlledValuePropTypes.checkPropTypes('select', props, () =>
46+
getStackAddendumByID(inst._debugID));
4447

4548
for (var i = 0; i < valuePropNames.length; i++) {
4649
var propName = valuePropNames[i];

src/renderers/dom/stack/client/wrappers/ReactDOMTextarea.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ var ReactDOMComponentTree = require('ReactDOMComponentTree');
1717
var invariant = require('fbjs/lib/invariant');
1818
var warning = require('fbjs/lib/warning');
1919

20+
if (__DEV__) {
21+
var {
22+
getStackAddendumByID,
23+
} = require('ReactGlobalSharedState').ReactComponentTreeHook;
24+
}
25+
2026
var didWarnValDefaultVal = false;
2127

2228
/**
@@ -57,12 +63,8 @@ var ReactDOMTextarea = {
5763

5864
mountWrapper: function(inst, props) {
5965
if (__DEV__) {
60-
var owner = inst._currentElement._owner;
61-
ReactControlledValuePropTypes.checkPropTypes(
62-
'textarea',
63-
props,
64-
owner ? owner.getName() : null,
65-
);
66+
ReactControlledValuePropTypes.checkPropTypes('textarea', props, () =>
67+
getStackAddendumByID(inst._debugID));
6668
if (
6769
props.value !== undefined &&
6870
props.defaultValue !== undefined &&

0 commit comments

Comments
 (0)