diff --git a/src/core/ReactPropTransferer.js b/src/core/ReactPropTransferer.js index 691ed58fc8..db8e675d5b 100644 --- a/src/core/ReactPropTransferer.js +++ b/src/core/ReactPropTransferer.js @@ -19,6 +19,7 @@ "use strict"; var emptyFunction = require('emptyFunction'); +var invariant = require('invariant'); var joinClasses = require('joinClasses'); var merge = require('merge'); @@ -90,6 +91,13 @@ var ReactPropTransferer = { * @protected */ transferPropsTo: function(component) { + invariant( + component.props.__owner__ === this, + 'You can\'t call transferPropsTo() on a component that you don\'t ' + + 'own. This usually means you are calling transferPropsTo() on a ' + + 'component passed in as props or children.' + ); + var props = {}; for (var thatKey in component.props) { if (component.props.hasOwnProperty(thatKey)) { diff --git a/src/core/__tests__/ReactCompositeComponentTransferProps-test.js b/src/core/__tests__/ReactPropTransferer-test.js similarity index 83% rename from src/core/__tests__/ReactCompositeComponentTransferProps-test.js rename to src/core/__tests__/ReactPropTransferer-test.js index 70c7e27532..8b75130005 100644 --- a/src/core/__tests__/ReactCompositeComponentTransferProps-test.js +++ b/src/core/__tests__/ReactPropTransferer-test.js @@ -25,7 +25,7 @@ var reactComponentExpect; var TestComponent; -describe('ReactCompositeComponent-transferProps', function() { +describe('ReactPropTransferer', function() { beforeEach(function() { React = require('React'); @@ -130,4 +130,27 @@ describe('ReactCompositeComponent-transferProps', function() { ReactTestUtils.renderIntoDocument(); }); + + it('should not transferPropsTo() a component you don\'t own', function() { + var Parent = React.createClass({ + render: function() { + return ; + } + }); + + var Child = React.createClass({ + render: function() { + return this.transferPropsTo(this.props.children); + } + }); + + expect(function() { + ReactTestUtils.renderIntoDocument(); + }).toThrow( + 'Invariant Violation: ' + + 'You can\'t call transferPropsTo() on a component that you don\'t own. ' + + 'This usually means you are calling transferPropsTo() on a component ' + + 'passed in as props or children.' + ); + }); });