@@ -488,6 +488,48 @@ describe('parser', function() {
488
488
expect ( scope . b ) . toEqual ( 234 ) ;
489
489
} ) ;
490
490
491
+ it ( 'should allow passing object as locals to the root left-expression of an assignment' , inject ( function ( $rootScope ) {
492
+ $rootScope . a = { } ;
493
+ $rootScope . key = "value" ;
494
+ var localA = { } ;
495
+
496
+ //getterFn
497
+ $rootScope . $eval ( 'a.value = 1' , { a : localA } ) ;
498
+ expect ( localA . value ) . toBe ( 1 ) ;
499
+
500
+ $rootScope . $eval ( 'w.a.value = 2' , { w : { a : localA } } ) ;
501
+ expect ( localA . value ) . toBe ( 2 ) ;
502
+
503
+ //field access
504
+ $rootScope . $eval ( '(a).value = 3' , { a : localA } ) ;
505
+ expect ( localA . value ) . toBe ( 3 ) ;
506
+
507
+ $rootScope . $eval ( '{c: {b: a}}.c.b.value = 4' , { a : localA } ) ;
508
+ expect ( localA . value ) . toBe ( 4 ) ;
509
+
510
+ //object index
511
+ $rootScope . $eval ( 'a[key] = 5' , { a : localA } ) ;
512
+ expect ( localA . value ) . toBe ( 5 ) ;
513
+
514
+ $rootScope . $eval ( 'w.a[key] = 6' , { w : { a : localA } } ) ;
515
+ expect ( localA . value ) . toBe ( 6 ) ;
516
+
517
+ $rootScope . $eval ( '{c: {b: a}}.c.b[key] = 7' , { a : localA } ) ;
518
+ expect ( localA . value ) . toBe ( 7 ) ;
519
+
520
+ //Nothing should have touched the $rootScope.a
521
+ expect ( $rootScope . a . value ) . toBeUndefined ( ) ;
522
+ } ) ) ;
523
+
524
+ it ( 'should ignore locals beyond the root object of an assignment expression' , inject ( function ( $rootScope ) {
525
+ var a = { } ;
526
+ var locals = { a : a } ;
527
+ $rootScope . b = { a : { value : 123 } } ;
528
+ $rootScope . $eval ( 'b.a.value = 1' , locals ) ;
529
+ expect ( a . value ) . toBeUndefined ( ) ;
530
+ expect ( $rootScope . b . a . value ) . toBe ( 1 ) ;
531
+ } ) ) ;
532
+
491
533
it ( 'should evaluate assignments in ternary operator' , function ( ) {
492
534
scope . $eval ( 'a = 1 ? 2 : 3' ) ;
493
535
expect ( scope . a ) . toBe ( 2 ) ;
@@ -799,6 +841,12 @@ describe('parser', function() {
799
841
} ) . toThrowMinErr (
800
842
'$parse' , 'isecfn' , 'Referencing Function in Angular expressions is disallowed! ' +
801
843
'Expression: a.toString.constructor' ) ;
844
+
845
+ expect ( function ( ) {
846
+ scope . $eval ( "c.a = 1" , { c : Function . prototype . constructor } ) ;
847
+ } ) . toThrowMinErr (
848
+ '$parse' , 'isecfn' , 'Referencing Function in Angular expressions is disallowed! ' +
849
+ 'Expression: c.a' ) ;
802
850
} ) ;
803
851
804
852
it ( 'should disallow traversing the Function object in a setter: E02' , function ( ) {
@@ -933,6 +981,14 @@ describe('parser', function() {
933
981
'$parse' , 'isecobj' , 'Referencing Object in Angular expressions is disallowed! ' +
934
982
'Expression: foo["bar"]["keys"](foo)' ) ;
935
983
} ) ;
984
+
985
+ it ( 'should NOT allow access to Object constructor in assignment locals' , function ( ) {
986
+ expect ( function ( ) {
987
+ scope . $eval ( "O.constructor.a = 1" , { O : Object } ) ;
988
+ } ) . toThrowMinErr (
989
+ '$parse' , 'isecobj' , 'Referencing Object in Angular expressions is disallowed! ' +
990
+ 'Expression: O.constructor.a' ) ;
991
+ } ) ;
936
992
} ) ;
937
993
938
994
describe ( 'Window and $element/node' , function ( ) {
0 commit comments