angular-gem 1.2.22 → 1.2.23

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.22
2
+ * @license AngularJS v1.2.23
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.22
2
+ * @license AngularJS v1.2.23
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.22
2
+ * @license AngularJS v1.2.23
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -69,7 +69,7 @@ function minErr(module) {
69
69
  return match;
70
70
  });
71
71
 
72
- message = message + '\nhttp://errors.angularjs.org/1.2.22/' +
72
+ message = message + '\nhttp://errors.angularjs.org/1.2.23/' +
73
73
  (module ? module + '/' : '') + code;
74
74
  for (i = 2; i < arguments.length; i++) {
75
75
  message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
@@ -194,7 +194,7 @@ function setupModuleLoader(window) {
194
194
  * @ngdoc property
195
195
  * @name angular.Module#requires
196
196
  * @module ng
197
- * @returns {Array.<string>} List of module names which must be loaded before this module.
197
+ *
198
198
  * @description
199
199
  * Holds the list of modules which the injector will load before the current module is
200
200
  * loaded.
@@ -205,8 +205,9 @@ function setupModuleLoader(window) {
205
205
  * @ngdoc property
206
206
  * @name angular.Module#name
207
207
  * @module ng
208
- * @returns {string} Name of the module.
208
+ *
209
209
  * @description
210
+ * Name of the module.
210
211
  */
211
212
  name: name,
212
213
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.22
2
+ * @license AngularJS v1.2.23
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -2003,6 +2003,7 @@ if(window.jasmine || window.mocha) {
2003
2003
  * @description
2004
2004
  *
2005
2005
  * *NOTE*: This function is also published on window for easy access.<br>
2006
+ * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or mocha
2006
2007
  *
2007
2008
  * This function registers a module configuration code. It collects the configuration information
2008
2009
  * which will be used when the injector is created by {@link angular.mock.inject inject}.
@@ -2045,6 +2046,7 @@ if(window.jasmine || window.mocha) {
2045
2046
  * @description
2046
2047
  *
2047
2048
  * *NOTE*: This function is also published on window for easy access.<br>
2049
+ * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or mocha
2048
2050
  *
2049
2051
  * The inject function wraps a function into an injectable function. The inject() creates new
2050
2052
  * instance of {@link auto.$injector $injector} per test, which is then used for
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.22
2
+ * @license AngularJS v1.2.23
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.22
2
+ * @license AngularJS v1.2.23
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.22
2
+ * @license AngularJS v1.2.23
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -597,7 +597,7 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
597
597
  */
598
598
  angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
599
599
  var LINKY_URL_REGEXP =
600
- /((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>]/,
600
+ /((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"]/,
601
601
  MAILTO_REGEXP = /^mailto:/;
602
602
 
603
603
  return function(text, target) {
@@ -9790,7 +9790,7 @@ if ( typeof module === "object" && module && typeof module.exports === "object"
9790
9790
  })( window );
9791
9791
 
9792
9792
  /**
9793
- * @license AngularJS v1.2.22
9793
+ * @license AngularJS v1.2.23
9794
9794
  * (c) 2010-2014 Google, Inc. http://angularjs.org
9795
9795
  * License: MIT
9796
9796
  */
@@ -9860,7 +9860,7 @@ function minErr(module) {
9860
9860
  return match;
9861
9861
  });
9862
9862
 
9863
- message = message + '\nhttp://errors.angularjs.org/1.2.22/' +
9863
+ message = message + '\nhttp://errors.angularjs.org/1.2.23/' +
9864
9864
  (module ? module + '/' : '') + code;
9865
9865
  for (i = 2; i < arguments.length; i++) {
9866
9866
  message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
@@ -10691,9 +10691,13 @@ function copy(source, destination, stackSource, stackDest) {
10691
10691
  }
10692
10692
  } else {
10693
10693
  var h = destination.$$hashKey;
10694
- forEach(destination, function(value, key) {
10695
- delete destination[key];
10696
- });
10694
+ if (isArray(destination)) {
10695
+ destination.length = 0;
10696
+ } else {
10697
+ forEach(destination, function(value, key) {
10698
+ delete destination[key];
10699
+ });
10700
+ }
10697
10701
  for ( var key in source) {
10698
10702
  result = copy(source[key], null, stackSource, stackDest);
10699
10703
  if (isObject(source[key])) {
@@ -10778,7 +10782,8 @@ function equals(o1, o2) {
10778
10782
  return true;
10779
10783
  }
10780
10784
  } else if (isDate(o1)) {
10781
- return isDate(o2) && o1.getTime() == o2.getTime();
10785
+ if (!isDate(o2)) return false;
10786
+ return (isNaN(o1.getTime()) && isNaN(o2.getTime())) || (o1.getTime() === o2.getTime());
10782
10787
  } else if (isRegExp(o1) && isRegExp(o2)) {
10783
10788
  return o1.toString() == o2.toString();
10784
10789
  } else {
@@ -11216,7 +11221,11 @@ function bootstrap(element, modules) {
11216
11221
 
11217
11222
  if (element.injector()) {
11218
11223
  var tag = (element[0] === document) ? 'document' : startingTag(element);
11219
- throw ngMinErr('btstrpd', "App Already Bootstrapped with this Element '{0}'", tag);
11224
+ //Encode angle brackets to prevent input from being sanitized to empty string #8683
11225
+ throw ngMinErr(
11226
+ 'btstrpd',
11227
+ "App Already Bootstrapped with this Element '{0}'",
11228
+ tag.replace(/</,'&lt;').replace(/>/,'&gt;'));
11220
11229
  }
11221
11230
 
11222
11231
  modules = modules || [];
@@ -11480,7 +11489,7 @@ function setupModuleLoader(window) {
11480
11489
  * @ngdoc property
11481
11490
  * @name angular.Module#requires
11482
11491
  * @module ng
11483
- * @returns {Array.<string>} List of module names which must be loaded before this module.
11492
+ *
11484
11493
  * @description
11485
11494
  * Holds the list of modules which the injector will load before the current module is
11486
11495
  * loaded.
@@ -11491,8 +11500,9 @@ function setupModuleLoader(window) {
11491
11500
  * @ngdoc property
11492
11501
  * @name angular.Module#name
11493
11502
  * @module ng
11494
- * @returns {string} Name of the module.
11503
+ *
11495
11504
  * @description
11505
+ * Name of the module.
11496
11506
  */
11497
11507
  name: name,
11498
11508
 
@@ -11769,11 +11779,11 @@ function setupModuleLoader(window) {
11769
11779
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
11770
11780
  */
11771
11781
  var version = {
11772
- full: '1.2.22', // all of these placeholder strings will be replaced by grunt's
11782
+ full: '1.2.23', // all of these placeholder strings will be replaced by grunt's
11773
11783
  major: 1, // package task
11774
11784
  minor: 2,
11775
- dot: 22,
11776
- codeName: 'finicky-pleasure'
11785
+ dot: 23,
11786
+ codeName: 'superficial-malady'
11777
11787
  };
11778
11788
 
11779
11789
 
@@ -14580,8 +14590,10 @@ function $BrowserProvider(){
14580
14590
  $scope.keys = [];
14581
14591
  $scope.cache = $cacheFactory('cacheId');
14582
14592
  $scope.put = function(key, value) {
14583
- $scope.cache.put(key, value);
14584
- $scope.keys.push(key);
14593
+ if ($scope.cache.get(key) === undefined) {
14594
+ $scope.keys.push(key);
14595
+ }
14596
+ $scope.cache.put(key, value === undefined ? null : value);
14585
14597
  };
14586
14598
  }]);
14587
14599
  </file>
@@ -15101,9 +15113,9 @@ function $TemplateCacheProvider() {
15101
15113
  *
15102
15114
  * * (no prefix) - Locate the required controller on the current element. Throw an error if not found.
15103
15115
  * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.
15104
- * * `^` - Locate the required controller by searching the element's parents. Throw an error if not found.
15105
- * * `?^` - Attempt to locate the required controller by searching the element's parents or pass `null` to the
15106
- * `link` fn if not found.
15116
+ * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found.
15117
+ * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass
15118
+ * `null` to the `link` fn if not found.
15107
15119
  *
15108
15120
  *
15109
15121
  * #### `controllerAs`
@@ -16921,8 +16933,10 @@ function directiveNormalize(name) {
16921
16933
  /**
16922
16934
  * @ngdoc property
16923
16935
  * @name $compile.directive.Attributes#$attr
16924
- * @returns {object} A map of DOM element attribute names to the normalized name. This is
16925
- * needed to do reverse lookup from normalized name back to actual name.
16936
+ *
16937
+ * @description
16938
+ * A map of DOM element attribute names to the normalized name. This is
16939
+ * needed to do reverse lookup from normalized name back to actual name.
16926
16940
  */
16927
16941
 
16928
16942
 
@@ -17677,7 +17691,7 @@ function $HttpProvider() {
17677
17691
  * that only JavaScript running on your domain could have sent the request. The token must be
17678
17692
  * unique for each user and must be verifiable by the server (to prevent the JavaScript from
17679
17693
  * making up its own tokens). We recommend that the token is a digest of your site's
17680
- * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography))
17694
+ * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography&#41;)
17681
17695
  * for added security.
17682
17696
  *
17683
17697
  * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName
@@ -18743,7 +18757,7 @@ function $IntervalProvider() {
18743
18757
  * };
18744
18758
  *
18745
18759
  * $scope.$on('$destroy', function() {
18746
- * // Make sure that the interval nis destroyed too
18760
+ * // Make sure that the interval is destroyed too
18747
18761
  * $scope.stopFight();
18748
18762
  * });
18749
18763
  * }])
@@ -19591,7 +19605,7 @@ function $LocationProvider(){
19591
19605
  // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx
19592
19606
  var href = elm.attr('href') || elm.attr('xlink:href');
19593
19607
 
19594
- if (href.indexOf('://') < 0) { // Ignore absolute URLs
19608
+ if (href && href.indexOf('://') < 0) { // Ignore absolute URLs
19595
19609
  var prefix = '#' + hashPrefix;
19596
19610
  if (href[0] == '/') {
19597
19611
  // absolute path - replace old path
@@ -19603,6 +19617,7 @@ function $LocationProvider(){
19603
19617
  // relative path - join with current path
19604
19618
  var stack = $location.path().split("/"),
19605
19619
  parts = href.split("/");
19620
+ if (stack.length === 2 && !stack[1]) stack.length = 1;
19606
19621
  for (var i=0; i<parts.length; i++) {
19607
19622
  if (parts[i] == ".")
19608
19623
  continue;
@@ -22795,7 +22810,7 @@ function $RootScopeProvider(){
22795
22810
  */
22796
22811
  function $$SanitizeUriProvider() {
22797
22812
  var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/,
22798
- imgSrcSanitizationWhitelist = /^\s*(https?|ftp|file):|data:image\//;
22813
+ imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file):|data:image\/)/;
22799
22814
 
22800
22815
  /**
22801
22816
  * @description
@@ -25235,9 +25250,13 @@ function limitToFilter(){
25235
25250
  *
25236
25251
  * - `function`: Getter function. The result of this function will be sorted using the
25237
25252
  * `<`, `=`, `>` operator.
25238
- * - `string`: An Angular expression which evaluates to an object to order by, such as 'name'
25239
- * to sort by a property called 'name'. Optionally prefixed with `+` or `-` to control
25240
- * ascending or descending sort order (for example, +name or -name).
25253
+ * - `string`: An Angular expression. The result of this expression is used to compare elements
25254
+ * (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by
25255
+ * 3 first characters of a property called `name`). The result of a constant expression
25256
+ * is interpreted as a property name to be used in comparisons (for example `"special name"`
25257
+ * to sort object by the value of their `special name` property). An expression can be
25258
+ * optionally prefixed with `+` or `-` to control ascending or descending sort order
25259
+ * (for example, `+name` or `-name`).
25241
25260
  * - `Array`: An array of function or string predicates. The first predicate in the array
25242
25261
  * is used for sorting, but when two items are equivalent, the next predicate is used.
25243
25262
  *
@@ -25605,7 +25624,7 @@ var htmlAnchorDirective = valueFn({
25605
25624
  *
25606
25625
  * @description
25607
25626
  *
25608
- * The following markup will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:
25627
+ * We shouldn't do this, because it will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:
25609
25628
  * ```html
25610
25629
  * <div ng-init="scope = { isDisabled: false }">
25611
25630
  * <button disabled="{{scope.isDisabled}}">Disabled</button>
@@ -25825,8 +25844,12 @@ forEach(['src', 'srcset', 'href'], function(attrName) {
25825
25844
  }
25826
25845
 
25827
25846
  attr.$observe(normalized, function(value) {
25828
- if (!value)
25829
- return;
25847
+ if (!value) {
25848
+ if (attrName === 'href') {
25849
+ attr.$set(name, null);
25850
+ }
25851
+ return;
25852
+ }
25830
25853
 
25831
25854
  attr.$set(name, value);
25832
25855
 
@@ -26284,7 +26307,9 @@ var inputType = {
26284
26307
  * @name input[text]
26285
26308
  *
26286
26309
  * @description
26287
- * Standard HTML text input with angular data binding.
26310
+ * Standard HTML text input with angular data binding, inherited by most of the `input` elements.
26311
+ *
26312
+ * *NOTE* Not every feature offered is available for all input types.
26288
26313
  *
26289
26314
  * @param {string} ngModel Assignable angular expression to data-bind to.
26290
26315
  * @param {string=} name Property name of the form under which the control is published.
@@ -26302,6 +26327,8 @@ var inputType = {
26302
26327
  * @param {string=} ngChange Angular expression to be executed when input changes due to user
26303
26328
  * interaction with the input element.
26304
26329
  * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
26330
+ * This parameter is ignored for input[type=password] controls, which will never trim the
26331
+ * input.
26305
26332
  *
26306
26333
  * @example
26307
26334
  <example name="text-input-directive" module="textInputExample">
@@ -26741,6 +26768,7 @@ function addNativeHtml5Validators(ctrl, validatorName, badFlags, ignoreFlags, va
26741
26768
  function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
26742
26769
  var validity = element.prop(VALIDITY_STATE_PROPERTY);
26743
26770
  var placeholder = element[0].placeholder, noevent = {};
26771
+ var type = lowercase(element[0].type);
26744
26772
  ctrl.$$validityState = validity;
26745
26773
 
26746
26774
  // In composition mode, users are still inputing intermediate text buffer,
@@ -26774,8 +26802,8 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
26774
26802
 
26775
26803
  // By default we will trim the value
26776
26804
  // If the attribute ng-trim exists we will avoid trimming
26777
- // e.g. <input ng-model="foo" ng-trim="false">
26778
- if (toBoolean(attr.ngTrim || 'T')) {
26805
+ // If input type is 'password', the value is never trimmed
26806
+ if (type !== 'password' && (toBoolean(attr.ngTrim || 'T'))) {
26779
26807
  value = trim(value);
26780
26808
  }
26781
26809
 
@@ -27050,6 +27078,8 @@ function checkboxInputType(scope, element, attr, ctrl) {
27050
27078
  * HTML input element control with angular data-binding. Input control follows HTML5 input types
27051
27079
  * and polyfills the HTML5 validation behavior for older browsers.
27052
27080
  *
27081
+ * *NOTE* Not every feature offered is available for all input types.
27082
+ *
27053
27083
  * @param {string} ngModel Assignable angular expression to data-bind to.
27054
27084
  * @param {string=} name Property name of the form under which the control is published.
27055
27085
  * @param {string=} required Sets `required` validation error key if the value is not entered.
@@ -27063,6 +27093,9 @@ function checkboxInputType(scope, element, attr, ctrl) {
27063
27093
  * patterns defined as scope expressions.
27064
27094
  * @param {string=} ngChange Angular expression to be executed when input changes due to user
27065
27095
  * interaction with the input element.
27096
+ * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
27097
+ * This parameter is ignored for input[type=password] controls, which will never trim the
27098
+ * input.
27066
27099
  *
27067
27100
  * @example
27068
27101
  <example name="input-directive" module="inputExample">
@@ -28052,7 +28085,6 @@ var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
28052
28085
  * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.
28053
28086
  *
28054
28087
  * @example
28055
- Try it here: enter text in text box and watch the greeting change.
28056
28088
 
28057
28089
  <example module="bindHtmlExample" deps="angular-sanitize.js">
28058
28090
  <file name="index.html">
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.22
2
+ * @license AngularJS v1.2.23
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.22
2
+ * @license AngularJS v1.2.23
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -68,7 +68,7 @@ function minErr(module) {
68
68
  return match;
69
69
  });
70
70
 
71
- message = message + '\nhttp://errors.angularjs.org/1.2.22/' +
71
+ message = message + '\nhttp://errors.angularjs.org/1.2.23/' +
72
72
  (module ? module + '/' : '') + code;
73
73
  for (i = 2; i < arguments.length; i++) {
74
74
  message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
@@ -899,9 +899,13 @@ function copy(source, destination, stackSource, stackDest) {
899
899
  }
900
900
  } else {
901
901
  var h = destination.$$hashKey;
902
- forEach(destination, function(value, key) {
903
- delete destination[key];
904
- });
902
+ if (isArray(destination)) {
903
+ destination.length = 0;
904
+ } else {
905
+ forEach(destination, function(value, key) {
906
+ delete destination[key];
907
+ });
908
+ }
905
909
  for ( var key in source) {
906
910
  result = copy(source[key], null, stackSource, stackDest);
907
911
  if (isObject(source[key])) {
@@ -986,7 +990,8 @@ function equals(o1, o2) {
986
990
  return true;
987
991
  }
988
992
  } else if (isDate(o1)) {
989
- return isDate(o2) && o1.getTime() == o2.getTime();
993
+ if (!isDate(o2)) return false;
994
+ return (isNaN(o1.getTime()) && isNaN(o2.getTime())) || (o1.getTime() === o2.getTime());
990
995
  } else if (isRegExp(o1) && isRegExp(o2)) {
991
996
  return o1.toString() == o2.toString();
992
997
  } else {
@@ -1424,7 +1429,11 @@ function bootstrap(element, modules) {
1424
1429
 
1425
1430
  if (element.injector()) {
1426
1431
  var tag = (element[0] === document) ? 'document' : startingTag(element);
1427
- throw ngMinErr('btstrpd', "App Already Bootstrapped with this Element '{0}'", tag);
1432
+ //Encode angle brackets to prevent input from being sanitized to empty string #8683
1433
+ throw ngMinErr(
1434
+ 'btstrpd',
1435
+ "App Already Bootstrapped with this Element '{0}'",
1436
+ tag.replace(/</,'&lt;').replace(/>/,'&gt;'));
1428
1437
  }
1429
1438
 
1430
1439
  modules = modules || [];
@@ -1688,7 +1697,7 @@ function setupModuleLoader(window) {
1688
1697
  * @ngdoc property
1689
1698
  * @name angular.Module#requires
1690
1699
  * @module ng
1691
- * @returns {Array.<string>} List of module names which must be loaded before this module.
1700
+ *
1692
1701
  * @description
1693
1702
  * Holds the list of modules which the injector will load before the current module is
1694
1703
  * loaded.
@@ -1699,8 +1708,9 @@ function setupModuleLoader(window) {
1699
1708
  * @ngdoc property
1700
1709
  * @name angular.Module#name
1701
1710
  * @module ng
1702
- * @returns {string} Name of the module.
1711
+ *
1703
1712
  * @description
1713
+ * Name of the module.
1704
1714
  */
1705
1715
  name: name,
1706
1716
 
@@ -1977,11 +1987,11 @@ function setupModuleLoader(window) {
1977
1987
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
1978
1988
  */
1979
1989
  var version = {
1980
- full: '1.2.22', // all of these placeholder strings will be replaced by grunt's
1990
+ full: '1.2.23', // all of these placeholder strings will be replaced by grunt's
1981
1991
  major: 1, // package task
1982
1992
  minor: 2,
1983
- dot: 22,
1984
- codeName: 'finicky-pleasure'
1993
+ dot: 23,
1994
+ codeName: 'superficial-malady'
1985
1995
  };
1986
1996
 
1987
1997
 
@@ -4788,8 +4798,10 @@ function $BrowserProvider(){
4788
4798
  $scope.keys = [];
4789
4799
  $scope.cache = $cacheFactory('cacheId');
4790
4800
  $scope.put = function(key, value) {
4791
- $scope.cache.put(key, value);
4792
- $scope.keys.push(key);
4801
+ if ($scope.cache.get(key) === undefined) {
4802
+ $scope.keys.push(key);
4803
+ }
4804
+ $scope.cache.put(key, value === undefined ? null : value);
4793
4805
  };
4794
4806
  }]);
4795
4807
  </file>
@@ -5309,9 +5321,9 @@ function $TemplateCacheProvider() {
5309
5321
  *
5310
5322
  * * (no prefix) - Locate the required controller on the current element. Throw an error if not found.
5311
5323
  * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.
5312
- * * `^` - Locate the required controller by searching the element's parents. Throw an error if not found.
5313
- * * `?^` - Attempt to locate the required controller by searching the element's parents or pass `null` to the
5314
- * `link` fn if not found.
5324
+ * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found.
5325
+ * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass
5326
+ * `null` to the `link` fn if not found.
5315
5327
  *
5316
5328
  *
5317
5329
  * #### `controllerAs`
@@ -7129,8 +7141,10 @@ function directiveNormalize(name) {
7129
7141
  /**
7130
7142
  * @ngdoc property
7131
7143
  * @name $compile.directive.Attributes#$attr
7132
- * @returns {object} A map of DOM element attribute names to the normalized name. This is
7133
- * needed to do reverse lookup from normalized name back to actual name.
7144
+ *
7145
+ * @description
7146
+ * A map of DOM element attribute names to the normalized name. This is
7147
+ * needed to do reverse lookup from normalized name back to actual name.
7134
7148
  */
7135
7149
 
7136
7150
 
@@ -7885,7 +7899,7 @@ function $HttpProvider() {
7885
7899
  * that only JavaScript running on your domain could have sent the request. The token must be
7886
7900
  * unique for each user and must be verifiable by the server (to prevent the JavaScript from
7887
7901
  * making up its own tokens). We recommend that the token is a digest of your site's
7888
- * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography))
7902
+ * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography&#41;)
7889
7903
  * for added security.
7890
7904
  *
7891
7905
  * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName
@@ -8951,7 +8965,7 @@ function $IntervalProvider() {
8951
8965
  * };
8952
8966
  *
8953
8967
  * $scope.$on('$destroy', function() {
8954
- * // Make sure that the interval nis destroyed too
8968
+ * // Make sure that the interval is destroyed too
8955
8969
  * $scope.stopFight();
8956
8970
  * });
8957
8971
  * }])
@@ -9799,7 +9813,7 @@ function $LocationProvider(){
9799
9813
  // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx
9800
9814
  var href = elm.attr('href') || elm.attr('xlink:href');
9801
9815
 
9802
- if (href.indexOf('://') < 0) { // Ignore absolute URLs
9816
+ if (href && href.indexOf('://') < 0) { // Ignore absolute URLs
9803
9817
  var prefix = '#' + hashPrefix;
9804
9818
  if (href[0] == '/') {
9805
9819
  // absolute path - replace old path
@@ -9811,6 +9825,7 @@ function $LocationProvider(){
9811
9825
  // relative path - join with current path
9812
9826
  var stack = $location.path().split("/"),
9813
9827
  parts = href.split("/");
9828
+ if (stack.length === 2 && !stack[1]) stack.length = 1;
9814
9829
  for (var i=0; i<parts.length; i++) {
9815
9830
  if (parts[i] == ".")
9816
9831
  continue;
@@ -13003,7 +13018,7 @@ function $RootScopeProvider(){
13003
13018
  */
13004
13019
  function $$SanitizeUriProvider() {
13005
13020
  var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/,
13006
- imgSrcSanitizationWhitelist = /^\s*(https?|ftp|file):|data:image\//;
13021
+ imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file):|data:image\/)/;
13007
13022
 
13008
13023
  /**
13009
13024
  * @description
@@ -15443,9 +15458,13 @@ function limitToFilter(){
15443
15458
  *
15444
15459
  * - `function`: Getter function. The result of this function will be sorted using the
15445
15460
  * `<`, `=`, `>` operator.
15446
- * - `string`: An Angular expression which evaluates to an object to order by, such as 'name'
15447
- * to sort by a property called 'name'. Optionally prefixed with `+` or `-` to control
15448
- * ascending or descending sort order (for example, +name or -name).
15461
+ * - `string`: An Angular expression. The result of this expression is used to compare elements
15462
+ * (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by
15463
+ * 3 first characters of a property called `name`). The result of a constant expression
15464
+ * is interpreted as a property name to be used in comparisons (for example `"special name"`
15465
+ * to sort object by the value of their `special name` property). An expression can be
15466
+ * optionally prefixed with `+` or `-` to control ascending or descending sort order
15467
+ * (for example, `+name` or `-name`).
15449
15468
  * - `Array`: An array of function or string predicates. The first predicate in the array
15450
15469
  * is used for sorting, but when two items are equivalent, the next predicate is used.
15451
15470
  *
@@ -15813,7 +15832,7 @@ var htmlAnchorDirective = valueFn({
15813
15832
  *
15814
15833
  * @description
15815
15834
  *
15816
- * The following markup will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:
15835
+ * We shouldn't do this, because it will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:
15817
15836
  * ```html
15818
15837
  * <div ng-init="scope = { isDisabled: false }">
15819
15838
  * <button disabled="{{scope.isDisabled}}">Disabled</button>
@@ -16033,8 +16052,12 @@ forEach(['src', 'srcset', 'href'], function(attrName) {
16033
16052
  }
16034
16053
 
16035
16054
  attr.$observe(normalized, function(value) {
16036
- if (!value)
16037
- return;
16055
+ if (!value) {
16056
+ if (attrName === 'href') {
16057
+ attr.$set(name, null);
16058
+ }
16059
+ return;
16060
+ }
16038
16061
 
16039
16062
  attr.$set(name, value);
16040
16063
 
@@ -16492,7 +16515,9 @@ var inputType = {
16492
16515
  * @name input[text]
16493
16516
  *
16494
16517
  * @description
16495
- * Standard HTML text input with angular data binding.
16518
+ * Standard HTML text input with angular data binding, inherited by most of the `input` elements.
16519
+ *
16520
+ * *NOTE* Not every feature offered is available for all input types.
16496
16521
  *
16497
16522
  * @param {string} ngModel Assignable angular expression to data-bind to.
16498
16523
  * @param {string=} name Property name of the form under which the control is published.
@@ -16510,6 +16535,8 @@ var inputType = {
16510
16535
  * @param {string=} ngChange Angular expression to be executed when input changes due to user
16511
16536
  * interaction with the input element.
16512
16537
  * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
16538
+ * This parameter is ignored for input[type=password] controls, which will never trim the
16539
+ * input.
16513
16540
  *
16514
16541
  * @example
16515
16542
  <example name="text-input-directive" module="textInputExample">
@@ -16949,6 +16976,7 @@ function addNativeHtml5Validators(ctrl, validatorName, badFlags, ignoreFlags, va
16949
16976
  function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
16950
16977
  var validity = element.prop(VALIDITY_STATE_PROPERTY);
16951
16978
  var placeholder = element[0].placeholder, noevent = {};
16979
+ var type = lowercase(element[0].type);
16952
16980
  ctrl.$$validityState = validity;
16953
16981
 
16954
16982
  // In composition mode, users are still inputing intermediate text buffer,
@@ -16982,8 +17010,8 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
16982
17010
 
16983
17011
  // By default we will trim the value
16984
17012
  // If the attribute ng-trim exists we will avoid trimming
16985
- // e.g. <input ng-model="foo" ng-trim="false">
16986
- if (toBoolean(attr.ngTrim || 'T')) {
17013
+ // If input type is 'password', the value is never trimmed
17014
+ if (type !== 'password' && (toBoolean(attr.ngTrim || 'T'))) {
16987
17015
  value = trim(value);
16988
17016
  }
16989
17017
 
@@ -17258,6 +17286,8 @@ function checkboxInputType(scope, element, attr, ctrl) {
17258
17286
  * HTML input element control with angular data-binding. Input control follows HTML5 input types
17259
17287
  * and polyfills the HTML5 validation behavior for older browsers.
17260
17288
  *
17289
+ * *NOTE* Not every feature offered is available for all input types.
17290
+ *
17261
17291
  * @param {string} ngModel Assignable angular expression to data-bind to.
17262
17292
  * @param {string=} name Property name of the form under which the control is published.
17263
17293
  * @param {string=} required Sets `required` validation error key if the value is not entered.
@@ -17271,6 +17301,9 @@ function checkboxInputType(scope, element, attr, ctrl) {
17271
17301
  * patterns defined as scope expressions.
17272
17302
  * @param {string=} ngChange Angular expression to be executed when input changes due to user
17273
17303
  * interaction with the input element.
17304
+ * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
17305
+ * This parameter is ignored for input[type=password] controls, which will never trim the
17306
+ * input.
17274
17307
  *
17275
17308
  * @example
17276
17309
  <example name="input-directive" module="inputExample">
@@ -18260,7 +18293,6 @@ var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
18260
18293
  * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.
18261
18294
  *
18262
18295
  * @example
18263
- Try it here: enter text in text box and watch the greeting change.
18264
18296
 
18265
18297
  <example module="bindHtmlExample" deps="angular-sanitize.js">
18266
18298
  <file name="index.html">