@samitouri / QOS-React-2 / commits / b004bc5f22

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 });