angularjs-rails 1.3.2 → 1.3.3
Sign up to get free protection for your applications and to get access to all the features.
- 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 {
|