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.3.0-beta.
|
2
|
+
* @license AngularJS v1.3.0-beta.14
|
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.3.0-beta.
|
71
|
+
message = message + '\nhttp://errors.angularjs.org/1.3.0-beta.14/' +
|
72
72
|
(module ? module + '/' : '') + code;
|
73
73
|
for (i = 2; i < arguments.length; i++) {
|
74
74
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
@@ -93,6 +93,7 @@ function minErr(module) {
|
|
93
93
|
-nodeName_,
|
94
94
|
-uid,
|
95
95
|
-REGEX_STRING_REGEXP,
|
96
|
+
-VALIDITY_STATE_PROPERTY,
|
96
97
|
|
97
98
|
-lowercase,
|
98
99
|
-uppercase,
|
@@ -145,7 +146,6 @@ function minErr(module) {
|
|
145
146
|
-toJsonReplacer,
|
146
147
|
-toJson,
|
147
148
|
-fromJson,
|
148
|
-
-toBoolean,
|
149
149
|
-startingTag,
|
150
150
|
-tryDecodeURIComponent,
|
151
151
|
-parseKeyValue,
|
@@ -184,6 +184,10 @@ function minErr(module) {
|
|
184
184
|
|
185
185
|
var REGEX_STRING_REGEXP = /^\/(.+)\/([a-z]*)$/;
|
186
186
|
|
187
|
+
// The name of a form control's ValidityState property.
|
188
|
+
// This is used so that it's possible for internal tests to create mock ValidityStates.
|
189
|
+
var VALIDITY_STATE_PROPERTY = 'validity';
|
190
|
+
|
187
191
|
/**
|
188
192
|
* @ngdoc function
|
189
193
|
* @name angular.lowercase
|
@@ -320,12 +324,12 @@ function forEach(obj, iterator, context) {
|
|
320
324
|
iterator.call(context, obj[key], key);
|
321
325
|
}
|
322
326
|
}
|
323
|
-
} else if (obj
|
324
|
-
obj.forEach(iterator, context);
|
325
|
-
} else if (isArrayLike(obj)) {
|
327
|
+
} else if (isArray(obj) || isArrayLike(obj)) {
|
326
328
|
for (key = 0, length = obj.length; key < length; key++) {
|
327
329
|
iterator.call(context, obj[key], key);
|
328
330
|
}
|
331
|
+
} else if (obj.forEach && obj.forEach !== forEach) {
|
332
|
+
obj.forEach(iterator, context);
|
329
333
|
} else {
|
330
334
|
for (key in obj) {
|
331
335
|
if (obj.hasOwnProperty(key)) {
|
@@ -694,12 +698,14 @@ function makeMap(str) {
|
|
694
698
|
if (msie < 9) {
|
695
699
|
nodeName_ = function(element) {
|
696
700
|
element = element.nodeName ? element : element[0];
|
697
|
-
return (
|
698
|
-
|
701
|
+
return lowercase(
|
702
|
+
(element.scopeName && element.scopeName != 'HTML')
|
703
|
+
? element.scopeName + ':' + element.nodeName : element.nodeName
|
704
|
+
);
|
699
705
|
};
|
700
706
|
} else {
|
701
707
|
nodeName_ = function(element) {
|
702
|
-
return element.nodeName ? element.nodeName : element[0].nodeName;
|
708
|
+
return lowercase(element.nodeName ? element.nodeName : element[0].nodeName);
|
703
709
|
};
|
704
710
|
}
|
705
711
|
|
@@ -762,10 +768,10 @@ function arrayRemove(array, value) {
|
|
762
768
|
|
763
769
|
function isLeafNode (node) {
|
764
770
|
if (node) {
|
765
|
-
switch (node
|
766
|
-
case "
|
767
|
-
case "
|
768
|
-
case "
|
771
|
+
switch (nodeName_(node)) {
|
772
|
+
case "option":
|
773
|
+
case "pre":
|
774
|
+
case "title":
|
769
775
|
return true;
|
770
776
|
}
|
771
777
|
}
|
@@ -845,7 +851,8 @@ function copy(source, destination, stackSource, stackDest) {
|
|
845
851
|
} else if (isRegExp(source)) {
|
846
852
|
destination = new RegExp(source.source);
|
847
853
|
} else if (isObject(source)) {
|
848
|
-
|
854
|
+
var emptyObject = Object.create(Object.getPrototypeOf(source));
|
855
|
+
destination = copy(source, emptyObject, stackSource, stackDest);
|
849
856
|
}
|
850
857
|
}
|
851
858
|
} else {
|
@@ -880,12 +887,14 @@ function copy(source, destination, stackSource, stackDest) {
|
|
880
887
|
delete destination[key];
|
881
888
|
});
|
882
889
|
for ( var key in source) {
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
|
890
|
+
if(source.hasOwnProperty(key)) {
|
891
|
+
result = copy(source[key], null, stackSource, stackDest);
|
892
|
+
if (isObject(source[key])) {
|
893
|
+
stackSource.push(source[key]);
|
894
|
+
stackDest.push(result);
|
895
|
+
}
|
896
|
+
destination[key] = result;
|
887
897
|
}
|
888
|
-
destination[key] = result;
|
889
898
|
}
|
890
899
|
setHashKey(destination,h);
|
891
900
|
}
|
@@ -1105,18 +1114,6 @@ function fromJson(json) {
|
|
1105
1114
|
}
|
1106
1115
|
|
1107
1116
|
|
1108
|
-
function toBoolean(value) {
|
1109
|
-
if (typeof value === 'function') {
|
1110
|
-
value = true;
|
1111
|
-
} else if (value && value.length !== 0) {
|
1112
|
-
var v = lowercase("" + value);
|
1113
|
-
value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');
|
1114
|
-
} else {
|
1115
|
-
value = false;
|
1116
|
-
}
|
1117
|
-
return value;
|
1118
|
-
}
|
1119
|
-
|
1120
1117
|
/**
|
1121
1118
|
* @returns {string} Returns the string representation of the element.
|
1122
1119
|
*/
|
@@ -1446,7 +1443,7 @@ function angularInit(element, bootstrap) {
|
|
1446
1443
|
*
|
1447
1444
|
* Angular will detect if it has been loaded into the browser more than once and only allow the
|
1448
1445
|
* first loaded script to be bootstrapped and will report a warning to the browser console for
|
1449
|
-
* each of the subsequent scripts.
|
1446
|
+
* each of the subsequent scripts. This prevents strange results in applications, where otherwise
|
1450
1447
|
* multiple instances of Angular try to work on the DOM.
|
1451
1448
|
*
|
1452
1449
|
* ```html
|
@@ -1589,7 +1586,7 @@ function assertArgFn(arg, name, acceptArrayAnnotation) {
|
|
1589
1586
|
}
|
1590
1587
|
|
1591
1588
|
assertArg(isFunction(arg), name, 'not a function, got ' +
|
1592
|
-
(arg && typeof arg
|
1589
|
+
(arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg));
|
1593
1590
|
return arg;
|
1594
1591
|
}
|
1595
1592
|
|
@@ -2044,6 +2041,7 @@ function setupModuleLoader(window) {
|
|
2044
2041
|
$ParseProvider,
|
2045
2042
|
$RootScopeProvider,
|
2046
2043
|
$QProvider,
|
2044
|
+
$$QProvider,
|
2047
2045
|
$$SanitizeUriProvider,
|
2048
2046
|
$SceProvider,
|
2049
2047
|
$SceDelegateProvider,
|
@@ -2071,11 +2069,11 @@ function setupModuleLoader(window) {
|
|
2071
2069
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
2072
2070
|
*/
|
2073
2071
|
var version = {
|
2074
|
-
full: '1.3.0-beta.
|
2072
|
+
full: '1.3.0-beta.14', // all of these placeholder strings will be replaced by grunt's
|
2075
2073
|
major: 1, // package task
|
2076
2074
|
minor: 3,
|
2077
2075
|
dot: 0,
|
2078
|
-
codeName: '
|
2076
|
+
codeName: 'harmonious-cacophonies'
|
2079
2077
|
};
|
2080
2078
|
|
2081
2079
|
|
@@ -2193,6 +2191,7 @@ function publishExternalAPI(angular){
|
|
2193
2191
|
$parse: $ParseProvider,
|
2194
2192
|
$rootScope: $RootScopeProvider,
|
2195
2193
|
$q: $QProvider,
|
2194
|
+
$$q: $$QProvider,
|
2196
2195
|
$sce: $SceProvider,
|
2197
2196
|
$sceDelegate: $SceDelegateProvider,
|
2198
2197
|
$sniffer: $SnifferProvider,
|
@@ -2367,6 +2366,12 @@ function jqLiteIsTextNode(html) {
|
|
2367
2366
|
return !HTML_REGEXP.test(html);
|
2368
2367
|
}
|
2369
2368
|
|
2369
|
+
function jqLiteAcceptsData(node) {
|
2370
|
+
// The window object can accept data but has no nodeType
|
2371
|
+
// Otherwise we are only interested in elements (1) and documents (9)
|
2372
|
+
return !node.nodeType || node.nodeType === 1 || node.nodeType === 9;
|
2373
|
+
}
|
2374
|
+
|
2370
2375
|
function jqLiteBuildFragment(html, context) {
|
2371
2376
|
var elem, tmp, tag, wrap,
|
2372
2377
|
fragment = context.createDocumentFragment(),
|
@@ -2514,30 +2519,29 @@ function jqLiteExpandoStore(element, key, value) {
|
|
2514
2519
|
}
|
2515
2520
|
|
2516
2521
|
function jqLiteData(element, key, value) {
|
2517
|
-
|
2518
|
-
|
2519
|
-
|
2520
|
-
|
2521
|
-
|
2522
|
-
|
2523
|
-
|
2524
|
-
|
2522
|
+
if (jqLiteAcceptsData(element)) {
|
2523
|
+
var data = jqLiteExpandoStore(element, 'data'),
|
2524
|
+
isSetter = isDefined(value),
|
2525
|
+
keyDefined = !isSetter && isDefined(key),
|
2526
|
+
isSimpleGetter = keyDefined && !isObject(key);
|
2527
|
+
|
2528
|
+
if (!data && !isSimpleGetter) {
|
2529
|
+
jqLiteExpandoStore(element, 'data', data = {});
|
2530
|
+
}
|
2525
2531
|
|
2526
|
-
|
2527
|
-
// set data only on Elements and Documents
|
2528
|
-
if (element.nodeType === 1 || element.nodeType === 9) {
|
2532
|
+
if (isSetter) {
|
2529
2533
|
data[key] = value;
|
2530
|
-
}
|
2531
|
-
|
2532
|
-
|
2533
|
-
|
2534
|
-
|
2535
|
-
|
2534
|
+
} else {
|
2535
|
+
if (keyDefined) {
|
2536
|
+
if (isSimpleGetter) {
|
2537
|
+
// don't create data in this case.
|
2538
|
+
return data && data[key];
|
2539
|
+
} else {
|
2540
|
+
extend(data, key);
|
2541
|
+
}
|
2536
2542
|
} else {
|
2537
|
-
|
2543
|
+
return data;
|
2538
2544
|
}
|
2539
|
-
} else {
|
2540
|
-
return data;
|
2541
2545
|
}
|
2542
2546
|
}
|
2543
2547
|
}
|
@@ -2591,6 +2595,10 @@ function jqLiteAddNodes(root, elements) {
|
|
2591
2595
|
// if an Array or NodeList and not a Window
|
2592
2596
|
if (typeof length === 'number' && elements.window !== elements) {
|
2593
2597
|
if (length) {
|
2598
|
+
if (elements.item) {
|
2599
|
+
// convert NodeList to an Array to make PhantomJS 1.x happy
|
2600
|
+
elements = slice.call(elements);
|
2601
|
+
}
|
2594
2602
|
push.apply(root, elements);
|
2595
2603
|
}
|
2596
2604
|
} else {
|
@@ -2688,7 +2696,7 @@ forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','),
|
|
2688
2696
|
});
|
2689
2697
|
var BOOLEAN_ELEMENTS = {};
|
2690
2698
|
forEach('input,select,option,textarea,button,form,details'.split(','), function(value) {
|
2691
|
-
BOOLEAN_ELEMENTS[
|
2699
|
+
BOOLEAN_ELEMENTS[value] = true;
|
2692
2700
|
});
|
2693
2701
|
var ALIASED_ATTR = {
|
2694
2702
|
'ngMinlength' : 'minlength',
|
@@ -2701,7 +2709,7 @@ function getBooleanAttrName(element, name) {
|
|
2701
2709
|
var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];
|
2702
2710
|
|
2703
2711
|
// booleanAttr is here twice to minimize DOM access
|
2704
|
-
return booleanAttr && BOOLEAN_ELEMENTS[element
|
2712
|
+
return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr;
|
2705
2713
|
}
|
2706
2714
|
|
2707
2715
|
function getAliasedAttrName(element, name) {
|
@@ -2811,7 +2819,7 @@ forEach({
|
|
2811
2819
|
|
2812
2820
|
val: function(element, value) {
|
2813
2821
|
if (isUndefined(value)) {
|
2814
|
-
if (nodeName_(element) === '
|
2822
|
+
if (element.multiple && nodeName_(element) === 'select') {
|
2815
2823
|
var result = [];
|
2816
2824
|
forEach(element.options, function (option) {
|
2817
2825
|
if (option.selected) {
|
@@ -2956,6 +2964,11 @@ forEach({
|
|
2956
2964
|
on: function onFn(element, type, fn, unsupported){
|
2957
2965
|
if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters');
|
2958
2966
|
|
2967
|
+
// Do not add event handlers to non-elements because they will not be cleaned up.
|
2968
|
+
if (!jqLiteAcceptsData(element)) {
|
2969
|
+
return;
|
2970
|
+
}
|
2971
|
+
|
2959
2972
|
var events = jqLiteExpandoStore(element, 'events'),
|
2960
2973
|
handle = jqLiteExpandoStore(element, 'handle');
|
2961
2974
|
|
@@ -3145,7 +3158,12 @@ forEach({
|
|
3145
3158
|
eventData = eventData || [];
|
3146
3159
|
|
3147
3160
|
var event = [{
|
3148
|
-
preventDefault:
|
3161
|
+
preventDefault: function() {
|
3162
|
+
this.defaultPrevented = true;
|
3163
|
+
},
|
3164
|
+
isDefaultPrevented: function() {
|
3165
|
+
return this.defaultPrevented === true;
|
3166
|
+
},
|
3149
3167
|
stopPropagation: noop
|
3150
3168
|
}];
|
3151
3169
|
|
@@ -3190,16 +3208,16 @@ forEach({
|
|
3190
3208
|
* @returns {string} hash string such that the same input will have the same hash string.
|
3191
3209
|
* The resulting string key is in 'type:hashKey' format.
|
3192
3210
|
*/
|
3193
|
-
function hashKey(obj) {
|
3211
|
+
function hashKey(obj, nextUidFn) {
|
3194
3212
|
var objType = typeof obj,
|
3195
3213
|
key;
|
3196
3214
|
|
3197
|
-
if (objType == 'object' && obj !== null) {
|
3215
|
+
if (objType == 'function' || (objType == 'object' && obj !== null)) {
|
3198
3216
|
if (typeof (key = obj.$$hashKey) == 'function') {
|
3199
3217
|
// must invoke on object to keep the right this
|
3200
3218
|
key = obj.$$hashKey();
|
3201
3219
|
} else if (key === undefined) {
|
3202
|
-
key = obj.$$hashKey = nextUid();
|
3220
|
+
key = obj.$$hashKey = (nextUidFn || nextUid)();
|
3203
3221
|
}
|
3204
3222
|
} else {
|
3205
3223
|
key = obj;
|
@@ -3211,7 +3229,13 @@ function hashKey(obj) {
|
|
3211
3229
|
/**
|
3212
3230
|
* HashMap which can use objects as keys
|
3213
3231
|
*/
|
3214
|
-
function HashMap(array){
|
3232
|
+
function HashMap(array, isolatedUid) {
|
3233
|
+
if (isolatedUid) {
|
3234
|
+
var uid = 0;
|
3235
|
+
this.nextUid = function() {
|
3236
|
+
return ++uid;
|
3237
|
+
};
|
3238
|
+
}
|
3215
3239
|
forEach(array, this.put, this);
|
3216
3240
|
}
|
3217
3241
|
HashMap.prototype = {
|
@@ -3221,7 +3245,7 @@ HashMap.prototype = {
|
|
3221
3245
|
* @param value value to store can be any type
|
3222
3246
|
*/
|
3223
3247
|
put: function(key, value) {
|
3224
|
-
this[hashKey(key)] = value;
|
3248
|
+
this[hashKey(key, this.nextUid)] = value;
|
3225
3249
|
},
|
3226
3250
|
|
3227
3251
|
/**
|
@@ -3229,7 +3253,7 @@ HashMap.prototype = {
|
|
3229
3253
|
* @returns {Object} the value for the key
|
3230
3254
|
*/
|
3231
3255
|
get: function(key) {
|
3232
|
-
return this[hashKey(key)];
|
3256
|
+
return this[hashKey(key, this.nextUid)];
|
3233
3257
|
},
|
3234
3258
|
|
3235
3259
|
/**
|
@@ -3237,7 +3261,7 @@ HashMap.prototype = {
|
|
3237
3261
|
* @param key
|
3238
3262
|
*/
|
3239
3263
|
remove: function(key) {
|
3240
|
-
var value = this[key = hashKey(key)];
|
3264
|
+
var value = this[key = hashKey(key, this.nextUid)];
|
3241
3265
|
delete this[key];
|
3242
3266
|
return value;
|
3243
3267
|
}
|
@@ -3327,7 +3351,7 @@ function annotate(fn, strictDi, name) {
|
|
3327
3351
|
argDecl,
|
3328
3352
|
last;
|
3329
3353
|
|
3330
|
-
if (typeof fn
|
3354
|
+
if (typeof fn === 'function') {
|
3331
3355
|
if (!($inject = fn.$inject)) {
|
3332
3356
|
$inject = [];
|
3333
3357
|
if (fn.length) {
|
@@ -3547,7 +3571,7 @@ function annotate(fn, strictDi, name) {
|
|
3547
3571
|
|
3548
3572
|
|
3549
3573
|
/**
|
3550
|
-
* @ngdoc
|
3574
|
+
* @ngdoc service
|
3551
3575
|
* @name $provide
|
3552
3576
|
*
|
3553
3577
|
* @description
|
@@ -3854,7 +3878,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
3854
3878
|
var INSTANTIATING = {},
|
3855
3879
|
providerSuffix = 'Provider',
|
3856
3880
|
path = [],
|
3857
|
-
loadedModules = new HashMap(),
|
3881
|
+
loadedModules = new HashMap([], true),
|
3858
3882
|
providerCache = {
|
3859
3883
|
$provide: {
|
3860
3884
|
provider: supportObject(provider),
|
@@ -4035,8 +4059,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
4035
4059
|
: getService(key)
|
4036
4060
|
);
|
4037
4061
|
}
|
4038
|
-
if (
|
4039
|
-
// this means that we must be an array.
|
4062
|
+
if (isArray(fn)) {
|
4040
4063
|
fn = fn[length];
|
4041
4064
|
}
|
4042
4065
|
|
@@ -4139,7 +4162,7 @@ function $AnchorScrollProvider() {
|
|
4139
4162
|
function getFirstAnchor(list) {
|
4140
4163
|
var result = null;
|
4141
4164
|
forEach(list, function(element) {
|
4142
|
-
if (!result &&
|
4165
|
+
if (!result && nodeName_(element) === 'a') result = element;
|
4143
4166
|
});
|
4144
4167
|
return result;
|
4145
4168
|
}
|
@@ -5964,8 +5987,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
5964
5987
|
nodeName = nodeName_(this.$$element);
|
5965
5988
|
|
5966
5989
|
// sanitize a[href] and img[src] values
|
5967
|
-
if ((nodeName === '
|
5968
|
-
(nodeName === '
|
5990
|
+
if ((nodeName === 'a' && key === 'href') ||
|
5991
|
+
(nodeName === 'img' && key === 'src')) {
|
5969
5992
|
this[key] = value = $$sanitizeUri(value, key === 'src');
|
5970
5993
|
}
|
5971
5994
|
|
@@ -6235,10 +6258,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
6235
6258
|
case 1: /* Element */
|
6236
6259
|
// use the node name: <directive>
|
6237
6260
|
addDirective(directives,
|
6238
|
-
directiveNormalize(nodeName_(node)
|
6261
|
+
directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective);
|
6239
6262
|
|
6240
6263
|
// iterate over the attributes
|
6241
|
-
for (var attr, name, nName, ngAttrName, value, nAttrs = node.attributes,
|
6264
|
+
for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes,
|
6242
6265
|
j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {
|
6243
6266
|
var attrStartName = false;
|
6244
6267
|
var attrEndName = false;
|
@@ -6246,9 +6269,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
6246
6269
|
attr = nAttrs[j];
|
6247
6270
|
if (!msie || msie >= 8 || attr.specified) {
|
6248
6271
|
name = attr.name;
|
6272
|
+
value = trim(attr.value);
|
6273
|
+
|
6249
6274
|
// support ngAttr attribute binding
|
6250
6275
|
ngAttrName = directiveNormalize(name);
|
6251
|
-
if (NG_ATTR_BINDING.test(ngAttrName)) {
|
6276
|
+
if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) {
|
6252
6277
|
name = snake_case(ngAttrName.substr(6), '-');
|
6253
6278
|
}
|
6254
6279
|
|
@@ -6261,9 +6286,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
6261
6286
|
|
6262
6287
|
nName = directiveNormalize(name.toLowerCase());
|
6263
6288
|
attrsMap[nName] = name;
|
6264
|
-
|
6265
|
-
|
6266
|
-
|
6289
|
+
if (isNgAttr || !attrs.hasOwnProperty(nName)) {
|
6290
|
+
attrs[nName] = value;
|
6291
|
+
if (getBooleanAttrName(node, nName)) {
|
6292
|
+
attrs[nName] = true; // presence means true
|
6293
|
+
}
|
6267
6294
|
}
|
6268
6295
|
addAttrInterpolateDirective(node, directives, value, nName);
|
6269
6296
|
addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,
|
@@ -7098,8 +7125,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7098
7125
|
var tag = nodeName_(node);
|
7099
7126
|
// maction[xlink:href] can source SVG. It's not limited to <maction>.
|
7100
7127
|
if (attrNormalizedName == "xlinkHref" ||
|
7101
|
-
(tag == "
|
7102
|
-
(tag != "
|
7128
|
+
(tag == "form" && attrNormalizedName == "action") ||
|
7129
|
+
(tag != "img" && (attrNormalizedName == "src" ||
|
7103
7130
|
attrNormalizedName == "ngSrc"))) {
|
7104
7131
|
return $sce.RESOURCE_URL;
|
7105
7132
|
}
|
@@ -7113,7 +7140,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7113
7140
|
if (!interpolateFn) return;
|
7114
7141
|
|
7115
7142
|
|
7116
|
-
if (name === "multiple" && nodeName_(node) === "
|
7143
|
+
if (name === "multiple" && nodeName_(node) === "select") {
|
7117
7144
|
throw $compileMinErr("selmulti",
|
7118
7145
|
"Binding to the 'multiple' attribute is not supported. Element: {0}",
|
7119
7146
|
startingTag(node));
|
@@ -7391,7 +7418,7 @@ function $ControllerProvider() {
|
|
7391
7418
|
instance = $injector.instantiate(expression, locals, constructor);
|
7392
7419
|
|
7393
7420
|
if (identifier) {
|
7394
|
-
if (!(locals && typeof locals.$scope
|
7421
|
+
if (!(locals && typeof locals.$scope === 'object')) {
|
7395
7422
|
throw minErr('$controller')('noscp',
|
7396
7423
|
"Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.",
|
7397
7424
|
constructor || expression.name, identifier);
|
@@ -8265,7 +8292,21 @@ function $HttpProvider() {
|
|
8265
8292
|
* @param {Object=} config Optional configuration object
|
8266
8293
|
* @returns {HttpPromise} Future object
|
8267
8294
|
*/
|
8268
|
-
|
8295
|
+
|
8296
|
+
/**
|
8297
|
+
* @ngdoc method
|
8298
|
+
* @name ng.$http#patch
|
8299
|
+
* @methodOf ng.$http
|
8300
|
+
*
|
8301
|
+
* @description
|
8302
|
+
* Shortcut method to perform `PATCH` request.
|
8303
|
+
*
|
8304
|
+
* @param {string} url Relative or absolute URL specifying the destination of the request
|
8305
|
+
* @param {*} data Request content
|
8306
|
+
* @param {Object=} config Optional configuration object
|
8307
|
+
* @returns {HttpPromise} Future object
|
8308
|
+
*/
|
8309
|
+
createShortMethodsWithData('post', 'put', 'patch');
|
8269
8310
|
|
8270
8311
|
/**
|
8271
8312
|
* @ngdoc property
|
@@ -8521,7 +8562,8 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
8521
8562
|
// Safari respectively.
|
8522
8563
|
if (xhr && xhr.readyState == 4) {
|
8523
8564
|
var responseHeaders = null,
|
8524
|
-
response = null
|
8565
|
+
response = null,
|
8566
|
+
statusText = '';
|
8525
8567
|
|
8526
8568
|
if(status !== ABORTED) {
|
8527
8569
|
responseHeaders = xhr.getAllResponseHeaders();
|
@@ -8531,11 +8573,17 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
8531
8573
|
response = ('response' in xhr) ? xhr.response : xhr.responseText;
|
8532
8574
|
}
|
8533
8575
|
|
8576
|
+
// Accessing statusText on an aborted xhr object will
|
8577
|
+
// throw an 'c00c023f error' in IE9 and lower, don't touch it.
|
8578
|
+
if (!(status === ABORTED && msie < 10)) {
|
8579
|
+
statusText = xhr.statusText;
|
8580
|
+
}
|
8581
|
+
|
8534
8582
|
completeRequest(callback,
|
8535
8583
|
status || xhr.status,
|
8536
8584
|
response,
|
8537
8585
|
responseHeaders,
|
8538
|
-
|
8586
|
+
statusText);
|
8539
8587
|
}
|
8540
8588
|
};
|
8541
8589
|
|
@@ -9015,8 +9063,8 @@ function $InterpolateProvider() {
|
|
9015
9063
|
}
|
9016
9064
|
|
9017
9065
|
function $IntervalProvider() {
|
9018
|
-
this.$get = ['$rootScope', '$window', '$q',
|
9019
|
-
function($rootScope, $window, $q) {
|
9066
|
+
this.$get = ['$rootScope', '$window', '$q', '$$q',
|
9067
|
+
function($rootScope, $window, $q, $$q) {
|
9020
9068
|
var intervals = {};
|
9021
9069
|
|
9022
9070
|
|
@@ -9146,10 +9194,10 @@ function $IntervalProvider() {
|
|
9146
9194
|
function interval(fn, delay, count, invokeApply) {
|
9147
9195
|
var setInterval = $window.setInterval,
|
9148
9196
|
clearInterval = $window.clearInterval,
|
9149
|
-
deferred = $q.defer(),
|
9150
|
-
promise = deferred.promise,
|
9151
9197
|
iteration = 0,
|
9152
|
-
skipApply = (isDefined(invokeApply) && !invokeApply)
|
9198
|
+
skipApply = (isDefined(invokeApply) && !invokeApply),
|
9199
|
+
deferred = (skipApply ? $$q : $q).defer(),
|
9200
|
+
promise = deferred.promise;
|
9153
9201
|
|
9154
9202
|
count = isDefined(count) ? count : 0;
|
9155
9203
|
|
@@ -9187,7 +9235,7 @@ function $IntervalProvider() {
|
|
9187
9235
|
interval.cancel = function(promise) {
|
9188
9236
|
if (promise && promise.$$intervalId in intervals) {
|
9189
9237
|
intervals[promise.$$intervalId].reject('canceled');
|
9190
|
-
clearInterval(promise.$$intervalId);
|
9238
|
+
$window.clearInterval(promise.$$intervalId);
|
9191
9239
|
delete intervals[promise.$$intervalId];
|
9192
9240
|
return true;
|
9193
9241
|
}
|
@@ -9821,7 +9869,7 @@ function $LocationProvider(){
|
|
9821
9869
|
html5Mode = false;
|
9822
9870
|
|
9823
9871
|
/**
|
9824
|
-
* @ngdoc
|
9872
|
+
* @ngdoc method
|
9825
9873
|
* @name $locationProvider#hashPrefix
|
9826
9874
|
* @description
|
9827
9875
|
* @param {string=} prefix Prefix for hash part (containing path and search)
|
@@ -9837,7 +9885,7 @@ function $LocationProvider(){
|
|
9837
9885
|
};
|
9838
9886
|
|
9839
9887
|
/**
|
9840
|
-
* @ngdoc
|
9888
|
+
* @ngdoc method
|
9841
9889
|
* @name $locationProvider#html5Mode
|
9842
9890
|
* @description
|
9843
9891
|
* @param {boolean=} mode Use HTML5 strategy if available.
|
@@ -9906,7 +9954,7 @@ function $LocationProvider(){
|
|
9906
9954
|
var elm = jqLite(event.target);
|
9907
9955
|
|
9908
9956
|
// traverse the DOM up to find first A tag
|
9909
|
-
while (
|
9957
|
+
while (nodeName_(elm[0]) !== 'a') {
|
9910
9958
|
// ignore rewriting if no A tag (reached root element, or no parent - removed from document)
|
9911
9959
|
if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;
|
9912
9960
|
}
|
@@ -10193,14 +10241,7 @@ var $parseMinErr = minErr('$parse');
|
|
10193
10241
|
//
|
10194
10242
|
// As an example, consider the following Angular expression:
|
10195
10243
|
//
|
10196
|
-
// {}.toString.constructor(alert("evil JS code"))
|
10197
|
-
//
|
10198
|
-
// We want to prevent this type of access. For the sake of performance, during the lexing phase we
|
10199
|
-
// disallow any "dotted" access to any member named "constructor".
|
10200
|
-
//
|
10201
|
-
// For reflective calls (a[b]) we check that the value of the lookup is not the Function constructor
|
10202
|
-
// while evaluating the expression, which is a stronger but more expensive test. Since reflective
|
10203
|
-
// calls are expensive anyway, this is not such a big deal compared to static dereferencing.
|
10244
|
+
// {}.toString.constructor('alert("evil JS code")')
|
10204
10245
|
//
|
10205
10246
|
// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits
|
10206
10247
|
// against the expression language, but not to prevent exploits that were enabled by exposing
|
@@ -10208,17 +10249,19 @@ var $parseMinErr = minErr('$parse');
|
|
10208
10249
|
// practice and therefore we are not even trying to protect against interaction with an object
|
10209
10250
|
// explicitly exposed in this way.
|
10210
10251
|
//
|
10211
|
-
// A developer could foil the name check by aliasing the Function constructor under a different
|
10212
|
-
// name on the scope.
|
10213
|
-
//
|
10214
10252
|
// In general, it is not possible to access a Window object from an angular expression unless a
|
10215
10253
|
// window or some DOM object that has a reference to window is published onto a Scope.
|
10254
|
+
// Similarly we prevent invocations of function known to be dangerous, as well as assignments to
|
10255
|
+
// native objects.
|
10256
|
+
|
10216
10257
|
|
10217
10258
|
function ensureSafeMemberName(name, fullExpression) {
|
10218
|
-
if (name === "
|
10259
|
+
if (name === "__defineGetter__" || name === "__defineSetter__"
|
10260
|
+
|| name === "__lookupGetter__" || name === "__lookupSetter__"
|
10261
|
+
|| name === "__proto__") {
|
10219
10262
|
throw $parseMinErr('isecfld',
|
10220
|
-
'
|
10221
|
-
fullExpression);
|
10263
|
+
'Attempting to access a disallowed field in Angular expressions! '
|
10264
|
+
+'Expression: {0}', fullExpression);
|
10222
10265
|
}
|
10223
10266
|
return name;
|
10224
10267
|
}
|
@@ -10231,7 +10274,7 @@ function ensureSafeObject(obj, fullExpression) {
|
|
10231
10274
|
'Referencing Function in Angular expressions is disallowed! Expression: {0}',
|
10232
10275
|
fullExpression);
|
10233
10276
|
} else if (// isWindow(obj)
|
10234
|
-
obj.
|
10277
|
+
obj.window === obj) {
|
10235
10278
|
throw $parseMinErr('isecwindow',
|
10236
10279
|
'Referencing the Window in Angular expressions is disallowed! Expression: {0}',
|
10237
10280
|
fullExpression);
|
@@ -10240,11 +10283,34 @@ function ensureSafeObject(obj, fullExpression) {
|
|
10240
10283
|
throw $parseMinErr('isecdom',
|
10241
10284
|
'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',
|
10242
10285
|
fullExpression);
|
10286
|
+
} else if (// block Object so that we can't get hold of dangerous Object.* methods
|
10287
|
+
obj === Object) {
|
10288
|
+
throw $parseMinErr('isecobj',
|
10289
|
+
'Referencing Object in Angular expressions is disallowed! Expression: {0}',
|
10290
|
+
fullExpression);
|
10243
10291
|
}
|
10244
10292
|
}
|
10245
10293
|
return obj;
|
10246
10294
|
}
|
10247
10295
|
|
10296
|
+
var CALL = Function.prototype.call;
|
10297
|
+
var APPLY = Function.prototype.apply;
|
10298
|
+
var BIND = Function.prototype.bind;
|
10299
|
+
|
10300
|
+
function ensureSafeFunction(obj, fullExpression) {
|
10301
|
+
if (obj) {
|
10302
|
+
if (obj.constructor === obj) {
|
10303
|
+
throw $parseMinErr('isecfn',
|
10304
|
+
'Referencing Function in Angular expressions is disallowed! Expression: {0}',
|
10305
|
+
fullExpression);
|
10306
|
+
} else if (obj === CALL || obj === APPLY || obj === BIND) {
|
10307
|
+
throw $parseMinErr('isecff',
|
10308
|
+
'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}',
|
10309
|
+
fullExpression);
|
10310
|
+
}
|
10311
|
+
}
|
10312
|
+
}
|
10313
|
+
|
10248
10314
|
var OPERATORS = {
|
10249
10315
|
/* jshint bitwise : false */
|
10250
10316
|
'null':function(){return null;},
|
@@ -10864,6 +10930,7 @@ Parser.prototype = {
|
|
10864
10930
|
i = indexFn(self, locals),
|
10865
10931
|
v;
|
10866
10932
|
|
10933
|
+
ensureSafeMemberName(i, parser.text);
|
10867
10934
|
if (!o) return undefined;
|
10868
10935
|
v = ensureSafeObject(o[i], parser.text);
|
10869
10936
|
return v;
|
@@ -10898,7 +10965,7 @@ Parser.prototype = {
|
|
10898
10965
|
var fnPtr = fn(scope, locals, context) || noop;
|
10899
10966
|
|
10900
10967
|
ensureSafeObject(context, parser.text);
|
10901
|
-
|
10968
|
+
ensureSafeFunction(fnPtr, parser.text);
|
10902
10969
|
|
10903
10970
|
// IE stupidity! (IE doesn't have apply for some native functions)
|
10904
10971
|
var v = fnPtr.apply
|
@@ -10993,6 +11060,8 @@ function setter(obj, path, setValue, fullExp) {
|
|
10993
11060
|
obj = propertyObj;
|
10994
11061
|
}
|
10995
11062
|
key = ensureSafeMemberName(element.shift(), fullExp);
|
11063
|
+
ensureSafeObject(obj, fullExp);
|
11064
|
+
ensureSafeObject(obj[key], fullExp);
|
10996
11065
|
obj[key] = setValue;
|
10997
11066
|
return setValue;
|
10998
11067
|
}
|
@@ -11210,11 +11279,7 @@ function $ParseProvider() {
|
|
11210
11279
|
cache[exp] = parsedExpression;
|
11211
11280
|
}
|
11212
11281
|
|
11213
|
-
|
11214
|
-
parsedExpression.$$unwatch = true;
|
11215
|
-
}
|
11216
|
-
|
11217
|
-
return oneTime ? oneTimeWrapper(parsedExpression) : parsedExpression;
|
11282
|
+
return oneTime || parsedExpression.constant ? oneTimeWrapper(parsedExpression) : parsedExpression;
|
11218
11283
|
|
11219
11284
|
case 'function':
|
11220
11285
|
return exp;
|
@@ -11233,7 +11298,7 @@ function $ParseProvider() {
|
|
11233
11298
|
|
11234
11299
|
function oneTimeParseFn(self, locals) {
|
11235
11300
|
if (!stable) {
|
11236
|
-
lastValue = expression(self, locals);
|
11301
|
+
lastValue = expression.constant && lastValue ? lastValue : expression(self, locals);
|
11237
11302
|
oneTimeParseFn.$$unwatch = isDefined(lastValue);
|
11238
11303
|
if (oneTimeParseFn.$$unwatch && self && self.$$postDigestQueue) {
|
11239
11304
|
self.$$postDigestQueue.push(function () {
|
@@ -11275,17 +11340,13 @@ function $ParseProvider() {
|
|
11275
11340
|
* var deferred = $q.defer();
|
11276
11341
|
*
|
11277
11342
|
* setTimeout(function() {
|
11278
|
-
*
|
11279
|
-
*
|
11280
|
-
*
|
11281
|
-
* deferred.
|
11282
|
-
*
|
11283
|
-
*
|
11284
|
-
*
|
11285
|
-
* } else {
|
11286
|
-
* deferred.reject('Greeting ' + name + ' is not allowed.');
|
11287
|
-
* }
|
11288
|
-
* });
|
11343
|
+
* deferred.notify('About to greet ' + name + '.');
|
11344
|
+
*
|
11345
|
+
* if (okToGreet(name)) {
|
11346
|
+
* deferred.resolve('Hello, ' + name + '!');
|
11347
|
+
* } else {
|
11348
|
+
* deferred.reject('Greeting ' + name + ' is not allowed.');
|
11349
|
+
* }
|
11289
11350
|
* }, 1000);
|
11290
11351
|
*
|
11291
11352
|
* return deferred.promise;
|
@@ -11429,6 +11490,13 @@ function $QProvider() {
|
|
11429
11490
|
}];
|
11430
11491
|
}
|
11431
11492
|
|
11493
|
+
function $$QProvider() {
|
11494
|
+
this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) {
|
11495
|
+
return qFactory(function(callback) {
|
11496
|
+
$browser.defer(callback);
|
11497
|
+
}, $exceptionHandler);
|
11498
|
+
}];
|
11499
|
+
}
|
11432
11500
|
|
11433
11501
|
/**
|
11434
11502
|
* Constructs a promise manager.
|
@@ -12176,7 +12244,7 @@ function $RootScopeProvider(){
|
|
12176
12244
|
* A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`.
|
12177
12245
|
* If any one expression in the collection changes the `listener` is executed.
|
12178
12246
|
*
|
12179
|
-
* - The items in the `
|
12247
|
+
* - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every
|
12180
12248
|
* call to $digest() to see if any items changes.
|
12181
12249
|
* - The `listener` is called whenever any expression in the `watchExpressions` array changes.
|
12182
12250
|
*
|
@@ -12506,7 +12574,7 @@ function $RootScopeProvider(){
|
|
12506
12574
|
if ((value = watch.get(current)) !== (last = watch.last) &&
|
12507
12575
|
!(watch.eq
|
12508
12576
|
? equals(value, last)
|
12509
|
-
: (typeof value
|
12577
|
+
: (typeof value === 'number' && typeof last === 'number'
|
12510
12578
|
&& isNaN(value) && isNaN(last)))) {
|
12511
12579
|
dirty = true;
|
12512
12580
|
lastDirtyWatch = watch;
|
@@ -13866,7 +13934,7 @@ function $SceProvider() {
|
|
13866
13934
|
|
13867
13935
|
/**
|
13868
13936
|
* @ngdoc method
|
13869
|
-
* @name $sce#
|
13937
|
+
* @name $sce#parseAs
|
13870
13938
|
*
|
13871
13939
|
* @description
|
13872
13940
|
* Converts Angular {@link guide/expression expression} into a function. This is like {@link
|
@@ -14253,8 +14321,8 @@ function $SnifferProvider() {
|
|
14253
14321
|
}
|
14254
14322
|
|
14255
14323
|
function $TimeoutProvider() {
|
14256
|
-
this.$get = ['$rootScope', '$browser', '$q', '$exceptionHandler',
|
14257
|
-
function($rootScope, $browser, $q, $exceptionHandler) {
|
14324
|
+
this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler',
|
14325
|
+
function($rootScope, $browser, $q, $$q, $exceptionHandler) {
|
14258
14326
|
var deferreds = {};
|
14259
14327
|
|
14260
14328
|
|
@@ -14284,9 +14352,9 @@ function $TimeoutProvider() {
|
|
14284
14352
|
*
|
14285
14353
|
*/
|
14286
14354
|
function timeout(fn, delay, invokeApply) {
|
14287
|
-
var
|
14355
|
+
var skipApply = (isDefined(invokeApply) && !invokeApply),
|
14356
|
+
deferred = (skipApply ? $$q : $q).defer(),
|
14288
14357
|
promise = deferred.promise,
|
14289
|
-
skipApply = (isDefined(invokeApply) && !invokeApply),
|
14290
14358
|
timeoutId;
|
14291
14359
|
|
14292
14360
|
timeoutId = $browser.defer(function() {
|
@@ -14824,7 +14892,7 @@ function filterFilter() {
|
|
14824
14892
|
// jshint +W086
|
14825
14893
|
for (var key in expression) {
|
14826
14894
|
(function(path) {
|
14827
|
-
if (typeof expression[path]
|
14895
|
+
if (typeof expression[path] === 'undefined') return;
|
14828
14896
|
predicates.push(function(value) {
|
14829
14897
|
return search(path == '$' ? value : (value && value[path]), expression[path]);
|
14830
14898
|
});
|
@@ -14979,6 +15047,7 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
14979
15047
|
var match = numStr.match(/([\d\.]+)e(-?)(\d+)/);
|
14980
15048
|
if (match && match[2] == '-' && match[3] > fractionSize + 1) {
|
14981
15049
|
numStr = '0';
|
15050
|
+
number = 0;
|
14982
15051
|
} else {
|
14983
15052
|
formatedText = numStr;
|
14984
15053
|
hasExponent = true;
|
@@ -14993,8 +15062,11 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
14993
15062
|
fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac);
|
14994
15063
|
}
|
14995
15064
|
|
14996
|
-
|
14997
|
-
|
15065
|
+
// safely round numbers in JS without hitting imprecisions of floating-point arithmetics
|
15066
|
+
// inspired by:
|
15067
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
|
15068
|
+
number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize);
|
15069
|
+
|
14998
15070
|
var fraction = ('' + number).split(DECIMAL_SEP);
|
14999
15071
|
var whole = fraction[0];
|
15000
15072
|
fraction = fraction[1] || '';
|
@@ -15617,7 +15689,7 @@ function orderByFilter($parse){
|
|
15617
15689
|
return 0;
|
15618
15690
|
}
|
15619
15691
|
function reverseComparator(comp, descending) {
|
15620
|
-
return
|
15692
|
+
return descending
|
15621
15693
|
? function(a,b){return comp(b,a);}
|
15622
15694
|
: comp;
|
15623
15695
|
}
|
@@ -16576,7 +16648,7 @@ var ngFormDirective = formDirectiveFactory(true);
|
|
16576
16648
|
*/
|
16577
16649
|
|
16578
16650
|
var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
|
16579
|
-
var EMAIL_REGEXP = /^[a-z0-9!#$%&'
|
16651
|
+
var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*$/i;
|
16580
16652
|
var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/;
|
16581
16653
|
var DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/;
|
16582
16654
|
var DATETIMELOCAL_REGEXP = /^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)$/;
|
@@ -16742,7 +16814,7 @@ var inputType = {
|
|
16742
16814
|
expect(valid.getText()).toContain('myForm.input.$valid = false');
|
16743
16815
|
});
|
16744
16816
|
</file>
|
16745
|
-
</example>
|
16817
|
+
</example>
|
16746
16818
|
*/
|
16747
16819
|
'date': createDateInputType('date', DATE_REGEXP,
|
16748
16820
|
createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']),
|
@@ -17427,15 +17499,29 @@ function validate(ctrl, validatorName, validity, value){
|
|
17427
17499
|
return validity ? value : undefined;
|
17428
17500
|
}
|
17429
17501
|
|
17502
|
+
function testFlags(validity, flags) {
|
17503
|
+
var i, flag;
|
17504
|
+
if (flags) {
|
17505
|
+
for (i=0; i<flags.length; ++i) {
|
17506
|
+
flag = flags[i];
|
17507
|
+
if (validity[flag]) {
|
17508
|
+
return true;
|
17509
|
+
}
|
17510
|
+
}
|
17511
|
+
}
|
17512
|
+
return false;
|
17513
|
+
}
|
17430
17514
|
|
17431
|
-
|
17432
|
-
|
17515
|
+
// Pass validity so that behaviour can be mocked easier.
|
17516
|
+
function addNativeHtml5Validators(ctrl, validatorName, badFlags, ignoreFlags, validity) {
|
17433
17517
|
if (isObject(validity)) {
|
17518
|
+
ctrl.$$hasNativeValidators = true;
|
17434
17519
|
var validator = function(value) {
|
17435
17520
|
// Don't overwrite previous validation, don't consider valueMissing to apply (ng-required can
|
17436
17521
|
// perform the required validation)
|
17437
|
-
if (!ctrl.$error[validatorName] &&
|
17438
|
-
validity
|
17522
|
+
if (!ctrl.$error[validatorName] &&
|
17523
|
+
!testFlags(validity, ignoreFlags) &&
|
17524
|
+
testFlags(validity, badFlags)) {
|
17439
17525
|
ctrl.$setValidity(validatorName, false);
|
17440
17526
|
return;
|
17441
17527
|
}
|
@@ -17446,8 +17532,9 @@ function addNativeHtml5Validators(ctrl, validatorName, element) {
|
|
17446
17532
|
}
|
17447
17533
|
|
17448
17534
|
function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
17449
|
-
var validity = element.prop(
|
17535
|
+
var validity = element.prop(VALIDITY_STATE_PROPERTY);
|
17450
17536
|
var placeholder = element[0].placeholder, noevent = {};
|
17537
|
+
ctrl.$$validityState = validity;
|
17451
17538
|
|
17452
17539
|
// In composition mode, users are still inputing intermediate text buffer,
|
17453
17540
|
// hold the listener until composition is done.
|
@@ -17482,20 +17569,20 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
17482
17569
|
// By default we will trim the value
|
17483
17570
|
// If the attribute ng-trim exists we will avoid trimming
|
17484
17571
|
// e.g. <input ng-model="foo" ng-trim="false">
|
17485
|
-
if (
|
17572
|
+
if (!attr.ngTrim || attr.ngTrim !== 'false') {
|
17486
17573
|
value = trim(value);
|
17487
17574
|
}
|
17488
17575
|
|
17489
|
-
|
17490
|
-
|
17491
|
-
|
17492
|
-
|
17493
|
-
|
17576
|
+
// If a control is suffering from bad input, browsers discard its value, so it may be
|
17577
|
+
// necessary to revalidate even if the control's value is the same empty value twice in
|
17578
|
+
// a row.
|
17579
|
+
var revalidate = validity && ctrl.$$hasNativeValidators;
|
17580
|
+
if (ctrl.$viewValue !== value || (value === '' && revalidate)) {
|
17494
17581
|
if (scope.$$phase) {
|
17495
|
-
ctrl.$setViewValue(value, event);
|
17582
|
+
ctrl.$setViewValue(value, event, revalidate);
|
17496
17583
|
} else {
|
17497
17584
|
scope.$apply(function() {
|
17498
|
-
ctrl.$setViewValue(value, event);
|
17585
|
+
ctrl.$setViewValue(value, event, revalidate);
|
17499
17586
|
});
|
17500
17587
|
}
|
17501
17588
|
}
|
@@ -17644,6 +17731,8 @@ function createDateInputType(type, regexp, parseDate, format) {
|
|
17644
17731
|
};
|
17645
17732
|
}
|
17646
17733
|
|
17734
|
+
var numberBadFlags = ['badInput'];
|
17735
|
+
|
17647
17736
|
function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
17648
17737
|
textInputType(scope, element, attr, ctrl, $sniffer, $browser);
|
17649
17738
|
|
@@ -17658,7 +17747,7 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
17658
17747
|
}
|
17659
17748
|
});
|
17660
17749
|
|
17661
|
-
addNativeHtml5Validators(ctrl, 'number',
|
17750
|
+
addNativeHtml5Validators(ctrl, 'number', numberBadFlags, null, ctrl.$$validityState);
|
17662
17751
|
|
17663
17752
|
ctrl.$formatters.push(function(value) {
|
17664
17753
|
return ctrl.$isEmpty(value) ? '' : '' + value;
|
@@ -17692,23 +17781,19 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
17692
17781
|
function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
17693
17782
|
textInputType(scope, element, attr, ctrl, $sniffer, $browser);
|
17694
17783
|
|
17695
|
-
|
17696
|
-
|
17784
|
+
ctrl.$validators.url = function(modelValue, viewValue) {
|
17785
|
+
var value = modelValue || viewValue;
|
17786
|
+
return ctrl.$isEmpty(value) || URL_REGEXP.test(value);
|
17697
17787
|
};
|
17698
|
-
|
17699
|
-
ctrl.$formatters.push(urlValidator);
|
17700
|
-
ctrl.$parsers.push(urlValidator);
|
17701
17788
|
}
|
17702
17789
|
|
17703
17790
|
function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
17704
17791
|
textInputType(scope, element, attr, ctrl, $sniffer, $browser);
|
17705
17792
|
|
17706
|
-
|
17707
|
-
|
17793
|
+
ctrl.$validators.email = function(modelValue, viewValue) {
|
17794
|
+
var value = modelValue || viewValue;
|
17795
|
+
return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value);
|
17708
17796
|
};
|
17709
|
-
|
17710
|
-
ctrl.$formatters.push(emailValidator);
|
17711
|
-
ctrl.$parsers.push(emailValidator);
|
17712
17797
|
}
|
17713
17798
|
|
17714
17799
|
function radioInputType(scope, element, attr, ctrl) {
|
@@ -18163,7 +18248,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
18163
18248
|
* `ngModel.$validators` pipeline which is designed to handle validations with true/false values.
|
18164
18249
|
*
|
18165
18250
|
* @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign
|
18166
|
-
* to `$error[validationErrorKey]
|
18251
|
+
* to `$error[validationErrorKey]=!isValid` so that it is available for data-binding.
|
18167
18252
|
* The `validationErrorKey` should be in camelCase and will get converted into dash-case
|
18168
18253
|
* for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`
|
18169
18254
|
* class and can be bound to as `{{someForm.someControl.$error.myError}}` .
|
@@ -18342,11 +18427,11 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
18342
18427
|
* event defined in `ng-model-options`. this method is rarely needed as `NgModelController`
|
18343
18428
|
* usually handles calling this in response to input events.
|
18344
18429
|
*/
|
18345
|
-
this.$commitViewValue = function() {
|
18430
|
+
this.$commitViewValue = function(revalidate) {
|
18346
18431
|
var viewValue = ctrl.$viewValue;
|
18347
18432
|
|
18348
18433
|
$timeout.cancel(pendingDebounce);
|
18349
|
-
if (ctrl.$$lastCommittedViewValue === viewValue) {
|
18434
|
+
if (!revalidate && ctrl.$$lastCommittedViewValue === viewValue) {
|
18350
18435
|
return;
|
18351
18436
|
}
|
18352
18437
|
ctrl.$$lastCommittedViewValue = viewValue;
|
@@ -18411,14 +18496,14 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
18411
18496
|
* @param {string} value Value from the view.
|
18412
18497
|
* @param {string} trigger Event that triggered the update.
|
18413
18498
|
*/
|
18414
|
-
this.$setViewValue = function(value, trigger) {
|
18499
|
+
this.$setViewValue = function(value, trigger, revalidate) {
|
18415
18500
|
ctrl.$viewValue = value;
|
18416
18501
|
if (!ctrl.$options || ctrl.$options.updateOnDefault) {
|
18417
|
-
ctrl.$$debounceViewValueCommit(trigger);
|
18502
|
+
ctrl.$$debounceViewValueCommit(trigger, revalidate);
|
18418
18503
|
}
|
18419
18504
|
};
|
18420
18505
|
|
18421
|
-
this.$$debounceViewValueCommit = function(trigger) {
|
18506
|
+
this.$$debounceViewValueCommit = function(trigger, revalidate) {
|
18422
18507
|
var debounceDelay = 0,
|
18423
18508
|
options = ctrl.$options,
|
18424
18509
|
debounce;
|
@@ -18437,10 +18522,10 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
18437
18522
|
$timeout.cancel(pendingDebounce);
|
18438
18523
|
if (debounceDelay) {
|
18439
18524
|
pendingDebounce = $timeout(function() {
|
18440
|
-
ctrl.$commitViewValue();
|
18525
|
+
ctrl.$commitViewValue(revalidate);
|
18441
18526
|
}, debounceDelay);
|
18442
18527
|
} else {
|
18443
|
-
ctrl.$commitViewValue();
|
18528
|
+
ctrl.$commitViewValue(revalidate);
|
18444
18529
|
}
|
18445
18530
|
};
|
18446
18531
|
|
@@ -20484,7 +20569,7 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
20484
20569
|
var block, childScope, previousElements;
|
20485
20570
|
$scope.$watch($attr.ngIf, function ngIfWatchAction(value) {
|
20486
20571
|
|
20487
|
-
if (
|
20572
|
+
if (value) {
|
20488
20573
|
if (!childScope) {
|
20489
20574
|
$transclude(function (clone, newScope) {
|
20490
20575
|
childScope = newScope;
|
@@ -20967,7 +21052,7 @@ var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
|
|
20967
21052
|
* When one person, perhaps John, views the document, "John is viewing" will be shown.
|
20968
21053
|
* When three people view the document, no explicit number rule is found, so
|
20969
21054
|
* an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.
|
20970
|
-
* In this case, plural category 'one' is matched and "John,
|
21055
|
+
* In this case, plural category 'one' is matched and "John, Mary and one other person are viewing"
|
20971
21056
|
* is shown.
|
20972
21057
|
*
|
20973
21058
|
* Note that when you specify offsets, you must provide explicit number rules for
|
@@ -21516,15 +21601,10 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
21516
21601
|
* <div ng-show="myValue" class="ng-hide"></div>
|
21517
21602
|
* ```
|
21518
21603
|
*
|
21519
|
-
* When the ngShow expression evaluates to
|
21520
|
-
* on the element causing it to become hidden. When
|
21604
|
+
* When the ngShow expression evaluates to a falsy value then the ng-hide CSS class is added to the class
|
21605
|
+
* attribute on the element causing it to become hidden. When truthy, the ng-hide CSS class is removed
|
21521
21606
|
* from the element causing the element not to appear hidden.
|
21522
21607
|
*
|
21523
|
-
* <div class="alert alert-warning">
|
21524
|
-
* **Note:** Here is a list of values that ngShow will consider as a falsy value (case insensitive):<br />
|
21525
|
-
* "f" / "0" / "false" / "no" / "n" / "[]"
|
21526
|
-
* </div>
|
21527
|
-
*
|
21528
21608
|
* ## Why is !important used?
|
21529
21609
|
*
|
21530
21610
|
* You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector
|
@@ -21660,7 +21740,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
21660
21740
|
var ngShowDirective = ['$animate', function($animate) {
|
21661
21741
|
return function(scope, element, attr) {
|
21662
21742
|
scope.$watch(attr.ngShow, function ngShowWatchAction(value){
|
21663
|
-
$animate[
|
21743
|
+
$animate[value ? 'removeClass' : 'addClass'](element, 'ng-hide');
|
21664
21744
|
});
|
21665
21745
|
};
|
21666
21746
|
}];
|
@@ -21685,15 +21765,10 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
21685
21765
|
* <div ng-hide="myValue"></div>
|
21686
21766
|
* ```
|
21687
21767
|
*
|
21688
|
-
* When the ngHide expression evaluates to
|
21689
|
-
* on the element causing it to become hidden. When
|
21768
|
+
* When the ngHide expression evaluates to a truthy value then the .ng-hide CSS class is added to the class
|
21769
|
+
* attribute on the element causing it to become hidden. When falsy, the ng-hide CSS class is removed
|
21690
21770
|
* from the element causing the element not to appear hidden.
|
21691
21771
|
*
|
21692
|
-
* <div class="alert alert-warning">
|
21693
|
-
* **Note:** Here is a list of values that ngHide will consider as a falsy value (case insensitive):<br />
|
21694
|
-
* "f" / "0" / "false" / "no" / "n" / "[]"
|
21695
|
-
* </div>
|
21696
|
-
*
|
21697
21772
|
* ## Why is !important used?
|
21698
21773
|
*
|
21699
21774
|
* You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector
|
@@ -21816,7 +21891,7 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
21816
21891
|
var ngHideDirective = ['$animate', function($animate) {
|
21817
21892
|
return function(scope, element, attr) {
|
21818
21893
|
scope.$watch(attr.ngHide, function ngHideWatchAction(value){
|
21819
|
-
$animate[
|
21894
|
+
$animate[value ? 'addClass' : 'removeClass'](element, 'ng-hide');
|
21820
21895
|
});
|
21821
21896
|
};
|
21822
21897
|
}];
|