From c6b48e13db1272031c10da1f91bf97a19ba923fe Mon Sep 17 00:00:00 2001 From: Lucas Galfaso Date: Fri, 12 Jun 2015 20:55:09 +0200 Subject: [PATCH] fix($parse): set null reference properties to `undefined` When there is an expression of the form * true && a.b.c * true && a() * true && a()() * false || a.b.c * false || a() * false || a()() where `a == null` Closes #12099 --- src/ng/parse.js | 6 ++++-- test/ng/parseSpec.js | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ng/parse.js b/src/ng/parse.js index 9a3d82666584..19446105d0bc 100644 --- a/src/ng/parse.js +++ b/src/ng/parse.js @@ -982,10 +982,10 @@ ASTCompiler.prototype = { nameId.name = ast.property.name; } } - recursionFn(intoId); }, function() { self.assign(intoId, 'undefined'); }); + recursionFn(intoId); }, !!create); break; case AST.CallExpression: @@ -1023,8 +1023,10 @@ ASTCompiler.prototype = { } expression = self.ensureSafeObject(expression); self.assign(intoId, expression); - recursionFn(intoId); + }, function() { + self.assign(intoId, 'undefined'); }); + recursionFn(intoId); }); } break; diff --git a/test/ng/parseSpec.js b/test/ng/parseSpec.js index 8814f3a7702e..321cff48f93a 100644 --- a/test/ng/parseSpec.js +++ b/test/ng/parseSpec.js @@ -1746,9 +1746,15 @@ describe('parser', function() { expect(scope.$eval("0||2")).toEqual(0 || 2); expect(scope.$eval("0||1&&2")).toEqual(0 || 1 && 2); expect(scope.$eval("true&&a")).toEqual(true && undefined); + expect(scope.$eval("true&&a()")).toEqual(true && undefined); + expect(scope.$eval("true&&a()()")).toEqual(true && undefined); expect(scope.$eval("true&&a.b")).toEqual(true && undefined); + expect(scope.$eval("true&&a.b.c")).toEqual(true && undefined); expect(scope.$eval("false||a")).toEqual(false || undefined); + expect(scope.$eval("false||a()")).toEqual(false || undefined); + expect(scope.$eval("false||a()()")).toEqual(false || undefined); expect(scope.$eval("false||a.b")).toEqual(false || undefined); + expect(scope.$eval("false||a.b.c")).toEqual(false || undefined); }); it('should parse ternary', function() {