angular-gem 1.2.14 → 1.2.15

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.14
2
+ * @license AngularJS v1.2.15
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -259,7 +259,7 @@ function htmlParser( html, handler ) {
259
259
  match = html.match( DOCTYPE_REGEXP );
260
260
 
261
261
  if ( match ) {
262
- html = html.replace( match[0] , '');
262
+ html = html.replace( match[0], '');
263
263
  chars = false;
264
264
  }
265
265
  // end tag
@@ -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.14
9793
+ * @license AngularJS v1.2.15
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.14/' +
9863
+ message = message + '\nhttp://errors.angularjs.org/1.2.15/' +
9864
9864
  (module ? module + '/' : '') + code;
9865
9865
  for (i = 2; i < arguments.length; i++) {
9866
9866
  message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
@@ -9916,6 +9916,7 @@ function minErr(module) {
9916
9916
  -isWindow,
9917
9917
  -isScope,
9918
9918
  -isFile,
9919
+ -isBlob,
9919
9920
  -isBoolean,
9920
9921
  -trim,
9921
9922
  -isElement,
@@ -10437,6 +10438,11 @@ function isFile(obj) {
10437
10438
  }
10438
10439
 
10439
10440
 
10441
+ function isBlob(obj) {
10442
+ return toString.call(obj) === '[object Blob]';
10443
+ }
10444
+
10445
+
10440
10446
  function isBoolean(value) {
10441
10447
  return typeof value === 'boolean';
10442
10448
  }
@@ -11106,6 +11112,41 @@ function angularInit(element, bootstrap) {
11106
11112
  * Note that ngScenario-based end-to-end tests cannot use this function to bootstrap manually.
11107
11113
  * They must use {@link ng.directive:ngApp ngApp}.
11108
11114
  *
11115
+ * Angular will detect if it has been loaded into the browser more than once and only allow the
11116
+ * first loaded script to be bootstrapped and will report a warning to the browser console for
11117
+ * each of the subsequent scripts. This prevents strange results in applications, where otherwise
11118
+ * multiple instances of Angular try to work on the DOM.
11119
+ *
11120
+ * <example name="multi-bootstrap" module="multi-bootstrap">
11121
+ * <file name="index.html">
11122
+ * <script src="../../../angular.js"></script>
11123
+ * <div ng-controller="BrokenTable">
11124
+ * <table>
11125
+ * <tr>
11126
+ * <th ng-repeat="heading in headings">{{heading}}</th>
11127
+ * </tr>
11128
+ * <tr ng-repeat="filling in fillings">
11129
+ * <td ng-repeat="fill in filling">{{fill}}</td>
11130
+ * </tr>
11131
+ * </table>
11132
+ * </div>
11133
+ * </file>
11134
+ * <file name="controller.js">
11135
+ * var app = angular.module('multi-bootstrap', [])
11136
+ *
11137
+ * .controller('BrokenTable', function($scope) {
11138
+ * $scope.headings = ['One', 'Two', 'Three'];
11139
+ * $scope.fillings = [[1, 2, 3], ['A', 'B', 'C'], [7, 8, 9]];
11140
+ * });
11141
+ * </file>
11142
+ * <file name="protractor.js" type="protractor">
11143
+ * it('should only insert one table cell for each item in $scope.fillings', function() {
11144
+ * expect(element.all(by.css('td')).count())
11145
+ * .toBe(9);
11146
+ * });
11147
+ * </file>
11148
+ * </example>
11149
+ *
11109
11150
  * @param {Element} element DOM element which is the root of angular application.
11110
11151
  * @param {Array<String|Function|Array>=} modules an array of modules to load into the application.
11111
11152
  * Each item in the array should be the name of a predefined module or a (DI annotated)
@@ -11323,16 +11364,16 @@ function setupModuleLoader(window) {
11323
11364
  * myModule.value('appName', 'MyCoolApp');
11324
11365
  *
11325
11366
  * // configure existing services inside initialization blocks.
11326
- * myModule.config(function($locationProvider) {
11367
+ * myModule.config(['$locationProvider', function($locationProvider) {
11327
11368
  * // Configure existing providers
11328
11369
  * $locationProvider.hashPrefix('!');
11329
- * });
11370
+ * }]);
11330
11371
  * ```
11331
11372
  *
11332
11373
  * Then you can create an injector and load your modules like this:
11333
11374
  *
11334
11375
  * ```js
11335
- * var injector = angular.injector(['ng', 'MyModule'])
11376
+ * var injector = angular.injector(['ng', 'myModule'])
11336
11377
  * ```
11337
11378
  *
11338
11379
  * However it's more likely that you'll just use
@@ -11341,7 +11382,7 @@ function setupModuleLoader(window) {
11341
11382
  *
11342
11383
  * @param {!string} name The name of the module to create or retrieve.
11343
11384
  * @param {Array.<string>=} requires If specified then new module is being created. If
11344
- * unspecified then the the module is being retrieved for further configuration.
11385
+ * unspecified then the module is being retrieved for further configuration.
11345
11386
  * @param {Function} configFn Optional configuration function for the module. Same as
11346
11387
  * {@link angular.Module#config Module#config()}.
11347
11388
  * @returns {module} new module with the {@link angular.Module} api.
@@ -11382,7 +11423,6 @@ function setupModuleLoader(window) {
11382
11423
  * @ngdoc property
11383
11424
  * @name angular.Module#requires
11384
11425
  * @module ng
11385
- * @propertyOf angular.Module
11386
11426
  * @returns {Array.<string>} List of module names which must be loaded before this module.
11387
11427
  * @description
11388
11428
  * Holds the list of modules which the injector will load before the current module is
@@ -11394,7 +11434,6 @@ function setupModuleLoader(window) {
11394
11434
  * @ngdoc property
11395
11435
  * @name angular.Module#name
11396
11436
  * @module ng
11397
- * @propertyOf angular.Module
11398
11437
  * @returns {string} Name of the module.
11399
11438
  * @description
11400
11439
  */
@@ -11672,11 +11711,11 @@ function setupModuleLoader(window) {
11672
11711
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
11673
11712
  */
11674
11713
  var version = {
11675
- full: '1.2.14', // all of these placeholder strings will be replaced by grunt's
11714
+ full: '1.2.15', // all of these placeholder strings will be replaced by grunt's
11676
11715
  major: 1, // package task
11677
11716
  minor: 2,
11678
- dot: 14,
11679
- codeName: 'feisty-cryokinesis'
11717
+ dot: 15,
11718
+ codeName: 'beer-underestimating'
11680
11719
  };
11681
11720
 
11682
11721
 
@@ -12164,11 +12203,15 @@ function jqLiteInheritedData(element, name, value) {
12164
12203
  var names = isArray(name) ? name : [name];
12165
12204
 
12166
12205
  while (element.length) {
12167
-
12206
+ var node = element[0];
12168
12207
  for (var i = 0, ii = names.length; i < ii; i++) {
12169
12208
  if ((value = element.data(names[i])) !== undefined) return value;
12170
12209
  }
12171
- element = element.parent();
12210
+
12211
+ // If dealing with a document fragment node with a host element, and no parent, use the host
12212
+ // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM
12213
+ // to lookup parent controllers.
12214
+ element = jqLite(node.parentNode || (node.nodeType === 11 && node.host));
12172
12215
  }
12173
12216
  }
12174
12217
 
@@ -12257,7 +12300,7 @@ forEach({
12257
12300
  return jqLite(element).data('$isolateScope') || jqLite(element).data('$isolateScopeNoTemplate');
12258
12301
  },
12259
12302
 
12260
- controller: jqLiteController ,
12303
+ controller: jqLiteController,
12261
12304
 
12262
12305
  injector: function(element) {
12263
12306
  return jqLiteInheritedData(element, '$injector');
@@ -14130,7 +14173,6 @@ function Browser(window, document, $log, $sniffer) {
14130
14173
 
14131
14174
  /**
14132
14175
  * @name $browser#onUrlChange
14133
- * @TODO(vojta): refactor to use node's syntax for events
14134
14176
  *
14135
14177
  * @description
14136
14178
  * Register callback function that will be called, when url changes.
@@ -14151,6 +14193,7 @@ function Browser(window, document, $log, $sniffer) {
14151
14193
  * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.
14152
14194
  */
14153
14195
  self.onUrlChange = function(callback) {
14196
+ // TODO(vojta): refactor to use node's syntax for events
14154
14197
  if (!urlChangeInit) {
14155
14198
  // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)
14156
14199
  // don't fire popstate when user change the address bar and don't fire hashchange when url
@@ -14527,15 +14570,11 @@ function $CacheFactoryProvider() {
14527
14570
  * `$templateCache` service directly.
14528
14571
  *
14529
14572
  * Adding via the `script` tag:
14573
+ *
14530
14574
  * ```html
14531
- * <html ng-app>
14532
- * <head>
14533
- * <script type="text/ng-template" id="templateId.html">
14534
- * This is the content of the template
14535
- * </script>
14536
- * </head>
14537
- * ...
14538
- * </html>
14575
+ * <script type="text/ng-template" id="templateId.html">
14576
+ * <p>This is the content of the template</p>
14577
+ * </script>
14539
14578
  * ```
14540
14579
  *
14541
14580
  * **Note:** the `script` tag containing the template does not need to be included in the `head` of
@@ -15072,7 +15111,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
15072
15111
  Suffix = 'Directive',
15073
15112
  COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,
15074
15113
  CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/,
15075
- TABLE_CONTENT_REGEXP = /^<\s*(tr|th|td|tbody)(\s+[^>]*)?>/i;
15114
+ TABLE_CONTENT_REGEXP = /^<\s*(tr|th|td|thead|tbody|tfoot)(\s+[^>]*)?>/i;
15076
15115
 
15077
15116
  // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes
15078
15117
  // The assumption is that future DOM event attribute names will begin with
@@ -16218,16 +16257,15 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16218
16257
  template = trim(template);
16219
16258
  if ((type = TABLE_CONTENT_REGEXP.exec(template))) {
16220
16259
  type = type[1].toLowerCase();
16221
- var table = jqLite('<table>' + template + '</table>'),
16222
- tbody = table.children('tbody'),
16223
- leaf = /(td|th)/.test(type) && table.find('tr');
16224
- if (tbody.length && type !== 'tbody') {
16225
- table = tbody;
16260
+ var table = jqLite('<table>' + template + '</table>');
16261
+ if (/(thead|tbody|tfoot)/.test(type)) {
16262
+ return table.children(type);
16226
16263
  }
16227
- if (leaf && leaf.length) {
16228
- table = leaf;
16264
+ table = table.children('tbody');
16265
+ if (type === 'tr') {
16266
+ return table.children('tr');
16229
16267
  }
16230
- return table.contents();
16268
+ return table.children('tr').contents();
16231
16269
  }
16232
16270
  return jqLite('<div>' +
16233
16271
  template +
@@ -16697,6 +16735,22 @@ function $ControllerProvider() {
16697
16735
  *
16698
16736
  * @description
16699
16737
  * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object.
16738
+ *
16739
+ * @example
16740
+ <example>
16741
+ <file name="index.html">
16742
+ <div ng-controller="MainCtrl">
16743
+ <p>$document title: <b ng-bind="title"></b></p>
16744
+ <p>window.document title: <b ng-bind="windowTitle"></b></p>
16745
+ </div>
16746
+ </file>
16747
+ <file name="script.js">
16748
+ function MainCtrl($scope, $document) {
16749
+ $scope.title = $document[0].title;
16750
+ $scope.windowTitle = angular.element(window.document)[0].title;
16751
+ }
16752
+ </file>
16753
+ </example>
16700
16754
  */
16701
16755
  function $DocumentProvider(){
16702
16756
  this.$get = ['$window', function(window){
@@ -16847,7 +16901,7 @@ function $HttpProvider() {
16847
16901
 
16848
16902
  // transform outgoing request data
16849
16903
  transformRequest: [function(d) {
16850
- return isObject(d) && !isFile(d) ? toJson(d) : d;
16904
+ return isObject(d) && !isFile(d) && !isBlob(d) ? toJson(d) : d;
16851
16905
  }],
16852
16906
 
16853
16907
  // default headers
@@ -16980,9 +17034,8 @@ function $HttpProvider() {
16980
17034
  *
16981
17035
  * # Shortcut methods
16982
17036
  *
16983
- * Since all invocations of the $http service require passing in an HTTP method and URL, and
16984
- * POST/PUT requests require request data to be provided as well, shortcut methods
16985
- * were created:
17037
+ * Shortcut methods are also available. All shortcut methods require passing in the URL, and
17038
+ * request data must be passed in for POST/PUT requests.
16986
17039
  *
16987
17040
  * ```js
16988
17041
  * $http.get('/someUrl').success(successCallback);
@@ -17317,7 +17370,7 @@ function $HttpProvider() {
17317
17370
  * - **headers** – `{function([headerName])}` – Header getter function.
17318
17371
  * - **config** – `{Object}` – The configuration object that was used to generate the request.
17319
17372
  *
17320
- * @property {Array.&ltObject&gt;} pendingRequests Array of config objects for currently pending
17373
+ * @property {Array.<Object>} pendingRequests Array of config objects for currently pending
17321
17374
  * requests. This is primarily meant to be used for debugging purposes.
17322
17375
  *
17323
17376
  *
@@ -17619,7 +17672,6 @@ function $HttpProvider() {
17619
17672
  /**
17620
17673
  * @ngdoc property
17621
17674
  * @name $http#defaults
17622
- * @propertyOf ng.$http
17623
17675
  *
17624
17676
  * @description
17625
17677
  * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of
@@ -17924,9 +17976,11 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
17924
17976
  jsonpDone = xhr = null;
17925
17977
 
17926
17978
  // fix status code when it is 0 (0 status is undocumented).
17927
- // Occurs when accessing file resources.
17928
- // On Android 4.1 stock browser it occurs while retrieving files from application cache.
17929
- status = (status === 0) ? (response ? 200 : 404) : status;
17979
+ // Occurs when accessing file resources or on Android 4.1 stock browser
17980
+ // while retrieving files from application cache.
17981
+ if (status === 0) {
17982
+ status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0;
17983
+ }
17930
17984
 
17931
17985
  // normalize IE bug (http://bugs.jquery.com/ticket/1450)
17932
17986
  status = status == 1223 ? 204 : status;
@@ -18370,7 +18424,7 @@ function $IntervalProvider() {
18370
18424
  * @description
18371
18425
  * Cancels a task associated with the `promise`.
18372
18426
  *
18373
- * @param {number} promise Promise returned by the `$interval` function.
18427
+ * @param {promise} promise returned by the `$interval` function.
18374
18428
  * @returns {boolean} Returns `true` if the task was successfully canceled.
18375
18429
  */
18376
18430
  interval.cancel = function(promise) {
@@ -20696,7 +20750,7 @@ function $ParseProvider() {
20696
20750
  *
20697
20751
  * Because `finally` is a reserved word in JavaScript and reserved keywords are not supported as
20698
20752
  * property names by ES3, you'll need to invoke the method like `promise['finally'](callback)` to
20699
- * make your code IE8 compatible.
20753
+ * make your code IE8 and Android 2.x compatible.
20700
20754
  *
20701
20755
  * # Chaining promises
20702
20756
  *
@@ -21109,21 +21163,32 @@ function qFactory(nextTick, exceptionHandler) {
21109
21163
  }
21110
21164
 
21111
21165
  function $$RAFProvider(){ //rAF
21112
- this.$get = ['$window', function($window) {
21166
+ this.$get = ['$window', '$timeout', function($window, $timeout) {
21113
21167
  var requestAnimationFrame = $window.requestAnimationFrame ||
21114
- $window.webkitRequestAnimationFrame;
21168
+ $window.webkitRequestAnimationFrame ||
21169
+ $window.mozRequestAnimationFrame;
21115
21170
 
21116
21171
  var cancelAnimationFrame = $window.cancelAnimationFrame ||
21117
- $window.webkitCancelAnimationFrame;
21118
-
21119
- var raf = function(fn) {
21120
- var id = requestAnimationFrame(fn);
21121
- return function() {
21122
- cancelAnimationFrame(id);
21123
- };
21124
- };
21172
+ $window.webkitCancelAnimationFrame ||
21173
+ $window.mozCancelAnimationFrame ||
21174
+ $window.webkitCancelRequestAnimationFrame;
21175
+
21176
+ var rafSupported = !!requestAnimationFrame;
21177
+ var raf = rafSupported
21178
+ ? function(fn) {
21179
+ var id = requestAnimationFrame(fn);
21180
+ return function() {
21181
+ cancelAnimationFrame(id);
21182
+ };
21183
+ }
21184
+ : function(fn) {
21185
+ var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666
21186
+ return function() {
21187
+ $timeout.cancel(timer);
21188
+ };
21189
+ };
21125
21190
 
21126
- raf.supported = !!requestAnimationFrame;
21191
+ raf.supported = rafSupported;
21127
21192
 
21128
21193
  return raf;
21129
21194
  }];
@@ -21268,7 +21333,6 @@ function $RootScopeProvider(){
21268
21333
  /**
21269
21334
  * @ngdoc property
21270
21335
  * @name $rootScope.Scope#$id
21271
- * @propertyOf ng.$rootScope.Scope
21272
21336
  * @returns {number} Unique scope ID (monotonically increasing alphanumeric sequence) useful for
21273
21337
  * debugging.
21274
21338
  */
@@ -21528,30 +21592,40 @@ function $RootScopeProvider(){
21528
21592
  * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the
21529
21593
  * collection will trigger a call to the `listener`.
21530
21594
  *
21531
- * @param {function(newCollection, oldCollection, scope)} listener a callback function that is
21532
- * fired with both the `newCollection` and `oldCollection` as parameters.
21533
- * The `newCollection` object is the newly modified data obtained from the `obj` expression
21534
- * and the `oldCollection` object is a copy of the former collection data.
21535
- * The `scope` refers to the current scope.
21595
+ * @param {function(newCollection, oldCollection, scope)} listener a callback function called
21596
+ * when a change is detected.
21597
+ * - The `newCollection` object is the newly modified data obtained from the `obj` expression
21598
+ * - The `oldCollection` object is a copy of the former collection data.
21599
+ * Due to performance considerations, the`oldCollection` value is computed only if the
21600
+ * `listener` function declares two or more arguments.
21601
+ * - The `scope` argument refers to the current scope.
21536
21602
  *
21537
21603
  * @returns {function()} Returns a de-registration function for this listener. When the
21538
21604
  * de-registration function is executed, the internal watch operation is terminated.
21539
21605
  */
21540
21606
  $watchCollection: function(obj, listener) {
21541
21607
  var self = this;
21542
- var oldValue;
21608
+ // the current value, updated on each dirty-check run
21543
21609
  var newValue;
21610
+ // a shallow copy of the newValue from the last dirty-check run,
21611
+ // updated to match newValue during dirty-check run
21612
+ var oldValue;
21613
+ // a shallow copy of the newValue from when the last change happened
21614
+ var veryOldValue;
21615
+ // only track veryOldValue if the listener is asking for it
21616
+ var trackVeryOldValue = (listener.length > 1);
21544
21617
  var changeDetected = 0;
21545
21618
  var objGetter = $parse(obj);
21546
21619
  var internalArray = [];
21547
21620
  var internalObject = {};
21621
+ var initRun = true;
21548
21622
  var oldLength = 0;
21549
21623
 
21550
21624
  function $watchCollectionWatch() {
21551
21625
  newValue = objGetter(self);
21552
21626
  var newLength, key;
21553
21627
 
21554
- if (!isObject(newValue)) {
21628
+ if (!isObject(newValue)) { // if primitive
21555
21629
  if (oldValue !== newValue) {
21556
21630
  oldValue = newValue;
21557
21631
  changeDetected++;
@@ -21573,7 +21647,9 @@ function $RootScopeProvider(){
21573
21647
  }
21574
21648
  // copy the items to oldValue and look for changes.
21575
21649
  for (var i = 0; i < newLength; i++) {
21576
- if (oldValue[i] !== newValue[i]) {
21650
+ var bothNaN = (oldValue[i] !== oldValue[i]) &&
21651
+ (newValue[i] !== newValue[i]);
21652
+ if (!bothNaN && (oldValue[i] !== newValue[i])) {
21577
21653
  changeDetected++;
21578
21654
  oldValue[i] = newValue[i];
21579
21655
  }
@@ -21617,7 +21693,32 @@ function $RootScopeProvider(){
21617
21693
  }
21618
21694
 
21619
21695
  function $watchCollectionAction() {
21620
- listener(newValue, oldValue, self);
21696
+ if (initRun) {
21697
+ initRun = false;
21698
+ listener(newValue, newValue, self);
21699
+ } else {
21700
+ listener(newValue, veryOldValue, self);
21701
+ }
21702
+
21703
+ // make a copy for the next time a collection is changed
21704
+ if (trackVeryOldValue) {
21705
+ if (!isObject(newValue)) {
21706
+ //primitive
21707
+ veryOldValue = newValue;
21708
+ } else if (isArrayLike(newValue)) {
21709
+ veryOldValue = new Array(newValue.length);
21710
+ for (var i = 0; i < newValue.length; i++) {
21711
+ veryOldValue[i] = newValue[i];
21712
+ }
21713
+ } else { // if object
21714
+ veryOldValue = {};
21715
+ for (var key in newValue) {
21716
+ if (hasOwnProperty.call(newValue, key)) {
21717
+ veryOldValue[key] = newValue[key];
21718
+ }
21719
+ }
21720
+ }
21721
+ }
21621
21722
  }
21622
21723
 
21623
21724
  return this.$watch($watchCollectionWatch, $watchCollectionAction);
@@ -21781,7 +21882,6 @@ function $RootScopeProvider(){
21781
21882
  /**
21782
21883
  * @ngdoc event
21783
21884
  * @name $rootScope.Scope#$destroy
21784
- * @eventOf ng.$rootScope.Scope
21785
21885
  * @eventType broadcast on scope being destroyed
21786
21886
  *
21787
21887
  * @description
@@ -21999,7 +22099,7 @@ function $RootScopeProvider(){
21999
22099
  * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called.
22000
22100
  *
22001
22101
  * @param {string} name Event name to listen on.
22002
- * @param {function(event, args...)} listener Function to call when the event is emitted.
22102
+ * @param {function(event, ...args)} listener Function to call when the event is emitted.
22003
22103
  * @returns {function()} Returns a deregistration function for this listener.
22004
22104
  */
22005
22105
  $on: function(name, listener) {
@@ -22800,7 +22900,7 @@ function $SceDelegateProvider() {
22800
22900
  * |---------------------|----------------|
22801
22901
  * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. |
22802
22902
  * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. |
22803
- * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`<a href=` and `<img src=` sanitize their urls and don't consititute an SCE context. |
22903
+ * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`<a href=` and `<img src=` sanitize their urls and don't constitute an SCE context. |
22804
22904
  * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contens are also safe to include in your application. Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.) <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. |
22805
22905
  * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. |
22806
22906
  *
@@ -24447,7 +24547,7 @@ function dateFilter($locale) {
24447
24547
  * @returns {string} JSON string.
24448
24548
  *
24449
24549
  *
24450
- * @example:
24550
+ * @example
24451
24551
  <example>
24452
24552
  <file name="index.html">
24453
24553
  <pre>{{ {'name':'value'} | json }}</pre>
@@ -24671,6 +24771,12 @@ function orderByFilter($parse){
24671
24771
  predicate = predicate.substring(1);
24672
24772
  }
24673
24773
  get = $parse(predicate);
24774
+ if (get.constant) {
24775
+ var key = get();
24776
+ return reverseComparator(function(a,b) {
24777
+ return compare(a[key], b[key]);
24778
+ }, descending);
24779
+ }
24674
24780
  }
24675
24781
  return reverseComparator(function(a,b){
24676
24782
  return compare(get(a),get(b));
@@ -25044,7 +25150,7 @@ var htmlAnchorDirective = valueFn({
25044
25150
  * such as selected. (Their presence means true and their absence means false.)
25045
25151
  * If we put an Angular interpolation expression into such an attribute then the
25046
25152
  * binding information would be lost when the browser removes the attribute.
25047
- * The `ngSelected` directive solves this problem for the `selected` atttribute.
25153
+ * The `ngSelected` directive solves this problem for the `selected` attribute.
25048
25154
  * This complementary directive is not removed by the browser and so provides
25049
25155
  * a permanent reliable place to store the binding information.
25050
25156
  *
@@ -25523,8 +25629,6 @@ function FormController(element, attrs, $scope, $animate) {
25523
25629
  </file>
25524
25630
  </example>
25525
25631
  *
25526
- * @param {string=} name Name of the form. If specified, the form controller will be published into
25527
- * related scope, under this name.
25528
25632
  */
25529
25633
  var formDirectiveFactory = function(isNgForm) {
25530
25634
  return ['$timeout', function($timeout) {
@@ -27192,7 +27296,7 @@ var ngValueDirective = function() {
27192
27296
  * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like
27193
27297
  * `{{ expression }}` which is similar but less verbose.
27194
27298
  *
27195
- * It is preferrable to use `ngBind` instead of `{{ expression }}` when a template is momentarily
27299
+ * It is preferable to use `ngBind` instead of `{{ expression }}` when a template is momentarily
27196
27300
  * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an
27197
27301
  * element attribute, it makes the bindings invisible to the user while the page is loading.
27198
27302
  *
@@ -28564,7 +28668,7 @@ var ngIfDirective = ['$animate', function($animate) {
28564
28668
  * @priority 400
28565
28669
  *
28566
28670
  * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,
28567
- * make sure you wrap it in quotes, e.g. `src="'myPartialTemplate.html'"`.
28671
+ * make sure you wrap it in **single** quotes, e.g. `src="'myPartialTemplate.html'"`.
28568
28672
  * @param {string=} onload Expression to evaluate when a new partial is loaded.
28569
28673
  *
28570
28674
  * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll
@@ -28678,7 +28782,6 @@ var ngIfDirective = ['$animate', function($animate) {
28678
28782
  /**
28679
28783
  * @ngdoc event
28680
28784
  * @name ngInclude#$includeContentRequested
28681
- * @eventOf ng.directive:ngInclude
28682
28785
  * @eventType emit on the scope ngInclude was declared in
28683
28786
  * @description
28684
28787
  * Emitted every time the ngInclude content is requested.
@@ -28688,7 +28791,6 @@ var ngIfDirective = ['$animate', function($animate) {
28688
28791
  /**
28689
28792
  * @ngdoc event
28690
28793
  * @name ngInclude#$includeContentLoaded
28691
- * @eventOf ng.directive:ngInclude
28692
28794
  * @eventType emit on the current ngInclude scope
28693
28795
  * @description
28694
28796
  * Emitted every time the ngInclude content is reloaded.
@@ -29175,9 +29277,11 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp
29175
29277
  * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**).
29176
29278
  *
29177
29279
  * @animations
29178
- * enter - when a new item is added to the list or when an item is revealed after a filter
29179
- * leave - when an item is removed from the list or when an item is filtered out
29180
- * move - when an adjacent item is filtered out causing a reorder or when the item contents are reordered
29280
+ * **.enter** - when a new item is added to the list or when an item is revealed after a filter
29281
+ *
29282
+ * **.leave** - when an item is removed from the list or when an item is filtered out
29283
+ *
29284
+ * **.move** - when an adjacent item is filtered out causing a reorder or when the item contents are reordered
29181
29285
  *
29182
29286
  * @element ANY
29183
29287
  * @scope
@@ -29909,7 +30013,6 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
29909
30013
  * @scope
29910
30014
  * @priority 800
29911
30015
  * @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>.
29912
- * @paramDescription
29913
30016
  * On child elements add:
29914
30017
  *
29915
30018
  * * `ngSwitchWhen`: the case statement to match against. If match then this
@@ -30158,7 +30261,7 @@ var ngTranscludeDirective = ngDirective({
30158
30261
  * `<script>` element must be specified as `text/ng-template`, and a cache name for the template must be
30159
30262
  * assigned through the element's `id`, which can then be used as a directive's `templateUrl`.
30160
30263
  *
30161
- * @param {'text/ng-template'} type Must be set to `'text/ng-template'`.
30264
+ * @param {string} type Must be set to `'text/ng-template'`.
30162
30265
  * @param {string} id Cache name of the template.
30163
30266
  *
30164
30267
  * @example
@@ -30589,6 +30692,12 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
30589
30692
  value = valueFn(scope, locals);
30590
30693
  }
30591
30694
  }
30695
+ // Update the null option's selected property here so $render cleans it up correctly
30696
+ if (optionGroupsCache[0].length > 1) {
30697
+ if (optionGroupsCache[0][1].id !== key) {
30698
+ optionGroupsCache[0][1].selected = false;
30699
+ }
30700
+ }
30592
30701
  }
30593
30702
  ctrl.$setViewValue(value);
30594
30703
  });
@@ -30726,7 +30835,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
30726
30835
  lastElement.val(existingOption.id = option.id);
30727
30836
  }
30728
30837
  // lastElement.prop('selected') provided by jQuery has side-effects
30729
- if (lastElement[0].selected !== option.selected) {
30838
+ if (existingOption.selected !== option.selected) {
30730
30839
  lastElement.prop('selected', (existingOption.selected = option.selected));
30731
30840
  }
30732
30841
  } else {