angularjs-rails 1.2.20 → 1.2.21

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2c4bf4ceba404ee9290e2ea88558badc93abc014
4
- data.tar.gz: 3cc597cb2ae8b9cebbf812cc467760019e9d043b
3
+ metadata.gz: a63cada1847d18af23c53daaedf6da7310dda04c
4
+ data.tar.gz: a8b16446fc75fbbea5971496239befcd7d03e91b
5
5
  SHA512:
6
- metadata.gz: 32d4690d0e7a7e7b6cdfd042d1786e58f60d7ff187999ba72c3449974b4e00f1d85b2bedaf659a44492dff62ee1cd4a6e7fe1360d31b47a879968cebdf20d099
7
- data.tar.gz: 0951e4ecd0101b7c46192a61879642e3d807a253af6e4afe2a1000d32c591d3eea9d148fb4cb52579c93486107977513aa6734d27e0d9fc9bfc44e87194cd8da
6
+ metadata.gz: 5210b4dd49396750d8ba3a6dade71ac067e7ce330dd9b5f4eb8a9aaa730ae189bad890da7c88b07fae09bb81b31a2572eb22fc8faab40849552ecd66a1f221a5
7
+ data.tar.gz: c4622afaa1ab5a350942e0301e8baa8c6a2309c46212a174350139b839304b80b462177745b3b62209f47f3d5673741efa1507c5ce39b023c6cf59cc211990c2
@@ -1,6 +1,6 @@
1
1
  module AngularJS
2
2
  module Rails
3
- VERSION = "1.2.20"
4
- UNSTABLE_VERSION = "1.3.0-beta.15"
3
+ VERSION = "1.2.21"
4
+ UNSTABLE_VERSION = "1.3.0-beta.17"
5
5
  end
6
6
  end
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.20
2
+ * @license AngularJS v1.2.21
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -52,9 +52,9 @@
52
52
  * }
53
53
  *
54
54
  * .slide.ng-enter { } /* starting animations for enter */
55
- * .slide.ng-enter-active { } /* terminal animations for enter */
55
+ * .slide.ng-enter.ng-enter-active { } /* terminal animations for enter */
56
56
  * .slide.ng-leave { } /* starting animations for leave */
57
- * .slide.ng-leave-active { } /* terminal animations for leave */
57
+ * .slide.ng-leave.ng-leave-active { } /* terminal animations for leave */
58
58
  * </style>
59
59
  *
60
60
  * <!--
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.20
2
+ * @license AngularJS v1.2.21
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.20
2
+ * @license AngularJS v1.2.21
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.20/' +
72
+ message = message + '\nhttp://errors.angularjs.org/1.2.21/' +
73
73
  (module ? module + '/' : '') + code;
74
74
  for (i = 2; i < arguments.length; i++) {
75
75
  message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.20
2
+ * @license AngularJS v1.2.21
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1722,6 +1722,7 @@ angular.mock.$RootElementProvider = function() {
1722
1722
  /**
1723
1723
  * @ngdoc module
1724
1724
  * @name ngMock
1725
+ * @packageName angular-mocks
1725
1726
  * @description
1726
1727
  *
1727
1728
  * # ngMock
@@ -1751,6 +1752,7 @@ angular.module('ngMock', ['ng']).provider({
1751
1752
  * @ngdoc module
1752
1753
  * @name ngMockE2E
1753
1754
  * @module ngMockE2E
1755
+ * @packageName angular-mocks
1754
1756
  * @description
1755
1757
  *
1756
1758
  * The `ngMockE2E` is an angular module which contains mocks suitable for end-to-end testing.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.20
2
+ * @license AngularJS v1.2.21
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -114,8 +114,8 @@ function shallowClearAndCopy(src, dst) {
114
114
  *
115
115
  * - **`action`** – {string} – The name of action. This name becomes the name of the method on
116
116
  * your resource object.
117
- * - **`method`** – {string} – HTTP request method. Valid methods are: `GET`, `POST`, `PUT`,
118
- * `DELETE`, and `JSONP`.
117
+ * - **`method`** – {string} – Case insensitive HTTP method (e.g. `GET`, `POST`, `PUT`,
118
+ * `DELETE`, `JSONP`, etc).
119
119
  * - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of
120
120
  * the parameter value is a function, it will be executed every time when a param value needs to
121
121
  * be obtained for a request (unless the param was overridden).
@@ -295,20 +295,20 @@ function shallowClearAndCopy(src, dst) {
295
295
  * # Creating a custom 'PUT' request
296
296
  * In this example we create a custom method on our resource to make a PUT request
297
297
  * ```js
298
- * var app = angular.module('app', ['ngResource', 'ngRoute']);
298
+ * var app = angular.module('app', ['ngResource', 'ngRoute']);
299
299
  *
300
- * // Some APIs expect a PUT request in the format URL/object/ID
301
- * // Here we are creating an 'update' method
302
- * app.factory('Notes', ['$resource', function($resource) {
300
+ * // Some APIs expect a PUT request in the format URL/object/ID
301
+ * // Here we are creating an 'update' method
302
+ * app.factory('Notes', ['$resource', function($resource) {
303
303
  * return $resource('/notes/:id', null,
304
304
  * {
305
305
  * 'update': { method:'PUT' }
306
306
  * });
307
- * }]);
307
+ * }]);
308
308
  *
309
- * // In our controller we get the ID from the URL using ngRoute and $routeParams
310
- * // We pass in $routeParams and our Notes factory along with $scope
311
- * app.controller('NotesCtrl', ['$scope', '$routeParams', 'Notes',
309
+ * // In our controller we get the ID from the URL using ngRoute and $routeParams
310
+ * // We pass in $routeParams and our Notes factory along with $scope
311
+ * app.controller('NotesCtrl', ['$scope', '$routeParams', 'Notes',
312
312
  function($scope, $routeParams, Notes) {
313
313
  * // First get a note object from the factory
314
314
  * var note = Notes.get({ id:$routeParams.id });
@@ -318,7 +318,7 @@ function shallowClearAndCopy(src, dst) {
318
318
  * Notes.update({ id:$id }, note);
319
319
  *
320
320
  * // This will PUT /notes/ID with the note object in the request payload
321
- * }]);
321
+ * }]);
322
322
  * ```
323
323
  */
324
324
  angular.module('ngResource', ['ng']).
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.20
2
+ * @license AngularJS v1.2.21
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -473,9 +473,7 @@ function $RouteProvider(){
473
473
  for (var i = 1, len = m.length; i < len; ++i) {
474
474
  var key = keys[i - 1];
475
475
 
476
- var val = 'string' == typeof m[i]
477
- ? decodeURIComponent(m[i])
478
- : m[i];
476
+ var val = m[i];
479
477
 
480
478
  if (key && val) {
481
479
  params[key.name] = val;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.20
2
+ * @license AngularJS v1.2.21
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -159,11 +159,11 @@ function sanitizeText(chars) {
159
159
 
160
160
  // Regular Expressions for parsing tags and attributes
161
161
  var START_TAG_REGEXP =
162
- /^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,
163
- END_TAG_REGEXP = /^<\s*\/\s*([\w:-]+)[^>]*>/,
162
+ /^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,
163
+ END_TAG_REGEXP = /^<\/\s*([\w:-]+)[^>]*>/,
164
164
  ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,
165
165
  BEGIN_TAG_REGEXP = /^</,
166
- BEGING_END_TAGE_REGEXP = /^<\s*\//,
166
+ BEGING_END_TAGE_REGEXP = /^<\//,
167
167
  COMMENT_REGEXP = /<!--(.*?)-->/g,
168
168
  DOCTYPE_REGEXP = /<!DOCTYPE([^>]*?)>/i,
169
169
  CDATA_REGEXP = /<!\[CDATA\[(.*?)]]>/g,
@@ -237,10 +237,11 @@ function makeMap(str) {
237
237
  * @param {object} handler
238
238
  */
239
239
  function htmlParser( html, handler ) {
240
- var index, chars, match, stack = [], last = html;
240
+ var index, chars, match, stack = [], last = html, text;
241
241
  stack.last = function() { return stack[ stack.length - 1 ]; };
242
242
 
243
243
  while ( html ) {
244
+ text = '';
244
245
  chars = true;
245
246
 
246
247
  // Make sure we're not in a script or style element
@@ -279,16 +280,23 @@ function htmlParser( html, handler ) {
279
280
  match = html.match( START_TAG_REGEXP );
280
281
 
281
282
  if ( match ) {
282
- html = html.substring( match[0].length );
283
- match[0].replace( START_TAG_REGEXP, parseStartTag );
283
+ // We only have a valid start-tag if there is a '>'.
284
+ if ( match[4] ) {
285
+ html = html.substring( match[0].length );
286
+ match[0].replace( START_TAG_REGEXP, parseStartTag );
287
+ }
284
288
  chars = false;
289
+ } else {
290
+ // no ending tag found --- this piece should be encoded as an entity.
291
+ text += '<';
292
+ html = html.substring(1);
285
293
  }
286
294
  }
287
295
 
288
296
  if ( chars ) {
289
297
  index = html.indexOf("<");
290
298
 
291
- var text = index < 0 ? html : html.substring( 0, index );
299
+ text += index < 0 ? html : html.substring( 0, index );
292
300
  html = index < 0 ? "" : html.substring( index );
293
301
 
294
302
  if (handler.chars) handler.chars( decodeEntities(text) );
@@ -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.20
9793
+ * @license AngularJS v1.2.21
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.20/' +
9863
+ message = message + '\nhttp://errors.angularjs.org/1.2.21/' +
9864
9864
  (module ? module + '/' : '') + code;
9865
9865
  for (i = 2; i < arguments.length; i++) {
9866
9866
  message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
@@ -9872,89 +9872,88 @@ function minErr(module) {
9872
9872
  }
9873
9873
 
9874
9874
  /* We need to tell jshint what variables are being exported */
9875
- /* global
9876
- -angular,
9877
- -msie,
9878
- -jqLite,
9879
- -jQuery,
9880
- -slice,
9881
- -push,
9882
- -toString,
9883
- -ngMinErr,
9884
- -angularModule,
9885
- -nodeName_,
9886
- -uid,
9887
- -VALIDITY_STATE_PROPERTY,
9888
-
9889
- -lowercase,
9890
- -uppercase,
9891
- -manualLowercase,
9892
- -manualUppercase,
9893
- -nodeName_,
9894
- -isArrayLike,
9895
- -forEach,
9896
- -sortedKeys,
9897
- -forEachSorted,
9898
- -reverseParams,
9899
- -nextUid,
9900
- -setHashKey,
9901
- -extend,
9902
- -int,
9903
- -inherit,
9904
- -noop,
9905
- -identity,
9906
- -valueFn,
9907
- -isUndefined,
9908
- -isDefined,
9909
- -isObject,
9910
- -isString,
9911
- -isNumber,
9912
- -isDate,
9913
- -isArray,
9914
- -isFunction,
9915
- -isRegExp,
9916
- -isWindow,
9917
- -isScope,
9918
- -isFile,
9919
- -isBlob,
9920
- -isBoolean,
9921
- -trim,
9922
- -isElement,
9923
- -makeMap,
9924
- -map,
9925
- -size,
9926
- -includes,
9927
- -indexOf,
9928
- -arrayRemove,
9929
- -isLeafNode,
9930
- -copy,
9931
- -shallowCopy,
9932
- -equals,
9933
- -csp,
9934
- -concat,
9935
- -sliceArgs,
9936
- -bind,
9937
- -toJsonReplacer,
9938
- -toJson,
9939
- -fromJson,
9940
- -toBoolean,
9941
- -startingTag,
9942
- -tryDecodeURIComponent,
9943
- -parseKeyValue,
9944
- -toKeyValue,
9945
- -encodeUriSegment,
9946
- -encodeUriQuery,
9947
- -angularInit,
9948
- -bootstrap,
9949
- -snake_case,
9950
- -bindJQuery,
9951
- -assertArg,
9952
- -assertArgFn,
9953
- -assertNotHasOwnProperty,
9954
- -getter,
9955
- -getBlockElements,
9956
- -hasOwnProperty,
9957
-
9875
+ /* global angular: true,
9876
+ msie: true,
9877
+ jqLite: true,
9878
+ jQuery: true,
9879
+ slice: true,
9880
+ push: true,
9881
+ toString: true,
9882
+ ngMinErr: true,
9883
+ angularModule: true,
9884
+ nodeName_: true,
9885
+ uid: true,
9886
+ VALIDITY_STATE_PROPERTY: true,
9887
+
9888
+ lowercase: true,
9889
+ uppercase: true,
9890
+ manualLowercase: true,
9891
+ manualUppercase: true,
9892
+ nodeName_: true,
9893
+ isArrayLike: true,
9894
+ forEach: true,
9895
+ sortedKeys: true,
9896
+ forEachSorted: true,
9897
+ reverseParams: true,
9898
+ nextUid: true,
9899
+ setHashKey: true,
9900
+ extend: true,
9901
+ int: true,
9902
+ inherit: true,
9903
+ noop: true,
9904
+ identity: true,
9905
+ valueFn: true,
9906
+ isUndefined: true,
9907
+ isDefined: true,
9908
+ isObject: true,
9909
+ isString: true,
9910
+ isNumber: true,
9911
+ isDate: true,
9912
+ isArray: true,
9913
+ isFunction: true,
9914
+ isRegExp: true,
9915
+ isWindow: true,
9916
+ isScope: true,
9917
+ isFile: true,
9918
+ isBlob: true,
9919
+ isBoolean: true,
9920
+ isPromiseLike: true,
9921
+ trim: true,
9922
+ isElement: true,
9923
+ makeMap: true,
9924
+ map: true,
9925
+ size: true,
9926
+ includes: true,
9927
+ indexOf: true,
9928
+ arrayRemove: true,
9929
+ isLeafNode: true,
9930
+ copy: true,
9931
+ shallowCopy: true,
9932
+ equals: true,
9933
+ csp: true,
9934
+ concat: true,
9935
+ sliceArgs: true,
9936
+ bind: true,
9937
+ toJsonReplacer: true,
9938
+ toJson: true,
9939
+ fromJson: true,
9940
+ toBoolean: true,
9941
+ startingTag: true,
9942
+ tryDecodeURIComponent: true,
9943
+ parseKeyValue: true,
9944
+ toKeyValue: true,
9945
+ encodeUriSegment: true,
9946
+ encodeUriQuery: true,
9947
+ angularInit: true,
9948
+ bootstrap: true,
9949
+ snake_case: true,
9950
+ bindJQuery: true,
9951
+ assertArg: true,
9952
+ assertArgFn: true,
9953
+ assertNotHasOwnProperty: true,
9954
+ getter: true,
9955
+ getBlockElements: true,
9956
+ hasOwnProperty: true,
9958
9957
  */
9959
9958
 
9960
9959
  ////////////////////////////////////
@@ -10113,11 +10112,12 @@ function forEach(obj, iterator, context) {
10113
10112
  iterator.call(context, obj[key], key);
10114
10113
  }
10115
10114
  }
10116
- } else if (obj.forEach && obj.forEach !== forEach) {
10117
- obj.forEach(iterator, context);
10118
- } else if (isArrayLike(obj)) {
10119
- for (key = 0; key < obj.length; key++)
10115
+ } else if (isArray(obj) || isArrayLike(obj)) {
10116
+ for (key = 0; key < obj.length; key++) {
10120
10117
  iterator.call(context, obj[key], key);
10118
+ }
10119
+ } else if (obj.forEach && obj.forEach !== forEach) {
10120
+ obj.forEach(iterator, context);
10121
10121
  } else {
10122
10122
  for (key in obj) {
10123
10123
  if (obj.hasOwnProperty(key)) {
@@ -10454,6 +10454,11 @@ function isBoolean(value) {
10454
10454
  }
10455
10455
 
10456
10456
 
10457
+ function isPromiseLike(obj) {
10458
+ return obj && isFunction(obj.then);
10459
+ }
10460
+
10461
+
10457
10462
  var trim = (function() {
10458
10463
  // native trim is way faster: http://jsperf.com/angular-trim-test
10459
10464
  // but IE doesn't have it... :-(
@@ -10618,7 +10623,7 @@ function isLeafNode (node) {
10618
10623
  </div>
10619
10624
 
10620
10625
  <script>
10621
- angular.module('copyExample')
10626
+ angular.module('copyExample', [])
10622
10627
  .controller('ExampleController', ['$scope', function($scope) {
10623
10628
  $scope.master= {};
10624
10629
 
@@ -10652,7 +10657,8 @@ function copy(source, destination, stackSource, stackDest) {
10652
10657
  } else if (isDate(source)) {
10653
10658
  destination = new Date(source.getTime());
10654
10659
  } else if (isRegExp(source)) {
10655
- destination = new RegExp(source.source);
10660
+ destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]);
10661
+ destination.lastIndex = source.lastIndex;
10656
10662
  } else if (isObject(source)) {
10657
10663
  destination = copy(source, {}, stackSource, stackDest);
10658
10664
  }
@@ -10796,12 +10802,25 @@ function equals(o1, o2) {
10796
10802
  return false;
10797
10803
  }
10798
10804
 
10805
+ var csp = function() {
10806
+ if (isDefined(csp.isActive_)) return csp.isActive_;
10807
+
10808
+ var active = !!(document.querySelector('[ng-csp]') ||
10809
+ document.querySelector('[data-ng-csp]'));
10810
+
10811
+ if (!active) {
10812
+ try {
10813
+ /* jshint -W031, -W054 */
10814
+ new Function('');
10815
+ /* jshint +W031, +W054 */
10816
+ } catch (e) {
10817
+ active = true;
10818
+ }
10819
+ }
10820
+
10821
+ return (csp.isActive_ = active);
10822
+ };
10799
10823
 
10800
- function csp() {
10801
- return (document.securityPolicy && document.securityPolicy.isActive) ||
10802
- (document.querySelector &&
10803
- !!(document.querySelector('[ng-csp]') || document.querySelector('[data-ng-csp]')));
10804
- }
10805
10824
 
10806
10825
 
10807
10826
  function concat(array1, array2, index) {
@@ -10973,7 +10992,7 @@ function parseKeyValue(/**string*/keyValue) {
10973
10992
  var obj = {}, key_value, key;
10974
10993
  forEach((keyValue || "").split('&'), function(keyValue) {
10975
10994
  if ( keyValue ) {
10976
- key_value = keyValue.split('=');
10995
+ key_value = keyValue.replace(/\+/g,'%20').split('=');
10977
10996
  key = tryDecodeURIComponent(key_value[0]);
10978
10997
  if ( isDefined(key) ) {
10979
10998
  var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
@@ -11658,12 +11677,11 @@ function setupModuleLoader(window) {
11658
11677
 
11659
11678
  }
11660
11679
 
11661
- /* global
11662
- angularModule: true,
11663
- version: true,
11680
+ /* global angularModule: true,
11681
+ version: true,
11664
11682
 
11665
- $LocaleProvider,
11666
- $CompileProvider,
11683
+ $LocaleProvider,
11684
+ $CompileProvider,
11667
11685
 
11668
11686
  htmlAnchorDirective,
11669
11687
  inputDirective,
@@ -11751,11 +11769,11 @@ function setupModuleLoader(window) {
11751
11769
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
11752
11770
  */
11753
11771
  var version = {
11754
- full: '1.2.20', // all of these placeholder strings will be replaced by grunt's
11772
+ full: '1.2.21', // all of these placeholder strings will be replaced by grunt's
11755
11773
  major: 1, // package task
11756
11774
  minor: 2,
11757
- dot: 20,
11758
- codeName: 'accidental-beautification'
11775
+ dot: 21,
11776
+ codeName: 'wizard-props'
11759
11777
  };
11760
11778
 
11761
11779
 
@@ -11879,12 +11897,10 @@ function publishExternalAPI(angular){
11879
11897
  ]);
11880
11898
  }
11881
11899
 
11882
- /* global
11883
-
11884
- -JQLitePrototype,
11885
- -addEventListenerFn,
11886
- -removeEventListenerFn,
11887
- -BOOLEAN_ATTR
11900
+ /* global JQLitePrototype: true,
11901
+ addEventListenerFn: true,
11902
+ removeEventListenerFn: true,
11903
+ BOOLEAN_ATTR: true
11888
11904
  */
11889
11905
 
11890
11906
  //////////////////////////////////
@@ -12298,25 +12314,22 @@ function jqLiteController(element, name) {
12298
12314
  }
12299
12315
 
12300
12316
  function jqLiteInheritedData(element, name, value) {
12301
- element = jqLite(element);
12302
-
12303
12317
  // if element is the document object work with the html element instead
12304
12318
  // this makes $(document).scope() possible
12305
- if(element[0].nodeType == 9) {
12306
- element = element.find('html');
12319
+ if(element.nodeType == 9) {
12320
+ element = element.documentElement;
12307
12321
  }
12308
12322
  var names = isArray(name) ? name : [name];
12309
12323
 
12310
- while (element.length) {
12311
- var node = element[0];
12324
+ while (element) {
12312
12325
  for (var i = 0, ii = names.length; i < ii; i++) {
12313
- if ((value = element.data(names[i])) !== undefined) return value;
12326
+ if ((value = jqLite.data(element, names[i])) !== undefined) return value;
12314
12327
  }
12315
12328
 
12316
12329
  // If dealing with a document fragment node with a host element, and no parent, use the host
12317
12330
  // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM
12318
12331
  // to lookup parent controllers.
12319
- element = jqLite(node.parentNode || (node.nodeType === 11 && node.host));
12332
+ element = element.parentNode || (element.nodeType === 11 && element.host);
12320
12333
  }
12321
12334
  }
12322
12335
 
@@ -12391,18 +12404,25 @@ function getBooleanAttrName(element, name) {
12391
12404
  return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr;
12392
12405
  }
12393
12406
 
12407
+ forEach({
12408
+ data: jqLiteData,
12409
+ removeData: jqLiteRemoveData
12410
+ }, function(fn, name) {
12411
+ JQLite[name] = fn;
12412
+ });
12413
+
12394
12414
  forEach({
12395
12415
  data: jqLiteData,
12396
12416
  inheritedData: jqLiteInheritedData,
12397
12417
 
12398
12418
  scope: function(element) {
12399
12419
  // Can't use jqLiteData here directly so we stay compatible with jQuery!
12400
- return jqLite(element).data('$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);
12420
+ return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);
12401
12421
  },
12402
12422
 
12403
12423
  isolateScope: function(element) {
12404
12424
  // Can't use jqLiteData here directly so we stay compatible with jQuery!
12405
- return jqLite(element).data('$isolateScope') || jqLite(element).data('$isolateScopeNoTemplate');
12425
+ return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate');
12406
12426
  },
12407
12427
 
12408
12428
  controller: jqLiteController,
@@ -12830,7 +12850,9 @@ forEach({
12830
12850
  clone: jqLiteClone,
12831
12851
 
12832
12852
  triggerHandler: function(element, eventName, eventData) {
12833
- var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName];
12853
+ // Copy event handlers in case event handlers array is modified during execution.
12854
+ var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName],
12855
+ eventFnsCopy = shallowCopy(eventFns || []);
12834
12856
 
12835
12857
  eventData = eventData || [];
12836
12858
 
@@ -12839,7 +12861,7 @@ forEach({
12839
12861
  stopPropagation: noop
12840
12862
  }];
12841
12863
 
12842
- forEach(eventFns, function(fn) {
12864
+ forEach(eventFnsCopy, function(fn) {
12843
12865
  fn.apply(element, event.concat(eventData));
12844
12866
  });
12845
12867
  }
@@ -15085,14 +15107,16 @@ function $TemplateCacheProvider() {
15085
15107
  *
15086
15108
  *
15087
15109
  * #### `template`
15088
- * replace the current element with the contents of the HTML. The replacement process
15089
- * migrates all of the attributes / classes from the old element to the new one. See the
15090
- * {@link guide/directive#creating-custom-directives_creating-directives_template-expanding-directive
15091
- * Directives Guide} for an example.
15110
+ * HTML markup that may:
15111
+ * * Replace the contents of the directive's element (defualt).
15112
+ * * Replace the directive's element itself (if `replace` is true - DEPRECATED).
15113
+ * * Wrap the contents of the directive's element (if `transclude` is true).
15092
15114
  *
15093
- * You can specify `template` as a string representing the template or as a function which takes
15094
- * two arguments `tElement` and `tAttrs` (described in the `compile` function api below) and
15095
- * returns a string value representing the template.
15115
+ * Value may be:
15116
+ *
15117
+ * * A string. For example `<div red-on-hover>{{delete_str}}</div>`.
15118
+ * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile`
15119
+ * function api below) and returns a string value.
15096
15120
  *
15097
15121
  *
15098
15122
  * #### `templateUrl`
@@ -15107,11 +15131,14 @@ function $TemplateCacheProvider() {
15107
15131
  *
15108
15132
  *
15109
15133
  * #### `replace` ([*DEPRECATED*!], will be removed in next major release)
15110
- * specify where the template should be inserted. Defaults to `false`.
15134
+ * specify what the template should replace. Defaults to `false`.
15111
15135
  *
15112
- * * `true` - the template will replace the current element.
15113
- * * `false` - the template will replace the contents of the current element.
15136
+ * * `true` - the template will replace the directive's element.
15137
+ * * `false` - the template will replace the contents of the directive's element.
15114
15138
  *
15139
+ * The replacement process migrates all of the attributes / classes from the old element to the new
15140
+ * one. See the {@link guide/directive#creating-custom-directives_creating-directives_template-expanding-directive
15141
+ * Directives Guide} for an example.
15115
15142
  *
15116
15143
  * #### `transclude`
15117
15144
  * compile the content of the element and make it available to the directive.
@@ -15125,6 +15152,11 @@ function $TemplateCacheProvider() {
15125
15152
  * * `true` - transclude the content of the directive.
15126
15153
  * * `'element'` - transclude the whole element including any directives defined at lower priority.
15127
15154
  *
15155
+ * <div class="alert alert-warning">
15156
+ * **Note:** When testing an element transclude directive you must not place the directive at the root of the
15157
+ * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives
15158
+ * Testing Transclusion Directives}.
15159
+ * </div>
15128
15160
  *
15129
15161
  * #### `compile`
15130
15162
  *
@@ -15770,7 +15802,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
15770
15802
  : null;
15771
15803
 
15772
15804
  if (nodeLinkFn && nodeLinkFn.scope) {
15773
- safeAddClass(jqLite(nodeList[i]), 'ng-scope');
15805
+ safeAddClass(attrs.$$element, 'ng-scope');
15774
15806
  }
15775
15807
 
15776
15808
  childLinkFn = (nodeLinkFn && nodeLinkFn.terminal ||
@@ -15792,7 +15824,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
15792
15824
  return linkFnFound ? compositeLinkFn : null;
15793
15825
 
15794
15826
  function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) {
15795
- var nodeLinkFn, childLinkFn, node, $node, childScope, i, ii, n, childBoundTranscludeFn;
15827
+ var nodeLinkFn, childLinkFn, node, childScope, i, ii, n, childBoundTranscludeFn;
15796
15828
 
15797
15829
  // copy nodeList so that linking doesn't break due to live list updates.
15798
15830
  var nodeListLength = nodeList.length,
@@ -15805,12 +15837,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
15805
15837
  node = stableNodeList[n];
15806
15838
  nodeLinkFn = linkFns[i++];
15807
15839
  childLinkFn = linkFns[i++];
15808
- $node = jqLite(node);
15809
15840
 
15810
15841
  if (nodeLinkFn) {
15811
15842
  if (nodeLinkFn.scope) {
15812
15843
  childScope = scope.$new();
15813
- $node.data('$scope', childScope);
15844
+ jqLite.data(node, '$scope', childScope);
15814
15845
  } else {
15815
15846
  childScope = scope;
15816
15847
  }
@@ -16102,12 +16133,12 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16102
16133
  if (directiveValue == 'element') {
16103
16134
  hasElementTranscludeDirective = true;
16104
16135
  terminalPriority = directive.priority;
16105
- $template = groupScan(compileNode, attrStart, attrEnd);
16136
+ $template = $compileNode;
16106
16137
  $compileNode = templateAttrs.$$element =
16107
16138
  jqLite(document.createComment(' ' + directiveName + ': ' +
16108
16139
  templateAttrs[directiveName] + ' '));
16109
16140
  compileNode = $compileNode[0];
16110
- replaceWith(jqCollection, jqLite(sliceArgs($template)), compileNode);
16141
+ replaceWith(jqCollection, sliceArgs($template), compileNode);
16111
16142
 
16112
16143
  childTranscludeFn = compile($template, transcludeFn, terminalPriority,
16113
16144
  replaceDirective && replaceDirective.name, {
@@ -16284,29 +16315,26 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16284
16315
  function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {
16285
16316
  var attrs, $element, i, ii, linkFn, controller, isolateScope, elementControllers = {}, transcludeFn;
16286
16317
 
16287
- if (compileNode === linkNode) {
16288
- attrs = templateAttrs;
16289
- } else {
16290
- attrs = shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr));
16291
- }
16318
+ attrs = (compileNode === linkNode)
16319
+ ? templateAttrs
16320
+ : shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr));
16292
16321
  $element = attrs.$$element;
16293
16322
 
16294
16323
  if (newIsolateScopeDirective) {
16295
16324
  var LOCAL_REGEXP = /^\s*([@=&])(\??)\s*(\w*)\s*$/;
16296
- var $linkNode = jqLite(linkNode);
16297
16325
 
16298
16326
  isolateScope = scope.$new(true);
16299
16327
 
16300
16328
  if (templateDirective && (templateDirective === newIsolateScopeDirective ||
16301
16329
  templateDirective === newIsolateScopeDirective.$$originalDirective)) {
16302
- $linkNode.data('$isolateScope', isolateScope) ;
16330
+ $element.data('$isolateScope', isolateScope);
16303
16331
  } else {
16304
- $linkNode.data('$isolateScopeNoTemplate', isolateScope);
16332
+ $element.data('$isolateScopeNoTemplate', isolateScope);
16305
16333
  }
16306
16334
 
16307
16335
 
16308
16336
 
16309
- safeAddClass($linkNode, 'ng-isolate-scope');
16337
+ safeAddClass($element, 'ng-isolate-scope');
16310
16338
 
16311
16339
  forEach(newIsolateScopeDirective.scope, function(definition, scopeName) {
16312
16340
  var match = definition.match(LOCAL_REGEXP) || [],
@@ -17110,11 +17138,7 @@ function parseHeaders(headers) {
17110
17138
  val = trim(line.substr(i + 1));
17111
17139
 
17112
17140
  if (key) {
17113
- if (parsed[key]) {
17114
- parsed[key] += ', ' + val;
17115
- } else {
17116
- parsed[key] = val;
17117
- }
17141
+ parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
17118
17142
  }
17119
17143
  });
17120
17144
 
@@ -17951,7 +17975,7 @@ function $HttpProvider() {
17951
17975
  * Shortcut method to perform `JSONP` request.
17952
17976
  *
17953
17977
  * @param {string} url Relative or absolute URL specifying the destination of the request.
17954
- * Should contain `JSON_CALLBACK` string.
17978
+ * The name of the callback should be the string `JSON_CALLBACK`.
17955
17979
  * @param {Object=} config Optional configuration object
17956
17980
  * @returns {HttpPromise} Future object
17957
17981
  */
@@ -18051,7 +18075,7 @@ function $HttpProvider() {
18051
18075
  if (cache) {
18052
18076
  cachedResp = cache.get(url);
18053
18077
  if (isDefined(cachedResp)) {
18054
- if (cachedResp.then) {
18078
+ if (isPromiseLike(cachedResp)) {
18055
18079
  // cached request has already been sent, but there is no response yet
18056
18080
  cachedResp.then(removePendingReq, removePendingReq);
18057
18081
  return cachedResp;
@@ -18133,27 +18157,29 @@ function $HttpProvider() {
18133
18157
 
18134
18158
 
18135
18159
  function buildUrl(url, params) {
18136
- if (!params) return url;
18137
- var parts = [];
18138
- forEachSorted(params, function(value, key) {
18139
- if (value === null || isUndefined(value)) return;
18140
- if (!isArray(value)) value = [value];
18141
-
18142
- forEach(value, function(v) {
18143
- if (isObject(v)) {
18144
- v = toJson(v);
18145
- }
18146
- parts.push(encodeUriQuery(key) + '=' +
18147
- encodeUriQuery(v));
18148
- });
18149
- });
18150
- if(parts.length > 0) {
18151
- url += ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');
18160
+ if (!params) return url;
18161
+ var parts = [];
18162
+ forEachSorted(params, function(value, key) {
18163
+ if (value === null || isUndefined(value)) return;
18164
+ if (!isArray(value)) value = [value];
18165
+
18166
+ forEach(value, function(v) {
18167
+ if (isObject(v)) {
18168
+ if (isDate(v)){
18169
+ v = v.toISOString();
18170
+ } else if (isObject(v)) {
18171
+ v = toJson(v);
18172
+ }
18152
18173
  }
18153
- return url;
18154
- }
18155
-
18156
-
18174
+ parts.push(encodeUriQuery(key) + '=' +
18175
+ encodeUriQuery(v));
18176
+ });
18177
+ });
18178
+ if(parts.length > 0) {
18179
+ url += ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');
18180
+ }
18181
+ return url;
18182
+ }
18157
18183
  }];
18158
18184
  }
18159
18185
 
@@ -18289,7 +18315,7 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
18289
18315
 
18290
18316
  if (timeout > 0) {
18291
18317
  var timeoutId = $browserDefer(timeoutRequest, timeout);
18292
- } else if (timeout && timeout.then) {
18318
+ } else if (isPromiseLike(timeout)) {
18293
18319
  timeout.then(timeoutRequest);
18294
18320
  }
18295
18321
 
@@ -18702,7 +18728,7 @@ function $IntervalProvider() {
18702
18728
  * // Make sure that the interval nis destroyed too
18703
18729
  * $scope.stopFight();
18704
18730
  * });
18705
- * })
18731
+ * }])
18706
18732
  * // Register the 'myCurrentTime' directive factory method.
18707
18733
  * // We inject $interval and dateFilter service since the factory method is DI.
18708
18734
  * .directive('myCurrentTime', ['$interval', 'dateFilter',
@@ -18731,7 +18757,7 @@ function $IntervalProvider() {
18731
18757
  * $interval.cancel(stopTime);
18732
18758
  * });
18733
18759
  * }
18734
- * });
18760
+ * }]);
18735
18761
  * </script>
18736
18762
  *
18737
18763
  * <div>
@@ -20160,11 +20186,7 @@ Lexer.prototype = {
20160
20186
  string += String.fromCharCode(parseInt(hex, 16));
20161
20187
  } else {
20162
20188
  var rep = ESCAPE[ch];
20163
- if (rep) {
20164
- string += rep;
20165
- } else {
20166
- string += ch;
20167
- }
20189
+ string = string + (rep || ch);
20168
20190
  }
20169
20191
  escape = false;
20170
20192
  } else if (ch === '\\') {
@@ -21343,7 +21365,7 @@ function qFactory(nextTick, exceptionHandler) {
21343
21365
  } catch(e) {
21344
21366
  return makePromise(e, false);
21345
21367
  }
21346
- if (callbackOutput && isFunction(callbackOutput.then)) {
21368
+ if (isPromiseLike(callbackOutput)) {
21347
21369
  return callbackOutput.then(function() {
21348
21370
  return makePromise(value, isResolved);
21349
21371
  }, function(error) {
@@ -21368,7 +21390,7 @@ function qFactory(nextTick, exceptionHandler) {
21368
21390
 
21369
21391
 
21370
21392
  var ref = function(value) {
21371
- if (value && isFunction(value.then)) return value;
21393
+ if (isPromiseLike(value)) return value;
21372
21394
  return {
21373
21395
  then: function(callback) {
21374
21396
  var result = defer();
@@ -22035,7 +22057,7 @@ function $RootScopeProvider(){
22035
22057
 
22036
22058
  function $watchCollectionWatch() {
22037
22059
  newValue = objGetter(self);
22038
- var newLength, key;
22060
+ var newLength, key, bothNaN;
22039
22061
 
22040
22062
  if (!isObject(newValue)) { // if primitive
22041
22063
  if (oldValue !== newValue) {
@@ -22059,7 +22081,7 @@ function $RootScopeProvider(){
22059
22081
  }
22060
22082
  // copy the items to oldValue and look for changes.
22061
22083
  for (var i = 0; i < newLength; i++) {
22062
- var bothNaN = (oldValue[i] !== oldValue[i]) &&
22084
+ bothNaN = (oldValue[i] !== oldValue[i]) &&
22063
22085
  (newValue[i] !== newValue[i]);
22064
22086
  if (!bothNaN && (oldValue[i] !== newValue[i])) {
22065
22087
  changeDetected++;
@@ -22079,7 +22101,9 @@ function $RootScopeProvider(){
22079
22101
  if (newValue.hasOwnProperty(key)) {
22080
22102
  newLength++;
22081
22103
  if (oldValue.hasOwnProperty(key)) {
22082
- if (oldValue[key] !== newValue[key]) {
22104
+ bothNaN = (oldValue[key] !== oldValue[key]) &&
22105
+ (newValue[key] !== newValue[key]);
22106
+ if (!bothNaN && (oldValue[key] !== newValue[key])) {
22083
22107
  changeDetected++;
22084
22108
  oldValue[key] = newValue[key];
22085
22109
  }
@@ -24192,6 +24216,17 @@ function $WindowProvider(){
24192
24216
  this.$get = valueFn(window);
24193
24217
  }
24194
24218
 
24219
+ /* global currencyFilter: true,
24220
+ dateFilter: true,
24221
+ filterFilter: true,
24222
+ jsonFilter: true,
24223
+ limitToFilter: true,
24224
+ lowercaseFilter: true,
24225
+ numberFilter: true,
24226
+ orderByFilter: true,
24227
+ uppercaseFilter: true,
24228
+ */
24229
+
24195
24230
  /**
24196
24231
  * @ngdoc provider
24197
24232
  * @name $filterProvider
@@ -24953,11 +24988,7 @@ function dateFilter($locale) {
24953
24988
  format = format || 'mediumDate';
24954
24989
  format = $locale.DATETIME_FORMATS[format] || format;
24955
24990
  if (isString(date)) {
24956
- if (NUMBER_STRING.test(date)) {
24957
- date = int(date);
24958
- } else {
24959
- date = jsonStringToDate(date);
24960
- }
24991
+ date = NUMBER_STRING.test(date) ? int(date) : jsonStringToDate(date);
24961
24992
  }
24962
24993
 
24963
24994
  if (isNumber(date)) {
@@ -25232,7 +25263,7 @@ function limitToFilter(){
25232
25263
  * @example
25233
25264
  <example module="orderByExample">
25234
25265
  <file name="index.html">
25235
- <div ng-controller="Ctrl">
25266
+ <div ng-controller="ExampleController">
25236
25267
  <table class="friend">
25237
25268
  <tr>
25238
25269
  <th><a href="" ng-click="reverse=false;order('name', false)">Name</a>
@@ -25313,6 +25344,10 @@ function orderByFilter($parse){
25313
25344
  var t1 = typeof v1;
25314
25345
  var t2 = typeof v2;
25315
25346
  if (t1 == t2) {
25347
+ if (isDate(v1) && isDate(v2)) {
25348
+ v1 = v1.valueOf();
25349
+ v2 = v2.valueOf();
25350
+ }
25316
25351
  if (t1 == "string") {
25317
25352
  v1 = v1.toLowerCase();
25318
25353
  v2 = v2.toLowerCase();
@@ -26206,12 +26241,10 @@ var formDirectiveFactory = function(isNgForm) {
26206
26241
  var formDirective = formDirectiveFactory();
26207
26242
  var ngFormDirective = formDirectiveFactory(true);
26208
26243
 
26209
- /* global
26210
-
26211
- -VALID_CLASS,
26212
- -INVALID_CLASS,
26213
- -PRISTINE_CLASS,
26214
- -DIRTY_CLASS
26244
+ /* global VALID_CLASS: true,
26245
+ INVALID_CLASS: true,
26246
+ PRISTINE_CLASS: true,
26247
+ DIRTY_CLASS: true
26215
26248
  */
26216
26249
 
26217
26250
  var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
@@ -27856,7 +27889,7 @@ var ngValueDirective = function() {
27856
27889
  * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like
27857
27890
  * `{{ expression }}` which is similar but less verbose.
27858
27891
  *
27859
- * It is preferable to use `ngBind` instead of `{{ expression }}` when a template is momentarily
27892
+ * It is preferable to use `ngBind` instead of `{{ expression }}` if a template is momentarily
27860
27893
  * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an
27861
27894
  * element attribute, it makes the bindings invisible to the user while the page is loading.
27862
27895
  *
@@ -28020,15 +28053,24 @@ var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
28020
28053
  </example>
28021
28054
  */
28022
28055
  var ngBindHtmlDirective = ['$sce', '$parse', function($sce, $parse) {
28023
- return function(scope, element, attr) {
28024
- element.addClass('ng-binding').data('$binding', attr.ngBindHtml);
28056
+ return {
28057
+ compile: function (tElement) {
28058
+ tElement.addClass('ng-binding');
28025
28059
 
28026
- var parsed = $parse(attr.ngBindHtml);
28027
- function getStringValue() { return (parsed(scope) || '').toString(); }
28060
+ return function (scope, element, attr) {
28061
+ element.data('$binding', attr.ngBindHtml);
28028
28062
 
28029
- scope.$watch(getStringValue, function ngBindHtmlWatchAction(value) {
28030
- element.html($sce.getTrustedHtml(parsed(scope)) || '');
28031
- });
28063
+ var parsed = $parse(attr.ngBindHtml);
28064
+
28065
+ function getStringValue() {
28066
+ return (parsed(scope) || '').toString();
28067
+ }
28068
+
28069
+ scope.$watch(getStringValue, function ngBindHtmlWatchAction(value) {
28070
+ element.html($sce.getTrustedHtml(parsed(scope)) || '');
28071
+ });
28072
+ };
28073
+ }
28032
28074
  };
28033
28075
  }];
28034
28076
 
@@ -28691,8 +28733,10 @@ var ngControllerDirective = [function() {
28691
28733
  * This is necessary when developing things like Google Chrome Extensions.
28692
28734
  *
28693
28735
  * CSP forbids apps to use `eval` or `Function(string)` generated functions (among other things).
28694
- * For us to be compatible, we just need to implement the "getterFn" in $parse without violating
28695
- * any of these restrictions.
28736
+ * For Angular to be CSP compatible there are only two things that we need to do differently:
28737
+ *
28738
+ * - don't use `Function` constructor to generate optimized value getters
28739
+ * - don't inject custom stylesheet into the document
28696
28740
  *
28697
28741
  * AngularJS uses `Function(string)` generated functions as a speed optimization. Applying the `ngCsp`
28698
28742
  * directive will cause Angular to use CSP compatibility mode. When this mode is on AngularJS will
@@ -28703,7 +28747,18 @@ var ngControllerDirective = [function() {
28703
28747
  * includes some CSS rules (e.g. {@link ng.directive:ngCloak ngCloak}).
28704
28748
  * To make those directives work in CSP mode, include the `angular-csp.css` manually.
28705
28749
  *
28706
- * In order to use this feature put the `ngCsp` directive on the root element of the application.
28750
+ * Angular tries to autodetect if CSP is active and automatically turn on the CSP-safe mode. This
28751
+ * autodetection however triggers a CSP error to be logged in the console:
28752
+ *
28753
+ * ```
28754
+ * Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of
28755
+ * script in the following Content Security Policy directive: "default-src 'self'". Note that
28756
+ * 'script-src' was not explicitly set, so 'default-src' is used as a fallback.
28757
+ * ```
28758
+ *
28759
+ * This error is harmless but annoying. To prevent the error from showing up, put the `ngCsp`
28760
+ * directive on the root element of the application or on the `angular.js` script tag, whichever
28761
+ * appears first in the html document.
28707
28762
  *
28708
28763
  * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.*
28709
28764
  *
@@ -28718,9 +28773,9 @@ var ngControllerDirective = [function() {
28718
28773
  ```
28719
28774
  */
28720
28775
 
28721
- // ngCsp is not implemented as a proper directive any more, because we need it be processed while we bootstrap
28722
- // the system (before $parse is instantiated), for this reason we just have a csp() fn that looks for ng-csp attribute
28723
- // anywhere in the current doc
28776
+ // ngCsp is not implemented as a proper directive any more, because we need it be processed while we
28777
+ // bootstrap the system (before $parse is instantiated), for this reason we just have
28778
+ // the csp.isActive() fn that looks for ng-csp attribute anywhere in the current doc
28724
28779
 
28725
28780
  /**
28726
28781
  * @ngdoc directive
@@ -31491,6 +31546,12 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
31491
31546
  // lastElement.prop('selected') provided by jQuery has side-effects
31492
31547
  if (existingOption.selected !== option.selected) {
31493
31548
  lastElement.prop('selected', (existingOption.selected = option.selected));
31549
+ if (msie) {
31550
+ // See #7692
31551
+ // The selected item wouldn't visually update on IE without this.
31552
+ // Tested on Win7: IE9, IE10 and IE11. Future IEs should be tested as well
31553
+ lastElement.prop('selected', existingOption.selected);
31554
+ }
31494
31555
  }
31495
31556
  } else {
31496
31557
  // grow elements