angular-gem 1.2.22 → 1.2.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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">