angularjs-rails 1.2.18 → 1.2.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -2
- data/lib/angularjs-rails/version.rb +2 -2
- data/vendor/assets/javascripts/angular-animate.js +1 -1
- data/vendor/assets/javascripts/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/angular-loader.js +2 -2
- data/vendor/assets/javascripts/angular-mocks.js +9 -3
- data/vendor/assets/javascripts/angular-resource.js +1 -1
- data/vendor/assets/javascripts/angular-route.js +1 -1
- data/vendor/assets/javascripts/angular-sanitize.js +1 -1
- data/vendor/assets/javascripts/angular-scenario.js +143 -83
- data/vendor/assets/javascripts/angular-touch.js +1 -1
- data/vendor/assets/javascripts/angular.js +142 -82
- data/vendor/assets/javascripts/unstable/angular-animate.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-loader.js +2 -2
- data/vendor/assets/javascripts/unstable/angular-messages.js +2 -2
- data/vendor/assets/javascripts/unstable/angular-mocks.js +8 -2
- data/vendor/assets/javascripts/unstable/angular-resource.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-route.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-sanitize.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-scenario.js +269 -195
- data/vendor/assets/javascripts/unstable/angular-touch.js +1 -1
- data/vendor/assets/javascripts/unstable/angular.js +267 -192
- metadata +14 -14
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.19
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -68,7 +68,7 @@ function minErr(module) {
|
|
68
68
|
return match;
|
69
69
|
});
|
70
70
|
|
71
|
-
message = message + '\nhttp://errors.angularjs.org/1.2.
|
71
|
+
message = message + '\nhttp://errors.angularjs.org/1.2.19/' +
|
72
72
|
(module ? module + '/' : '') + code;
|
73
73
|
for (i = 2; i < arguments.length; i++) {
|
74
74
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
@@ -92,6 +92,7 @@ function minErr(module) {
|
|
92
92
|
-angularModule,
|
93
93
|
-nodeName_,
|
94
94
|
-uid,
|
95
|
+
-VALIDITY_STATE_PROPERTY,
|
95
96
|
|
96
97
|
-lowercase,
|
97
98
|
-uppercase,
|
@@ -181,6 +182,10 @@ function minErr(module) {
|
|
181
182
|
* <div doc-module-components="ng"></div>
|
182
183
|
*/
|
183
184
|
|
185
|
+
// The name of a form control's ValidityState property.
|
186
|
+
// This is used so that it's possible for internal tests to create mock ValidityStates.
|
187
|
+
var VALIDITY_STATE_PROPERTY = 'validity';
|
188
|
+
|
184
189
|
/**
|
185
190
|
* @ngdoc function
|
186
191
|
* @name angular.lowercase
|
@@ -1353,7 +1358,7 @@ function angularInit(element, bootstrap) {
|
|
1353
1358
|
*
|
1354
1359
|
* Angular will detect if it has been loaded into the browser more than once and only allow the
|
1355
1360
|
* first loaded script to be bootstrapped and will report a warning to the browser console for
|
1356
|
-
* each of the subsequent scripts.
|
1361
|
+
* each of the subsequent scripts. This prevents strange results in applications, where otherwise
|
1357
1362
|
* multiple instances of Angular try to work on the DOM.
|
1358
1363
|
*
|
1359
1364
|
* <example name="multi-bootstrap" module="multi-bootstrap">
|
@@ -1483,7 +1488,7 @@ function assertArgFn(arg, name, acceptArrayAnnotation) {
|
|
1483
1488
|
}
|
1484
1489
|
|
1485
1490
|
assertArg(isFunction(arg), name, 'not a function, got ' +
|
1486
|
-
(arg && typeof arg
|
1491
|
+
(arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg));
|
1487
1492
|
return arg;
|
1488
1493
|
}
|
1489
1494
|
|
@@ -1953,11 +1958,11 @@ function setupModuleLoader(window) {
|
|
1953
1958
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
1954
1959
|
*/
|
1955
1960
|
var version = {
|
1956
|
-
full: '1.2.
|
1961
|
+
full: '1.2.19', // all of these placeholder strings will be replaced by grunt's
|
1957
1962
|
major: 1, // package task
|
1958
1963
|
minor: 2,
|
1959
|
-
dot:
|
1960
|
-
codeName: '
|
1964
|
+
dot: 19,
|
1965
|
+
codeName: 'precognitive-flashbacks'
|
1961
1966
|
};
|
1962
1967
|
|
1963
1968
|
|
@@ -2179,8 +2184,9 @@ function publishExternalAPI(angular){
|
|
2179
2184
|
* @returns {Object} jQuery object.
|
2180
2185
|
*/
|
2181
2186
|
|
2187
|
+
JQLite.expando = 'ng339';
|
2188
|
+
|
2182
2189
|
var jqCache = JQLite.cache = {},
|
2183
|
-
jqName = JQLite.expando = 'ng' + new Date().getTime(),
|
2184
2190
|
jqId = 1,
|
2185
2191
|
addEventListenerFn = (window.document.addEventListener
|
2186
2192
|
? function(element, type, fn) {element.addEventListener(type, fn, false);}
|
@@ -2390,7 +2396,7 @@ function jqLiteOff(element, type, fn, unsupported) {
|
|
2390
2396
|
}
|
2391
2397
|
|
2392
2398
|
function jqLiteRemoveData(element, name) {
|
2393
|
-
var expandoId = element
|
2399
|
+
var expandoId = element.ng339,
|
2394
2400
|
expandoStore = jqCache[expandoId];
|
2395
2401
|
|
2396
2402
|
if (expandoStore) {
|
@@ -2404,17 +2410,17 @@ function jqLiteRemoveData(element, name) {
|
|
2404
2410
|
jqLiteOff(element);
|
2405
2411
|
}
|
2406
2412
|
delete jqCache[expandoId];
|
2407
|
-
element
|
2413
|
+
element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it
|
2408
2414
|
}
|
2409
2415
|
}
|
2410
2416
|
|
2411
2417
|
function jqLiteExpandoStore(element, key, value) {
|
2412
|
-
var expandoId = element
|
2418
|
+
var expandoId = element.ng339,
|
2413
2419
|
expandoStore = jqCache[expandoId || -1];
|
2414
2420
|
|
2415
2421
|
if (isDefined(value)) {
|
2416
2422
|
if (!expandoStore) {
|
2417
|
-
element
|
2423
|
+
element.ng339 = expandoId = jqNextId();
|
2418
2424
|
expandoStore = jqCache[expandoId] = {};
|
2419
2425
|
}
|
2420
2426
|
expandoStore[key] = value;
|
@@ -3081,16 +3087,16 @@ forEach({
|
|
3081
3087
|
* @returns {string} hash string such that the same input will have the same hash string.
|
3082
3088
|
* The resulting string key is in 'type:hashKey' format.
|
3083
3089
|
*/
|
3084
|
-
function hashKey(obj) {
|
3090
|
+
function hashKey(obj, nextUidFn) {
|
3085
3091
|
var objType = typeof obj,
|
3086
3092
|
key;
|
3087
3093
|
|
3088
|
-
if (objType == 'object' && obj !== null) {
|
3094
|
+
if (objType == 'function' || (objType == 'object' && obj !== null)) {
|
3089
3095
|
if (typeof (key = obj.$$hashKey) == 'function') {
|
3090
3096
|
// must invoke on object to keep the right this
|
3091
3097
|
key = obj.$$hashKey();
|
3092
3098
|
} else if (key === undefined) {
|
3093
|
-
key = obj.$$hashKey = nextUid();
|
3099
|
+
key = obj.$$hashKey = (nextUidFn || nextUid)();
|
3094
3100
|
}
|
3095
3101
|
} else {
|
3096
3102
|
key = obj;
|
@@ -3102,7 +3108,13 @@ function hashKey(obj) {
|
|
3102
3108
|
/**
|
3103
3109
|
* HashMap which can use objects as keys
|
3104
3110
|
*/
|
3105
|
-
function HashMap(array){
|
3111
|
+
function HashMap(array, isolatedUid) {
|
3112
|
+
if (isolatedUid) {
|
3113
|
+
var uid = 0;
|
3114
|
+
this.nextUid = function() {
|
3115
|
+
return ++uid;
|
3116
|
+
};
|
3117
|
+
}
|
3106
3118
|
forEach(array, this.put, this);
|
3107
3119
|
}
|
3108
3120
|
HashMap.prototype = {
|
@@ -3112,7 +3124,7 @@ HashMap.prototype = {
|
|
3112
3124
|
* @param value value to store can be any type
|
3113
3125
|
*/
|
3114
3126
|
put: function(key, value) {
|
3115
|
-
this[hashKey(key)] = value;
|
3127
|
+
this[hashKey(key, this.nextUid)] = value;
|
3116
3128
|
},
|
3117
3129
|
|
3118
3130
|
/**
|
@@ -3120,7 +3132,7 @@ HashMap.prototype = {
|
|
3120
3132
|
* @returns {Object} the value for the key
|
3121
3133
|
*/
|
3122
3134
|
get: function(key) {
|
3123
|
-
return this[hashKey(key)];
|
3135
|
+
return this[hashKey(key, this.nextUid)];
|
3124
3136
|
},
|
3125
3137
|
|
3126
3138
|
/**
|
@@ -3128,7 +3140,7 @@ HashMap.prototype = {
|
|
3128
3140
|
* @param key
|
3129
3141
|
*/
|
3130
3142
|
remove: function(key) {
|
3131
|
-
var value = this[key = hashKey(key)];
|
3143
|
+
var value = this[key = hashKey(key, this.nextUid)];
|
3132
3144
|
delete this[key];
|
3133
3145
|
return value;
|
3134
3146
|
}
|
@@ -3206,7 +3218,7 @@ function annotate(fn) {
|
|
3206
3218
|
argDecl,
|
3207
3219
|
last;
|
3208
3220
|
|
3209
|
-
if (typeof fn
|
3221
|
+
if (typeof fn === 'function') {
|
3210
3222
|
if (!($inject = fn.$inject)) {
|
3211
3223
|
$inject = [];
|
3212
3224
|
if (fn.length) {
|
@@ -3419,7 +3431,7 @@ function annotate(fn) {
|
|
3419
3431
|
|
3420
3432
|
|
3421
3433
|
/**
|
3422
|
-
* @ngdoc
|
3434
|
+
* @ngdoc service
|
3423
3435
|
* @name $provide
|
3424
3436
|
*
|
3425
3437
|
* @description
|
@@ -3725,7 +3737,7 @@ function createInjector(modulesToLoad) {
|
|
3725
3737
|
var INSTANTIATING = {},
|
3726
3738
|
providerSuffix = 'Provider',
|
3727
3739
|
path = [],
|
3728
|
-
loadedModules = new HashMap(),
|
3740
|
+
loadedModules = new HashMap([], true),
|
3729
3741
|
providerCache = {
|
3730
3742
|
$provide: {
|
3731
3743
|
provider: supportObject(provider),
|
@@ -3896,8 +3908,7 @@ function createInjector(modulesToLoad) {
|
|
3896
3908
|
: getService(key)
|
3897
3909
|
);
|
3898
3910
|
}
|
3899
|
-
if (
|
3900
|
-
// this means that we must be an array.
|
3911
|
+
if (isArray(fn)) {
|
3901
3912
|
fn = fn[length];
|
3902
3913
|
}
|
3903
3914
|
|
@@ -6078,7 +6089,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
6078
6089
|
directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority, ignoreDirective);
|
6079
6090
|
|
6080
6091
|
// iterate over the attributes
|
6081
|
-
for (var attr, name, nName, ngAttrName, value, nAttrs = node.attributes,
|
6092
|
+
for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes,
|
6082
6093
|
j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {
|
6083
6094
|
var attrStartName = false;
|
6084
6095
|
var attrEndName = false;
|
@@ -6086,9 +6097,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
6086
6097
|
attr = nAttrs[j];
|
6087
6098
|
if (!msie || msie >= 8 || attr.specified) {
|
6088
6099
|
name = attr.name;
|
6100
|
+
value = trim(attr.value);
|
6101
|
+
|
6089
6102
|
// support ngAttr attribute binding
|
6090
6103
|
ngAttrName = directiveNormalize(name);
|
6091
|
-
if (NG_ATTR_BINDING.test(ngAttrName)) {
|
6104
|
+
if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) {
|
6092
6105
|
name = snake_case(ngAttrName.substr(6), '-');
|
6093
6106
|
}
|
6094
6107
|
|
@@ -6101,9 +6114,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
6101
6114
|
|
6102
6115
|
nName = directiveNormalize(name.toLowerCase());
|
6103
6116
|
attrsMap[nName] = name;
|
6104
|
-
|
6105
|
-
|
6106
|
-
|
6117
|
+
if (isNgAttr || !attrs.hasOwnProperty(nName)) {
|
6118
|
+
attrs[nName] = value;
|
6119
|
+
if (getBooleanAttrName(node, nName)) {
|
6120
|
+
attrs[nName] = true; // presence means true
|
6121
|
+
}
|
6107
6122
|
}
|
6108
6123
|
addAttrInterpolateDirective(node, directives, value, nName);
|
6109
6124
|
addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,
|
@@ -7201,7 +7216,7 @@ function $ControllerProvider() {
|
|
7201
7216
|
instance = $injector.instantiate(expression, locals);
|
7202
7217
|
|
7203
7218
|
if (identifier) {
|
7204
|
-
if (!(locals && typeof locals.$scope
|
7219
|
+
if (!(locals && typeof locals.$scope === 'object')) {
|
7205
7220
|
throw minErr('$controller')('noscp',
|
7206
7221
|
"Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.",
|
7207
7222
|
constructor || expression.name, identifier);
|
@@ -8403,7 +8418,8 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
8403
8418
|
// Safari respectively.
|
8404
8419
|
if (xhr && xhr.readyState == 4) {
|
8405
8420
|
var responseHeaders = null,
|
8406
|
-
response = null
|
8421
|
+
response = null,
|
8422
|
+
statusText = '';
|
8407
8423
|
|
8408
8424
|
if(status !== ABORTED) {
|
8409
8425
|
responseHeaders = xhr.getAllResponseHeaders();
|
@@ -8413,11 +8429,17 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
8413
8429
|
response = ('response' in xhr) ? xhr.response : xhr.responseText;
|
8414
8430
|
}
|
8415
8431
|
|
8432
|
+
// Accessing statusText on an aborted xhr object will
|
8433
|
+
// throw an 'c00c023f error' in IE9 and lower, don't touch it.
|
8434
|
+
if (!(status === ABORTED && msie < 10)) {
|
8435
|
+
statusText = xhr.statusText;
|
8436
|
+
}
|
8437
|
+
|
8416
8438
|
completeRequest(callback,
|
8417
8439
|
status || xhr.status,
|
8418
8440
|
response,
|
8419
8441
|
responseHeaders,
|
8420
|
-
|
8442
|
+
statusText);
|
8421
8443
|
}
|
8422
8444
|
};
|
8423
8445
|
|
@@ -8951,7 +8973,7 @@ function $IntervalProvider() {
|
|
8951
8973
|
interval.cancel = function(promise) {
|
8952
8974
|
if (promise && promise.$$intervalId in intervals) {
|
8953
8975
|
intervals[promise.$$intervalId].reject('canceled');
|
8954
|
-
clearInterval(promise.$$intervalId);
|
8976
|
+
$window.clearInterval(promise.$$intervalId);
|
8955
8977
|
delete intervals[promise.$$intervalId];
|
8956
8978
|
return true;
|
8957
8979
|
}
|
@@ -9585,7 +9607,7 @@ function $LocationProvider(){
|
|
9585
9607
|
html5Mode = false;
|
9586
9608
|
|
9587
9609
|
/**
|
9588
|
-
* @ngdoc
|
9610
|
+
* @ngdoc method
|
9589
9611
|
* @name $locationProvider#hashPrefix
|
9590
9612
|
* @description
|
9591
9613
|
* @param {string=} prefix Prefix for hash part (containing path and search)
|
@@ -9601,7 +9623,7 @@ function $LocationProvider(){
|
|
9601
9623
|
};
|
9602
9624
|
|
9603
9625
|
/**
|
9604
|
-
* @ngdoc
|
9626
|
+
* @ngdoc method
|
9605
9627
|
* @name $locationProvider#html5Mode
|
9606
9628
|
* @description
|
9607
9629
|
* @param {boolean=} mode Use HTML5 strategy if available.
|
@@ -9959,14 +9981,7 @@ var promiseWarning;
|
|
9959
9981
|
//
|
9960
9982
|
// As an example, consider the following Angular expression:
|
9961
9983
|
//
|
9962
|
-
// {}.toString.constructor(alert("evil JS code"))
|
9963
|
-
//
|
9964
|
-
// We want to prevent this type of access. For the sake of performance, during the lexing phase we
|
9965
|
-
// disallow any "dotted" access to any member named "constructor".
|
9966
|
-
//
|
9967
|
-
// For reflective calls (a[b]) we check that the value of the lookup is not the Function constructor
|
9968
|
-
// while evaluating the expression, which is a stronger but more expensive test. Since reflective
|
9969
|
-
// calls are expensive anyway, this is not such a big deal compared to static dereferencing.
|
9984
|
+
// {}.toString.constructor('alert("evil JS code")')
|
9970
9985
|
//
|
9971
9986
|
// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits
|
9972
9987
|
// against the expression language, but not to prevent exploits that were enabled by exposing
|
@@ -9974,17 +9989,19 @@ var promiseWarning;
|
|
9974
9989
|
// practice and therefore we are not even trying to protect against interaction with an object
|
9975
9990
|
// explicitly exposed in this way.
|
9976
9991
|
//
|
9977
|
-
// A developer could foil the name check by aliasing the Function constructor under a different
|
9978
|
-
// name on the scope.
|
9979
|
-
//
|
9980
9992
|
// In general, it is not possible to access a Window object from an angular expression unless a
|
9981
9993
|
// window or some DOM object that has a reference to window is published onto a Scope.
|
9994
|
+
// Similarly we prevent invocations of function known to be dangerous, as well as assignments to
|
9995
|
+
// native objects.
|
9996
|
+
|
9982
9997
|
|
9983
9998
|
function ensureSafeMemberName(name, fullExpression) {
|
9984
|
-
if (name === "
|
9999
|
+
if (name === "__defineGetter__" || name === "__defineSetter__"
|
10000
|
+
|| name === "__lookupGetter__" || name === "__lookupSetter__"
|
10001
|
+
|| name === "__proto__") {
|
9985
10002
|
throw $parseMinErr('isecfld',
|
9986
|
-
'
|
9987
|
-
fullExpression);
|
10003
|
+
'Attempting to access a disallowed field in Angular expressions! '
|
10004
|
+
+'Expression: {0}', fullExpression);
|
9988
10005
|
}
|
9989
10006
|
return name;
|
9990
10007
|
}
|
@@ -10006,11 +10023,34 @@ function ensureSafeObject(obj, fullExpression) {
|
|
10006
10023
|
throw $parseMinErr('isecdom',
|
10007
10024
|
'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',
|
10008
10025
|
fullExpression);
|
10026
|
+
} else if (// block Object so that we can't get hold of dangerous Object.* methods
|
10027
|
+
obj === Object) {
|
10028
|
+
throw $parseMinErr('isecobj',
|
10029
|
+
'Referencing Object in Angular expressions is disallowed! Expression: {0}',
|
10030
|
+
fullExpression);
|
10009
10031
|
}
|
10010
10032
|
}
|
10011
10033
|
return obj;
|
10012
10034
|
}
|
10013
10035
|
|
10036
|
+
var CALL = Function.prototype.call;
|
10037
|
+
var APPLY = Function.prototype.apply;
|
10038
|
+
var BIND = Function.prototype.bind;
|
10039
|
+
|
10040
|
+
function ensureSafeFunction(obj, fullExpression) {
|
10041
|
+
if (obj) {
|
10042
|
+
if (obj.constructor === obj) {
|
10043
|
+
throw $parseMinErr('isecfn',
|
10044
|
+
'Referencing Function in Angular expressions is disallowed! Expression: {0}',
|
10045
|
+
fullExpression);
|
10046
|
+
} else if (obj === CALL || obj === APPLY || (BIND && obj === BIND)) {
|
10047
|
+
throw $parseMinErr('isecff',
|
10048
|
+
'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}',
|
10049
|
+
fullExpression);
|
10050
|
+
}
|
10051
|
+
}
|
10052
|
+
}
|
10053
|
+
|
10014
10054
|
var OPERATORS = {
|
10015
10055
|
/* jshint bitwise : false */
|
10016
10056
|
'null':function(){return null;},
|
@@ -10645,6 +10685,7 @@ Parser.prototype = {
|
|
10645
10685
|
i = indexFn(self, locals),
|
10646
10686
|
v, p;
|
10647
10687
|
|
10688
|
+
ensureSafeMemberName(i, parser.text);
|
10648
10689
|
if (!o) return undefined;
|
10649
10690
|
v = ensureSafeObject(o[i], parser.text);
|
10650
10691
|
if (v && v.then && parser.options.unwrapPromises) {
|
@@ -10687,7 +10728,7 @@ Parser.prototype = {
|
|
10687
10728
|
var fnPtr = fn(scope, locals, context) || noop;
|
10688
10729
|
|
10689
10730
|
ensureSafeObject(context, parser.text);
|
10690
|
-
|
10731
|
+
ensureSafeFunction(fnPtr, parser.text);
|
10691
10732
|
|
10692
10733
|
// IE stupidity! (IE doesn't have apply for some native functions)
|
10693
10734
|
var v = fnPtr.apply
|
@@ -10796,6 +10837,8 @@ function setter(obj, path, setValue, fullExp, options) {
|
|
10796
10837
|
}
|
10797
10838
|
}
|
10798
10839
|
key = ensureSafeMemberName(element.shift(), fullExp);
|
10840
|
+
ensureSafeObject(obj, fullExp);
|
10841
|
+
ensureSafeObject(obj[key], fullExp);
|
10799
10842
|
obj[key] = setValue;
|
10800
10843
|
return setValue;
|
10801
10844
|
}
|
@@ -11215,17 +11258,13 @@ function $ParseProvider() {
|
|
11215
11258
|
* var deferred = $q.defer();
|
11216
11259
|
*
|
11217
11260
|
* setTimeout(function() {
|
11218
|
-
*
|
11219
|
-
*
|
11220
|
-
*
|
11221
|
-
* deferred.
|
11222
|
-
*
|
11223
|
-
*
|
11224
|
-
*
|
11225
|
-
* } else {
|
11226
|
-
* deferred.reject('Greeting ' + name + ' is not allowed.');
|
11227
|
-
* }
|
11228
|
-
* });
|
11261
|
+
* deferred.notify('About to greet ' + name + '.');
|
11262
|
+
*
|
11263
|
+
* if (okToGreet(name)) {
|
11264
|
+
* deferred.resolve('Hello, ' + name + '!');
|
11265
|
+
* } else {
|
11266
|
+
* deferred.reject('Greeting ' + name + ' is not allowed.');
|
11267
|
+
* }
|
11229
11268
|
* }, 1000);
|
11230
11269
|
*
|
11231
11270
|
* return deferred.promise;
|
@@ -12387,7 +12426,7 @@ function $RootScopeProvider(){
|
|
12387
12426
|
if ((value = watch.get(current)) !== (last = watch.last) &&
|
12388
12427
|
!(watch.eq
|
12389
12428
|
? equals(value, last)
|
12390
|
-
: (typeof value
|
12429
|
+
: (typeof value === 'number' && typeof last === 'number'
|
12391
12430
|
&& isNaN(value) && isNaN(last)))) {
|
12392
12431
|
dirty = true;
|
12393
12432
|
lastDirtyWatch = watch;
|
@@ -13732,7 +13771,7 @@ function $SceProvider() {
|
|
13732
13771
|
|
13733
13772
|
/**
|
13734
13773
|
* @ngdoc method
|
13735
|
-
* @name $sce#
|
13774
|
+
* @name $sce#parseAs
|
13736
13775
|
*
|
13737
13776
|
* @description
|
13738
13777
|
* Converts Angular {@link guide/expression expression} into a function. This is like {@link
|
@@ -14688,7 +14727,7 @@ function filterFilter() {
|
|
14688
14727
|
// jshint +W086
|
14689
14728
|
for (var key in expression) {
|
14690
14729
|
(function(path) {
|
14691
|
-
if (typeof expression[path]
|
14730
|
+
if (typeof expression[path] === 'undefined') return;
|
14692
14731
|
predicates.push(function(value) {
|
14693
14732
|
return search(path == '$' ? value : (value && value[path]), expression[path]);
|
14694
14733
|
});
|
@@ -14843,6 +14882,7 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
14843
14882
|
var match = numStr.match(/([\d\.]+)e(-?)(\d+)/);
|
14844
14883
|
if (match && match[2] == '-' && match[3] > fractionSize + 1) {
|
14845
14884
|
numStr = '0';
|
14885
|
+
number = 0;
|
14846
14886
|
} else {
|
14847
14887
|
formatedText = numStr;
|
14848
14888
|
hasExponent = true;
|
@@ -14857,8 +14897,11 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
14857
14897
|
fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac);
|
14858
14898
|
}
|
14859
14899
|
|
14860
|
-
|
14861
|
-
|
14900
|
+
// safely round numbers in JS without hitting imprecisions of floating-point arithmetics
|
14901
|
+
// inspired by:
|
14902
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
|
14903
|
+
number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize);
|
14904
|
+
|
14862
14905
|
var fraction = ('' + number).split(DECIMAL_SEP);
|
14863
14906
|
var whole = fraction[0];
|
14864
14907
|
fraction = fraction[1] || '';
|
@@ -16360,7 +16403,7 @@ var ngFormDirective = formDirectiveFactory(true);
|
|
16360
16403
|
*/
|
16361
16404
|
|
16362
16405
|
var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
|
16363
|
-
var EMAIL_REGEXP = /^[a-z0-9!#$%&'
|
16406
|
+
var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*$/i;
|
16364
16407
|
var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/;
|
16365
16408
|
|
16366
16409
|
var inputType = {
|
@@ -16786,15 +16829,29 @@ function validate(ctrl, validatorName, validity, value){
|
|
16786
16829
|
return validity ? value : undefined;
|
16787
16830
|
}
|
16788
16831
|
|
16832
|
+
function testFlags(validity, flags) {
|
16833
|
+
var i, flag;
|
16834
|
+
if (flags) {
|
16835
|
+
for (i=0; i<flags.length; ++i) {
|
16836
|
+
flag = flags[i];
|
16837
|
+
if (validity[flag]) {
|
16838
|
+
return true;
|
16839
|
+
}
|
16840
|
+
}
|
16841
|
+
}
|
16842
|
+
return false;
|
16843
|
+
}
|
16789
16844
|
|
16790
|
-
|
16791
|
-
|
16845
|
+
// Pass validity so that behaviour can be mocked easier.
|
16846
|
+
function addNativeHtml5Validators(ctrl, validatorName, badFlags, ignoreFlags, validity) {
|
16792
16847
|
if (isObject(validity)) {
|
16848
|
+
ctrl.$$hasNativeValidators = true;
|
16793
16849
|
var validator = function(value) {
|
16794
16850
|
// Don't overwrite previous validation, don't consider valueMissing to apply (ng-required can
|
16795
16851
|
// perform the required validation)
|
16796
|
-
if (!ctrl.$error[validatorName] &&
|
16797
|
-
validity
|
16852
|
+
if (!ctrl.$error[validatorName] &&
|
16853
|
+
!testFlags(validity, ignoreFlags) &&
|
16854
|
+
testFlags(validity, badFlags)) {
|
16798
16855
|
ctrl.$setValidity(validatorName, false);
|
16799
16856
|
return;
|
16800
16857
|
}
|
@@ -16805,8 +16862,9 @@ function addNativeHtml5Validators(ctrl, validatorName, element) {
|
|
16805
16862
|
}
|
16806
16863
|
|
16807
16864
|
function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
16808
|
-
var validity = element.prop(
|
16865
|
+
var validity = element.prop(VALIDITY_STATE_PROPERTY);
|
16809
16866
|
var placeholder = element[0].placeholder, noevent = {};
|
16867
|
+
ctrl.$$validityState = validity;
|
16810
16868
|
|
16811
16869
|
// In composition mode, users are still inputing intermediate text buffer,
|
16812
16870
|
// hold the listener until composition is done.
|
@@ -16844,11 +16902,11 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
16844
16902
|
value = trim(value);
|
16845
16903
|
}
|
16846
16904
|
|
16847
|
-
|
16848
|
-
|
16849
|
-
|
16850
|
-
|
16851
|
-
|
16905
|
+
// If a control is suffering from bad input, browsers discard its value, so it may be
|
16906
|
+
// necessary to revalidate even if the control's value is the same empty value twice in
|
16907
|
+
// a row.
|
16908
|
+
var revalidate = validity && ctrl.$$hasNativeValidators;
|
16909
|
+
if (ctrl.$viewValue !== value || (value === '' && revalidate)) {
|
16852
16910
|
if (scope.$$phase) {
|
16853
16911
|
ctrl.$setViewValue(value);
|
16854
16912
|
} else {
|
@@ -16954,6 +17012,8 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
16954
17012
|
}
|
16955
17013
|
}
|
16956
17014
|
|
17015
|
+
var numberBadFlags = ['badInput'];
|
17016
|
+
|
16957
17017
|
function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
16958
17018
|
textInputType(scope, element, attr, ctrl, $sniffer, $browser);
|
16959
17019
|
|
@@ -16968,7 +17028,7 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
16968
17028
|
}
|
16969
17029
|
});
|
16970
17030
|
|
16971
|
-
addNativeHtml5Validators(ctrl, 'number',
|
17031
|
+
addNativeHtml5Validators(ctrl, 'number', numberBadFlags, null, ctrl.$$validityState);
|
16972
17032
|
|
16973
17033
|
ctrl.$formatters.push(function(value) {
|
16974
17034
|
return ctrl.$isEmpty(value) ? '' : '' + value;
|
@@ -17450,7 +17510,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
17450
17510
|
* This method should be called by validators - i.e. the parser or formatter functions.
|
17451
17511
|
*
|
17452
17512
|
* @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign
|
17453
|
-
* to `$error[validationErrorKey]
|
17513
|
+
* to `$error[validationErrorKey]=!isValid` so that it is available for data-binding.
|
17454
17514
|
* The `validationErrorKey` should be in camelCase and will get converted into dash-case
|
17455
17515
|
* for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`
|
17456
17516
|
* class and can be bound to as `{{someForm.someControl.$error.myError}}` .
|
@@ -19834,7 +19894,7 @@ var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
|
|
19834
19894
|
* When one person, perhaps John, views the document, "John is viewing" will be shown.
|
19835
19895
|
* When three people view the document, no explicit number rule is found, so
|
19836
19896
|
* an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.
|
19837
|
-
* In this case, plural category 'one' is matched and "John,
|
19897
|
+
* In this case, plural category 'one' is matched and "John, Mary and one other person are viewing"
|
19838
19898
|
* is shown.
|
19839
19899
|
*
|
19840
19900
|
* Note that when you specify offsets, you must provide explicit number rules for
|
@@ -20716,7 +20776,7 @@ var ngHideDirective = ['$animate', function($animate) {
|
|
20716
20776
|
<file name="protractor.js" type="protractor">
|
20717
20777
|
var colorSpan = element(by.css('span'));
|
20718
20778
|
|
20719
|
-
|
20779
|
+
it('should check ng-style', function() {
|
20720
20780
|
expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');
|
20721
20781
|
element(by.css('input[value=\'set color\']')).click();
|
20722
20782
|
expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');
|
@@ -21609,7 +21669,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
21609
21669
|
// rather then the element.
|
21610
21670
|
(element = optionTemplate.clone())
|
21611
21671
|
.val(option.id)
|
21612
|
-
.
|
21672
|
+
.prop('selected', option.selected)
|
21613
21673
|
.text(option.label);
|
21614
21674
|
}
|
21615
21675
|
|