diff --git a/src/renderers/dom/shared/ReactDOMComponent.js b/src/renderers/dom/shared/ReactDOMComponent.js index 244d80b94f..f7bf1bb122 100644 --- a/src/renderers/dom/shared/ReactDOMComponent.js +++ b/src/renderers/dom/shared/ReactDOMComponent.js @@ -53,13 +53,9 @@ var registrationNameModules = EventPluginRegistry.registrationNameModules; // For quickly matching children type, to test if can be treated as content. var CONTENT_TYPES = {'string': true, 'number': true}; +var CHILDREN = keyOf({children: null}); var STYLE = keyOf({style: null}); var HTML = keyOf({__html: null}); -var RESERVED_PROPS = { - children: null, - dangerouslySetInnerHTML: null, - suppressContentEditableWarning: null, -}; function getDeclarationErrorAddendum(internalInstance) { if (internalInstance) { @@ -639,13 +635,11 @@ ReactDOMComponent.Mixin = { } var markup = null; if (this._tag != null && isCustomComponent(this._tag, props)) { - if (!RESERVED_PROPS.hasOwnProperty(propKey)) { + if (propKey !== CHILDREN) { markup = DOMPropertyOperations.createMarkupForCustomAttribute(propKey, propValue); } } else if (this._namespaceURI === DOMNamespaces.svg) { - if (!RESERVED_PROPS.hasOwnProperty(propKey)) { - markup = DOMPropertyOperations.createMarkupForSVGAttribute(propKey, propValue); - } + markup = DOMPropertyOperations.createMarkupForSVGAttribute(propKey, propValue); } else { markup = DOMPropertyOperations.createMarkupForProperty(propKey, propValue); } @@ -920,21 +914,20 @@ ReactDOMComponent.Mixin = { deleteListener(this, propKey); } } else if (isCustomComponent(this._tag, nextProps)) { - if (!RESERVED_PROPS.hasOwnProperty(propKey)) { - DOMPropertyOperations.setValueForAttribute( - getNode(this), - propKey, - nextProp - ); + if (propKey === CHILDREN) { + nextProp = null; } + DOMPropertyOperations.setValueForAttribute( + getNode(this), + propKey, + nextProp + ); } else if (this._namespaceURI === DOMNamespaces.svg) { - if (!RESERVED_PROPS.hasOwnProperty(propKey)) { - DOMPropertyOperations.setValueForSVGAttribute( - getNode(this), - propKey, - nextProp - ); - } + DOMPropertyOperations.setValueForSVGAttribute( + getNode(this), + propKey, + nextProp + ); } else if ( DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) { diff --git a/src/renderers/dom/shared/__tests__/ReactDOMComponent-test.js b/src/renderers/dom/shared/__tests__/ReactDOMComponent-test.js index 1e07d5a4c2..53e68defe5 100644 --- a/src/renderers/dom/shared/__tests__/ReactDOMComponent-test.js +++ b/src/renderers/dom/shared/__tests__/ReactDOMComponent-test.js @@ -238,100 +238,16 @@ describe('ReactDOMComponent', function() { expect(stubStyle.display).toEqual(''); }); - it('should skip reserved props on web components', function() { + it('should skip child object attribute on web components', function() { var container = document.createElement('div'); - ReactDOM.render( - , - container - ); + // Test initial render to null + ReactDOM.render(, container); expect(container.firstChild.hasAttribute('children')).toBe(false); - expect( - container.firstChild.hasAttribute('suppressContentEditableWarning') - ).toBe(false); - ReactDOM.render( - , - container - ); + // Test updates to null + ReactDOM.render(, container); expect(container.firstChild.hasAttribute('children')).toBe(false); - expect( - container.firstChild.hasAttribute('suppressContentEditableWarning') - ).toBe(false); - }); - - it('should skip dangerouslySetInnerHTML on web components', function() { - var container = document.createElement('div'); - - ReactDOM.render( - , - container - ); - expect( - container.firstChild.hasAttribute('dangerouslySetInnerHTML') - ).toBe(false); - - ReactDOM.render( - , - container - ); - expect( - container.firstChild.hasAttribute('dangerouslySetInnerHTML') - ).toBe(false); - }); - - it('should skip reserved props on SVG components', function() { - var container = document.createElement('div'); - - ReactDOM.render( - , - container - ); - expect(container.firstChild.hasAttribute('children')).toBe(false); - expect( - container.firstChild.hasAttribute('suppressContentEditableWarning') - ).toBe(false); - - ReactDOM.render( - , - container - ); - expect(container.firstChild.hasAttribute('children')).toBe(false); - expect( - container.firstChild.hasAttribute('suppressContentEditableWarning') - ).toBe(false); - }); - - it('should skip dangerouslySetInnerHTML on SVG components', function() { - var container = document.createElement('div'); - - ReactDOM.render( - , - container - ); - expect( - container.firstChild.hasAttribute('dangerouslySetInnerHTML') - ).toBe(false); - - ReactDOM.render( - , - container - ); - expect( - container.firstChild.hasAttribute('dangerouslySetInnerHTML') - ).toBe(false); }); it('should remove attributes', function() {