@@ -876,7 +876,8 @@ function setter(obj, path, setValue, fullExp, options) {
876
876
return setValue ;
877
877
}
878
878
879
- var getterFnCache = { } ;
879
+ var getterFnCacheDefault = { } ;
880
+ var getterFnCacheExpensive = { } ;
880
881
881
882
function isPossiblyDangerousMemberName ( name ) {
882
883
return name == 'constructor' ;
@@ -896,11 +897,12 @@ function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {
896
897
var eso = function ( o ) {
897
898
return ensureSafeObject ( o , fullExp ) ;
898
899
} ;
899
- var eso0 = isPossiblyDangerousMemberName ( key0 ) ? eso : identity ;
900
- var eso1 = isPossiblyDangerousMemberName ( key1 ) ? eso : identity ;
901
- var eso2 = isPossiblyDangerousMemberName ( key2 ) ? eso : identity ;
902
- var eso3 = isPossiblyDangerousMemberName ( key3 ) ? eso : identity ;
903
- var eso4 = isPossiblyDangerousMemberName ( key4 ) ? eso : identity ;
900
+ var expensiveChecks = options . expensiveChecks ;
901
+ var eso0 = ( expensiveChecks || isPossiblyDangerousMemberName ( key0 ) ) ? eso : identity ;
902
+ var eso1 = ( expensiveChecks || isPossiblyDangerousMemberName ( key1 ) ) ? eso : identity ;
903
+ var eso2 = ( expensiveChecks || isPossiblyDangerousMemberName ( key2 ) ) ? eso : identity ;
904
+ var eso3 = ( expensiveChecks || isPossiblyDangerousMemberName ( key3 ) ) ? eso : identity ;
905
+ var eso4 = ( expensiveChecks || isPossiblyDangerousMemberName ( key4 ) ) ? eso : identity ;
904
906
905
907
return ! options . unwrapPromises
906
908
? function cspSafeGetter ( scope , locals ) {
@@ -1006,6 +1008,8 @@ function getterFnWithExtraArgs(fn, fullExpression) {
1006
1008
}
1007
1009
1008
1010
function getterFn ( path , options , fullExp ) {
1011
+ var expensiveChecks = options . expensiveChecks ;
1012
+ var getterFnCache = ( expensiveChecks ? getterFnCacheExpensive : getterFnCacheDefault ) ;
1009
1013
// Check whether the cache has this getter already.
1010
1014
// We can use hasOwnProperty directly on the cache because we ensure,
1011
1015
// see below, that the cache never stores a path called 'hasOwnProperty'
@@ -1037,15 +1041,18 @@ function getterFn(path, options, fullExp) {
1037
1041
}
1038
1042
} else {
1039
1043
var code = 'var p;\n' ;
1040
- var needsEnsureSafeObject = false ;
1044
+ if ( expensiveChecks ) {
1045
+ code += 's = eso(s, fe);\nl = eso(l, fe);\n' ;
1046
+ }
1047
+ var needsEnsureSafeObject = expensiveChecks ;
1041
1048
forEach ( pathKeys , function ( key , index ) {
1042
1049
ensureSafeMemberName ( key , fullExp ) ;
1043
1050
var lookupJs = ( index
1044
1051
// we simply dereference 's' on any .dot notation
1045
1052
? 's'
1046
1053
// but if we are first then we check locals first, and if so read it first
1047
1054
: '((l&&l.hasOwnProperty("' + key + '"))?l:s)' ) + '["' + key + '"]' ;
1048
- var wrapWithEso = isPossiblyDangerousMemberName ( key ) ;
1055
+ var wrapWithEso = expensiveChecks || isPossiblyDangerousMemberName ( key ) ;
1049
1056
if ( wrapWithEso ) {
1050
1057
lookupJs = 'eso(' + lookupJs + ', fe)' ;
1051
1058
needsEnsureSafeObject = true ;
@@ -1139,12 +1146,14 @@ function getterFn(path, options, fullExp) {
1139
1146
* service.
1140
1147
*/
1141
1148
function $ParseProvider ( ) {
1142
- var cache = { } ;
1149
+ var cacheDefault = { } ;
1150
+ var cacheExpensive = { } ;
1143
1151
1144
1152
var $parseOptions = {
1145
1153
csp : false ,
1146
1154
unwrapPromises : false ,
1147
- logPromiseWarnings : true
1155
+ logPromiseWarnings : true ,
1156
+ expensiveChecks : false
1148
1157
} ;
1149
1158
1150
1159
@@ -1231,6 +1240,12 @@ function $ParseProvider() {
1231
1240
1232
1241
this . $get = [ '$filter' , '$sniffer' , '$log' , function ( $filter , $sniffer , $log ) {
1233
1242
$parseOptions . csp = $sniffer . csp ;
1243
+ var $parseOptionsExpensive = {
1244
+ csp : $parseOptions . csp ,
1245
+ unwrapPromises : $parseOptions . unwrapPromises ,
1246
+ logPromiseWarnings : $parseOptions . logPromiseWarnings ,
1247
+ expensiveChecks : true
1248
+ } ;
1234
1249
1235
1250
promiseWarning = function promiseWarningFn ( fullExp ) {
1236
1251
if ( ! $parseOptions . logPromiseWarnings || promiseWarningCache . hasOwnProperty ( fullExp ) ) return ;
@@ -1239,18 +1254,20 @@ function $ParseProvider() {
1239
1254
'Automatic unwrapping of promises in Angular expressions is deprecated.' ) ;
1240
1255
} ;
1241
1256
1242
- return function ( exp ) {
1257
+ return function ( exp , expensiveChecks ) {
1243
1258
var parsedExpression ;
1244
1259
1245
1260
switch ( typeof exp ) {
1246
1261
case 'string' :
1247
1262
1263
+ var cache = ( expensiveChecks ? cacheExpensive : cacheDefault ) ;
1248
1264
if ( cache . hasOwnProperty ( exp ) ) {
1249
1265
return cache [ exp ] ;
1250
1266
}
1251
1267
1252
- var lexer = new Lexer ( $parseOptions ) ;
1253
- var parser = new Parser ( lexer , $filter , $parseOptions ) ;
1268
+ var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions ;
1269
+ var lexer = new Lexer ( parseOptions ) ;
1270
+ var parser = new Parser ( lexer , $filter , parseOptions ) ;
1254
1271
parsedExpression = parser . parse ( exp ) ;
1255
1272
1256
1273
if ( exp !== 'hasOwnProperty' ) {
0 commit comments