angularjs-rails 1.5.5 → 1.5.6
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 +1 -1
- data/vendor/assets/javascripts/angular-animate.js +4 -3
- data/vendor/assets/javascripts/angular-aria.js +4 -4
- data/vendor/assets/javascripts/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/angular-loader.js +2 -2
- data/vendor/assets/javascripts/angular-message-format.js +1 -1
- data/vendor/assets/javascripts/angular-messages.js +3 -1
- data/vendor/assets/javascripts/angular-mocks.js +121 -15
- data/vendor/assets/javascripts/angular-parse-ext.js +1 -1
- data/vendor/assets/javascripts/angular-resource.js +1 -1
- data/vendor/assets/javascripts/angular-route.js +37 -30
- data/vendor/assets/javascripts/angular-sanitize.js +3 -3
- data/vendor/assets/javascripts/angular-scenario.js +3012 -2204
- data/vendor/assets/javascripts/angular-touch.js +1 -1
- data/vendor/assets/javascripts/angular.js +260 -105
- metadata +2 -2
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.5.
|
2
|
+
* @license AngularJS v1.5.6
|
3
3
|
* (c) 2010-2016 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -57,7 +57,7 @@ function minErr(module, ErrorConstructor) {
|
|
57
57
|
return match;
|
58
58
|
});
|
59
59
|
|
60
|
-
message += '\nhttp://errors.angularjs.org/1.5.
|
60
|
+
message += '\nhttp://errors.angularjs.org/1.5.6/' +
|
61
61
|
(module ? module + '/' : '') + code;
|
62
62
|
|
63
63
|
for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
|
@@ -516,12 +516,22 @@ noop.$inject = [];
|
|
516
516
|
* functional style.
|
517
517
|
*
|
518
518
|
```js
|
519
|
-
|
520
|
-
|
521
|
-
|
519
|
+
function transformer(transformationFn, value) {
|
520
|
+
return (transformationFn || angular.identity)(value);
|
521
|
+
};
|
522
|
+
|
523
|
+
// E.g.
|
524
|
+
function getResult(fn, input) {
|
525
|
+
return (fn || angular.identity)(input);
|
526
|
+
};
|
527
|
+
|
528
|
+
getResult(function(n) { return n * 2; }, 21); // returns 42
|
529
|
+
getResult(null, 21); // returns 21
|
530
|
+
getResult(undefined, 21); // returns 21
|
522
531
|
```
|
523
|
-
|
524
|
-
|
532
|
+
*
|
533
|
+
* @param {*} value to be returned.
|
534
|
+
* @returns {*} the value passed in.
|
525
535
|
*/
|
526
536
|
function identity($) {return $;}
|
527
537
|
identity.$inject = [];
|
@@ -766,8 +776,8 @@ var escapeForRegexp = function(s) {
|
|
766
776
|
*/
|
767
777
|
function isElement(node) {
|
768
778
|
return !!(node &&
|
769
|
-
(node.nodeName //
|
770
|
-
|| (node.prop && node.attr && node.find))); //
|
779
|
+
(node.nodeName // We are a direct element.
|
780
|
+
|| (node.prop && node.attr && node.find))); // We have an on and find method part of jQuery API.
|
771
781
|
}
|
772
782
|
|
773
783
|
/**
|
@@ -1257,7 +1267,7 @@ function bind(self, fn) {
|
|
1257
1267
|
: fn.call(self);
|
1258
1268
|
};
|
1259
1269
|
} else {
|
1260
|
-
//
|
1270
|
+
// In IE, native methods are not functions so they cannot be bound (note: they don't need to be).
|
1261
1271
|
return fn;
|
1262
1272
|
}
|
1263
1273
|
}
|
@@ -1294,6 +1304,27 @@ function toJsonReplacer(key, value) {
|
|
1294
1304
|
* @param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace.
|
1295
1305
|
* If set to an integer, the JSON output will contain that many spaces per indentation.
|
1296
1306
|
* @returns {string|undefined} JSON-ified string representing `obj`.
|
1307
|
+
* @knownIssue
|
1308
|
+
*
|
1309
|
+
* The Safari browser throws a `RangeError` instead of returning `null` when it tries to stringify a `Date`
|
1310
|
+
* object with an invalid date value. The only reliable way to prevent this is to monkeypatch the
|
1311
|
+
* `Date.prototype.toJSON` method as follows:
|
1312
|
+
*
|
1313
|
+
* ```
|
1314
|
+
* var _DatetoJSON = Date.prototype.toJSON;
|
1315
|
+
* Date.prototype.toJSON = function() {
|
1316
|
+
* try {
|
1317
|
+
* return _DatetoJSON.call(this);
|
1318
|
+
* } catch(e) {
|
1319
|
+
* if (e instanceof RangeError) {
|
1320
|
+
* return null;
|
1321
|
+
* }
|
1322
|
+
* throw e;
|
1323
|
+
* }
|
1324
|
+
* };
|
1325
|
+
* ```
|
1326
|
+
*
|
1327
|
+
* See https://github.com/angular/angular.js/pull/14221 for more information.
|
1297
1328
|
*/
|
1298
1329
|
function toJson(obj, pretty) {
|
1299
1330
|
if (isUndefined(obj)) return undefined;
|
@@ -1384,7 +1415,7 @@ function tryDecodeURIComponent(value) {
|
|
1384
1415
|
try {
|
1385
1416
|
return decodeURIComponent(value);
|
1386
1417
|
} catch (e) {
|
1387
|
-
// Ignore any invalid uri component
|
1418
|
+
// Ignore any invalid uri component.
|
1388
1419
|
}
|
1389
1420
|
}
|
1390
1421
|
|
@@ -1629,7 +1660,7 @@ function angularInit(element, bootstrap) {
|
|
1629
1660
|
module,
|
1630
1661
|
config = {};
|
1631
1662
|
|
1632
|
-
// The element `element` has priority over any other element
|
1663
|
+
// The element `element` has priority over any other element.
|
1633
1664
|
forEach(ngAttrPrefixes, function(prefix) {
|
1634
1665
|
var name = prefix + 'app';
|
1635
1666
|
|
@@ -1723,7 +1754,7 @@ function bootstrap(element, modules, config) {
|
|
1723
1754
|
|
1724
1755
|
if (element.injector()) {
|
1725
1756
|
var tag = (element[0] === window.document) ? 'document' : startingTag(element);
|
1726
|
-
//Encode angle brackets to prevent input from being sanitized to empty string #8683
|
1757
|
+
// Encode angle brackets to prevent input from being sanitized to empty string #8683.
|
1727
1758
|
throw ngMinErr(
|
1728
1759
|
'btstrpd',
|
1729
1760
|
"App already bootstrapped with this element '{0}'",
|
@@ -2479,11 +2510,11 @@ function toDebugString(obj) {
|
|
2479
2510
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
2480
2511
|
*/
|
2481
2512
|
var version = {
|
2482
|
-
full: '1.5.
|
2513
|
+
full: '1.5.6', // all of these placeholder strings will be replaced by grunt's
|
2483
2514
|
major: 1, // package task
|
2484
2515
|
minor: 5,
|
2485
|
-
dot:
|
2486
|
-
codeName: '
|
2516
|
+
dot: 6,
|
2517
|
+
codeName: 'arrow-stringification'
|
2487
2518
|
};
|
2488
2519
|
|
2489
2520
|
|
@@ -2710,8 +2741,8 @@ function publishExternalAPI(angular) {
|
|
2710
2741
|
* - [`removeData()`](http://api.jquery.com/removeData/)
|
2711
2742
|
* - [`replaceWith()`](http://api.jquery.com/replaceWith/)
|
2712
2743
|
* - [`text()`](http://api.jquery.com/text/)
|
2713
|
-
* - [`toggleClass()`](http://api.jquery.com/toggleClass/)
|
2714
|
-
* - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers
|
2744
|
+
* - [`toggleClass()`](http://api.jquery.com/toggleClass/) - Does not support a function as first argument
|
2745
|
+
* - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers
|
2715
2746
|
* - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces or event object as parameter
|
2716
2747
|
* - [`val()`](http://api.jquery.com/val/)
|
2717
2748
|
* - [`wrap()`](http://api.jquery.com/wrap/)
|
@@ -3871,8 +3902,16 @@ var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/;
|
|
3871
3902
|
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
|
3872
3903
|
var $injectorMinErr = minErr('$injector');
|
3873
3904
|
|
3905
|
+
function stringifyFn(fn) {
|
3906
|
+
// Support: Chrome 50-51 only
|
3907
|
+
// Creating a new string by adding `' '` at the end, to hack around some bug in Chrome v50/51
|
3908
|
+
// (See https://github.com/angular/angular.js/issues/14487.)
|
3909
|
+
// TODO (gkalpak): Remove workaround when Chrome v52 is released
|
3910
|
+
return Function.prototype.toString.call(fn) + ' ';
|
3911
|
+
}
|
3912
|
+
|
3874
3913
|
function extractArgs(fn) {
|
3875
|
-
var fnText =
|
3914
|
+
var fnText = stringifyFn(fn).replace(STRIP_COMMENTS, ''),
|
3876
3915
|
args = fnText.match(ARROW_ARG) || fnText.match(FN_ARGS);
|
3877
3916
|
return args;
|
3878
3917
|
}
|
@@ -4140,18 +4179,20 @@ function annotate(fn, strictDi, name) {
|
|
4140
4179
|
* these cases the {@link auto.$provide $provide} service has additional helper methods to register
|
4141
4180
|
* services without specifying a provider.
|
4142
4181
|
*
|
4143
|
-
* * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the
|
4182
|
+
* * {@link auto.$provide#provider provider(name, provider)} - registers a **service provider** with the
|
4144
4183
|
* {@link auto.$injector $injector}
|
4145
|
-
* * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by
|
4184
|
+
* * {@link auto.$provide#constant constant(name, obj)} - registers a value/object that can be accessed by
|
4146
4185
|
* providers and services.
|
4147
|
-
* * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by
|
4186
|
+
* * {@link auto.$provide#value value(name, obj)} - registers a value/object that can only be accessed by
|
4148
4187
|
* services, not providers.
|
4149
|
-
* * {@link auto.$provide#factory factory(fn)} - registers a service **factory function
|
4188
|
+
* * {@link auto.$provide#factory factory(name, fn)} - registers a service **factory function**
|
4150
4189
|
* that will be wrapped in a **service provider** object, whose `$get` property will contain the
|
4151
4190
|
* given factory function.
|
4152
|
-
* * {@link auto.$provide#service service(
|
4191
|
+
* * {@link auto.$provide#service service(name, Fn)} - registers a **constructor function**
|
4153
4192
|
* that will be wrapped in a **service provider** object, whose `$get` property will instantiate
|
4154
4193
|
* a new object using the given constructor function.
|
4194
|
+
* * {@link auto.$provide#decorator decorator(name, decorFn)} - registers a **decorator function** that
|
4195
|
+
* will be able to modify or replace the implementation of another service.
|
4155
4196
|
*
|
4156
4197
|
* See the individual methods for more information and examples.
|
4157
4198
|
*/
|
@@ -4408,18 +4449,20 @@ function annotate(fn, strictDi, name) {
|
|
4408
4449
|
* @name $provide#decorator
|
4409
4450
|
* @description
|
4410
4451
|
*
|
4411
|
-
* Register a **
|
4452
|
+
* Register a **decorator function** with the {@link auto.$injector $injector}. A decorator function
|
4412
4453
|
* intercepts the creation of a service, allowing it to override or modify the behavior of the
|
4413
|
-
* service. The
|
4414
|
-
*
|
4454
|
+
* service. The return value of the decorator function may be the original service, or a new service
|
4455
|
+
* that replaces (or wraps and delegates to) the original service.
|
4456
|
+
*
|
4457
|
+
* You can find out more about using decorators in the {@link guide/decorators} guide.
|
4415
4458
|
*
|
4416
4459
|
* @param {string} name The name of the service to decorate.
|
4417
4460
|
* @param {Function|Array.<string|Function>} decorator This function will be invoked when the service needs to be
|
4418
|
-
*
|
4461
|
+
* provided and should return the decorated service instance. The function is called using
|
4419
4462
|
* the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable.
|
4420
4463
|
* Local injection arguments:
|
4421
4464
|
*
|
4422
|
-
* * `$delegate` - The original service instance, which can be monkey patched, configured,
|
4465
|
+
* * `$delegate` - The original service instance, which can be replaced, monkey patched, configured,
|
4423
4466
|
* decorated or delegated to.
|
4424
4467
|
*
|
4425
4468
|
* @example
|
@@ -4645,7 +4688,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
4645
4688
|
// Workaround for MS Edge.
|
4646
4689
|
// Check https://connect.microsoft.com/IE/Feedback/Details/2211653
|
4647
4690
|
return typeof func === 'function'
|
4648
|
-
&& /^(?:class\s|constructor\()/.test(
|
4691
|
+
&& /^(?:class\s|constructor\()/.test(stringifyFn(func));
|
4649
4692
|
}
|
4650
4693
|
|
4651
4694
|
function invoke(fn, self, locals, serviceName) {
|
@@ -4736,7 +4779,7 @@ function $AnchorScrollProvider() {
|
|
4736
4779
|
* When called, it scrolls to the element related to the specified `hash` or (if omitted) to the
|
4737
4780
|
* current value of {@link ng.$location#hash $location.hash()}, according to the rules specified
|
4738
4781
|
* in the
|
4739
|
-
* [HTML5 spec](http://www.w3.org/html/wg/drafts/html/master/browsers.html#
|
4782
|
+
* [HTML5 spec](http://www.w3.org/html/wg/drafts/html/master/browsers.html#an-indicated-part-of-the-document).
|
4740
4783
|
*
|
4741
4784
|
* It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to
|
4742
4785
|
* match any anchor whenever it changes. This can be disabled by calling
|
@@ -5974,7 +6017,7 @@ function Browser(window, document, $log, $sniffer) {
|
|
5974
6017
|
// Do the assignment again so that those two variables are referentially identical.
|
5975
6018
|
lastHistoryState = cachedState;
|
5976
6019
|
} else {
|
5977
|
-
if (!sameBase
|
6020
|
+
if (!sameBase) {
|
5978
6021
|
pendingLocation = url;
|
5979
6022
|
}
|
5980
6023
|
if (replace) {
|
@@ -5988,6 +6031,9 @@ function Browser(window, document, $log, $sniffer) {
|
|
5988
6031
|
pendingLocation = url;
|
5989
6032
|
}
|
5990
6033
|
}
|
6034
|
+
if (pendingLocation) {
|
6035
|
+
pendingLocation = url;
|
6036
|
+
}
|
5991
6037
|
return self;
|
5992
6038
|
// getter
|
5993
6039
|
} else {
|
@@ -6904,8 +6950,9 @@ function $TemplateCacheProvider() {
|
|
6904
6950
|
* If the `require` property is an object and `bindToController` is truthy, then the required controllers are
|
6905
6951
|
* bound to the controller using the keys of the `require` property. This binding occurs after all the controllers
|
6906
6952
|
* have been constructed but before `$onInit` is called.
|
6953
|
+
* If the name of the required controller is the same as the local name (the key), the name can be
|
6954
|
+
* omitted. For example, `{parentDir: '^^'}` is equivalent to `{parentDir: '^^parentDir'}`.
|
6907
6955
|
* See the {@link $compileProvider#component} helper for an example of how this can be used.
|
6908
|
-
*
|
6909
6956
|
* If no such required directive(s) can be found, or if the directive does not have a controller, then an error is
|
6910
6957
|
* raised (unless no link function is specified and the required controllers are not being bound to the directive
|
6911
6958
|
* controller, in which case error checking is skipped). The name can be prefixed with:
|
@@ -7534,6 +7581,20 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7534
7581
|
}
|
7535
7582
|
}
|
7536
7583
|
|
7584
|
+
function getDirectiveRequire(directive) {
|
7585
|
+
var require = directive.require || (directive.controller && directive.name);
|
7586
|
+
|
7587
|
+
if (!isArray(require) && isObject(require)) {
|
7588
|
+
forEach(require, function(value, key) {
|
7589
|
+
var match = value.match(REQUIRE_PREFIX_REGEXP);
|
7590
|
+
var name = value.substring(match[0].length);
|
7591
|
+
if (!name) require[key] = match[0] + key;
|
7592
|
+
});
|
7593
|
+
}
|
7594
|
+
|
7595
|
+
return require;
|
7596
|
+
}
|
7597
|
+
|
7537
7598
|
/**
|
7538
7599
|
* @ngdoc method
|
7539
7600
|
* @name $compileProvider#directive
|
@@ -7570,7 +7631,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7570
7631
|
directive.priority = directive.priority || 0;
|
7571
7632
|
directive.index = index;
|
7572
7633
|
directive.name = directive.name || name;
|
7573
|
-
directive.require =
|
7634
|
+
directive.require = getDirectiveRequire(directive);
|
7574
7635
|
directive.restrict = directive.restrict || 'EA';
|
7575
7636
|
directive.$$moduleName = directiveFactory.$$moduleName;
|
7576
7637
|
directives.push(directive);
|
@@ -8027,7 +8088,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8027
8088
|
(nodeName === 'img' && key === 'src')) {
|
8028
8089
|
// sanitize a[href] and img[src] values
|
8029
8090
|
this[key] = value = $$sanitizeUri(value, key === 'src');
|
8030
|
-
} else if (nodeName === 'img' && key === 'srcset') {
|
8091
|
+
} else if (nodeName === 'img' && key === 'srcset' && isDefined(value)) {
|
8031
8092
|
// sanitize img[srcset] values
|
8032
8093
|
var result = "";
|
8033
8094
|
|
@@ -8186,7 +8247,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8186
8247
|
compile.$$createComment = function(directiveName, comment) {
|
8187
8248
|
var content = '';
|
8188
8249
|
if (debugInfoEnabled) {
|
8189
|
-
content = ' ' + (directiveName || '') + ': '
|
8250
|
+
content = ' ' + (directiveName || '') + ': ';
|
8251
|
+
if (comment) content += comment + ' ';
|
8190
8252
|
}
|
8191
8253
|
return window.document.createComment(content);
|
8192
8254
|
};
|
@@ -8918,10 +8980,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8918
8980
|
} else if (directive.compile) {
|
8919
8981
|
try {
|
8920
8982
|
linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);
|
8983
|
+
var context = directive.$$originalDirective || directive;
|
8921
8984
|
if (isFunction(linkFn)) {
|
8922
|
-
addLinkFns(null, linkFn, attrStart, attrEnd);
|
8985
|
+
addLinkFns(null, bind(context, linkFn), attrStart, attrEnd);
|
8923
8986
|
} else if (linkFn) {
|
8924
|
-
addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd);
|
8987
|
+
addLinkFns(bind(context, linkFn.pre), bind(context, linkFn.post), attrStart, attrEnd);
|
8925
8988
|
}
|
8926
8989
|
} catch (e) {
|
8927
8990
|
$exceptionHandler(e, startingTag($compileNode));
|
@@ -9790,14 +9853,13 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
9790
9853
|
|
9791
9854
|
parentGet = $parse(attrs[attrName]);
|
9792
9855
|
|
9793
|
-
destination[scopeName] = parentGet(scope);
|
9856
|
+
var initialValue = destination[scopeName] = parentGet(scope);
|
9794
9857
|
initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]);
|
9795
9858
|
|
9796
9859
|
removeWatch = scope.$watch(parentGet, function parentValueWatchAction(newValue, oldValue) {
|
9797
|
-
if (
|
9798
|
-
|
9799
|
-
|
9800
|
-
oldValue = destination[scopeName];
|
9860
|
+
if (oldValue === newValue) {
|
9861
|
+
if (oldValue === initialValue) return;
|
9862
|
+
oldValue = initialValue;
|
9801
9863
|
}
|
9802
9864
|
recordChanges(scopeName, newValue, oldValue);
|
9803
9865
|
destination[scopeName] = newValue;
|
@@ -10700,10 +10762,13 @@ function $HttpProvider() {
|
|
10700
10762
|
* - **config** – `{Object}` – The configuration object that was used to generate the request.
|
10701
10763
|
* - **statusText** – `{string}` – HTTP status text of the response.
|
10702
10764
|
*
|
10703
|
-
* A response status code between 200 and 299 is considered a success status and
|
10704
|
-
*
|
10705
|
-
*
|
10706
|
-
*
|
10765
|
+
* A response status code between 200 and 299 is considered a success status and will result in
|
10766
|
+
* the success callback being called. Any response status code outside of that range is
|
10767
|
+
* considered an error status and will result in the error callback being called.
|
10768
|
+
* Also, status codes less than -1 are normalized to zero. -1 usually means the request was
|
10769
|
+
* aborted, e.g. using a `config.timeout`.
|
10770
|
+
* Note that if the response is a redirect, XMLHttpRequest will transparently follow it, meaning
|
10771
|
+
* that the outcome (success or error) will be determined by the final response status code.
|
10707
10772
|
*
|
10708
10773
|
*
|
10709
10774
|
* ## Shortcut methods
|
@@ -12033,6 +12098,30 @@ function $InterpolateProvider() {
|
|
12033
12098
|
* </file>
|
12034
12099
|
* </example>
|
12035
12100
|
*
|
12101
|
+
* @knownIssue
|
12102
|
+
* It is currently not possible for an interpolated expression to contain the interpolation end
|
12103
|
+
* symbol. For example, `{{ '}}' }}` will be incorrectly interpreted as `{{ ' }}` + `' }}`, i.e.
|
12104
|
+
* an interpolated expression consisting of a single-quote (`'`) and the `' }}` string.
|
12105
|
+
*
|
12106
|
+
* @knownIssue
|
12107
|
+
* All directives and components must use the standard `{{` `}}` interpolation symbols
|
12108
|
+
* in their templates. If you change the application interpolation symbols the {@link $compile}
|
12109
|
+
* service will attempt to denormalize the standard symbols to the custom symbols.
|
12110
|
+
* The denormalization process is not clever enough to know not to replace instances of the standard
|
12111
|
+
* symbols where they would not normally be treated as interpolation symbols. For example in the following
|
12112
|
+
* code snippet the closing braces of the literal object will get incorrectly denormalized:
|
12113
|
+
*
|
12114
|
+
* ```
|
12115
|
+
* <div data-context='{"context":{"id":3,"type":"page"}}">
|
12116
|
+
* ```
|
12117
|
+
*
|
12118
|
+
* The workaround is to ensure that such instances are separated by whitespace:
|
12119
|
+
* ```
|
12120
|
+
* <div data-context='{"context":{"id":3,"type":"page"} }">
|
12121
|
+
* ```
|
12122
|
+
*
|
12123
|
+
* See https://github.com/angular/angular.js/pull/14610#issuecomment-219401099 for more information.
|
12124
|
+
*
|
12036
12125
|
* @param {string} text The text with markup to interpolate.
|
12037
12126
|
* @param {boolean=} mustHaveExpression if set to true then the interpolation string must have
|
12038
12127
|
* embedded expression in order to return an interpolation function. Strings with no
|
@@ -12455,17 +12544,20 @@ function parseAppUrl(relativeUrl, locationObj) {
|
|
12455
12544
|
}
|
12456
12545
|
}
|
12457
12546
|
|
12547
|
+
function startsWith(haystack, needle) {
|
12548
|
+
return haystack.lastIndexOf(needle, 0) === 0;
|
12549
|
+
}
|
12458
12550
|
|
12459
12551
|
/**
|
12460
12552
|
*
|
12461
|
-
* @param {string}
|
12462
|
-
* @param {string}
|
12463
|
-
* @returns {string} returns text from
|
12464
|
-
* expected string.
|
12553
|
+
* @param {string} base
|
12554
|
+
* @param {string} url
|
12555
|
+
* @returns {string} returns text from `url` after `base` or `undefined` if it does not begin with
|
12556
|
+
* the expected string.
|
12465
12557
|
*/
|
12466
|
-
function
|
12467
|
-
if (
|
12468
|
-
return
|
12558
|
+
function stripBaseUrl(base, url) {
|
12559
|
+
if (startsWith(url, base)) {
|
12560
|
+
return url.substr(base.length);
|
12469
12561
|
}
|
12470
12562
|
}
|
12471
12563
|
|
@@ -12511,7 +12603,7 @@ function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {
|
|
12511
12603
|
* @private
|
12512
12604
|
*/
|
12513
12605
|
this.$$parse = function(url) {
|
12514
|
-
var pathUrl =
|
12606
|
+
var pathUrl = stripBaseUrl(appBaseNoFile, url);
|
12515
12607
|
if (!isString(pathUrl)) {
|
12516
12608
|
throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url,
|
12517
12609
|
appBaseNoFile);
|
@@ -12548,14 +12640,14 @@ function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {
|
|
12548
12640
|
var appUrl, prevAppUrl;
|
12549
12641
|
var rewrittenUrl;
|
12550
12642
|
|
12551
|
-
if (isDefined(appUrl =
|
12643
|
+
if (isDefined(appUrl = stripBaseUrl(appBase, url))) {
|
12552
12644
|
prevAppUrl = appUrl;
|
12553
|
-
if (isDefined(appUrl =
|
12554
|
-
rewrittenUrl = appBaseNoFile + (
|
12645
|
+
if (isDefined(appUrl = stripBaseUrl(basePrefix, appUrl))) {
|
12646
|
+
rewrittenUrl = appBaseNoFile + (stripBaseUrl('/', appUrl) || appUrl);
|
12555
12647
|
} else {
|
12556
12648
|
rewrittenUrl = appBase + prevAppUrl;
|
12557
12649
|
}
|
12558
|
-
} else if (isDefined(appUrl =
|
12650
|
+
} else if (isDefined(appUrl = stripBaseUrl(appBaseNoFile, url))) {
|
12559
12651
|
rewrittenUrl = appBaseNoFile + appUrl;
|
12560
12652
|
} else if (appBaseNoFile == url + '/') {
|
12561
12653
|
rewrittenUrl = appBaseNoFile;
|
@@ -12589,14 +12681,14 @@ function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {
|
|
12589
12681
|
* @private
|
12590
12682
|
*/
|
12591
12683
|
this.$$parse = function(url) {
|
12592
|
-
var withoutBaseUrl =
|
12684
|
+
var withoutBaseUrl = stripBaseUrl(appBase, url) || stripBaseUrl(appBaseNoFile, url);
|
12593
12685
|
var withoutHashUrl;
|
12594
12686
|
|
12595
12687
|
if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === '#') {
|
12596
12688
|
|
12597
12689
|
// The rest of the url starts with a hash so we have
|
12598
12690
|
// got either a hashbang path or a plain hash fragment
|
12599
|
-
withoutHashUrl =
|
12691
|
+
withoutHashUrl = stripBaseUrl(hashPrefix, withoutBaseUrl);
|
12600
12692
|
if (isUndefined(withoutHashUrl)) {
|
12601
12693
|
// There was no hashbang prefix so we just have a hash fragment
|
12602
12694
|
withoutHashUrl = withoutBaseUrl;
|
@@ -12644,7 +12736,7 @@ function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {
|
|
12644
12736
|
var firstPathSegmentMatch;
|
12645
12737
|
|
12646
12738
|
//Get the relative path from the input URL.
|
12647
|
-
if (url
|
12739
|
+
if (startsWith(url, base)) {
|
12648
12740
|
url = url.replace(base, '');
|
12649
12741
|
}
|
12650
12742
|
|
@@ -12707,7 +12799,7 @@ function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) {
|
|
12707
12799
|
|
12708
12800
|
if (appBase == stripHash(url)) {
|
12709
12801
|
rewrittenUrl = url;
|
12710
|
-
} else if ((appUrl =
|
12802
|
+
} else if ((appUrl = stripBaseUrl(appBaseNoFile, url))) {
|
12711
12803
|
rewrittenUrl = appBase + hashPrefix + appUrl;
|
12712
12804
|
} else if (appBaseNoFile === url + '/') {
|
12713
12805
|
rewrittenUrl = appBaseNoFile;
|
@@ -12889,7 +12981,7 @@ var locationPrototype = {
|
|
12889
12981
|
* ```
|
12890
12982
|
*
|
12891
12983
|
* @param {(string|number)=} path New path
|
12892
|
-
* @return {string} path
|
12984
|
+
* @return {(string|object)} path if called with no parameters, or `$location` if called with a parameter
|
12893
12985
|
*/
|
12894
12986
|
path: locationGetterSetter('$$path', function(path) {
|
12895
12987
|
path = path !== null ? path.toString() : '';
|
@@ -13315,7 +13407,7 @@ function $LocationProvider() {
|
|
13315
13407
|
// update $location when $browser url changes
|
13316
13408
|
$browser.onUrlChange(function(newUrl, newState) {
|
13317
13409
|
|
13318
|
-
if (isUndefined(
|
13410
|
+
if (isUndefined(stripBaseUrl(appBaseNoFile, newUrl))) {
|
13319
13411
|
// If we are navigating outside of the app then force a reload
|
13320
13412
|
$window.location.href = newUrl;
|
13321
13413
|
return;
|
@@ -14151,13 +14243,28 @@ AST.prototype = {
|
|
14151
14243
|
property = {type: AST.Property, kind: 'init'};
|
14152
14244
|
if (this.peek().constant) {
|
14153
14245
|
property.key = this.constant();
|
14246
|
+
property.computed = false;
|
14247
|
+
this.consume(':');
|
14248
|
+
property.value = this.expression();
|
14154
14249
|
} else if (this.peek().identifier) {
|
14155
14250
|
property.key = this.identifier();
|
14251
|
+
property.computed = false;
|
14252
|
+
if (this.peek(':')) {
|
14253
|
+
this.consume(':');
|
14254
|
+
property.value = this.expression();
|
14255
|
+
} else {
|
14256
|
+
property.value = property.key;
|
14257
|
+
}
|
14258
|
+
} else if (this.peek('[')) {
|
14259
|
+
this.consume('[');
|
14260
|
+
property.key = this.expression();
|
14261
|
+
this.consume(']');
|
14262
|
+
property.computed = true;
|
14263
|
+
this.consume(':');
|
14264
|
+
property.value = this.expression();
|
14156
14265
|
} else {
|
14157
14266
|
this.throwError("invalid key", this.peek());
|
14158
14267
|
}
|
14159
|
-
this.consume(':');
|
14160
|
-
property.value = this.expression();
|
14161
14268
|
properties.push(property);
|
14162
14269
|
} while (this.expect(','));
|
14163
14270
|
}
|
@@ -14326,7 +14433,7 @@ function findConstantAndWatchExpressions(ast, $filter) {
|
|
14326
14433
|
argsToWatch = [];
|
14327
14434
|
forEach(ast.properties, function(property) {
|
14328
14435
|
findConstantAndWatchExpressions(property.value, $filter);
|
14329
|
-
allConstants = allConstants && property.value.constant;
|
14436
|
+
allConstants = allConstants && property.value.constant && !property.computed;
|
14330
14437
|
if (!property.value.constant) {
|
14331
14438
|
argsToWatch.push.apply(argsToWatch, property.value.toWatch);
|
14332
14439
|
}
|
@@ -14498,7 +14605,7 @@ ASTCompiler.prototype = {
|
|
14498
14605
|
},
|
14499
14606
|
|
14500
14607
|
recurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) {
|
14501
|
-
var left, right, self = this, args, expression;
|
14608
|
+
var left, right, self = this, args, expression, computed;
|
14502
14609
|
recursionFn = recursionFn || noop;
|
14503
14610
|
if (!skipWatchIdCheck && isDefined(ast.watchId)) {
|
14504
14611
|
intoId = intoId || this.nextId();
|
@@ -14695,17 +14802,41 @@ ASTCompiler.prototype = {
|
|
14695
14802
|
break;
|
14696
14803
|
case AST.ObjectExpression:
|
14697
14804
|
args = [];
|
14805
|
+
computed = false;
|
14698
14806
|
forEach(ast.properties, function(property) {
|
14699
|
-
|
14700
|
-
|
14701
|
-
|
14702
|
-
('' + property.key.value)) +
|
14703
|
-
':' + expr);
|
14704
|
-
});
|
14807
|
+
if (property.computed) {
|
14808
|
+
computed = true;
|
14809
|
+
}
|
14705
14810
|
});
|
14706
|
-
|
14707
|
-
|
14708
|
-
|
14811
|
+
if (computed) {
|
14812
|
+
intoId = intoId || this.nextId();
|
14813
|
+
this.assign(intoId, '{}');
|
14814
|
+
forEach(ast.properties, function(property) {
|
14815
|
+
if (property.computed) {
|
14816
|
+
left = self.nextId();
|
14817
|
+
self.recurse(property.key, left);
|
14818
|
+
} else {
|
14819
|
+
left = property.key.type === AST.Identifier ?
|
14820
|
+
property.key.name :
|
14821
|
+
('' + property.key.value);
|
14822
|
+
}
|
14823
|
+
right = self.nextId();
|
14824
|
+
self.recurse(property.value, right);
|
14825
|
+
self.assign(self.member(intoId, left, property.computed), right);
|
14826
|
+
});
|
14827
|
+
} else {
|
14828
|
+
forEach(ast.properties, function(property) {
|
14829
|
+
self.recurse(property.value, ast.constant ? undefined : self.nextId(), undefined, function(expr) {
|
14830
|
+
args.push(self.escape(
|
14831
|
+
property.key.type === AST.Identifier ? property.key.name :
|
14832
|
+
('' + property.key.value)) +
|
14833
|
+
':' + expr);
|
14834
|
+
});
|
14835
|
+
});
|
14836
|
+
expression = '{' + args.join(',') + '}';
|
14837
|
+
this.assign(intoId, expression);
|
14838
|
+
}
|
14839
|
+
recursionFn(intoId || expression);
|
14709
14840
|
break;
|
14710
14841
|
case AST.ThisExpression:
|
14711
14842
|
this.assign(intoId, 's');
|
@@ -15031,16 +15162,28 @@ ASTInterpreter.prototype = {
|
|
15031
15162
|
case AST.ObjectExpression:
|
15032
15163
|
args = [];
|
15033
15164
|
forEach(ast.properties, function(property) {
|
15034
|
-
|
15035
|
-
|
15036
|
-
|
15037
|
-
|
15038
|
-
|
15165
|
+
if (property.computed) {
|
15166
|
+
args.push({key: self.recurse(property.key),
|
15167
|
+
computed: true,
|
15168
|
+
value: self.recurse(property.value)
|
15169
|
+
});
|
15170
|
+
} else {
|
15171
|
+
args.push({key: property.key.type === AST.Identifier ?
|
15172
|
+
property.key.name :
|
15173
|
+
('' + property.key.value),
|
15174
|
+
computed: false,
|
15175
|
+
value: self.recurse(property.value)
|
15176
|
+
});
|
15177
|
+
}
|
15039
15178
|
});
|
15040
15179
|
return function(scope, locals, assign, inputs) {
|
15041
15180
|
var value = {};
|
15042
15181
|
for (var i = 0; i < args.length; ++i) {
|
15043
|
-
|
15182
|
+
if (args[i].computed) {
|
15183
|
+
value[args[i].key(scope, locals, assign, inputs)] = args[i].value(scope, locals, assign, inputs);
|
15184
|
+
} else {
|
15185
|
+
value[args[i].key] = args[i].value(scope, locals, assign, inputs);
|
15186
|
+
}
|
15044
15187
|
}
|
15045
15188
|
return context ? {value: value} : value;
|
15046
15189
|
};
|
@@ -17039,15 +17182,19 @@ function $RootScopeProvider() {
|
|
17039
17182
|
dirty = false;
|
17040
17183
|
current = target;
|
17041
17184
|
|
17042
|
-
|
17185
|
+
// It's safe for asyncQueuePosition to be a local variable here because this loop can't
|
17186
|
+
// be reentered recursively. Calling $digest from a function passed to $applyAsync would
|
17187
|
+
// lead to a '$digest already in progress' error.
|
17188
|
+
for (var asyncQueuePosition = 0; asyncQueuePosition < asyncQueue.length; asyncQueuePosition++) {
|
17043
17189
|
try {
|
17044
|
-
asyncTask = asyncQueue
|
17190
|
+
asyncTask = asyncQueue[asyncQueuePosition];
|
17045
17191
|
asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals);
|
17046
17192
|
} catch (e) {
|
17047
17193
|
$exceptionHandler(e);
|
17048
17194
|
}
|
17049
17195
|
lastDirtyWatch = null;
|
17050
17196
|
}
|
17197
|
+
asyncQueue.length = 0;
|
17051
17198
|
|
17052
17199
|
traverseScopesLoop:
|
17053
17200
|
do { // "traverse the scopes" loop
|
@@ -17118,13 +17265,15 @@ function $RootScopeProvider() {
|
|
17118
17265
|
|
17119
17266
|
clearPhase();
|
17120
17267
|
|
17121
|
-
|
17268
|
+
// postDigestQueuePosition isn't local here because this loop can be reentered recursively.
|
17269
|
+
while (postDigestQueuePosition < postDigestQueue.length) {
|
17122
17270
|
try {
|
17123
|
-
postDigestQueue
|
17271
|
+
postDigestQueue[postDigestQueuePosition++]();
|
17124
17272
|
} catch (e) {
|
17125
17273
|
$exceptionHandler(e);
|
17126
17274
|
}
|
17127
17275
|
}
|
17276
|
+
postDigestQueue.length = postDigestQueuePosition = 0;
|
17128
17277
|
},
|
17129
17278
|
|
17130
17279
|
|
@@ -17579,6 +17728,8 @@ function $RootScopeProvider() {
|
|
17579
17728
|
var postDigestQueue = $rootScope.$$postDigestQueue = [];
|
17580
17729
|
var applyAsyncQueue = $rootScope.$$applyAsyncQueue = [];
|
17581
17730
|
|
17731
|
+
var postDigestQueuePosition = 0;
|
17732
|
+
|
17582
17733
|
return $rootScope;
|
17583
17734
|
|
17584
17735
|
|
@@ -18147,7 +18298,7 @@ function $SceDelegateProvider() {
|
|
18147
18298
|
* You can ensure your document is in standards mode and not quirks mode by adding `<!doctype html>`
|
18148
18299
|
* to the top of your HTML document.
|
18149
18300
|
*
|
18150
|
-
* SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for
|
18301
|
+
* SCE assists in writing code in a way that (a) is secure by default and (b) makes auditing for
|
18151
18302
|
* security vulnerabilities such as XSS, clickjacking, etc. a lot easier.
|
18152
18303
|
*
|
18153
18304
|
* Here's an example of a binding in a privileged context:
|
@@ -18824,7 +18975,7 @@ function $SnifferProvider() {
|
|
18824
18975
|
for (var prop in bodyStyle) {
|
18825
18976
|
if (match = vendorRegex.exec(prop)) {
|
18826
18977
|
vendorPrefix = match[0];
|
18827
|
-
vendorPrefix = vendorPrefix
|
18978
|
+
vendorPrefix = vendorPrefix[0].toUpperCase() + vendorPrefix.substr(1);
|
18828
18979
|
break;
|
18829
18980
|
}
|
18830
18981
|
}
|
@@ -18947,7 +19098,7 @@ function $TemplateRequestProvider() {
|
|
18947
19098
|
// are included in there. This also makes Angular accept any script
|
18948
19099
|
// directive, no matter its name. However, we still need to unwrap trusted
|
18949
19100
|
// types.
|
18950
|
-
if (!isString(tpl) ||
|
19101
|
+
if (!isString(tpl) || isUndefined($templateCache.get(tpl))) {
|
18951
19102
|
tpl = $sce.getTrustedResourceUrl(tpl);
|
18952
19103
|
}
|
18953
19104
|
|
@@ -20129,7 +20280,7 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
20129
20280
|
|
20130
20281
|
// extract decimals digits
|
20131
20282
|
if (integerLen > 0) {
|
20132
|
-
decimals = digits.splice(integerLen);
|
20283
|
+
decimals = digits.splice(integerLen, digits.length);
|
20133
20284
|
} else {
|
20134
20285
|
decimals = digits;
|
20135
20286
|
digits = [0];
|
@@ -20138,10 +20289,10 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
20138
20289
|
// format the integer digits with grouping separators
|
20139
20290
|
var groups = [];
|
20140
20291
|
if (digits.length >= pattern.lgSize) {
|
20141
|
-
groups.unshift(digits.splice(-pattern.lgSize).join(''));
|
20292
|
+
groups.unshift(digits.splice(-pattern.lgSize, digits.length).join(''));
|
20142
20293
|
}
|
20143
20294
|
while (digits.length > pattern.gSize) {
|
20144
|
-
groups.unshift(digits.splice(-pattern.gSize).join(''));
|
20295
|
+
groups.unshift(digits.splice(-pattern.gSize, digits.length).join(''));
|
20145
20296
|
}
|
20146
20297
|
if (digits.length) {
|
20147
20298
|
groups.unshift(digits.join(''));
|
@@ -22080,11 +22231,11 @@ var inputType = {
|
|
22080
22231
|
<span class="error" ng-show="myForm.input.$error.pattern">
|
22081
22232
|
Single word only!</span>
|
22082
22233
|
</div>
|
22083
|
-
<
|
22084
|
-
<
|
22085
|
-
<
|
22086
|
-
<
|
22087
|
-
<
|
22234
|
+
<code>text = {{example.text}}</code><br/>
|
22235
|
+
<code>myForm.input.$valid = {{myForm.input.$valid}}</code><br/>
|
22236
|
+
<code>myForm.input.$error = {{myForm.input.$error}}</code><br/>
|
22237
|
+
<code>myForm.$valid = {{myForm.$valid}}</code><br/>
|
22238
|
+
<code>myForm.$error.required = {{!!myForm.$error.required}}</code><br/>
|
22088
22239
|
</form>
|
22089
22240
|
</file>
|
22090
22241
|
<file name="protractor.js" type="protractor">
|
@@ -23963,8 +24114,9 @@ var ngBindHtmlDirective = ['$sce', '$parse', '$compile', function($sce, $parse,
|
|
23963
24114
|
restrict: 'A',
|
23964
24115
|
compile: function ngBindHtmlCompile(tElement, tAttrs) {
|
23965
24116
|
var ngBindHtmlGetter = $parse(tAttrs.ngBindHtml);
|
23966
|
-
var ngBindHtmlWatch = $parse(tAttrs.ngBindHtml, function
|
23967
|
-
|
24117
|
+
var ngBindHtmlWatch = $parse(tAttrs.ngBindHtml, function sceValueOf(val) {
|
24118
|
+
// Unwrap the value to compare the actual inner safe value, not the wrapper object.
|
24119
|
+
return $sce.valueOf(val);
|
23968
24120
|
});
|
23969
24121
|
$compile.$$addBindingClass(tElement);
|
23970
24122
|
|
@@ -23972,9 +24124,9 @@ var ngBindHtmlDirective = ['$sce', '$parse', '$compile', function($sce, $parse,
|
|
23972
24124
|
$compile.$$addBindingInfo(element, attr.ngBindHtml);
|
23973
24125
|
|
23974
24126
|
scope.$watch(ngBindHtmlWatch, function ngBindHtmlWatchAction() {
|
23975
|
-
//
|
23976
|
-
|
23977
|
-
element.html($sce.getTrustedHtml(
|
24127
|
+
// The watched value is the unwrapped value. To avoid re-escaping, use the direct getter.
|
24128
|
+
var value = ngBindHtmlGetter(scope);
|
24129
|
+
element.html($sce.getTrustedHtml(value) || '');
|
23978
24130
|
});
|
23979
24131
|
};
|
23980
24132
|
}
|
@@ -24127,7 +24279,9 @@ function classDirective(name, selector) {
|
|
24127
24279
|
}
|
24128
24280
|
|
24129
24281
|
function ngClassWatchAction(newVal) {
|
24130
|
-
|
24282
|
+
// jshint bitwise: false
|
24283
|
+
if (selector === true || (scope.$index & 1) === selector) {
|
24284
|
+
// jshint bitwise: true
|
24131
24285
|
var newClasses = arrayClasses(newVal || []);
|
24132
24286
|
if (!oldVal) {
|
24133
24287
|
addClasses(newClasses);
|
@@ -30353,6 +30507,7 @@ var styleDirective = valueFn({
|
|
30353
30507
|
/**
|
30354
30508
|
* @ngdoc directive
|
30355
30509
|
* @name ngRequired
|
30510
|
+
* @restrict A
|
30356
30511
|
*
|
30357
30512
|
* @description
|
30358
30513
|
*
|