Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 2e5a7e5

Browse files
committed
fix($parse): handle null targets at assign
When assigning to a sub property of a property that its value is `null` then write an empty object to the property that will contain the sub-property
1 parent 5dfa630 commit 2e5a7e5

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

src/ng/parse.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -926,7 +926,7 @@ ASTCompiler.prototype = {
926926
self.if(self.stage === 'inputs' || 's', function() {
927927
if (create && create !== 1) {
928928
self.if(
929-
self.not(self.getHasOwnProperty('s', ast.name)),
929+
self.not(self.nonComputedMember('s', ast.name)),
930930
self.lazyAssign(self.nonComputedMember('s', ast.name), '{}'));
931931
}
932932
self.assign(intoId, self.nonComputedMember('s', ast.name));
@@ -948,7 +948,7 @@ ASTCompiler.prototype = {
948948
self.recurse(ast.property, right);
949949
self.addEnsureSafeMemberName(right);
950950
if (create && create !== 1) {
951-
self.if(self.not(right + ' in ' + left), self.lazyAssign(self.computedMember(left, right), '{}'));
951+
self.if(self.not(self.computedMember(left, right)), self.lazyAssign(self.computedMember(left, right), '{}'));
952952
}
953953
expression = self.ensureSafeObject(self.computedMember(left, right));
954954
self.assign(intoId, expression);
@@ -959,7 +959,7 @@ ASTCompiler.prototype = {
959959
} else {
960960
ensureSafeMemberName(ast.property.name);
961961
if (create && create !== 1) {
962-
self.if(self.not(self.escape(ast.property.name) + ' in ' + left), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}'));
962+
self.if(self.not(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}'));
963963
}
964964
expression = self.nonComputedMember(left, ast.property.name);
965965
if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.property.name)) {
@@ -1515,7 +1515,7 @@ ASTInterpreter.prototype = {
15151515
identifier: function(name, expensiveChecks, context, create, expression) {
15161516
return function(scope, locals, assign, inputs) {
15171517
var base = locals && (name in locals) ? locals : scope;
1518-
if (create && create !== 1 && base && !(name in base)) {
1518+
if (create && create !== 1 && base && !(base[name])) {
15191519
base[name] = {};
15201520
}
15211521
var value = base ? base[name] : undefined;
@@ -1537,7 +1537,7 @@ ASTInterpreter.prototype = {
15371537
if (lhs != null) {
15381538
rhs = right(scope, locals, assign, inputs);
15391539
ensureSafeMemberName(rhs, expression);
1540-
if (create && create !== 1 && lhs && !(rhs in lhs)) {
1540+
if (create && create !== 1 && lhs && !(lhs[rhs])) {
15411541
lhs[rhs] = {};
15421542
}
15431543
value = lhs[rhs];
@@ -1553,7 +1553,7 @@ ASTInterpreter.prototype = {
15531553
nonComputedMember: function(left, right, expensiveChecks, context, create, expression) {
15541554
return function(scope, locals, assign, inputs) {
15551555
var lhs = left(scope, locals, assign, inputs);
1556-
if (create && create !== 1 && lhs && !(right in lhs)) {
1556+
if (create && create !== 1 && lhs && !(lhs[right])) {
15571557
lhs[right] = {};
15581558
}
15591559
var value = lhs != null ? lhs[right] : undefined;

test/ng/parseSpec.js

+21
Original file line numberDiff line numberDiff line change
@@ -2784,6 +2784,27 @@ describe('parser', function() {
27842784
fn.assign(scope, 123);
27852785
expect(scope.a.b.c).toEqual(123);
27862786
}));
2787+
2788+
it('should create objects when finding a null', inject(function($parse) {
2789+
var fn = $parse('foo.bar');
2790+
var scope = {foo: null};
2791+
fn.assign(scope, 123);
2792+
expect(scope.foo.bar).toEqual(123);
2793+
}));
2794+
2795+
it('should create objects when finding a null', inject(function($parse) {
2796+
var fn = $parse('foo["bar"]');
2797+
var scope = {foo: null};
2798+
fn.assign(scope, 123);
2799+
expect(scope.foo.bar).toEqual(123);
2800+
}));
2801+
2802+
it('should create objects when finding a null', inject(function($parse) {
2803+
var fn = $parse('foo.bar.baz');
2804+
var scope = {foo: null};
2805+
fn.assign(scope, 123);
2806+
expect(scope.foo.bar.baz).toEqual(123);
2807+
}));
27872808
});
27882809

27892810
describe('one-time binding', function() {

0 commit comments

Comments
 (0)