angularjs-rails 1.3.2 → 1.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/angularjs-rails/version.rb +2 -2
- data/vendor/assets/javascripts/angular-animate.js +2 -2
- data/vendor/assets/javascripts/angular-aria.js +83 -23
- data/vendor/assets/javascripts/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/angular-loader.js +6 -23
- data/vendor/assets/javascripts/angular-messages.js +1 -1
- data/vendor/assets/javascripts/angular-mocks.js +21 -17
- data/vendor/assets/javascripts/angular-resource.js +1 -1
- data/vendor/assets/javascripts/angular-route.js +19 -5
- data/vendor/assets/javascripts/angular-sanitize.js +20 -20
- data/vendor/assets/javascripts/angular-scenario.js +298 -269
- data/vendor/assets/javascripts/angular-touch.js +3 -3
- data/vendor/assets/javascripts/angular.js +292 -263
- data/vendor/assets/javascripts/unstable/angular-animate.js +2 -2
- data/vendor/assets/javascripts/unstable/angular-aria.js +83 -23
- data/vendor/assets/javascripts/unstable/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-loader.js +6 -23
- data/vendor/assets/javascripts/unstable/angular-messages.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-mocks.js +21 -17
- data/vendor/assets/javascripts/unstable/angular-resource.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-route.js +19 -5
- data/vendor/assets/javascripts/unstable/angular-sanitize.js +20 -20
- data/vendor/assets/javascripts/unstable/angular-scenario.js +298 -269
- data/vendor/assets/javascripts/unstable/angular-touch.js +3 -3
- data/vendor/assets/javascripts/unstable/angular.js +292 -263
- metadata +2 -2
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.3
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -1889,7 +1889,7 @@ angular.module('ngAnimate', ['ng'])
|
|
1889
1889
|
//the jqLite object, so we're safe to use a single variable to house
|
1890
1890
|
//the styles since there is always only one element being animated
|
1891
1891
|
var oldStyle = node.getAttribute('style') || '';
|
1892
|
-
if (oldStyle.charAt(oldStyle.length-1) !== ';') {
|
1892
|
+
if (oldStyle.charAt(oldStyle.length - 1) !== ';') {
|
1893
1893
|
oldStyle += ';';
|
1894
1894
|
}
|
1895
1895
|
node.setAttribute('style', oldStyle + ' ' + style);
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.3
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -10,33 +10,49 @@
|
|
10
10
|
* @name ngAria
|
11
11
|
* @description
|
12
12
|
*
|
13
|
-
* The `ngAria` module provides support for
|
14
|
-
*
|
15
|
-
*
|
13
|
+
* The `ngAria` module provides support for common
|
14
|
+
* [<abbr title="Accessible Rich Internet Applications">ARIA</abbr>](http://www.w3.org/TR/wai-aria/)
|
15
|
+
* attributes that convey state or semantic information about the application for users
|
16
|
+
* of assistive technologies, such as screen readers.
|
16
17
|
*
|
17
18
|
* <div doc-module-components="ngAria"></div>
|
18
19
|
*
|
19
|
-
*
|
20
|
-
* To enable the addition of the ARIA tags, just require the module into your application and the tags will
|
21
|
-
* hook into your ng-show/ng-hide, input, textarea, button, select and ng-required directives and adds the
|
22
|
-
* appropriate ARIA attributes.
|
20
|
+
* ## Usage
|
23
21
|
*
|
24
|
-
*
|
22
|
+
* For ngAria to do its magic, simply include the module as a dependency. The directives supported
|
23
|
+
* by ngAria are:
|
24
|
+
* `ngModel`, `ngDisabled`, `ngShow`, `ngHide`, `ngClick`, `ngDblClick`, and `ngMessages`.
|
25
25
|
*
|
26
|
-
*
|
27
|
-
* + aria-checked
|
28
|
-
* + aria-disabled
|
29
|
-
* + aria-required
|
30
|
-
* + aria-invalid
|
31
|
-
* + aria-multiline
|
32
|
-
* + aria-valuenow
|
33
|
-
* + aria-valuemin
|
34
|
-
* + aria-valuemax
|
35
|
-
* + tabindex
|
26
|
+
* Below is a more detailed breakdown of the attributes handled by ngAria:
|
36
27
|
*
|
37
|
-
*
|
28
|
+
* | Directive | Supported Attributes |
|
29
|
+
* |---------------------------------------------|----------------------------------------------------------------------------------------|
|
30
|
+
* | {@link ng.directive:ngModel ngModel} | aria-checked, aria-valuemin, aria-valuemax, aria-valuenow, aria-invalid, aria-required |
|
31
|
+
* | {@link ng.directive:ngDisabled ngDisabled} | aria-disabled |
|
32
|
+
* | {@link ng.directive:ngShow ngShow} | aria-hidden |
|
33
|
+
* | {@link ng.directive:ngHide ngHide} | aria-hidden |
|
34
|
+
* | {@link ng.directive:ngClick ngClick} | tabindex |
|
35
|
+
* | {@link ng.directive:ngDblclick ngDblclick} | tabindex |
|
36
|
+
* | {@link module:ngMessages ngMessages} | aria-live |
|
37
|
+
*
|
38
|
+
* Find out more information about each directive by reading the
|
39
|
+
* {@link guide/accessibility ngAria Developer Guide}.
|
40
|
+
*
|
41
|
+
* ##Example
|
42
|
+
* Using ngDisabled with ngAria:
|
43
|
+
* ```html
|
44
|
+
* <md-checkbox ng-disabled="disabled">
|
45
|
+
* ```
|
46
|
+
* Becomes:
|
47
|
+
* ```html
|
48
|
+
* <md-checkbox ng-disabled="disabled" aria-disabled="true">
|
49
|
+
* ```
|
50
|
+
*
|
51
|
+
* ##Disabling Attributes
|
52
|
+
* It's possible to disable individual attributes added by ngAria with the
|
53
|
+
* {@link ngAria.$ariaProvider#config config} method. For more details, see the
|
54
|
+
* {@link guide/accessibility Developer Guide}.
|
38
55
|
*/
|
39
|
-
|
40
56
|
/* global -ngAriaModule */
|
41
57
|
var ngAriaModule = angular.module('ngAria', ['ng']).
|
42
58
|
provider('$aria', $AriaProvider);
|
@@ -47,10 +63,20 @@ var ngAriaModule = angular.module('ngAria', ['ng']).
|
|
47
63
|
*
|
48
64
|
* @description
|
49
65
|
*
|
50
|
-
* Used for configuring ARIA attributes.
|
66
|
+
* Used for configuring the ARIA attributes injected and managed by ngAria.
|
67
|
+
*
|
68
|
+
* ```js
|
69
|
+
* angular.module('myApp', ['ngAria'], function config($ariaProvider) {
|
70
|
+
* $ariaProvider.config({
|
71
|
+
* ariaValue: true,
|
72
|
+
* tabindex: false
|
73
|
+
* });
|
74
|
+
* });
|
75
|
+
*```
|
51
76
|
*
|
52
77
|
* ## Dependencies
|
53
78
|
* Requires the {@link ngAria} module to be installed.
|
79
|
+
*
|
54
80
|
*/
|
55
81
|
function $AriaProvider() {
|
56
82
|
var config = {
|
@@ -113,7 +139,41 @@ function $AriaProvider() {
|
|
113
139
|
*
|
114
140
|
* @description
|
115
141
|
*
|
116
|
-
*
|
142
|
+
* The $aria service contains helper methods for applying common
|
143
|
+
* [ARIA](http://www.w3.org/TR/wai-aria/) attributes to HTML directives.
|
144
|
+
*
|
145
|
+
* ngAria injects common accessibility attributes that tell assistive technologies when HTML
|
146
|
+
* elements are enabled, selected, hidden, and more. To see how this is performed with ngAria,
|
147
|
+
* let's review a code snippet from ngAria itself:
|
148
|
+
*
|
149
|
+
*```js
|
150
|
+
* ngAriaModule.directive('ngDisabled', ['$aria', function($aria) {
|
151
|
+
* return $aria.$$watchExpr('ngDisabled', 'aria-disabled');
|
152
|
+
* }])
|
153
|
+
*```
|
154
|
+
* Shown above, the ngAria module creates a directive with the same signature as the
|
155
|
+
* traditional `ng-disabled` directive. But this ngAria version is dedicated to
|
156
|
+
* solely managing accessibility attributes. The internal `$aria` service is used to watch the
|
157
|
+
* boolean attribute `ngDisabled`. If it has not been explicitly set by the developer,
|
158
|
+
* `aria-disabled` is injected as an attribute with its value synchronized to the value in
|
159
|
+
* `ngDisabled`.
|
160
|
+
*
|
161
|
+
* Because ngAria hooks into the `ng-disabled` directive, developers do not have to do
|
162
|
+
* anything to enable this feature. The `aria-disabled` attribute is automatically managed
|
163
|
+
* simply as a silent side-effect of using `ng-disabled` with the ngAria module.
|
164
|
+
*
|
165
|
+
* The full list of directives that interface with ngAria:
|
166
|
+
* * **ngModel**
|
167
|
+
* * **ngShow**
|
168
|
+
* * **ngHide**
|
169
|
+
* * **ngClick**
|
170
|
+
* * **ngDblclick**
|
171
|
+
* * **ngMessages**
|
172
|
+
* * **ngDisabled**
|
173
|
+
*
|
174
|
+
* Read the {@link guide/accessibility ngAria Developer Guide} for a thorough explanation of each
|
175
|
+
* directive.
|
176
|
+
*
|
117
177
|
*
|
118
178
|
* ## Dependencies
|
119
179
|
* Requires the {@link ngAria} module to be installed.
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.3
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -43,40 +43,23 @@ function minErr(module, ErrorConstructor) {
|
|
43
43
|
prefix = '[' + (module ? module + ':' : '') + code + '] ',
|
44
44
|
template = arguments[1],
|
45
45
|
templateArgs = arguments,
|
46
|
-
|
47
|
-
if (typeof obj === 'function') {
|
48
|
-
return obj.toString().replace(/ \{[\s\S]*$/, '');
|
49
|
-
} else if (typeof obj === 'undefined') {
|
50
|
-
return 'undefined';
|
51
|
-
} else if (typeof obj !== 'string') {
|
52
|
-
return JSON.stringify(obj);
|
53
|
-
}
|
54
|
-
return obj;
|
55
|
-
},
|
46
|
+
|
56
47
|
message, i;
|
57
48
|
|
58
49
|
message = prefix + template.replace(/\{\d+\}/g, function(match) {
|
59
50
|
var index = +match.slice(1, -1), arg;
|
60
51
|
|
61
52
|
if (index + 2 < templateArgs.length) {
|
62
|
-
|
63
|
-
if (typeof arg === 'function') {
|
64
|
-
return arg.toString().replace(/ ?\{[\s\S]*$/, '');
|
65
|
-
} else if (typeof arg === 'undefined') {
|
66
|
-
return 'undefined';
|
67
|
-
} else if (typeof arg !== 'string') {
|
68
|
-
return toJson(arg);
|
69
|
-
}
|
70
|
-
return arg;
|
53
|
+
return toDebugString(templateArgs[index + 2]);
|
71
54
|
}
|
72
55
|
return match;
|
73
56
|
});
|
74
57
|
|
75
|
-
message = message + '\nhttp://errors.angularjs.org/1.3.
|
58
|
+
message = message + '\nhttp://errors.angularjs.org/1.3.3/' +
|
76
59
|
(module ? module + '/' : '') + code;
|
77
60
|
for (i = 2; i < arguments.length; i++) {
|
78
|
-
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
79
|
-
encodeURIComponent(
|
61
|
+
message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
|
62
|
+
encodeURIComponent(toDebugString(arguments[i]));
|
80
63
|
}
|
81
64
|
return new ErrorConstructor(message);
|
82
65
|
};
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.3
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -117,7 +117,7 @@ angular.mock.$Browser = function() {
|
|
117
117
|
self.defer.now += delay;
|
118
118
|
} else {
|
119
119
|
if (self.deferredFns.length) {
|
120
|
-
self.defer.now = self.deferredFns[self.deferredFns.length-1].time;
|
120
|
+
self.defer.now = self.deferredFns[self.deferredFns.length - 1].time;
|
121
121
|
} else {
|
122
122
|
throw new Error('No deferred tasks to be flushed');
|
123
123
|
}
|
@@ -428,7 +428,7 @@ angular.mock.$LogProvider = function() {
|
|
428
428
|
});
|
429
429
|
});
|
430
430
|
if (errors.length) {
|
431
|
-
errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or "+
|
431
|
+
errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or " +
|
432
432
|
"an expected log message was not checked and removed:");
|
433
433
|
errors.push('');
|
434
434
|
throw new Error(errors.join('\n---------\n'));
|
@@ -461,17 +461,17 @@ angular.mock.$LogProvider = function() {
|
|
461
461
|
* @returns {promise} A promise which will be notified on each iteration.
|
462
462
|
*/
|
463
463
|
angular.mock.$IntervalProvider = function() {
|
464
|
-
this.$get = ['$rootScope', '$q',
|
465
|
-
function($rootScope, $q) {
|
464
|
+
this.$get = ['$browser', '$rootScope', '$q', '$$q',
|
465
|
+
function($browser, $rootScope, $q, $$q) {
|
466
466
|
var repeatFns = [],
|
467
467
|
nextRepeatId = 0,
|
468
468
|
now = 0;
|
469
469
|
|
470
470
|
var $interval = function(fn, delay, count, invokeApply) {
|
471
|
-
var
|
472
|
-
|
473
|
-
|
474
|
-
|
471
|
+
var iteration = 0,
|
472
|
+
skipApply = (angular.isDefined(invokeApply) && !invokeApply),
|
473
|
+
deferred = (skipApply ? $$q : $q).defer(),
|
474
|
+
promise = deferred.promise;
|
475
475
|
|
476
476
|
count = (angular.isDefined(count)) ? count : 0;
|
477
477
|
promise.then(null, null, fn);
|
@@ -494,7 +494,11 @@ angular.mock.$IntervalProvider = function() {
|
|
494
494
|
}
|
495
495
|
}
|
496
496
|
|
497
|
-
if (
|
497
|
+
if (skipApply) {
|
498
|
+
$browser.defer.flush();
|
499
|
+
} else {
|
500
|
+
$rootScope.$apply();
|
501
|
+
}
|
498
502
|
}
|
499
503
|
|
500
504
|
repeatFns.push({
|
@@ -581,10 +585,10 @@ function jsonStringToDate(string) {
|
|
581
585
|
tzMin = int(match[9] + match[11]);
|
582
586
|
}
|
583
587
|
date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));
|
584
|
-
date.setUTCHours(int(match[4]||0) - tzHour,
|
585
|
-
int(match[5]||0) - tzMin,
|
586
|
-
int(match[6]||0),
|
587
|
-
int(match[7]||0));
|
588
|
+
date.setUTCHours(int(match[4] || 0) - tzHour,
|
589
|
+
int(match[5] || 0) - tzMin,
|
590
|
+
int(match[6] || 0),
|
591
|
+
int(match[7] || 0));
|
588
592
|
return date;
|
589
593
|
}
|
590
594
|
return string;
|
@@ -663,7 +667,7 @@ angular.mock.TzDate = function(offset, timestamp) {
|
|
663
667
|
}
|
664
668
|
|
665
669
|
var localOffset = new Date(timestamp).getTimezoneOffset();
|
666
|
-
self.offsetDiff = localOffset*60*1000 - offset*1000*60*60;
|
670
|
+
self.offsetDiff = localOffset * 60 * 1000 - offset * 1000 * 60 * 60;
|
667
671
|
self.date = new Date(timestamp + self.offsetDiff);
|
668
672
|
|
669
673
|
self.getTime = function() {
|
@@ -815,7 +819,7 @@ angular.mock.animate = angular.module('ngAnimateMock', ['ng'])
|
|
815
819
|
animate.queue.push({
|
816
820
|
event: method,
|
817
821
|
element: arguments[0],
|
818
|
-
options: arguments[arguments.length-1],
|
822
|
+
options: arguments[arguments.length - 1],
|
819
823
|
args: arguments
|
820
824
|
});
|
821
825
|
return $delegate[method].apply($delegate, arguments);
|
@@ -1770,7 +1774,7 @@ angular.mock.$RAFDecorator = ['$delegate', function($delegate) {
|
|
1770
1774
|
}
|
1771
1775
|
|
1772
1776
|
var length = queue.length;
|
1773
|
-
for (var i=0;i<length;i++) {
|
1777
|
+
for (var i = 0; i < length; i++) {
|
1774
1778
|
queue[i]();
|
1775
1779
|
}
|
1776
1780
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.3
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -151,6 +151,9 @@ function $RouteProvider() {
|
|
151
151
|
if (angular.isUndefined(routeCopy.reloadOnSearch)) {
|
152
152
|
routeCopy.reloadOnSearch = true;
|
153
153
|
}
|
154
|
+
if (angular.isUndefined(routeCopy.caseInsensitiveMatch)) {
|
155
|
+
routeCopy.caseInsensitiveMatch = this.caseInsensitiveMatch;
|
156
|
+
}
|
154
157
|
routes[path] = angular.extend(
|
155
158
|
routeCopy,
|
156
159
|
path && pathRegExp(path, routeCopy)
|
@@ -158,9 +161,9 @@ function $RouteProvider() {
|
|
158
161
|
|
159
162
|
// create redirection for trailing slashes
|
160
163
|
if (path) {
|
161
|
-
var redirectPath = (path[path.length-1] == '/')
|
162
|
-
? path.substr(0, path.length-1)
|
163
|
-
: path +'/';
|
164
|
+
var redirectPath = (path[path.length - 1] == '/')
|
165
|
+
? path.substr(0, path.length - 1)
|
166
|
+
: path + '/';
|
164
167
|
|
165
168
|
routes[redirectPath] = angular.extend(
|
166
169
|
{redirectTo: path},
|
@@ -171,6 +174,17 @@ function $RouteProvider() {
|
|
171
174
|
return this;
|
172
175
|
};
|
173
176
|
|
177
|
+
/**
|
178
|
+
* @ngdoc property
|
179
|
+
* @name $routeProvider#caseInsensitiveMatch
|
180
|
+
* @description
|
181
|
+
*
|
182
|
+
* A boolean property indicating if routes defined
|
183
|
+
* using this provider should be matched using a case sensitive
|
184
|
+
* algorithm. Defaults to `false`.
|
185
|
+
*/
|
186
|
+
this.caseInsensitiveMatch = false;
|
187
|
+
|
174
188
|
/**
|
175
189
|
* @param path {string} path
|
176
190
|
* @param opts {Object} options
|
@@ -639,7 +653,7 @@ function $RouteProvider() {
|
|
639
653
|
*/
|
640
654
|
function interpolate(string, params) {
|
641
655
|
var result = [];
|
642
|
-
angular.forEach((string||'').split(':'), function(segment, i) {
|
656
|
+
angular.forEach((string || '').split(':'), function(segment, i) {
|
643
657
|
if (i === 0) {
|
644
658
|
result.push(segment);
|
645
659
|
} else {
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.3
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -218,29 +218,29 @@ var validElements = angular.extend({},
|
|
218
218
|
//Attributes that have href and hence need to be sanitized
|
219
219
|
var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap,xlink:href");
|
220
220
|
|
221
|
-
var htmlAttrs = makeMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,'+
|
222
|
-
'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,'+
|
223
|
-
'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,'+
|
224
|
-
'scope,scrolling,shape,size,span,start,summary,target,title,type,'+
|
221
|
+
var htmlAttrs = makeMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' +
|
222
|
+
'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' +
|
223
|
+
'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' +
|
224
|
+
'scope,scrolling,shape,size,span,start,summary,target,title,type,' +
|
225
225
|
'valign,value,vspace,width');
|
226
226
|
|
227
227
|
// SVG attributes (without "id" and "name" attributes)
|
228
228
|
// https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes
|
229
|
-
var svgAttrs = makeMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,'+
|
230
|
-
'attributeName,attributeType,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,'+
|
231
|
-
'color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,'+
|
232
|
-
'font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,'+
|
233
|
-
'gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,'+
|
234
|
-
'keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,'+
|
235
|
-
'markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,'+
|
236
|
-
'overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,'+
|
237
|
-
'repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,'+
|
238
|
-
'stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,'+
|
239
|
-
'stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,'+
|
240
|
-
'stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,'+
|
241
|
-
'underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,'+
|
242
|
-
'viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,'+
|
243
|
-
'xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,'+
|
229
|
+
var svgAttrs = makeMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' +
|
230
|
+
'attributeName,attributeType,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,' +
|
231
|
+
'color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,' +
|
232
|
+
'font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,' +
|
233
|
+
'gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,' +
|
234
|
+
'keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,' +
|
235
|
+
'markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,' +
|
236
|
+
'overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,' +
|
237
|
+
'repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,' +
|
238
|
+
'stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,' +
|
239
|
+
'stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,' +
|
240
|
+
'stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,' +
|
241
|
+
'underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,' +
|
242
|
+
'viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,' +
|
243
|
+
'xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,' +
|
244
244
|
'zoomAndPan');
|
245
245
|
|
246
246
|
var validAttrs = angular.extend({},
|
@@ -9190,7 +9190,7 @@ return jQuery;
|
|
9190
9190
|
}));
|
9191
9191
|
|
9192
9192
|
/**
|
9193
|
-
* @license AngularJS v1.3.
|
9193
|
+
* @license AngularJS v1.3.3
|
9194
9194
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
9195
9195
|
* License: MIT
|
9196
9196
|
*/
|
@@ -9234,40 +9234,23 @@ function minErr(module, ErrorConstructor) {
|
|
9234
9234
|
prefix = '[' + (module ? module + ':' : '') + code + '] ',
|
9235
9235
|
template = arguments[1],
|
9236
9236
|
templateArgs = arguments,
|
9237
|
-
|
9238
|
-
if (typeof obj === 'function') {
|
9239
|
-
return obj.toString().replace(/ \{[\s\S]*$/, '');
|
9240
|
-
} else if (typeof obj === 'undefined') {
|
9241
|
-
return 'undefined';
|
9242
|
-
} else if (typeof obj !== 'string') {
|
9243
|
-
return JSON.stringify(obj);
|
9244
|
-
}
|
9245
|
-
return obj;
|
9246
|
-
},
|
9237
|
+
|
9247
9238
|
message, i;
|
9248
9239
|
|
9249
9240
|
message = prefix + template.replace(/\{\d+\}/g, function(match) {
|
9250
9241
|
var index = +match.slice(1, -1), arg;
|
9251
9242
|
|
9252
9243
|
if (index + 2 < templateArgs.length) {
|
9253
|
-
|
9254
|
-
if (typeof arg === 'function') {
|
9255
|
-
return arg.toString().replace(/ ?\{[\s\S]*$/, '');
|
9256
|
-
} else if (typeof arg === 'undefined') {
|
9257
|
-
return 'undefined';
|
9258
|
-
} else if (typeof arg !== 'string') {
|
9259
|
-
return toJson(arg);
|
9260
|
-
}
|
9261
|
-
return arg;
|
9244
|
+
return toDebugString(templateArgs[index + 2]);
|
9262
9245
|
}
|
9263
9246
|
return match;
|
9264
9247
|
});
|
9265
9248
|
|
9266
|
-
message = message + '\nhttp://errors.angularjs.org/1.3.
|
9249
|
+
message = message + '\nhttp://errors.angularjs.org/1.3.3/' +
|
9267
9250
|
(module ? module + '/' : '') + code;
|
9268
9251
|
for (i = 2; i < arguments.length; i++) {
|
9269
|
-
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
9270
|
-
encodeURIComponent(
|
9252
|
+
message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
|
9253
|
+
encodeURIComponent(toDebugString(arguments[i]));
|
9271
9254
|
}
|
9272
9255
|
return new ErrorConstructor(message);
|
9273
9256
|
};
|
@@ -9907,7 +9890,7 @@ function includes(array, obj) {
|
|
9907
9890
|
|
9908
9891
|
function arrayRemove(array, value) {
|
9909
9892
|
var index = array.indexOf(value);
|
9910
|
-
if (index >=0)
|
9893
|
+
if (index >= 0)
|
9911
9894
|
array.splice(index, 1);
|
9912
9895
|
return value;
|
9913
9896
|
}
|
@@ -10108,7 +10091,7 @@ function equals(o1, o2) {
|
|
10108
10091
|
if (isArray(o1)) {
|
10109
10092
|
if (!isArray(o2)) return false;
|
10110
10093
|
if ((length = o1.length) == o2.length) {
|
10111
|
-
for (key=0; key<length; key++) {
|
10094
|
+
for (key = 0; key < length; key++) {
|
10112
10095
|
if (!equals(o1[key], o2[key])) return false;
|
10113
10096
|
}
|
10114
10097
|
return true;
|
@@ -10194,7 +10177,7 @@ function bind(self, fn) {
|
|
10194
10177
|
return curryArgs.length
|
10195
10178
|
? function() {
|
10196
10179
|
return arguments.length
|
10197
|
-
? fn.apply(self,
|
10180
|
+
? fn.apply(self, concat(curryArgs, arguments, 0))
|
10198
10181
|
: fn.apply(self, curryArgs);
|
10199
10182
|
}
|
10200
10183
|
: function() {
|
@@ -10394,7 +10377,7 @@ var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];
|
|
10394
10377
|
function getNgAttribute(element, ngAttr) {
|
10395
10378
|
var attr, i, ii = ngAttrPrefixes.length;
|
10396
10379
|
element = jqLite(element);
|
10397
|
-
for (i=0; i<ii; ++i) {
|
10380
|
+
for (i = 0; i < ii; ++i) {
|
10398
10381
|
attr = ngAttrPrefixes[i] + ngAttr;
|
10399
10382
|
if (isString(attr = element.attr(attr))) {
|
10400
10383
|
return attr;
|
@@ -11179,6 +11162,34 @@ function setupModuleLoader(window) {
|
|
11179
11162
|
|
11180
11163
|
}
|
11181
11164
|
|
11165
|
+
/* global: toDebugString: true */
|
11166
|
+
|
11167
|
+
function serializeObject(obj) {
|
11168
|
+
var seen = [];
|
11169
|
+
|
11170
|
+
return JSON.stringify(obj, function(key, val) {
|
11171
|
+
val = toJsonReplacer(key, val);
|
11172
|
+
if (isObject(val)) {
|
11173
|
+
|
11174
|
+
if (seen.indexOf(val) >= 0) return '<<already seen>>';
|
11175
|
+
|
11176
|
+
seen.push(val);
|
11177
|
+
}
|
11178
|
+
return val;
|
11179
|
+
});
|
11180
|
+
}
|
11181
|
+
|
11182
|
+
function toDebugString(obj) {
|
11183
|
+
if (typeof obj === 'function') {
|
11184
|
+
return obj.toString().replace(/ \{[\s\S]*$/, '');
|
11185
|
+
} else if (typeof obj === 'undefined') {
|
11186
|
+
return 'undefined';
|
11187
|
+
} else if (typeof obj !== 'string') {
|
11188
|
+
return serializeObject(obj);
|
11189
|
+
}
|
11190
|
+
return obj;
|
11191
|
+
}
|
11192
|
+
|
11182
11193
|
/* global angularModule: true,
|
11183
11194
|
version: true,
|
11184
11195
|
|
@@ -11281,11 +11292,11 @@ function setupModuleLoader(window) {
|
|
11281
11292
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
11282
11293
|
*/
|
11283
11294
|
var version = {
|
11284
|
-
full: '1.3.
|
11295
|
+
full: '1.3.3', // all of these placeholder strings will be replaced by grunt's
|
11285
11296
|
major: 1, // package task
|
11286
11297
|
minor: 3,
|
11287
|
-
dot:
|
11288
|
-
codeName: '
|
11298
|
+
dot: 3,
|
11299
|
+
codeName: 'undersea-arithmetic'
|
11289
11300
|
};
|
11290
11301
|
|
11291
11302
|
|
@@ -12018,7 +12029,7 @@ forEach({
|
|
12018
12029
|
}
|
12019
12030
|
} else {
|
12020
12031
|
return (element[name] ||
|
12021
|
-
(element.attributes.getNamedItem(name)|| noop).specified)
|
12032
|
+
(element.attributes.getNamedItem(name) || noop).specified)
|
12022
12033
|
? lowercasedName
|
12023
12034
|
: undefined;
|
12024
12035
|
}
|
@@ -13354,7 +13365,7 @@ function $AnchorScrollProvider() {
|
|
13354
13365
|
* @name $anchorScrollProvider#disableAutoScrolling
|
13355
13366
|
*
|
13356
13367
|
* @description
|
13357
|
-
* By default, {@link ng.$anchorScroll $anchorScroll()} will automatically
|
13368
|
+
* By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to
|
13358
13369
|
* {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.<br />
|
13359
13370
|
* Use this method to disable automatic scrolling.
|
13360
13371
|
*
|
@@ -14003,8 +14014,7 @@ function $$AsyncCallbackProvider() {
|
|
14003
14014
|
/**
|
14004
14015
|
* @param {object} window The global window object.
|
14005
14016
|
* @param {object} document jQuery wrapped document.
|
14006
|
-
* @param {
|
14007
|
-
* @param {object} $log console.log or an object with the same interface.
|
14017
|
+
* @param {object} $log window.console or an object with the same interface.
|
14008
14018
|
* @param {object} $sniffer $sniffer service
|
14009
14019
|
*/
|
14010
14020
|
function Browser(window, document, $log, $sniffer) {
|
@@ -14354,8 +14364,8 @@ function Browser(window, document, $log, $sniffer) {
|
|
14354
14364
|
// - 20 cookies per unique domain
|
14355
14365
|
// - 4096 bytes per cookie
|
14356
14366
|
if (cookieLength > 4096) {
|
14357
|
-
$log.warn("Cookie '"+ name +
|
14358
|
-
"' possibly not set or overflowed because it was too large ("+
|
14367
|
+
$log.warn("Cookie '" + name +
|
14368
|
+
"' possibly not set or overflowed because it was too large (" +
|
14359
14369
|
cookieLength + " > 4096 bytes)!");
|
14360
14370
|
}
|
14361
14371
|
}
|
@@ -15020,7 +15030,7 @@ function $TemplateCacheProvider() {
|
|
15020
15030
|
*
|
15021
15031
|
*
|
15022
15032
|
* #### `bindToController`
|
15023
|
-
* When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController` will
|
15033
|
+
* When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController: true` will
|
15024
15034
|
* allow a component to have its properties bound to the controller, rather than to scope. When the controller
|
15025
15035
|
* is instantiated, the initial values of the isolate scope bindings are already available.
|
15026
15036
|
*
|
@@ -15869,16 +15879,16 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15869
15879
|
|
15870
15880
|
// for each tuples
|
15871
15881
|
var nbrUrisWith2parts = Math.floor(rawUris.length / 2);
|
15872
|
-
for (var i=0; i<nbrUrisWith2parts; i++) {
|
15873
|
-
var innerIdx = i*2;
|
15882
|
+
for (var i = 0; i < nbrUrisWith2parts; i++) {
|
15883
|
+
var innerIdx = i * 2;
|
15874
15884
|
// sanitize the uri
|
15875
15885
|
result += $$sanitizeUri(trim(rawUris[innerIdx]), true);
|
15876
15886
|
// add the descriptor
|
15877
|
-
result += (" " + trim(rawUris[innerIdx+1]));
|
15887
|
+
result += (" " + trim(rawUris[innerIdx + 1]));
|
15878
15888
|
}
|
15879
15889
|
|
15880
15890
|
// split the last item into uri and descriptor
|
15881
|
-
var lastTuple = trim(rawUris[i*2]).split(/\s/);
|
15891
|
+
var lastTuple = trim(rawUris[i * 2]).split(/\s/);
|
15882
15892
|
|
15883
15893
|
// sanitize the last uri
|
15884
15894
|
result += $$sanitizeUri(trim(lastTuple[0]), true);
|
@@ -16072,7 +16082,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16072
16082
|
if (!node) {
|
16073
16083
|
return 'html';
|
16074
16084
|
} else {
|
16075
|
-
return nodeName_(node) !== 'foreignobject' && node.toString().match(/SVG/) ? 'svg': 'html';
|
16085
|
+
return nodeName_(node) !== 'foreignobject' && node.toString().match(/SVG/) ? 'svg' : 'html';
|
16076
16086
|
}
|
16077
16087
|
}
|
16078
16088
|
|
@@ -16885,7 +16895,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16885
16895
|
var match = null;
|
16886
16896
|
if (hasDirectives.hasOwnProperty(name)) {
|
16887
16897
|
for (var directive, directives = $injector.get(name + Suffix),
|
16888
|
-
i = 0, ii = directives.length; i<ii; i++) {
|
16898
|
+
i = 0, ii = directives.length; i < ii; i++) {
|
16889
16899
|
try {
|
16890
16900
|
directive = directives[i];
|
16891
16901
|
if ((maxPriority === undefined || maxPriority > directive.priority) &&
|
@@ -16914,7 +16924,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16914
16924
|
function directiveIsMultiElement(name) {
|
16915
16925
|
if (hasDirectives.hasOwnProperty(name)) {
|
16916
16926
|
for (var directive, directives = $injector.get(name + Suffix),
|
16917
|
-
i = 0, ii = directives.length; i<ii; i++) {
|
16927
|
+
i = 0, ii = directives.length; i < ii; i++) {
|
16918
16928
|
directive = directives[i];
|
16919
16929
|
if (directive.multiElement) {
|
16920
16930
|
return true;
|
@@ -17133,7 +17143,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17133
17143
|
case 'svg':
|
17134
17144
|
case 'math':
|
17135
17145
|
var wrapper = document.createElement('div');
|
17136
|
-
wrapper.innerHTML = '<'+type+'>'+template+'</'+type+'>';
|
17146
|
+
wrapper.innerHTML = '<' + type + '>' + template + '</' + type + '>';
|
17137
17147
|
return wrapper.childNodes[0].childNodes;
|
17138
17148
|
default:
|
17139
17149
|
return template;
|
@@ -17490,6 +17500,10 @@ function $ControllerProvider() {
|
|
17490
17500
|
* * if $controllerProvider#allowGlobals, check `window[constructor]` on the global
|
17491
17501
|
* `window` object (not recommended)
|
17492
17502
|
*
|
17503
|
+
* The string can use the `controller as property` syntax, where the controller instance is published
|
17504
|
+
* as the specified property on the `scope`; the `scope` must be injected into `locals` param for this
|
17505
|
+
* to work correctly.
|
17506
|
+
*
|
17493
17507
|
* @param {Object} locals Injection locals for Controller.
|
17494
17508
|
* @return {Object} Instance of given controller.
|
17495
17509
|
*
|
@@ -17664,7 +17678,7 @@ function defaultHttpResponseTransform(data, headers) {
|
|
17664
17678
|
// strip json vulnerability protection prefix
|
17665
17679
|
data = data.replace(JSON_PROTECTION_PREFIX, '');
|
17666
17680
|
var contentType = headers('Content-Type');
|
17667
|
-
if ((contentType && contentType.indexOf(APPLICATION_JSON) === 0) ||
|
17681
|
+
if ((contentType && contentType.indexOf(APPLICATION_JSON) === 0 && data.trim()) ||
|
17668
17682
|
(JSON_START.test(data) && JSON_END.test(data))) {
|
17669
17683
|
data = fromJson(data);
|
17670
17684
|
}
|
@@ -19235,7 +19249,8 @@ function $InterpolateProvider() {
|
|
19235
19249
|
|
19236
19250
|
function parseStringifyInterceptor(value) {
|
19237
19251
|
try {
|
19238
|
-
|
19252
|
+
value = getValue(value);
|
19253
|
+
return allOrNothing && !isDefined(value) ? value : stringify(value);
|
19239
19254
|
} catch (err) {
|
19240
19255
|
var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text,
|
19241
19256
|
err.toString());
|
@@ -19559,8 +19574,8 @@ function encodePath(path) {
|
|
19559
19574
|
return segments.join('/');
|
19560
19575
|
}
|
19561
19576
|
|
19562
|
-
function parseAbsoluteUrl(absoluteUrl, locationObj
|
19563
|
-
var parsedUrl = urlResolve(absoluteUrl
|
19577
|
+
function parseAbsoluteUrl(absoluteUrl, locationObj) {
|
19578
|
+
var parsedUrl = urlResolve(absoluteUrl);
|
19564
19579
|
|
19565
19580
|
locationObj.$$protocol = parsedUrl.protocol;
|
19566
19581
|
locationObj.$$host = parsedUrl.hostname;
|
@@ -19568,12 +19583,12 @@ function parseAbsoluteUrl(absoluteUrl, locationObj, appBase) {
|
|
19568
19583
|
}
|
19569
19584
|
|
19570
19585
|
|
19571
|
-
function parseAppUrl(relativeUrl, locationObj
|
19586
|
+
function parseAppUrl(relativeUrl, locationObj) {
|
19572
19587
|
var prefixed = (relativeUrl.charAt(0) !== '/');
|
19573
19588
|
if (prefixed) {
|
19574
19589
|
relativeUrl = '/' + relativeUrl;
|
19575
19590
|
}
|
19576
|
-
var match = urlResolve(relativeUrl
|
19591
|
+
var match = urlResolve(relativeUrl);
|
19577
19592
|
locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ?
|
19578
19593
|
match.pathname.substring(1) : match.pathname);
|
19579
19594
|
locationObj.$$search = parseKeyValue(match.search);
|
@@ -19628,7 +19643,7 @@ function LocationHtml5Url(appBase, basePrefix) {
|
|
19628
19643
|
this.$$html5 = true;
|
19629
19644
|
basePrefix = basePrefix || '';
|
19630
19645
|
var appBaseNoFile = stripFile(appBase);
|
19631
|
-
parseAbsoluteUrl(appBase, this
|
19646
|
+
parseAbsoluteUrl(appBase, this);
|
19632
19647
|
|
19633
19648
|
|
19634
19649
|
/**
|
@@ -19643,7 +19658,7 @@ function LocationHtml5Url(appBase, basePrefix) {
|
|
19643
19658
|
appBaseNoFile);
|
19644
19659
|
}
|
19645
19660
|
|
19646
|
-
parseAppUrl(pathUrl, this
|
19661
|
+
parseAppUrl(pathUrl, this);
|
19647
19662
|
|
19648
19663
|
if (!this.$$path) {
|
19649
19664
|
this.$$path = '/';
|
@@ -19706,7 +19721,7 @@ function LocationHtml5Url(appBase, basePrefix) {
|
|
19706
19721
|
function LocationHashbangUrl(appBase, hashPrefix) {
|
19707
19722
|
var appBaseNoFile = stripFile(appBase);
|
19708
19723
|
|
19709
|
-
parseAbsoluteUrl(appBase, this
|
19724
|
+
parseAbsoluteUrl(appBase, this);
|
19710
19725
|
|
19711
19726
|
|
19712
19727
|
/**
|
@@ -19726,7 +19741,7 @@ function LocationHashbangUrl(appBase, hashPrefix) {
|
|
19726
19741
|
throw $locationMinErr('ihshprfx', 'Invalid url "{0}", missing hash prefix "{1}".', url,
|
19727
19742
|
hashPrefix);
|
19728
19743
|
}
|
19729
|
-
parseAppUrl(withoutHashUrl, this
|
19744
|
+
parseAppUrl(withoutHashUrl, this);
|
19730
19745
|
|
19731
19746
|
this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);
|
19732
19747
|
|
@@ -20366,11 +20381,19 @@ function $LocationProvider() {
|
|
20366
20381
|
$rootScope.$evalAsync(function() {
|
20367
20382
|
var oldUrl = $location.absUrl();
|
20368
20383
|
var oldState = $location.$$state;
|
20384
|
+
var defaultPrevented;
|
20369
20385
|
|
20370
20386
|
$location.$$parse(newUrl);
|
20371
20387
|
$location.$$state = newState;
|
20372
|
-
|
20373
|
-
|
20388
|
+
|
20389
|
+
defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
|
20390
|
+
newState, oldState).defaultPrevented;
|
20391
|
+
|
20392
|
+
// if the location was changed by a `$locationChangeStart` handler then stop
|
20393
|
+
// processing this location change
|
20394
|
+
if ($location.absUrl() !== newUrl) return;
|
20395
|
+
|
20396
|
+
if (defaultPrevented) {
|
20374
20397
|
$location.$$parse(oldUrl);
|
20375
20398
|
$location.$$state = oldState;
|
20376
20399
|
setBrowserUrlWithFallback(oldUrl, false, oldState);
|
@@ -20394,13 +20417,20 @@ function $LocationProvider() {
|
|
20394
20417
|
initializing = false;
|
20395
20418
|
|
20396
20419
|
$rootScope.$evalAsync(function() {
|
20397
|
-
|
20398
|
-
|
20420
|
+
var newUrl = $location.absUrl();
|
20421
|
+
var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
|
20422
|
+
$location.$$state, oldState).defaultPrevented;
|
20423
|
+
|
20424
|
+
// if the location was changed by a `$locationChangeStart` handler then stop
|
20425
|
+
// processing this location change
|
20426
|
+
if ($location.absUrl() !== newUrl) return;
|
20427
|
+
|
20428
|
+
if (defaultPrevented) {
|
20399
20429
|
$location.$$parse(oldUrl);
|
20400
20430
|
$location.$$state = oldState;
|
20401
20431
|
} else {
|
20402
20432
|
if (urlOrStateChanged) {
|
20403
|
-
setBrowserUrlWithFallback(
|
20433
|
+
setBrowserUrlWithFallback(newUrl, currentReplace,
|
20404
20434
|
oldState === $location.$$state ? null : $location.$$state);
|
20405
20435
|
}
|
20406
20436
|
afterLocationChange(oldUrl, oldState);
|
@@ -20590,7 +20620,7 @@ var $parseMinErr = minErr('$parse');
|
|
20590
20620
|
// Sandboxing Angular Expressions
|
20591
20621
|
// ------------------------------
|
20592
20622
|
// Angular expressions are generally considered safe because these expressions only have direct
|
20593
|
-
// access to
|
20623
|
+
// access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by
|
20594
20624
|
// obtaining a reference to native JS functions such as the Function constructor.
|
20595
20625
|
//
|
20596
20626
|
// As an example, consider the following Angular expression:
|
@@ -20599,7 +20629,7 @@ var $parseMinErr = minErr('$parse');
|
|
20599
20629
|
//
|
20600
20630
|
// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits
|
20601
20631
|
// against the expression language, but not to prevent exploits that were enabled by exposing
|
20602
|
-
// sensitive JavaScript or browser
|
20632
|
+
// sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good
|
20603
20633
|
// practice and therefore we are not even trying to protect against interaction with an object
|
20604
20634
|
// explicitly exposed in this way.
|
20605
20635
|
//
|
@@ -20607,6 +20637,8 @@ var $parseMinErr = minErr('$parse');
|
|
20607
20637
|
// window or some DOM object that has a reference to window is published onto a Scope.
|
20608
20638
|
// Similarly we prevent invocations of function known to be dangerous, as well as assignments to
|
20609
20639
|
// native objects.
|
20640
|
+
//
|
20641
|
+
// See https://docs.angularjs.org/guide/security
|
20610
20642
|
|
20611
20643
|
|
20612
20644
|
function ensureSafeMemberName(name, fullExpression) {
|
@@ -20615,7 +20647,7 @@ function ensureSafeMemberName(name, fullExpression) {
|
|
20615
20647
|
|| name === "__proto__") {
|
20616
20648
|
throw $parseMinErr('isecfld',
|
20617
20649
|
'Attempting to access a disallowed field in Angular expressions! '
|
20618
|
-
+'Expression: {0}', fullExpression);
|
20650
|
+
+ 'Expression: {0}', fullExpression);
|
20619
20651
|
}
|
20620
20652
|
return name;
|
20621
20653
|
}
|
@@ -20692,24 +20724,24 @@ var OPERATORS = extend(createMap(), {
|
|
20692
20724
|
}
|
20693
20725
|
return a;
|
20694
20726
|
}
|
20695
|
-
return isDefined(b)?b:undefined;},
|
20727
|
+
return isDefined(b) ? b : undefined;},
|
20696
20728
|
'-':function(self, locals, a, b) {
|
20697
20729
|
a=a(self, locals); b=b(self, locals);
|
20698
|
-
return (isDefined(a)?a:0)-(isDefined(b)?b:0);
|
20730
|
+
return (isDefined(a) ? a : 0) - (isDefined(b) ? b : 0);
|
20699
20731
|
},
|
20700
|
-
'*':function(self, locals, a, b) {return a(self, locals)*b(self, locals);},
|
20701
|
-
'/':function(self, locals, a, b) {return a(self, locals)/b(self, locals);},
|
20702
|
-
'%':function(self, locals, a, b) {return a(self, locals)%b(self, locals);},
|
20703
|
-
'===':function(self, locals, a, b) {return a(self, locals)===b(self, locals);},
|
20704
|
-
'!==':function(self, locals, a, b) {return a(self, locals)!==b(self, locals);},
|
20705
|
-
'==':function(self, locals, a, b) {return a(self, locals)==b(self, locals);},
|
20706
|
-
'!=':function(self, locals, a, b) {return a(self, locals)!=b(self, locals);},
|
20707
|
-
'<':function(self, locals, a, b) {return a(self, locals)<b(self, locals);},
|
20708
|
-
'>':function(self, locals, a, b) {return a(self, locals)>b(self, locals);},
|
20709
|
-
'<=':function(self, locals, a, b) {return a(self, locals)<=b(self, locals);},
|
20710
|
-
'>=':function(self, locals, a, b) {return a(self, locals)>=b(self, locals);},
|
20711
|
-
'&&':function(self, locals, a, b) {return a(self, locals)&&b(self, locals);},
|
20712
|
-
'||':function(self, locals, a, b) {return a(self, locals)||b(self, locals);},
|
20732
|
+
'*':function(self, locals, a, b) {return a(self, locals) * b(self, locals);},
|
20733
|
+
'/':function(self, locals, a, b) {return a(self, locals) / b(self, locals);},
|
20734
|
+
'%':function(self, locals, a, b) {return a(self, locals) % b(self, locals);},
|
20735
|
+
'===':function(self, locals, a, b) {return a(self, locals) === b(self, locals);},
|
20736
|
+
'!==':function(self, locals, a, b) {return a(self, locals) !== b(self, locals);},
|
20737
|
+
'==':function(self, locals, a, b) {return a(self, locals) == b(self, locals);},
|
20738
|
+
'!=':function(self, locals, a, b) {return a(self, locals) != b(self, locals);},
|
20739
|
+
'<':function(self, locals, a, b) {return a(self, locals) < b(self, locals);},
|
20740
|
+
'>':function(self, locals, a, b) {return a(self, locals) > b(self, locals);},
|
20741
|
+
'<=':function(self, locals, a, b) {return a(self, locals) <= b(self, locals);},
|
20742
|
+
'>=':function(self, locals, a, b) {return a(self, locals) >= b(self, locals);},
|
20743
|
+
'&&':function(self, locals, a, b) {return a(self, locals) && b(self, locals);},
|
20744
|
+
'||':function(self, locals, a, b) {return a(self, locals) || b(self, locals);},
|
20713
20745
|
'!':function(self, locals, a) {return !a(self, locals);},
|
20714
20746
|
|
20715
20747
|
//Tokenized as operators but parsed as assignment/filters
|
@@ -20735,44 +20767,31 @@ Lexer.prototype = {
|
|
20735
20767
|
lex: function(text) {
|
20736
20768
|
this.text = text;
|
20737
20769
|
this.index = 0;
|
20738
|
-
this.ch = undefined;
|
20739
20770
|
this.tokens = [];
|
20740
20771
|
|
20741
20772
|
while (this.index < this.text.length) {
|
20742
|
-
|
20743
|
-
if (
|
20744
|
-
this.readString(
|
20745
|
-
} else if (this.isNumber(
|
20773
|
+
var ch = this.text.charAt(this.index);
|
20774
|
+
if (ch === '"' || ch === "'") {
|
20775
|
+
this.readString(ch);
|
20776
|
+
} else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) {
|
20746
20777
|
this.readNumber();
|
20747
|
-
} else if (this.isIdent(
|
20778
|
+
} else if (this.isIdent(ch)) {
|
20748
20779
|
this.readIdent();
|
20749
|
-
} else if (this.is('(){}[].,;:?')) {
|
20750
|
-
this.tokens.push({
|
20751
|
-
index: this.index,
|
20752
|
-
text: this.ch
|
20753
|
-
});
|
20780
|
+
} else if (this.is(ch, '(){}[].,;:?')) {
|
20781
|
+
this.tokens.push({index: this.index, text: ch});
|
20754
20782
|
this.index++;
|
20755
|
-
} else if (this.isWhitespace(
|
20783
|
+
} else if (this.isWhitespace(ch)) {
|
20756
20784
|
this.index++;
|
20757
20785
|
} else {
|
20758
|
-
var ch2 =
|
20786
|
+
var ch2 = ch + this.peek();
|
20759
20787
|
var ch3 = ch2 + this.peek(2);
|
20760
|
-
var
|
20761
|
-
var
|
20762
|
-
var
|
20763
|
-
if (
|
20764
|
-
|
20765
|
-
this.index
|
20766
|
-
|
20767
|
-
this.tokens.push({index: this.index, text: ch2, fn: fn2});
|
20768
|
-
this.index += 2;
|
20769
|
-
} else if (fn) {
|
20770
|
-
this.tokens.push({
|
20771
|
-
index: this.index,
|
20772
|
-
text: this.ch,
|
20773
|
-
fn: fn
|
20774
|
-
});
|
20775
|
-
this.index += 1;
|
20788
|
+
var op1 = OPERATORS[ch];
|
20789
|
+
var op2 = OPERATORS[ch2];
|
20790
|
+
var op3 = OPERATORS[ch3];
|
20791
|
+
if (op1 || op2 || op3) {
|
20792
|
+
var token = op3 ? ch3 : (op2 ? ch2 : ch);
|
20793
|
+
this.tokens.push({index: this.index, text: token, operator: true});
|
20794
|
+
this.index += token.length;
|
20776
20795
|
} else {
|
20777
20796
|
this.throwError('Unexpected next character ', this.index, this.index + 1);
|
20778
20797
|
}
|
@@ -20781,8 +20800,8 @@ Lexer.prototype = {
|
|
20781
20800
|
return this.tokens;
|
20782
20801
|
},
|
20783
20802
|
|
20784
|
-
is: function(chars) {
|
20785
|
-
return chars.indexOf(
|
20803
|
+
is: function(ch, chars) {
|
20804
|
+
return chars.indexOf(ch) !== -1;
|
20786
20805
|
},
|
20787
20806
|
|
20788
20807
|
peek: function(i) {
|
@@ -20791,7 +20810,7 @@ Lexer.prototype = {
|
|
20791
20810
|
},
|
20792
20811
|
|
20793
20812
|
isNumber: function(ch) {
|
20794
|
-
return ('0' <= ch && ch <= '9');
|
20813
|
+
return ('0' <= ch && ch <= '9') && typeof ch === "string";
|
20795
20814
|
},
|
20796
20815
|
|
20797
20816
|
isWhitespace: function(ch) {
|
@@ -20844,79 +20863,28 @@ Lexer.prototype = {
|
|
20844
20863
|
}
|
20845
20864
|
this.index++;
|
20846
20865
|
}
|
20847
|
-
number = 1 * number;
|
20848
20866
|
this.tokens.push({
|
20849
20867
|
index: start,
|
20850
20868
|
text: number,
|
20851
20869
|
constant: true,
|
20852
|
-
|
20870
|
+
value: Number(number)
|
20853
20871
|
});
|
20854
20872
|
},
|
20855
20873
|
|
20856
20874
|
readIdent: function() {
|
20857
|
-
var expression = this.text;
|
20858
|
-
|
20859
|
-
var ident = '';
|
20860
20875
|
var start = this.index;
|
20861
|
-
|
20862
|
-
var lastDot, peekIndex, methodName, ch;
|
20863
|
-
|
20864
20876
|
while (this.index < this.text.length) {
|
20865
|
-
ch = this.text.charAt(this.index);
|
20866
|
-
if (
|
20867
|
-
if (ch === '.') lastDot = this.index;
|
20868
|
-
ident += ch;
|
20869
|
-
} else {
|
20877
|
+
var ch = this.text.charAt(this.index);
|
20878
|
+
if (!(this.isIdent(ch) || this.isNumber(ch))) {
|
20870
20879
|
break;
|
20871
20880
|
}
|
20872
20881
|
this.index++;
|
20873
20882
|
}
|
20874
|
-
|
20875
|
-
//check if the identifier ends with . and if so move back one char
|
20876
|
-
if (lastDot && ident[ident.length - 1] === '.') {
|
20877
|
-
this.index--;
|
20878
|
-
ident = ident.slice(0, -1);
|
20879
|
-
lastDot = ident.lastIndexOf('.');
|
20880
|
-
if (lastDot === -1) {
|
20881
|
-
lastDot = undefined;
|
20882
|
-
}
|
20883
|
-
}
|
20884
|
-
|
20885
|
-
//check if this is not a method invocation and if it is back out to last dot
|
20886
|
-
if (lastDot) {
|
20887
|
-
peekIndex = this.index;
|
20888
|
-
while (peekIndex < this.text.length) {
|
20889
|
-
ch = this.text.charAt(peekIndex);
|
20890
|
-
if (ch === '(') {
|
20891
|
-
methodName = ident.substr(lastDot - start + 1);
|
20892
|
-
ident = ident.substr(0, lastDot - start);
|
20893
|
-
this.index = peekIndex;
|
20894
|
-
break;
|
20895
|
-
}
|
20896
|
-
if (this.isWhitespace(ch)) {
|
20897
|
-
peekIndex++;
|
20898
|
-
} else {
|
20899
|
-
break;
|
20900
|
-
}
|
20901
|
-
}
|
20902
|
-
}
|
20903
|
-
|
20904
20883
|
this.tokens.push({
|
20905
20884
|
index: start,
|
20906
|
-
text:
|
20907
|
-
|
20885
|
+
text: this.text.slice(start, this.index),
|
20886
|
+
identifier: true
|
20908
20887
|
});
|
20909
|
-
|
20910
|
-
if (methodName) {
|
20911
|
-
this.tokens.push({
|
20912
|
-
index: lastDot,
|
20913
|
-
text: '.'
|
20914
|
-
});
|
20915
|
-
this.tokens.push({
|
20916
|
-
index: lastDot + 1,
|
20917
|
-
text: methodName
|
20918
|
-
});
|
20919
|
-
}
|
20920
20888
|
},
|
20921
20889
|
|
20922
20890
|
readString: function(quote) {
|
@@ -20947,9 +20915,8 @@ Lexer.prototype = {
|
|
20947
20915
|
this.tokens.push({
|
20948
20916
|
index: start,
|
20949
20917
|
text: rawString,
|
20950
|
-
string: string,
|
20951
20918
|
constant: true,
|
20952
|
-
|
20919
|
+
value: string
|
20953
20920
|
});
|
20954
20921
|
return;
|
20955
20922
|
} else {
|
@@ -21010,16 +20977,12 @@ Parser.prototype = {
|
|
21010
20977
|
primary = this.arrayDeclaration();
|
21011
20978
|
} else if (this.expect('{')) {
|
21012
20979
|
primary = this.object();
|
20980
|
+
} else if (this.peek().identifier) {
|
20981
|
+
primary = this.identifier();
|
20982
|
+
} else if (this.peek().constant) {
|
20983
|
+
primary = this.constant();
|
21013
20984
|
} else {
|
21014
|
-
|
21015
|
-
primary = token.fn;
|
21016
|
-
if (!primary) {
|
21017
|
-
this.throwError('not a primary expression', token);
|
21018
|
-
}
|
21019
|
-
if (token.constant) {
|
21020
|
-
primary.constant = true;
|
21021
|
-
primary.literal = true;
|
21022
|
-
}
|
20985
|
+
this.throwError('not a primary expression', this.peek());
|
21023
20986
|
}
|
21024
20987
|
|
21025
20988
|
var next, context;
|
@@ -21053,8 +21016,11 @@ Parser.prototype = {
|
|
21053
21016
|
},
|
21054
21017
|
|
21055
21018
|
peek: function(e1, e2, e3, e4) {
|
21056
|
-
|
21057
|
-
|
21019
|
+
return this.peekAhead(0, e1, e2, e3, e4);
|
21020
|
+
},
|
21021
|
+
peekAhead: function(i, e1, e2, e3, e4) {
|
21022
|
+
if (this.tokens.length > i) {
|
21023
|
+
var token = this.tokens[i];
|
21058
21024
|
var t = token.text;
|
21059
21025
|
if (t === e1 || t === e2 || t === e3 || t === e4 ||
|
21060
21026
|
(!e1 && !e2 && !e3 && !e4)) {
|
@@ -21074,12 +21040,19 @@ Parser.prototype = {
|
|
21074
21040
|
},
|
21075
21041
|
|
21076
21042
|
consume: function(e1) {
|
21077
|
-
if (
|
21043
|
+
if (this.tokens.length === 0) {
|
21044
|
+
throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);
|
21045
|
+
}
|
21046
|
+
|
21047
|
+
var token = this.expect(e1);
|
21048
|
+
if (!token) {
|
21078
21049
|
this.throwError('is unexpected, expecting [' + e1 + ']', this.peek());
|
21079
21050
|
}
|
21051
|
+
return token;
|
21080
21052
|
},
|
21081
21053
|
|
21082
|
-
unaryFn: function(
|
21054
|
+
unaryFn: function(op, right) {
|
21055
|
+
var fn = OPERATORS[op];
|
21083
21056
|
return extend(function $parseUnaryFn(self, locals) {
|
21084
21057
|
return fn(self, locals, right);
|
21085
21058
|
}, {
|
@@ -21088,7 +21061,8 @@ Parser.prototype = {
|
|
21088
21061
|
});
|
21089
21062
|
},
|
21090
21063
|
|
21091
|
-
binaryFn: function(left,
|
21064
|
+
binaryFn: function(left, op, right, isBranching) {
|
21065
|
+
var fn = OPERATORS[op];
|
21092
21066
|
return extend(function $parseBinaryFn(self, locals) {
|
21093
21067
|
return fn(self, locals, left, right);
|
21094
21068
|
}, {
|
@@ -21097,6 +21071,28 @@ Parser.prototype = {
|
|
21097
21071
|
});
|
21098
21072
|
},
|
21099
21073
|
|
21074
|
+
identifier: function() {
|
21075
|
+
var id = this.consume().text;
|
21076
|
+
|
21077
|
+
//Continue reading each `.identifier` unless it is a method invocation
|
21078
|
+
while (this.peek('.') && this.peekAhead(1).identifier && !this.peekAhead(2, '(')) {
|
21079
|
+
id += this.consume().text + this.consume().text;
|
21080
|
+
}
|
21081
|
+
|
21082
|
+
return CONSTANTS[id] || getterFn(id, this.options, this.text);
|
21083
|
+
},
|
21084
|
+
|
21085
|
+
constant: function() {
|
21086
|
+
var value = this.consume().value;
|
21087
|
+
|
21088
|
+
return extend(function $parseConstant() {
|
21089
|
+
return value;
|
21090
|
+
}, {
|
21091
|
+
constant: true,
|
21092
|
+
literal: true
|
21093
|
+
});
|
21094
|
+
},
|
21095
|
+
|
21100
21096
|
statements: function() {
|
21101
21097
|
var statements = [];
|
21102
21098
|
while (true) {
|
@@ -21128,8 +21124,7 @@ Parser.prototype = {
|
|
21128
21124
|
},
|
21129
21125
|
|
21130
21126
|
filter: function(inputFn) {
|
21131
|
-
var
|
21132
|
-
var fn = this.$filter(token.text);
|
21127
|
+
var fn = this.$filter(this.consume().text);
|
21133
21128
|
var argsFn;
|
21134
21129
|
var args;
|
21135
21130
|
|
@@ -21192,7 +21187,7 @@ Parser.prototype = {
|
|
21192
21187
|
var token;
|
21193
21188
|
if ((token = this.expect('?'))) {
|
21194
21189
|
middle = this.assignment();
|
21195
|
-
if (
|
21190
|
+
if (this.consume(':')) {
|
21196
21191
|
var right = this.assignment();
|
21197
21192
|
|
21198
21193
|
return extend(function $parseTernary(self, locals) {
|
@@ -21200,9 +21195,6 @@ Parser.prototype = {
|
|
21200
21195
|
}, {
|
21201
21196
|
constant: left.constant && middle.constant && right.constant
|
21202
21197
|
});
|
21203
|
-
|
21204
|
-
} else {
|
21205
|
-
this.throwError('expected :', token);
|
21206
21198
|
}
|
21207
21199
|
}
|
21208
21200
|
|
@@ -21213,7 +21205,7 @@ Parser.prototype = {
|
|
21213
21205
|
var left = this.logicalAND();
|
21214
21206
|
var token;
|
21215
21207
|
while ((token = this.expect('||'))) {
|
21216
|
-
left = this.binaryFn(left, token.
|
21208
|
+
left = this.binaryFn(left, token.text, this.logicalAND(), true);
|
21217
21209
|
}
|
21218
21210
|
return left;
|
21219
21211
|
},
|
@@ -21222,7 +21214,7 @@ Parser.prototype = {
|
|
21222
21214
|
var left = this.equality();
|
21223
21215
|
var token;
|
21224
21216
|
if ((token = this.expect('&&'))) {
|
21225
|
-
left = this.binaryFn(left, token.
|
21217
|
+
left = this.binaryFn(left, token.text, this.logicalAND(), true);
|
21226
21218
|
}
|
21227
21219
|
return left;
|
21228
21220
|
},
|
@@ -21231,7 +21223,7 @@ Parser.prototype = {
|
|
21231
21223
|
var left = this.relational();
|
21232
21224
|
var token;
|
21233
21225
|
if ((token = this.expect('==','!=','===','!=='))) {
|
21234
|
-
left = this.binaryFn(left, token.
|
21226
|
+
left = this.binaryFn(left, token.text, this.equality());
|
21235
21227
|
}
|
21236
21228
|
return left;
|
21237
21229
|
},
|
@@ -21240,7 +21232,7 @@ Parser.prototype = {
|
|
21240
21232
|
var left = this.additive();
|
21241
21233
|
var token;
|
21242
21234
|
if ((token = this.expect('<', '>', '<=', '>='))) {
|
21243
|
-
left = this.binaryFn(left, token.
|
21235
|
+
left = this.binaryFn(left, token.text, this.relational());
|
21244
21236
|
}
|
21245
21237
|
return left;
|
21246
21238
|
},
|
@@ -21249,7 +21241,7 @@ Parser.prototype = {
|
|
21249
21241
|
var left = this.multiplicative();
|
21250
21242
|
var token;
|
21251
21243
|
while ((token = this.expect('+','-'))) {
|
21252
|
-
left = this.binaryFn(left, token.
|
21244
|
+
left = this.binaryFn(left, token.text, this.multiplicative());
|
21253
21245
|
}
|
21254
21246
|
return left;
|
21255
21247
|
},
|
@@ -21258,7 +21250,7 @@ Parser.prototype = {
|
|
21258
21250
|
var left = this.unary();
|
21259
21251
|
var token;
|
21260
21252
|
while ((token = this.expect('*','/','%'))) {
|
21261
|
-
left = this.binaryFn(left, token.
|
21253
|
+
left = this.binaryFn(left, token.text, this.unary());
|
21262
21254
|
}
|
21263
21255
|
return left;
|
21264
21256
|
},
|
@@ -21268,9 +21260,9 @@ Parser.prototype = {
|
|
21268
21260
|
if (this.expect('+')) {
|
21269
21261
|
return this.primary();
|
21270
21262
|
} else if ((token = this.expect('-'))) {
|
21271
|
-
return this.binaryFn(Parser.ZERO, token.
|
21263
|
+
return this.binaryFn(Parser.ZERO, token.text, this.unary());
|
21272
21264
|
} else if ((token = this.expect('!'))) {
|
21273
|
-
return this.unaryFn(token.
|
21265
|
+
return this.unaryFn(token.text, this.unary());
|
21274
21266
|
} else {
|
21275
21267
|
return this.primary();
|
21276
21268
|
}
|
@@ -21278,7 +21270,7 @@ Parser.prototype = {
|
|
21278
21270
|
|
21279
21271
|
fieldAccess: function(object) {
|
21280
21272
|
var expression = this.text;
|
21281
|
-
var field = this.
|
21273
|
+
var field = this.consume().text;
|
21282
21274
|
var getter = getterFn(field, this.options, expression);
|
21283
21275
|
|
21284
21276
|
return extend(function $parseFieldAccess(scope, locals, self) {
|
@@ -21363,8 +21355,7 @@ Parser.prototype = {
|
|
21363
21355
|
// Support trailing commas per ES5.1.
|
21364
21356
|
break;
|
21365
21357
|
}
|
21366
|
-
|
21367
|
-
elementFns.push(elementFn);
|
21358
|
+
elementFns.push(this.expression());
|
21368
21359
|
} while (this.expect(','));
|
21369
21360
|
}
|
21370
21361
|
this.consume(']');
|
@@ -21390,11 +21381,16 @@ Parser.prototype = {
|
|
21390
21381
|
// Support trailing commas per ES5.1.
|
21391
21382
|
break;
|
21392
21383
|
}
|
21393
|
-
var token = this.
|
21394
|
-
|
21384
|
+
var token = this.consume();
|
21385
|
+
if (token.constant) {
|
21386
|
+
keys.push(token.value);
|
21387
|
+
} else if (token.identifier) {
|
21388
|
+
keys.push(token.text);
|
21389
|
+
} else {
|
21390
|
+
this.throwError("invalid key", token);
|
21391
|
+
}
|
21395
21392
|
this.consume(':');
|
21396
|
-
|
21397
|
-
valueFns.push(value);
|
21393
|
+
valueFns.push(this.expression());
|
21398
21394
|
} while (this.expect(','));
|
21399
21395
|
}
|
21400
21396
|
this.consume('}');
|
@@ -21836,13 +21832,21 @@ function $ParseProvider() {
|
|
21836
21832
|
|
21837
21833
|
function addInterceptor(parsedExpression, interceptorFn) {
|
21838
21834
|
if (!interceptorFn) return parsedExpression;
|
21835
|
+
var watchDelegate = parsedExpression.$$watchDelegate;
|
21839
21836
|
|
21840
|
-
var
|
21837
|
+
var regularWatch =
|
21838
|
+
watchDelegate !== oneTimeLiteralWatchDelegate &&
|
21839
|
+
watchDelegate !== oneTimeWatchDelegate;
|
21840
|
+
|
21841
|
+
var fn = regularWatch ? function regularInterceptedExpression(scope, locals) {
|
21842
|
+
var value = parsedExpression(scope, locals);
|
21843
|
+
return interceptorFn(value, scope, locals);
|
21844
|
+
} : function oneTimeInterceptedExpression(scope, locals) {
|
21841
21845
|
var value = parsedExpression(scope, locals);
|
21842
21846
|
var result = interceptorFn(value, scope, locals);
|
21843
21847
|
// we only return the interceptor's result if the
|
21844
21848
|
// initial value is defined (for bind-once)
|
21845
|
-
return isDefined(value)
|
21849
|
+
return isDefined(value) ? result : value;
|
21846
21850
|
};
|
21847
21851
|
|
21848
21852
|
// Propagate $$watchDelegates other then inputsWatchDelegate
|
@@ -21867,7 +21871,11 @@ function $ParseProvider() {
|
|
21867
21871
|
* @requires $rootScope
|
21868
21872
|
*
|
21869
21873
|
* @description
|
21870
|
-
* A
|
21874
|
+
* A service that helps you run functions asynchronously, and use their return values (or exceptions)
|
21875
|
+
* when they are done processing.
|
21876
|
+
*
|
21877
|
+
* This is an implementation of promises/deferred objects inspired by
|
21878
|
+
* [Kris Kowal's Q](https://github.com/kriskowal/q).
|
21871
21879
|
*
|
21872
21880
|
* $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred
|
21873
21881
|
* implementations, and the other which resembles ES6 promises to some degree.
|
@@ -22003,16 +22011,12 @@ function $ParseProvider() {
|
|
22003
22011
|
*
|
22004
22012
|
* - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)`
|
22005
22013
|
*
|
22006
|
-
* - `finally(callback)` – allows you to observe either the fulfillment or rejection of a promise,
|
22014
|
+
* - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise,
|
22007
22015
|
* but to do so without modifying the final value. This is useful to release resources or do some
|
22008
22016
|
* clean-up that needs to be done whether the promise was rejected or resolved. See the [full
|
22009
22017
|
* specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for
|
22010
22018
|
* more information.
|
22011
22019
|
*
|
22012
|
-
* Because `finally` is a reserved word in JavaScript and reserved keywords are not supported as
|
22013
|
-
* property names by ES3, you'll need to invoke the method like `promise['finally'](callback)` to
|
22014
|
-
* make your code IE8 and Android 2.x compatible.
|
22015
|
-
*
|
22016
22020
|
* # Chaining promises
|
22017
22021
|
*
|
22018
22022
|
* Because calling the `then` method of a promise returns a new derived promise, it is easily
|
@@ -23235,11 +23239,11 @@ function $RootScopeProvider() {
|
|
23235
23239
|
if (ttl < 5) {
|
23236
23240
|
logIdx = 4 - ttl;
|
23237
23241
|
if (!watchLog[logIdx]) watchLog[logIdx] = [];
|
23238
|
-
|
23239
|
-
|
23240
|
-
|
23241
|
-
|
23242
|
-
|
23242
|
+
watchLog[logIdx].push({
|
23243
|
+
msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp,
|
23244
|
+
newVal: value,
|
23245
|
+
oldVal: last
|
23246
|
+
});
|
23243
23247
|
}
|
23244
23248
|
} else if (watch === lastDirtyWatch) {
|
23245
23249
|
// If the most recently dirty watcher is now clean, short circuit since the remaining watchers
|
@@ -23272,7 +23276,7 @@ function $RootScopeProvider() {
|
|
23272
23276
|
throw $rootScopeMinErr('infdig',
|
23273
23277
|
'{0} $digest() iterations reached. Aborting!\n' +
|
23274
23278
|
'Watchers fired in the last 5 iterations: {1}',
|
23275
|
-
TTL,
|
23279
|
+
TTL, watchLog);
|
23276
23280
|
}
|
23277
23281
|
|
23278
23282
|
} while (dirty || asyncQueue.length);
|
@@ -23623,7 +23627,7 @@ function $RootScopeProvider() {
|
|
23623
23627
|
do {
|
23624
23628
|
namedListeners = scope.$$listeners[name] || empty;
|
23625
23629
|
event.currentScope = scope;
|
23626
|
-
for (i=0, length=namedListeners.length; i<length; i++) {
|
23630
|
+
for (i = 0, length = namedListeners.length; i < length; i++) {
|
23627
23631
|
|
23628
23632
|
// if listeners were deregistered, defragment the array
|
23629
23633
|
if (!namedListeners[i]) {
|
@@ -23697,7 +23701,7 @@ function $RootScopeProvider() {
|
|
23697
23701
|
while ((current = next)) {
|
23698
23702
|
event.currentScope = current;
|
23699
23703
|
listeners = current.$$listeners[name] || [];
|
23700
|
-
for (i=0, length = listeners.length; i<length; i++) {
|
23704
|
+
for (i = 0, length = listeners.length; i < length; i++) {
|
23701
23705
|
// if listeners were deregistered, defragment the array
|
23702
23706
|
if (!listeners[i]) {
|
23703
23707
|
listeners.splice(i, 1);
|
@@ -23853,7 +23857,7 @@ function $$SanitizeUriProvider() {
|
|
23853
23857
|
var normalizedVal;
|
23854
23858
|
normalizedVal = urlResolve(uri).href;
|
23855
23859
|
if (normalizedVal !== '' && !normalizedVal.match(regex)) {
|
23856
|
-
return 'unsafe:'+normalizedVal;
|
23860
|
+
return 'unsafe:' + normalizedVal;
|
23857
23861
|
}
|
23858
23862
|
return uri;
|
23859
23863
|
};
|
@@ -24952,7 +24956,7 @@ function $SnifferProvider() {
|
|
24952
24956
|
transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle));
|
24953
24957
|
animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle));
|
24954
24958
|
|
24955
|
-
if (android && (!transitions
|
24959
|
+
if (android && (!transitions || !animations)) {
|
24956
24960
|
transitions = isString(document.body.style.webkitTransition);
|
24957
24961
|
animations = isString(document.body.style.webkitAnimation);
|
24958
24962
|
}
|
@@ -25023,7 +25027,7 @@ function $TemplateRequestProvider() {
|
|
25023
25027
|
if (isArray(transformResponse)) {
|
25024
25028
|
var original = transformResponse;
|
25025
25029
|
transformResponse = [];
|
25026
|
-
for (var i=0; i<original.length; ++i) {
|
25030
|
+
for (var i = 0; i < original.length; ++i) {
|
25027
25031
|
var transformer = original[i];
|
25028
25032
|
if (transformer !== defaultHttpResponseTransform) {
|
25029
25033
|
transformResponse.push(transformer);
|
@@ -25267,7 +25271,7 @@ function $TimeoutProvider() {
|
|
25267
25271
|
// exactly the behavior needed here. There is little value is mocking these out for this
|
25268
25272
|
// service.
|
25269
25273
|
var urlParsingNode = document.createElement("a");
|
25270
|
-
var originUrl = urlResolve(window.location.href
|
25274
|
+
var originUrl = urlResolve(window.location.href);
|
25271
25275
|
|
25272
25276
|
|
25273
25277
|
/**
|
@@ -25322,7 +25326,7 @@ var originUrl = urlResolve(window.location.href, true);
|
|
25322
25326
|
* | pathname | The pathname, beginning with "/"
|
25323
25327
|
*
|
25324
25328
|
*/
|
25325
|
-
function urlResolve(url
|
25329
|
+
function urlResolve(url) {
|
25326
25330
|
var href = url;
|
25327
25331
|
|
25328
25332
|
if (msie) {
|
@@ -25702,8 +25706,8 @@ function filterFilter() {
|
|
25702
25706
|
}
|
25703
25707
|
return false;
|
25704
25708
|
}
|
25705
|
-
text = (''+text).toLowerCase();
|
25706
|
-
return (''+obj).toLowerCase().indexOf(text) > -1;
|
25709
|
+
text = ('' + text).toLowerCase();
|
25710
|
+
return ('' + obj).toLowerCase().indexOf(text) > -1;
|
25707
25711
|
};
|
25708
25712
|
}
|
25709
25713
|
}
|
@@ -25963,7 +25967,7 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
25963
25967
|
if (whole.length >= (lgroup + group)) {
|
25964
25968
|
pos = whole.length - lgroup;
|
25965
25969
|
for (i = 0; i < pos; i++) {
|
25966
|
-
if ((pos - i)%group === 0 && i !== 0) {
|
25970
|
+
if ((pos - i) % group === 0 && i !== 0) {
|
25967
25971
|
formatedText += groupSep;
|
25968
25972
|
}
|
25969
25973
|
formatedText += whole.charAt(i);
|
@@ -25971,7 +25975,7 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
25971
25975
|
}
|
25972
25976
|
|
25973
25977
|
for (i = pos; i < whole.length; i++) {
|
25974
|
-
if ((whole.length - i)%lgroup === 0 && i !== 0) {
|
25978
|
+
if ((whole.length - i) % lgroup === 0 && i !== 0) {
|
25975
25979
|
formatedText += groupSep;
|
25976
25980
|
}
|
25977
25981
|
formatedText += whole.charAt(i);
|
@@ -26211,10 +26215,10 @@ function dateFilter($locale) {
|
|
26211
26215
|
tzMin = int(match[9] + match[11]);
|
26212
26216
|
}
|
26213
26217
|
dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3]));
|
26214
|
-
var h = int(match[4]||0) - tzHour;
|
26215
|
-
var m = int(match[5]||0) - tzMin;
|
26216
|
-
var s = int(match[6]||0);
|
26217
|
-
var ms = Math.round(parseFloat('0.' + (match[7]||0)) * 1000);
|
26218
|
+
var h = int(match[4] || 0) - tzHour;
|
26219
|
+
var m = int(match[5] || 0) - tzMin;
|
26220
|
+
var s = int(match[6] || 0);
|
26221
|
+
var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);
|
26218
26222
|
timeSetter.call(date, h, m, s, ms);
|
26219
26223
|
return date;
|
26220
26224
|
}
|
@@ -26446,7 +26450,7 @@ function limitToFilter() {
|
|
26446
26450
|
n = input.length;
|
26447
26451
|
}
|
26448
26452
|
|
26449
|
-
for (; i<n; i++) {
|
26453
|
+
for (; i < n; i++) {
|
26450
26454
|
out.push(input[i]);
|
26451
26455
|
}
|
26452
26456
|
|
@@ -26573,7 +26577,7 @@ orderByFilter.$inject = ['$parse'];
|
|
26573
26577
|
function orderByFilter($parse) {
|
26574
26578
|
return function(array, sortPredicate, reverseOrder) {
|
26575
26579
|
if (!(isArrayLike(array))) return array;
|
26576
|
-
sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate];
|
26580
|
+
sortPredicate = isArray(sortPredicate) ? sortPredicate : [sortPredicate];
|
26577
26581
|
if (sortPredicate.length === 0) { sortPredicate = ['+']; }
|
26578
26582
|
sortPredicate = sortPredicate.map(function(predicate) {
|
26579
26583
|
var descending = false, get = predicate || identity;
|
@@ -26600,9 +26604,7 @@ function orderByFilter($parse) {
|
|
26600
26604
|
return compare(get(a),get(b));
|
26601
26605
|
}, descending);
|
26602
26606
|
});
|
26603
|
-
|
26604
|
-
for (var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); }
|
26605
|
-
return arrayCopy.sort(reverseComparator(comparator, reverseOrder));
|
26607
|
+
return slice.call(array).sort(reverseComparator(comparator, reverseOrder));
|
26606
26608
|
|
26607
26609
|
function comparator(o1, o2) {
|
26608
26610
|
for (var i = 0; i < sortPredicate.length; i++) {
|
@@ -27664,9 +27666,14 @@ var inputType = {
|
|
27664
27666
|
* minlength.
|
27665
27667
|
* @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
|
27666
27668
|
* maxlength.
|
27667
|
-
* @param {string=}
|
27668
|
-
*
|
27669
|
-
*
|
27669
|
+
* @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
|
27670
|
+
* that contains the regular expression body that will be converted to a regular expression
|
27671
|
+
* as in the ngPattern directive.
|
27672
|
+
* @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
|
27673
|
+
* a RegExp found by evaluating the Angular expression given in the attribute value.
|
27674
|
+
* If the expression evaluates to a RegExp object then this is used directly.
|
27675
|
+
* If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
|
27676
|
+
* characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
|
27670
27677
|
* @param {string=} ngChange Angular expression to be executed when input changes due to user
|
27671
27678
|
* interaction with the input element.
|
27672
27679
|
* @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
|
@@ -28207,9 +28214,14 @@ var inputType = {
|
|
28207
28214
|
* minlength.
|
28208
28215
|
* @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
|
28209
28216
|
* maxlength.
|
28210
|
-
* @param {string=}
|
28211
|
-
*
|
28212
|
-
*
|
28217
|
+
* @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
|
28218
|
+
* that contains the regular expression body that will be converted to a regular expression
|
28219
|
+
* as in the ngPattern directive.
|
28220
|
+
* @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
|
28221
|
+
* a RegExp found by evaluating the Angular expression given in the attribute value.
|
28222
|
+
* If the expression evaluates to a RegExp object then this is used directly.
|
28223
|
+
* If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
|
28224
|
+
* characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
|
28213
28225
|
* @param {string=} ngChange Angular expression to be executed when input changes due to user
|
28214
28226
|
* interaction with the input element.
|
28215
28227
|
*
|
@@ -28289,9 +28301,14 @@ var inputType = {
|
|
28289
28301
|
* minlength.
|
28290
28302
|
* @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
|
28291
28303
|
* maxlength.
|
28292
|
-
* @param {string=}
|
28293
|
-
*
|
28294
|
-
*
|
28304
|
+
* @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
|
28305
|
+
* that contains the regular expression body that will be converted to a regular expression
|
28306
|
+
* as in the ngPattern directive.
|
28307
|
+
* @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
|
28308
|
+
* a RegExp found by evaluating the Angular expression given in the attribute value.
|
28309
|
+
* If the expression evaluates to a RegExp object then this is used directly.
|
28310
|
+
* If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
|
28311
|
+
* characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
|
28295
28312
|
* @param {string=} ngChange Angular expression to be executed when input changes due to user
|
28296
28313
|
* interaction with the input element.
|
28297
28314
|
*
|
@@ -28372,9 +28389,14 @@ var inputType = {
|
|
28372
28389
|
* minlength.
|
28373
28390
|
* @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
|
28374
28391
|
* maxlength.
|
28375
|
-
* @param {string=}
|
28376
|
-
*
|
28377
|
-
*
|
28392
|
+
* @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
|
28393
|
+
* that contains the regular expression body that will be converted to a regular expression
|
28394
|
+
* as in the ngPattern directive.
|
28395
|
+
* @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
|
28396
|
+
* a RegExp found by evaluating the Angular expression given in the attribute value.
|
28397
|
+
* If the expression evaluates to a RegExp object then this is used directly.
|
28398
|
+
* If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
|
28399
|
+
* characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
|
28378
28400
|
* @param {string=} ngChange Angular expression to be executed when input changes due to user
|
28379
28401
|
* interaction with the input element.
|
28380
28402
|
*
|
@@ -28685,8 +28707,8 @@ function createDateParser(regexp, mapping) {
|
|
28685
28707
|
// When a date is JSON'ified to wraps itself inside of an extra
|
28686
28708
|
// set of double quotes. This makes the date parsing code unable
|
28687
28709
|
// to match the date string and parse it as a date.
|
28688
|
-
if (iso.charAt(0) == '"' && iso.charAt(iso.length-1) == '"') {
|
28689
|
-
iso = iso.substring(1, iso.length-1);
|
28710
|
+
if (iso.charAt(0) == '"' && iso.charAt(iso.length - 1) == '"') {
|
28711
|
+
iso = iso.substring(1, iso.length - 1);
|
28690
28712
|
}
|
28691
28713
|
if (ISO_DATE_REGEXP.test(iso)) {
|
28692
28714
|
return new Date(iso);
|
@@ -29133,12 +29155,17 @@ var VALID_CLASS = 'ng-valid',
|
|
29133
29155
|
* @property {string} $viewValue Actual string value in the view.
|
29134
29156
|
* @property {*} $modelValue The value in the model that the control is bound to.
|
29135
29157
|
* @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever
|
29136
|
-
the control reads value from the DOM. The functions are called in array order, each passing
|
29137
|
-
through to the next. The last return value is forwarded to the
|
29138
|
-
|
29139
|
-
|
29140
|
-
|
29141
|
-
|
29158
|
+
the control reads value from the DOM. The functions are called in array order, each passing
|
29159
|
+
its return value through to the next. The last return value is forwarded to the
|
29160
|
+
{@link ngModel.NgModelController#$validators `$validators`} collection.
|
29161
|
+
|
29162
|
+
Parsers are used to sanitize / convert the {@link ngModel.NgModelController#$viewValue
|
29163
|
+
`$viewValue`}.
|
29164
|
+
|
29165
|
+
Returning `undefined` from a parser means a parse error occurred. In that case,
|
29166
|
+
no {@link ngModel.NgModelController#$validators `$validators`} will run and the `ngModel`
|
29167
|
+
will be set to `undefined` unless {@link ngModelOptions `ngModelOptions.allowInvalid`}
|
29168
|
+
is set to `true`. The parse error is stored in `ngModel.$error.parse`.
|
29142
29169
|
|
29143
29170
|
*
|
29144
29171
|
* @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever
|
@@ -29263,7 +29290,7 @@ var VALID_CLASS = 'ng-valid',
|
|
29263
29290
|
|
29264
29291
|
// Listen for change events to enable binding
|
29265
29292
|
element.on('blur keyup change', function() {
|
29266
|
-
scope.$
|
29293
|
+
scope.$evalAsync(read);
|
29267
29294
|
});
|
29268
29295
|
read(); // initialize
|
29269
29296
|
|
@@ -30199,7 +30226,7 @@ var patternDirective = function() {
|
|
30199
30226
|
var regexp, patternExp = attr.ngPattern || attr.pattern;
|
30200
30227
|
attr.$observe('pattern', function(regex) {
|
30201
30228
|
if (isString(regex) && regex.length > 0) {
|
30202
|
-
regex = new RegExp(regex);
|
30229
|
+
regex = new RegExp('^' + regex + '$');
|
30203
30230
|
}
|
30204
30231
|
|
30205
30232
|
if (regex && !regex.test) {
|
@@ -30490,7 +30517,7 @@ var ngValueDirective = function() {
|
|
30490
30517
|
* `ngModelOptions` has an effect on the element it's declared on and its descendants.
|
30491
30518
|
*
|
30492
30519
|
* @param {Object} ngModelOptions options to apply to the current model. Valid keys are:
|
30493
|
-
* - `updateOn`: string specifying which event should
|
30520
|
+
* - `updateOn`: string specifying which event should the input be bound to. You can set several
|
30494
30521
|
* events using an space delimited list. There is a special event called `default` that
|
30495
30522
|
* matches the default events belonging of the control.
|
30496
30523
|
* - `debounce`: integer value which contains the debounce model update value in milliseconds. A
|
@@ -33358,7 +33385,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
33358
33385
|
});
|
33359
33386
|
throw ngRepeatMinErr('dupes',
|
33360
33387
|
"Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}",
|
33361
|
-
expression, trackById,
|
33388
|
+
expression, trackById, value);
|
33362
33389
|
} else {
|
33363
33390
|
// new never before seen block
|
33364
33391
|
nextBlockOrder[index] = {id: trackById, scope: undefined, clone: undefined};
|
@@ -34164,7 +34191,7 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
34164
34191
|
* In many cases, `ngRepeat` can be used on `<option>` elements instead of `ngOptions` to achieve a
|
34165
34192
|
* similar result. However, the `ngOptions` provides some benefits such as reducing memory and
|
34166
34193
|
* increasing speed by not creating a new scope for each repeated instance, as well as providing
|
34167
|
-
* more flexibility in how the `select`'s model is assigned via `select as`. `ngOptions should be
|
34194
|
+
* more flexibility in how the `select`'s model is assigned via `select as`. `ngOptions` should be
|
34168
34195
|
* used when the `select` model needs to be bound to a non-string value. This is because an option
|
34169
34196
|
* element can only be bound to string values at present.
|
34170
34197
|
*
|
@@ -34762,13 +34789,14 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
34762
34789
|
lastElement = null; // start at the beginning
|
34763
34790
|
for (index = 0, length = optionGroup.length; index < length; index++) {
|
34764
34791
|
option = optionGroup[index];
|
34765
|
-
if ((existingOption = existingOptions[index+1])) {
|
34792
|
+
if ((existingOption = existingOptions[index + 1])) {
|
34766
34793
|
// reuse elements
|
34767
34794
|
lastElement = existingOption.element;
|
34768
34795
|
if (existingOption.label !== option.label) {
|
34769
34796
|
updateLabelMap(labelMap, existingOption.label, false);
|
34770
34797
|
updateLabelMap(labelMap, option.label, true);
|
34771
34798
|
lastElement.text(existingOption.label = option.label);
|
34799
|
+
lastElement.prop('label', existingOption.label);
|
34772
34800
|
}
|
34773
34801
|
if (existingOption.id !== option.id) {
|
34774
34802
|
lastElement.val(existingOption.id = option.id);
|
@@ -34798,6 +34826,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
34798
34826
|
.val(option.id)
|
34799
34827
|
.prop('selected', option.selected)
|
34800
34828
|
.attr('selected', option.selected)
|
34829
|
+
.prop('label', option.label)
|
34801
34830
|
.text(option.label);
|
34802
34831
|
}
|
34803
34832
|
|
@@ -35109,10 +35138,10 @@ function callerFile(offset) {
|
|
35109
35138
|
if (line) {
|
35110
35139
|
if (line.indexOf('@') !== -1) {
|
35111
35140
|
// Firefox
|
35112
|
-
line = line.substring(line.indexOf('@')+1);
|
35141
|
+
line = line.substring(line.indexOf('@') + 1);
|
35113
35142
|
} else {
|
35114
35143
|
// Chrome
|
35115
|
-
line = line.substring(line.indexOf('(')+1).replace(')', '');
|
35144
|
+
line = line.substring(line.indexOf('(') + 1).replace(')', '');
|
35116
35145
|
}
|
35117
35146
|
}
|
35118
35147
|
|
@@ -35196,7 +35225,7 @@ _jQuery.fn.bindings = function(windowJquery, bindExp) {
|
|
35196
35225
|
var element = windowJquery(this),
|
35197
35226
|
bindings;
|
35198
35227
|
if (bindings = element.data('$binding')) {
|
35199
|
-
for (var expressions = [], binding, j=0, jj=bindings.length; j<jj; j++) {
|
35228
|
+
for (var expressions = [], binding, j=0, jj=bindings.length; j < jj; j++) {
|
35200
35229
|
binding = bindings[j];
|
35201
35230
|
|
35202
35231
|
if (binding.expressions) {
|
@@ -35572,7 +35601,7 @@ angular.scenario.Describe.prototype.it = function(name, body) {
|
|
35572
35601
|
*/
|
35573
35602
|
angular.scenario.Describe.prototype.iit = function(name, body) {
|
35574
35603
|
this.it.apply(this, arguments);
|
35575
|
-
this.its[this.its.length-1].only = true;
|
35604
|
+
this.its[this.its.length - 1].only = true;
|
35576
35605
|
};
|
35577
35606
|
|
35578
35607
|
/**
|
@@ -35884,7 +35913,7 @@ angular.scenario.ObjectModel.Spec.prototype.addStep = function(name) {
|
|
35884
35913
|
* @return {Object} the step
|
35885
35914
|
*/
|
35886
35915
|
angular.scenario.ObjectModel.Spec.prototype.getLastStep = function() {
|
35887
|
-
return this.steps[this.steps.length-1];
|
35916
|
+
return this.steps[this.steps.length - 1];
|
35888
35917
|
};
|
35889
35918
|
|
35890
35919
|
/**
|
@@ -36459,7 +36488,7 @@ angular.scenario.dsl('expect', function() {
|
|
36459
36488
|
*/
|
36460
36489
|
angular.scenario.dsl('using', function() {
|
36461
36490
|
return function(selector, label) {
|
36462
|
-
this.selector = _jQuery.trim((this.selector||'') + ' ' + selector);
|
36491
|
+
this.selector = _jQuery.trim((this.selector || '') + ' ' + selector);
|
36463
36492
|
if (angular.isString(label) && label.length) {
|
36464
36493
|
this.label = label + ' ( ' + this.selector + ' )';
|
36465
36494
|
} else {
|