Don't try to iterate over non-objects
Fixes #4776.
Ben Alpert committed
Sep 9, 2015 at 08:58 UTC
b004bc5f22ddf399b80e3604ad8452581d521470
3 files changed
+64
src/isomorphic/classic/element/ReactElementValidator.js
+3
@@ -135,6 +135,9 @@ function getAddendaForKeyUse(messageType, element, parentType) {
135
* @param {*} parentType node's parent's type.
136
*/
137
function validateChildKeys(node, parentType) {
138
+ if (typeof node !== 'object') {
139
+ return;
140
+ }
141
if (Array.isArray(node)) {
142
for (var i = 0; i < node.length; i++) {
143
var child = node[i];
src/isomorphic/classic/element/__tests__/ReactElementValidator-test.js
+20
@@ -449,4 +449,24 @@ describe('ReactElementValidator', function() {
449
expect(console.error.argsForCall.length).toBe(0);
450
});
451
452
+ it('should not enumerate enumerable numbers (#4776)', function() {
453
+ /*eslint-disable no-extend-native */
454
+ Number.prototype['@@iterator'] = function() {
455
+ throw new Error('number iterator called');
456
+ };
457
+ /*eslint-enable no-extend-native */
458
+
459
+ try {
460
+ void (
461
+ <div>
462
+ {5}
463
+ {12}
464
+ {13}
465
+ </div>
466
+ );
467
+ } finally {
468
+ delete Number.prototype['@@iterator'];
469
+ }
470
+ });
471
+
472
});
src/shared/utils/__tests__/traverseAllChildren-test.js
+41
@@ -435,4 +435,45 @@ describe('traverseAllChildren', function() {
435
);
436
});
437
438
+ it('should not enumerate enumerable numbers (#4776)', function() {
439
+ /*eslint-disable no-extend-native */
440
+ Number.prototype['@@iterator'] = function() {
441
+ throw new Error('number iterator called');
442
+ };
443
+ /*eslint-enable no-extend-native */
444
+
445
+ try {
446
+ var instance = (
447
+ <div>
448
+ {5}
449
+ {12}
450
+ {13}
451
+ </div>
452
+ );
453
+
454
+ var traverseFn = jasmine.createSpy();
455
+
456
+ traverseAllChildren(instance.props.children, traverseFn, null);
457
+ expect(traverseFn.calls.length).toBe(3);
458
+
459
+ expect(traverseFn).toHaveBeenCalledWith(
460
+ null,
461
+ 5,
462
+ '.0'
463
+ );
464
+ expect(traverseFn).toHaveBeenCalledWith(
465
+ null,
466
+ 12,
467
+ '.1'
468
+ );
469
+ expect(traverseFn).toHaveBeenCalledWith(
470
+ null,
471
+ 13,
472
+ '.2'
473
+ );
474
+ } finally {
475
+ delete Number.prototype['@@iterator'];
476
+ }
477
+ });
478
+
479
});