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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5b053cde702e705c4a0d3cf314a2eae1b4b5d9b
|
4
|
+
data.tar.gz: ec1dccc42dee2b82402cade5825ee72a5b1da416
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8e256e13363b40424d6ae102292675ea4bf993e0e581b644cceb1f28b34739c040c611e28c65fc310a82e4cef518ea1daea42f650c80682cb8cb7d51fe4ac87
|
7
|
+
data.tar.gz: a475a737e4338a8ce1b7203c20657ef81d829950b2cfd4457a7f0cef9746dabdb3a2bb5809093de9671c66beab1bd665f457aac4979a3dc1a10ce2a6f29b13df
|
data/README.md
CHANGED
@@ -14,8 +14,17 @@ Add the following directive to your JavaScript manifest file (application.js):
|
|
14
14
|
|
15
15
|
If you desire to require (optional) Angular files, you may include them as well in your JavaScript manifest file (application.js). For example:
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
//= require angular-animate
|
18
|
+
//= require angular-resource
|
19
|
+
|
20
|
+
To use the 'unstable' branch, add the following directive to your JavaScript manifest file (application.js):
|
21
|
+
|
22
|
+
//= require unstable/angular
|
23
|
+
|
24
|
+
And similarly, for optional Angular assets:
|
25
|
+
|
26
|
+
//= require unstable/angular-animate
|
27
|
+
//= require unstable/angular-resource
|
19
28
|
|
20
29
|
## Versioning
|
21
30
|
|
@@ -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
|
*/
|
@@ -69,7 +69,7 @@ function minErr(module) {
|
|
69
69
|
return match;
|
70
70
|
});
|
71
71
|
|
72
|
-
message = message + '\nhttp://errors.angularjs.org/1.2.
|
72
|
+
message = message + '\nhttp://errors.angularjs.org/1.2.19/' +
|
73
73
|
(module ? module + '/' : '') + code;
|
74
74
|
for (i = 2; i < arguments.length; i++) {
|
75
75
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
@@ -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
|
*/
|
@@ -462,7 +462,7 @@ angular.mock.$IntervalProvider = function() {
|
|
462
462
|
iteration = 0,
|
463
463
|
skipApply = (angular.isDefined(invokeApply) && !invokeApply);
|
464
464
|
|
465
|
-
count = (angular.isDefined(count)) ? count : 0
|
465
|
+
count = (angular.isDefined(count)) ? count : 0;
|
466
466
|
promise.then(null, null, fn);
|
467
467
|
|
468
468
|
promise.$$intervalId = nextRepeatId;
|
@@ -1726,7 +1726,7 @@ angular.mock.$RootElementProvider = function() {
|
|
1726
1726
|
*
|
1727
1727
|
* # ngMock
|
1728
1728
|
*
|
1729
|
-
* The `ngMock` module
|
1729
|
+
* The `ngMock` module provides support to inject and mock Angular services into unit tests.
|
1730
1730
|
* In addition, ngMock also extends various core ng services such that they can be
|
1731
1731
|
* inspected and controlled in a synchronous manner within test code.
|
1732
1732
|
*
|
@@ -1965,6 +1965,12 @@ if(window.jasmine || window.mocha) {
|
|
1965
1965
|
(window.afterEach || window.teardown)(function() {
|
1966
1966
|
var injector = currentSpec.$injector;
|
1967
1967
|
|
1968
|
+
angular.forEach(currentSpec.$modules, function(module) {
|
1969
|
+
if (module && module.$$hashKey) {
|
1970
|
+
module.$$hashKey = undefined;
|
1971
|
+
}
|
1972
|
+
});
|
1973
|
+
|
1968
1974
|
currentSpec.$injector = null;
|
1969
1975
|
currentSpec.$modules = null;
|
1970
1976
|
currentSpec = null;
|
@@ -9790,7 +9790,7 @@ if ( typeof module === "object" && module && typeof module.exports === "object"
|
|
9790
9790
|
})( window );
|
9791
9791
|
|
9792
9792
|
/**
|
9793
|
-
* @license AngularJS v1.2.
|
9793
|
+
* @license AngularJS v1.2.19
|
9794
9794
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
9795
9795
|
* License: MIT
|
9796
9796
|
*/
|
@@ -9860,7 +9860,7 @@ function minErr(module) {
|
|
9860
9860
|
return match;
|
9861
9861
|
});
|
9862
9862
|
|
9863
|
-
message = message + '\nhttp://errors.angularjs.org/1.2.
|
9863
|
+
message = message + '\nhttp://errors.angularjs.org/1.2.19/' +
|
9864
9864
|
(module ? module + '/' : '') + code;
|
9865
9865
|
for (i = 2; i < arguments.length; i++) {
|
9866
9866
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
@@ -9884,6 +9884,7 @@ function minErr(module) {
|
|
9884
9884
|
-angularModule,
|
9885
9885
|
-nodeName_,
|
9886
9886
|
-uid,
|
9887
|
+
-VALIDITY_STATE_PROPERTY,
|
9887
9888
|
|
9888
9889
|
-lowercase,
|
9889
9890
|
-uppercase,
|
@@ -9973,6 +9974,10 @@ function minErr(module) {
|
|
9973
9974
|
* <div doc-module-components="ng"></div>
|
9974
9975
|
*/
|
9975
9976
|
|
9977
|
+
// The name of a form control's ValidityState property.
|
9978
|
+
// This is used so that it's possible for internal tests to create mock ValidityStates.
|
9979
|
+
var VALIDITY_STATE_PROPERTY = 'validity';
|
9980
|
+
|
9976
9981
|
/**
|
9977
9982
|
* @ngdoc function
|
9978
9983
|
* @name angular.lowercase
|
@@ -11145,7 +11150,7 @@ function angularInit(element, bootstrap) {
|
|
11145
11150
|
*
|
11146
11151
|
* Angular will detect if it has been loaded into the browser more than once and only allow the
|
11147
11152
|
* first loaded script to be bootstrapped and will report a warning to the browser console for
|
11148
|
-
* each of the subsequent scripts.
|
11153
|
+
* each of the subsequent scripts. This prevents strange results in applications, where otherwise
|
11149
11154
|
* multiple instances of Angular try to work on the DOM.
|
11150
11155
|
*
|
11151
11156
|
* <example name="multi-bootstrap" module="multi-bootstrap">
|
@@ -11275,7 +11280,7 @@ function assertArgFn(arg, name, acceptArrayAnnotation) {
|
|
11275
11280
|
}
|
11276
11281
|
|
11277
11282
|
assertArg(isFunction(arg), name, 'not a function, got ' +
|
11278
|
-
(arg && typeof arg
|
11283
|
+
(arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg));
|
11279
11284
|
return arg;
|
11280
11285
|
}
|
11281
11286
|
|
@@ -11745,11 +11750,11 @@ function setupModuleLoader(window) {
|
|
11745
11750
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
11746
11751
|
*/
|
11747
11752
|
var version = {
|
11748
|
-
full: '1.2.
|
11753
|
+
full: '1.2.19', // all of these placeholder strings will be replaced by grunt's
|
11749
11754
|
major: 1, // package task
|
11750
11755
|
minor: 2,
|
11751
|
-
dot:
|
11752
|
-
codeName: '
|
11756
|
+
dot: 19,
|
11757
|
+
codeName: 'precognitive-flashbacks'
|
11753
11758
|
};
|
11754
11759
|
|
11755
11760
|
|
@@ -11971,8 +11976,9 @@ function publishExternalAPI(angular){
|
|
11971
11976
|
* @returns {Object} jQuery object.
|
11972
11977
|
*/
|
11973
11978
|
|
11979
|
+
JQLite.expando = 'ng339';
|
11980
|
+
|
11974
11981
|
var jqCache = JQLite.cache = {},
|
11975
|
-
jqName = JQLite.expando = 'ng' + new Date().getTime(),
|
11976
11982
|
jqId = 1,
|
11977
11983
|
addEventListenerFn = (window.document.addEventListener
|
11978
11984
|
? function(element, type, fn) {element.addEventListener(type, fn, false);}
|
@@ -12182,7 +12188,7 @@ function jqLiteOff(element, type, fn, unsupported) {
|
|
12182
12188
|
}
|
12183
12189
|
|
12184
12190
|
function jqLiteRemoveData(element, name) {
|
12185
|
-
var expandoId = element
|
12191
|
+
var expandoId = element.ng339,
|
12186
12192
|
expandoStore = jqCache[expandoId];
|
12187
12193
|
|
12188
12194
|
if (expandoStore) {
|
@@ -12196,17 +12202,17 @@ function jqLiteRemoveData(element, name) {
|
|
12196
12202
|
jqLiteOff(element);
|
12197
12203
|
}
|
12198
12204
|
delete jqCache[expandoId];
|
12199
|
-
element
|
12205
|
+
element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it
|
12200
12206
|
}
|
12201
12207
|
}
|
12202
12208
|
|
12203
12209
|
function jqLiteExpandoStore(element, key, value) {
|
12204
|
-
var expandoId = element
|
12210
|
+
var expandoId = element.ng339,
|
12205
12211
|
expandoStore = jqCache[expandoId || -1];
|
12206
12212
|
|
12207
12213
|
if (isDefined(value)) {
|
12208
12214
|
if (!expandoStore) {
|
12209
|
-
element
|
12215
|
+
element.ng339 = expandoId = jqNextId();
|
12210
12216
|
expandoStore = jqCache[expandoId] = {};
|
12211
12217
|
}
|
12212
12218
|
expandoStore[key] = value;
|
@@ -12873,16 +12879,16 @@ forEach({
|
|
12873
12879
|
* @returns {string} hash string such that the same input will have the same hash string.
|
12874
12880
|
* The resulting string key is in 'type:hashKey' format.
|
12875
12881
|
*/
|
12876
|
-
function hashKey(obj) {
|
12882
|
+
function hashKey(obj, nextUidFn) {
|
12877
12883
|
var objType = typeof obj,
|
12878
12884
|
key;
|
12879
12885
|
|
12880
|
-
if (objType == 'object' && obj !== null) {
|
12886
|
+
if (objType == 'function' || (objType == 'object' && obj !== null)) {
|
12881
12887
|
if (typeof (key = obj.$$hashKey) == 'function') {
|
12882
12888
|
// must invoke on object to keep the right this
|
12883
12889
|
key = obj.$$hashKey();
|
12884
12890
|
} else if (key === undefined) {
|
12885
|
-
key = obj.$$hashKey = nextUid();
|
12891
|
+
key = obj.$$hashKey = (nextUidFn || nextUid)();
|
12886
12892
|
}
|
12887
12893
|
} else {
|
12888
12894
|
key = obj;
|
@@ -12894,7 +12900,13 @@ function hashKey(obj) {
|
|
12894
12900
|
/**
|
12895
12901
|
* HashMap which can use objects as keys
|
12896
12902
|
*/
|
12897
|
-
function HashMap(array){
|
12903
|
+
function HashMap(array, isolatedUid) {
|
12904
|
+
if (isolatedUid) {
|
12905
|
+
var uid = 0;
|
12906
|
+
this.nextUid = function() {
|
12907
|
+
return ++uid;
|
12908
|
+
};
|
12909
|
+
}
|
12898
12910
|
forEach(array, this.put, this);
|
12899
12911
|
}
|
12900
12912
|
HashMap.prototype = {
|
@@ -12904,7 +12916,7 @@ HashMap.prototype = {
|
|
12904
12916
|
* @param value value to store can be any type
|
12905
12917
|
*/
|
12906
12918
|
put: function(key, value) {
|
12907
|
-
this[hashKey(key)] = value;
|
12919
|
+
this[hashKey(key, this.nextUid)] = value;
|
12908
12920
|
},
|
12909
12921
|
|
12910
12922
|
/**
|
@@ -12912,7 +12924,7 @@ HashMap.prototype = {
|
|
12912
12924
|
* @returns {Object} the value for the key
|
12913
12925
|
*/
|
12914
12926
|
get: function(key) {
|
12915
|
-
return this[hashKey(key)];
|
12927
|
+
return this[hashKey(key, this.nextUid)];
|
12916
12928
|
},
|
12917
12929
|
|
12918
12930
|
/**
|
@@ -12920,7 +12932,7 @@ HashMap.prototype = {
|
|
12920
12932
|
* @param key
|
12921
12933
|
*/
|
12922
12934
|
remove: function(key) {
|
12923
|
-
var value = this[key = hashKey(key)];
|
12935
|
+
var value = this[key = hashKey(key, this.nextUid)];
|
12924
12936
|
delete this[key];
|
12925
12937
|
return value;
|
12926
12938
|
}
|
@@ -12998,7 +13010,7 @@ function annotate(fn) {
|
|
12998
13010
|
argDecl,
|
12999
13011
|
last;
|
13000
13012
|
|
13001
|
-
if (typeof fn
|
13013
|
+
if (typeof fn === 'function') {
|
13002
13014
|
if (!($inject = fn.$inject)) {
|
13003
13015
|
$inject = [];
|
13004
13016
|
if (fn.length) {
|
@@ -13211,7 +13223,7 @@ function annotate(fn) {
|
|
13211
13223
|
|
13212
13224
|
|
13213
13225
|
/**
|
13214
|
-
* @ngdoc
|
13226
|
+
* @ngdoc service
|
13215
13227
|
* @name $provide
|
13216
13228
|
*
|
13217
13229
|
* @description
|
@@ -13517,7 +13529,7 @@ function createInjector(modulesToLoad) {
|
|
13517
13529
|
var INSTANTIATING = {},
|
13518
13530
|
providerSuffix = 'Provider',
|
13519
13531
|
path = [],
|
13520
|
-
loadedModules = new HashMap(),
|
13532
|
+
loadedModules = new HashMap([], true),
|
13521
13533
|
providerCache = {
|
13522
13534
|
$provide: {
|
13523
13535
|
provider: supportObject(provider),
|
@@ -13688,8 +13700,7 @@ function createInjector(modulesToLoad) {
|
|
13688
13700
|
: getService(key)
|
13689
13701
|
);
|
13690
13702
|
}
|
13691
|
-
if (
|
13692
|
-
// this means that we must be an array.
|
13703
|
+
if (isArray(fn)) {
|
13693
13704
|
fn = fn[length];
|
13694
13705
|
}
|
13695
13706
|
|
@@ -15870,7 +15881,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15870
15881
|
directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority, ignoreDirective);
|
15871
15882
|
|
15872
15883
|
// iterate over the attributes
|
15873
|
-
for (var attr, name, nName, ngAttrName, value, nAttrs = node.attributes,
|
15884
|
+
for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes,
|
15874
15885
|
j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {
|
15875
15886
|
var attrStartName = false;
|
15876
15887
|
var attrEndName = false;
|
@@ -15878,9 +15889,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15878
15889
|
attr = nAttrs[j];
|
15879
15890
|
if (!msie || msie >= 8 || attr.specified) {
|
15880
15891
|
name = attr.name;
|
15892
|
+
value = trim(attr.value);
|
15893
|
+
|
15881
15894
|
// support ngAttr attribute binding
|
15882
15895
|
ngAttrName = directiveNormalize(name);
|
15883
|
-
if (NG_ATTR_BINDING.test(ngAttrName)) {
|
15896
|
+
if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) {
|
15884
15897
|
name = snake_case(ngAttrName.substr(6), '-');
|
15885
15898
|
}
|
15886
15899
|
|
@@ -15893,9 +15906,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15893
15906
|
|
15894
15907
|
nName = directiveNormalize(name.toLowerCase());
|
15895
15908
|
attrsMap[nName] = name;
|
15896
|
-
|
15897
|
-
|
15898
|
-
|
15909
|
+
if (isNgAttr || !attrs.hasOwnProperty(nName)) {
|
15910
|
+
attrs[nName] = value;
|
15911
|
+
if (getBooleanAttrName(node, nName)) {
|
15912
|
+
attrs[nName] = true; // presence means true
|
15913
|
+
}
|
15899
15914
|
}
|
15900
15915
|
addAttrInterpolateDirective(node, directives, value, nName);
|
15901
15916
|
addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,
|
@@ -16993,7 +17008,7 @@ function $ControllerProvider() {
|
|
16993
17008
|
instance = $injector.instantiate(expression, locals);
|
16994
17009
|
|
16995
17010
|
if (identifier) {
|
16996
|
-
if (!(locals && typeof locals.$scope
|
17011
|
+
if (!(locals && typeof locals.$scope === 'object')) {
|
16997
17012
|
throw minErr('$controller')('noscp',
|
16998
17013
|
"Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.",
|
16999
17014
|
constructor || expression.name, identifier);
|
@@ -18195,7 +18210,8 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
18195
18210
|
// Safari respectively.
|
18196
18211
|
if (xhr && xhr.readyState == 4) {
|
18197
18212
|
var responseHeaders = null,
|
18198
|
-
response = null
|
18213
|
+
response = null,
|
18214
|
+
statusText = '';
|
18199
18215
|
|
18200
18216
|
if(status !== ABORTED) {
|
18201
18217
|
responseHeaders = xhr.getAllResponseHeaders();
|
@@ -18205,11 +18221,17 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
18205
18221
|
response = ('response' in xhr) ? xhr.response : xhr.responseText;
|
18206
18222
|
}
|
18207
18223
|
|
18224
|
+
// Accessing statusText on an aborted xhr object will
|
18225
|
+
// throw an 'c00c023f error' in IE9 and lower, don't touch it.
|
18226
|
+
if (!(status === ABORTED && msie < 10)) {
|
18227
|
+
statusText = xhr.statusText;
|
18228
|
+
}
|
18229
|
+
|
18208
18230
|
completeRequest(callback,
|
18209
18231
|
status || xhr.status,
|
18210
18232
|
response,
|
18211
18233
|
responseHeaders,
|
18212
|
-
|
18234
|
+
statusText);
|
18213
18235
|
}
|
18214
18236
|
};
|
18215
18237
|
|
@@ -18743,7 +18765,7 @@ function $IntervalProvider() {
|
|
18743
18765
|
interval.cancel = function(promise) {
|
18744
18766
|
if (promise && promise.$$intervalId in intervals) {
|
18745
18767
|
intervals[promise.$$intervalId].reject('canceled');
|
18746
|
-
clearInterval(promise.$$intervalId);
|
18768
|
+
$window.clearInterval(promise.$$intervalId);
|
18747
18769
|
delete intervals[promise.$$intervalId];
|
18748
18770
|
return true;
|
18749
18771
|
}
|
@@ -19377,7 +19399,7 @@ function $LocationProvider(){
|
|
19377
19399
|
html5Mode = false;
|
19378
19400
|
|
19379
19401
|
/**
|
19380
|
-
* @ngdoc
|
19402
|
+
* @ngdoc method
|
19381
19403
|
* @name $locationProvider#hashPrefix
|
19382
19404
|
* @description
|
19383
19405
|
* @param {string=} prefix Prefix for hash part (containing path and search)
|
@@ -19393,7 +19415,7 @@ function $LocationProvider(){
|
|
19393
19415
|
};
|
19394
19416
|
|
19395
19417
|
/**
|
19396
|
-
* @ngdoc
|
19418
|
+
* @ngdoc method
|
19397
19419
|
* @name $locationProvider#html5Mode
|
19398
19420
|
* @description
|
19399
19421
|
* @param {boolean=} mode Use HTML5 strategy if available.
|
@@ -19751,14 +19773,7 @@ var promiseWarning;
|
|
19751
19773
|
//
|
19752
19774
|
// As an example, consider the following Angular expression:
|
19753
19775
|
//
|
19754
|
-
// {}.toString.constructor(alert("evil JS code"))
|
19755
|
-
//
|
19756
|
-
// We want to prevent this type of access. For the sake of performance, during the lexing phase we
|
19757
|
-
// disallow any "dotted" access to any member named "constructor".
|
19758
|
-
//
|
19759
|
-
// For reflective calls (a[b]) we check that the value of the lookup is not the Function constructor
|
19760
|
-
// while evaluating the expression, which is a stronger but more expensive test. Since reflective
|
19761
|
-
// calls are expensive anyway, this is not such a big deal compared to static dereferencing.
|
19776
|
+
// {}.toString.constructor('alert("evil JS code")')
|
19762
19777
|
//
|
19763
19778
|
// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits
|
19764
19779
|
// against the expression language, but not to prevent exploits that were enabled by exposing
|
@@ -19766,17 +19781,19 @@ var promiseWarning;
|
|
19766
19781
|
// practice and therefore we are not even trying to protect against interaction with an object
|
19767
19782
|
// explicitly exposed in this way.
|
19768
19783
|
//
|
19769
|
-
// A developer could foil the name check by aliasing the Function constructor under a different
|
19770
|
-
// name on the scope.
|
19771
|
-
//
|
19772
19784
|
// In general, it is not possible to access a Window object from an angular expression unless a
|
19773
19785
|
// window or some DOM object that has a reference to window is published onto a Scope.
|
19786
|
+
// Similarly we prevent invocations of function known to be dangerous, as well as assignments to
|
19787
|
+
// native objects.
|
19788
|
+
|
19774
19789
|
|
19775
19790
|
function ensureSafeMemberName(name, fullExpression) {
|
19776
|
-
if (name === "
|
19791
|
+
if (name === "__defineGetter__" || name === "__defineSetter__"
|
19792
|
+
|| name === "__lookupGetter__" || name === "__lookupSetter__"
|
19793
|
+
|| name === "__proto__") {
|
19777
19794
|
throw $parseMinErr('isecfld',
|
19778
|
-
'
|
19779
|
-
fullExpression);
|
19795
|
+
'Attempting to access a disallowed field in Angular expressions! '
|
19796
|
+
+'Expression: {0}', fullExpression);
|
19780
19797
|
}
|
19781
19798
|
return name;
|
19782
19799
|
}
|
@@ -19798,11 +19815,34 @@ function ensureSafeObject(obj, fullExpression) {
|
|
19798
19815
|
throw $parseMinErr('isecdom',
|
19799
19816
|
'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',
|
19800
19817
|
fullExpression);
|
19818
|
+
} else if (// block Object so that we can't get hold of dangerous Object.* methods
|
19819
|
+
obj === Object) {
|
19820
|
+
throw $parseMinErr('isecobj',
|
19821
|
+
'Referencing Object in Angular expressions is disallowed! Expression: {0}',
|
19822
|
+
fullExpression);
|
19801
19823
|
}
|
19802
19824
|
}
|
19803
19825
|
return obj;
|
19804
19826
|
}
|
19805
19827
|
|
19828
|
+
var CALL = Function.prototype.call;
|
19829
|
+
var APPLY = Function.prototype.apply;
|
19830
|
+
var BIND = Function.prototype.bind;
|
19831
|
+
|
19832
|
+
function ensureSafeFunction(obj, fullExpression) {
|
19833
|
+
if (obj) {
|
19834
|
+
if (obj.constructor === obj) {
|
19835
|
+
throw $parseMinErr('isecfn',
|
19836
|
+
'Referencing Function in Angular expressions is disallowed! Expression: {0}',
|
19837
|
+
fullExpression);
|
19838
|
+
} else if (obj === CALL || obj === APPLY || (BIND && obj === BIND)) {
|
19839
|
+
throw $parseMinErr('isecff',
|
19840
|
+
'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}',
|
19841
|
+
fullExpression);
|
19842
|
+
}
|
19843
|
+
}
|
19844
|
+
}
|
19845
|
+
|
19806
19846
|
var OPERATORS = {
|
19807
19847
|
/* jshint bitwise : false */
|
19808
19848
|
'null':function(){return null;},
|
@@ -20437,6 +20477,7 @@ Parser.prototype = {
|
|
20437
20477
|
i = indexFn(self, locals),
|
20438
20478
|
v, p;
|
20439
20479
|
|
20480
|
+
ensureSafeMemberName(i, parser.text);
|
20440
20481
|
if (!o) return undefined;
|
20441
20482
|
v = ensureSafeObject(o[i], parser.text);
|
20442
20483
|
if (v && v.then && parser.options.unwrapPromises) {
|
@@ -20479,7 +20520,7 @@ Parser.prototype = {
|
|
20479
20520
|
var fnPtr = fn(scope, locals, context) || noop;
|
20480
20521
|
|
20481
20522
|
ensureSafeObject(context, parser.text);
|
20482
|
-
|
20523
|
+
ensureSafeFunction(fnPtr, parser.text);
|
20483
20524
|
|
20484
20525
|
// IE stupidity! (IE doesn't have apply for some native functions)
|
20485
20526
|
var v = fnPtr.apply
|
@@ -20588,6 +20629,8 @@ function setter(obj, path, setValue, fullExp, options) {
|
|
20588
20629
|
}
|
20589
20630
|
}
|
20590
20631
|
key = ensureSafeMemberName(element.shift(), fullExp);
|
20632
|
+
ensureSafeObject(obj, fullExp);
|
20633
|
+
ensureSafeObject(obj[key], fullExp);
|
20591
20634
|
obj[key] = setValue;
|
20592
20635
|
return setValue;
|
20593
20636
|
}
|
@@ -21007,17 +21050,13 @@ function $ParseProvider() {
|
|
21007
21050
|
* var deferred = $q.defer();
|
21008
21051
|
*
|
21009
21052
|
* setTimeout(function() {
|
21010
|
-
*
|
21011
|
-
*
|
21012
|
-
*
|
21013
|
-
* deferred.
|
21014
|
-
*
|
21015
|
-
*
|
21016
|
-
*
|
21017
|
-
* } else {
|
21018
|
-
* deferred.reject('Greeting ' + name + ' is not allowed.');
|
21019
|
-
* }
|
21020
|
-
* });
|
21053
|
+
* deferred.notify('About to greet ' + name + '.');
|
21054
|
+
*
|
21055
|
+
* if (okToGreet(name)) {
|
21056
|
+
* deferred.resolve('Hello, ' + name + '!');
|
21057
|
+
* } else {
|
21058
|
+
* deferred.reject('Greeting ' + name + ' is not allowed.');
|
21059
|
+
* }
|
21021
21060
|
* }, 1000);
|
21022
21061
|
*
|
21023
21062
|
* return deferred.promise;
|
@@ -22179,7 +22218,7 @@ function $RootScopeProvider(){
|
|
22179
22218
|
if ((value = watch.get(current)) !== (last = watch.last) &&
|
22180
22219
|
!(watch.eq
|
22181
22220
|
? equals(value, last)
|
22182
|
-
: (typeof value
|
22221
|
+
: (typeof value === 'number' && typeof last === 'number'
|
22183
22222
|
&& isNaN(value) && isNaN(last)))) {
|
22184
22223
|
dirty = true;
|
22185
22224
|
lastDirtyWatch = watch;
|
@@ -23524,7 +23563,7 @@ function $SceProvider() {
|
|
23524
23563
|
|
23525
23564
|
/**
|
23526
23565
|
* @ngdoc method
|
23527
|
-
* @name $sce#
|
23566
|
+
* @name $sce#parseAs
|
23528
23567
|
*
|
23529
23568
|
* @description
|
23530
23569
|
* Converts Angular {@link guide/expression expression} into a function. This is like {@link
|
@@ -24480,7 +24519,7 @@ function filterFilter() {
|
|
24480
24519
|
// jshint +W086
|
24481
24520
|
for (var key in expression) {
|
24482
24521
|
(function(path) {
|
24483
|
-
if (typeof expression[path]
|
24522
|
+
if (typeof expression[path] === 'undefined') return;
|
24484
24523
|
predicates.push(function(value) {
|
24485
24524
|
return search(path == '$' ? value : (value && value[path]), expression[path]);
|
24486
24525
|
});
|
@@ -24635,6 +24674,7 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
24635
24674
|
var match = numStr.match(/([\d\.]+)e(-?)(\d+)/);
|
24636
24675
|
if (match && match[2] == '-' && match[3] > fractionSize + 1) {
|
24637
24676
|
numStr = '0';
|
24677
|
+
number = 0;
|
24638
24678
|
} else {
|
24639
24679
|
formatedText = numStr;
|
24640
24680
|
hasExponent = true;
|
@@ -24649,8 +24689,11 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
24649
24689
|
fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac);
|
24650
24690
|
}
|
24651
24691
|
|
24652
|
-
|
24653
|
-
|
24692
|
+
// safely round numbers in JS without hitting imprecisions of floating-point arithmetics
|
24693
|
+
// inspired by:
|
24694
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
|
24695
|
+
number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize);
|
24696
|
+
|
24654
24697
|
var fraction = ('' + number).split(DECIMAL_SEP);
|
24655
24698
|
var whole = fraction[0];
|
24656
24699
|
fraction = fraction[1] || '';
|
@@ -26152,7 +26195,7 @@ var ngFormDirective = formDirectiveFactory(true);
|
|
26152
26195
|
*/
|
26153
26196
|
|
26154
26197
|
var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
|
26155
|
-
var EMAIL_REGEXP = /^[a-z0-9!#$%&'
|
26198
|
+
var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*$/i;
|
26156
26199
|
var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/;
|
26157
26200
|
|
26158
26201
|
var inputType = {
|
@@ -26578,15 +26621,29 @@ function validate(ctrl, validatorName, validity, value){
|
|
26578
26621
|
return validity ? value : undefined;
|
26579
26622
|
}
|
26580
26623
|
|
26624
|
+
function testFlags(validity, flags) {
|
26625
|
+
var i, flag;
|
26626
|
+
if (flags) {
|
26627
|
+
for (i=0; i<flags.length; ++i) {
|
26628
|
+
flag = flags[i];
|
26629
|
+
if (validity[flag]) {
|
26630
|
+
return true;
|
26631
|
+
}
|
26632
|
+
}
|
26633
|
+
}
|
26634
|
+
return false;
|
26635
|
+
}
|
26581
26636
|
|
26582
|
-
|
26583
|
-
|
26637
|
+
// Pass validity so that behaviour can be mocked easier.
|
26638
|
+
function addNativeHtml5Validators(ctrl, validatorName, badFlags, ignoreFlags, validity) {
|
26584
26639
|
if (isObject(validity)) {
|
26640
|
+
ctrl.$$hasNativeValidators = true;
|
26585
26641
|
var validator = function(value) {
|
26586
26642
|
// Don't overwrite previous validation, don't consider valueMissing to apply (ng-required can
|
26587
26643
|
// perform the required validation)
|
26588
|
-
if (!ctrl.$error[validatorName] &&
|
26589
|
-
validity
|
26644
|
+
if (!ctrl.$error[validatorName] &&
|
26645
|
+
!testFlags(validity, ignoreFlags) &&
|
26646
|
+
testFlags(validity, badFlags)) {
|
26590
26647
|
ctrl.$setValidity(validatorName, false);
|
26591
26648
|
return;
|
26592
26649
|
}
|
@@ -26597,8 +26654,9 @@ function addNativeHtml5Validators(ctrl, validatorName, element) {
|
|
26597
26654
|
}
|
26598
26655
|
|
26599
26656
|
function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
26600
|
-
var validity = element.prop(
|
26657
|
+
var validity = element.prop(VALIDITY_STATE_PROPERTY);
|
26601
26658
|
var placeholder = element[0].placeholder, noevent = {};
|
26659
|
+
ctrl.$$validityState = validity;
|
26602
26660
|
|
26603
26661
|
// In composition mode, users are still inputing intermediate text buffer,
|
26604
26662
|
// hold the listener until composition is done.
|
@@ -26636,11 +26694,11 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
26636
26694
|
value = trim(value);
|
26637
26695
|
}
|
26638
26696
|
|
26639
|
-
|
26640
|
-
|
26641
|
-
|
26642
|
-
|
26643
|
-
|
26697
|
+
// If a control is suffering from bad input, browsers discard its value, so it may be
|
26698
|
+
// necessary to revalidate even if the control's value is the same empty value twice in
|
26699
|
+
// a row.
|
26700
|
+
var revalidate = validity && ctrl.$$hasNativeValidators;
|
26701
|
+
if (ctrl.$viewValue !== value || (value === '' && revalidate)) {
|
26644
26702
|
if (scope.$$phase) {
|
26645
26703
|
ctrl.$setViewValue(value);
|
26646
26704
|
} else {
|
@@ -26746,6 +26804,8 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
26746
26804
|
}
|
26747
26805
|
}
|
26748
26806
|
|
26807
|
+
var numberBadFlags = ['badInput'];
|
26808
|
+
|
26749
26809
|
function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
26750
26810
|
textInputType(scope, element, attr, ctrl, $sniffer, $browser);
|
26751
26811
|
|
@@ -26760,7 +26820,7 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
26760
26820
|
}
|
26761
26821
|
});
|
26762
26822
|
|
26763
|
-
addNativeHtml5Validators(ctrl, 'number',
|
26823
|
+
addNativeHtml5Validators(ctrl, 'number', numberBadFlags, null, ctrl.$$validityState);
|
26764
26824
|
|
26765
26825
|
ctrl.$formatters.push(function(value) {
|
26766
26826
|
return ctrl.$isEmpty(value) ? '' : '' + value;
|
@@ -27242,7 +27302,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
27242
27302
|
* This method should be called by validators - i.e. the parser or formatter functions.
|
27243
27303
|
*
|
27244
27304
|
* @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign
|
27245
|
-
* to `$error[validationErrorKey]
|
27305
|
+
* to `$error[validationErrorKey]=!isValid` so that it is available for data-binding.
|
27246
27306
|
* The `validationErrorKey` should be in camelCase and will get converted into dash-case
|
27247
27307
|
* for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`
|
27248
27308
|
* class and can be bound to as `{{someForm.someControl.$error.myError}}` .
|
@@ -29626,7 +29686,7 @@ var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
|
|
29626
29686
|
* When one person, perhaps John, views the document, "John is viewing" will be shown.
|
29627
29687
|
* When three people view the document, no explicit number rule is found, so
|
29628
29688
|
* an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.
|
29629
|
-
* In this case, plural category 'one' is matched and "John,
|
29689
|
+
* In this case, plural category 'one' is matched and "John, Mary and one other person are viewing"
|
29630
29690
|
* is shown.
|
29631
29691
|
*
|
29632
29692
|
* Note that when you specify offsets, you must provide explicit number rules for
|
@@ -30508,7 +30568,7 @@ var ngHideDirective = ['$animate', function($animate) {
|
|
30508
30568
|
<file name="protractor.js" type="protractor">
|
30509
30569
|
var colorSpan = element(by.css('span'));
|
30510
30570
|
|
30511
|
-
|
30571
|
+
it('should check ng-style', function() {
|
30512
30572
|
expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');
|
30513
30573
|
element(by.css('input[value=\'set color\']')).click();
|
30514
30574
|
expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');
|
@@ -31401,7 +31461,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
31401
31461
|
// rather then the element.
|
31402
31462
|
(element = optionTemplate.clone())
|
31403
31463
|
.val(option.id)
|
31404
|
-
.
|
31464
|
+
.prop('selected', option.selected)
|
31405
31465
|
.text(option.label);
|
31406
31466
|
}
|
31407
31467
|
|
@@ -31782,7 +31842,7 @@ _jQuery.fn.bindings = function(windowJquery, bindExp) {
|
|
31782
31842
|
function push(value) {
|
31783
31843
|
if (value === undefined) {
|
31784
31844
|
value = '';
|
31785
|
-
} else if (typeof value
|
31845
|
+
} else if (typeof value !== 'string') {
|
31786
31846
|
value = angular.toJson(value);
|
31787
31847
|
}
|
31788
31848
|
result.push('' + value);
|