Merge pull request #4823 from spicyj/gh-4776

Don't try to iterate over non-objects
This commit is contained in:
Ben Alpert
2015-09-09 12:55:20 -07:00
3 changed files with 64 additions and 0 deletions
@@ -135,6 +135,9 @@ function getAddendaForKeyUse(messageType, element, parentType) {
* @param {*} parentType node's parent's type.
*/
function validateChildKeys(node, parentType) {
if (typeof node !== 'object') {
return;
}
if (Array.isArray(node)) {
for (var i = 0; i < node.length; i++) {
var child = node[i];
@@ -449,4 +449,24 @@ describe('ReactElementValidator', function() {
expect(console.error.argsForCall.length).toBe(0);
});
it('should not enumerate enumerable numbers (#4776)', function() {
/*eslint-disable no-extend-native */
Number.prototype['@@iterator'] = function() {
throw new Error('number iterator called');
};
/*eslint-enable no-extend-native */
try {
void (
<div>
{5}
{12}
{13}
</div>
);
} finally {
delete Number.prototype['@@iterator'];
}
});
});
@@ -435,4 +435,45 @@ describe('traverseAllChildren', function() {
);
});
it('should not enumerate enumerable numbers (#4776)', function() {
/*eslint-disable no-extend-native */
Number.prototype['@@iterator'] = function() {
throw new Error('number iterator called');
};
/*eslint-enable no-extend-native */
try {
var instance = (
<div>
{5}
{12}
{13}
</div>
);
var traverseFn = jasmine.createSpy();
traverseAllChildren(instance.props.children, traverseFn, null);
expect(traverseFn.calls.length).toBe(3);
expect(traverseFn).toHaveBeenCalledWith(
null,
5,
'.0'
);
expect(traverseFn).toHaveBeenCalledWith(
null,
12,
'.1'
);
expect(traverseFn).toHaveBeenCalledWith(
null,
13,
'.2'
);
} finally {
delete Number.prototype['@@iterator'];
}
});
});