From f7b5b155a21b96ed2828552d05764ac3c00c2557 Mon Sep 17 00:00:00 2001 From: Lauren Long Date: Tue, 2 May 2017 13:51:06 -0700 Subject: [PATCH 1/2] Fix bug where event.data.val() was returning array of nulls when database payload had a length property --- spec/providers/database.spec.ts | 6 ++++++ src/providers/database.ts | 21 ++++++++++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/spec/providers/database.spec.ts b/spec/providers/database.spec.ts index 89265b167..efdbf60c2 100644 --- a/spec/providers/database.spec.ts +++ b/spec/providers/database.spec.ts @@ -137,6 +137,12 @@ describe('DeltaSnapshot', () => { populate({ myKey: 'foo', myOtherKey: 'bar' }, { myKey: null }); expect(subject.val()).to.deep.equal({ myOtherKey: 'bar' }); }); + + // Regression test: .val() was returning array of nulls when there's a property called length + it('should return correct values when data has "length" property', () => { + populate(null, { length: 3, foo: 'bar' }); + expect(subject.val()).to.deep.equal({ length: 3, foo: 'bar'}); + }); }); describe('#child(): DeltaSnapshot', () => { diff --git a/src/providers/database.ts b/src/providers/database.ts index 99de9a94b..73d8e027f 100644 --- a/src/providers/database.ts +++ b/src/providers/database.ts @@ -248,16 +248,19 @@ export class DeltaSnapshot implements firebase.database.DataSnapshot { let numKeys = 0; let maxKey = 0; let allIntegerKeys = true; - _.forEach(node, (childNode, key) => { - obj[key] = this._checkAndConvertToArray(childNode); - numKeys++; - const integerRegExp = /^(0|[1-9]\d*)$/; - if (allIntegerKeys && integerRegExp.test(key)) { - maxKey = Math.max(maxKey, Number(key)); - } else { - allIntegerKeys = false; + for (let key in node) { + if (node.hasOwnProperty(key)) { + let childNode = node[key]; + obj[key] = this._checkAndConvertToArray(childNode); + numKeys++; + const integerRegExp = /^(0|[1-9]\d*)$/; + if (allIntegerKeys && integerRegExp.test(key)) { + maxKey = Math.max(maxKey, Number(key)); + } else { + allIntegerKeys = false; + } } - }); + } if (allIntegerKeys && maxKey < 2 * numKeys) { // convert to array. From 3ba7d24d9ec0caef4d24adbe7ef8a7b300ca4e17 Mon Sep 17 00:00:00 2001 From: Lauren Long Date: Tue, 2 May 2017 17:00:25 -0700 Subject: [PATCH 2/2] small fix --- spec/providers/database.spec.ts | 2 +- src/providers/database.ts | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/spec/providers/database.spec.ts b/spec/providers/database.spec.ts index efdbf60c2..3dbdef63e 100644 --- a/spec/providers/database.spec.ts +++ b/spec/providers/database.spec.ts @@ -138,7 +138,7 @@ describe('DeltaSnapshot', () => { expect(subject.val()).to.deep.equal({ myOtherKey: 'bar' }); }); - // Regression test: .val() was returning array of nulls when there's a property called length + // Regression test: .val() was returning array of nulls when there's a property called length (BUG#37683995) it('should return correct values when data has "length" property', () => { populate(null, { length: 3, foo: 'bar' }); expect(subject.val()).to.deep.equal({ length: 3, foo: 'bar'}); diff --git a/src/providers/database.ts b/src/providers/database.ts index 73d8e027f..4e7f399e8 100644 --- a/src/providers/database.ts +++ b/src/providers/database.ts @@ -249,16 +249,15 @@ export class DeltaSnapshot implements firebase.database.DataSnapshot { let maxKey = 0; let allIntegerKeys = true; for (let key in node) { - if (node.hasOwnProperty(key)) { - let childNode = node[key]; - obj[key] = this._checkAndConvertToArray(childNode); - numKeys++; - const integerRegExp = /^(0|[1-9]\d*)$/; - if (allIntegerKeys && integerRegExp.test(key)) { - maxKey = Math.max(maxKey, Number(key)); - } else { - allIntegerKeys = false; - } + if (!node.hasOwnProperty(key)) { continue; } + let childNode = node[key]; + obj[key] = this._checkAndConvertToArray(childNode); + numKeys++; + const integerRegExp = /^(0|[1-9]\d*)$/; + if (allIntegerKeys && integerRegExp.test(key)) { + maxKey = Math.max(maxKey, Number(key)); + } else { + allIntegerKeys = false; } }