angularjs-rails 1.4.3 → 1.4.4

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.4.3
2
+ * @license AngularJS v1.4.4
3
3
  * (c) 2010-2015 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.4.3
2
+ * @license AngularJS v1.4.4
3
3
  * (c) 2010-2015 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -48,7 +48,7 @@ angular.module('ngCookies', ['ng']).
48
48
  * - **secure** - `{boolean}` - The cookie will be available only in secured connection.
49
49
  *
50
50
  * Note: by default the address that appears in your `<base>` tag will be used as path.
51
- * This is import so that cookies will be visible for all routes in case html5mode is enabled
51
+ * This is important so that cookies will be visible for all routes in case html5mode is enabled
52
52
  *
53
53
  **/
54
54
  var defaults = this.defaults = {};
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.4.3
2
+ * @license AngularJS v1.4.4
3
3
  * (c) 2010-2015 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -59,7 +59,7 @@ function minErr(module, ErrorConstructor) {
59
59
  return match;
60
60
  });
61
61
 
62
- message += '\nhttp://errors.angularjs.org/1.4.3/' +
62
+ message += '\nhttp://errors.angularjs.org/1.4.4/' +
63
63
  (module ? module + '/' : '') + code;
64
64
 
65
65
  for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
@@ -109,8 +109,8 @@ function setupModuleLoader(window) {
109
109
  * All modules (angular core or 3rd party) that should be available to an application must be
110
110
  * registered using this mechanism.
111
111
  *
112
- * When passed two or more arguments, a new module is created. If passed only one argument, an
113
- * existing module (the name passed as the first argument to `module`) is retrieved.
112
+ * Passing one argument retrieves an existing {@link angular.Module},
113
+ * whereas passing more than one argument creates a new {@link angular.Module}
114
114
  *
115
115
  *
116
116
  * # Module
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.4.3
2
+ * @license AngularJS v1.4.4
3
3
  * (c) 2010-2015 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.4.3
2
+ * @license AngularJS v1.4.4
3
3
  * (c) 2010-2015 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.4.3
2
+ * @license AngularJS v1.4.4
3
3
  * (c) 2010-2015 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -762,20 +762,23 @@ angular.mock.animate = angular.module('ngAnimateMock', ['ng'])
762
762
 
763
763
  .config(['$provide', function($provide) {
764
764
 
765
- var reflowQueue = [];
766
- $provide.value('$$animateReflow', function(fn) {
767
- var index = reflowQueue.length;
768
- reflowQueue.push(fn);
769
- return function cancel() {
770
- reflowQueue.splice(index, 1);
771
- };
765
+ $provide.factory('$$forceReflow', function() {
766
+ function reflowFn() {
767
+ reflowFn.totalReflows++;
768
+ }
769
+ reflowFn.totalReflows = 0;
770
+ return reflowFn;
772
771
  });
773
772
 
774
- $provide.decorator('$animate', ['$delegate', '$timeout', '$browser', '$$rAF',
775
- function($delegate, $timeout, $browser, $$rAF) {
773
+ $provide.decorator('$animate', ['$delegate', '$timeout', '$browser', '$$rAF', '$$forceReflow',
774
+ function($delegate, $timeout, $browser, $$rAF, $$forceReflow) {
775
+
776
776
  var animate = {
777
777
  queue: [],
778
778
  cancel: $delegate.cancel,
779
+ get reflows() {
780
+ return $$forceReflow.totalReflows;
781
+ },
779
782
  enabled: $delegate.enabled,
780
783
  triggerCallbackEvents: function() {
781
784
  $$rAF.flush();
@@ -786,12 +789,6 @@ angular.mock.animate = angular.module('ngAnimateMock', ['ng'])
786
789
  triggerCallbacks: function() {
787
790
  this.triggerCallbackEvents();
788
791
  this.triggerCallbackPromise();
789
- },
790
- triggerReflow: function() {
791
- angular.forEach(reflowQueue, function(fn) {
792
- fn();
793
- });
794
- reflowQueue = [];
795
792
  }
796
793
  };
797
794
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.4.3
2
+ * @license AngularJS v1.4.4
3
3
  * (c) 2010-2015 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.4.3
2
+ * @license AngularJS v1.4.4
3
3
  * (c) 2010-2015 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.4.3
2
+ * @license AngularJS v1.4.4
3
3
  * (c) 2010-2015 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -631,7 +631,7 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
631
631
  */
632
632
  angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
633
633
  var LINKY_URL_REGEXP =
634
- /((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"”’]/i,
634
+ /((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i,
635
635
  MAILTO_REGEXP = /^mailto:/i;
636
636
 
637
637
  return function(text, target) {
@@ -9190,7 +9190,7 @@ return jQuery;
9190
9190
  }));
9191
9191
 
9192
9192
  /**
9193
- * @license AngularJS v1.4.3
9193
+ * @license AngularJS v1.4.4
9194
9194
  * (c) 2010-2015 Google, Inc. http://angularjs.org
9195
9195
  * License: MIT
9196
9196
  */
@@ -9249,7 +9249,7 @@ function minErr(module, ErrorConstructor) {
9249
9249
  return match;
9250
9250
  });
9251
9251
 
9252
- message += '\nhttp://errors.angularjs.org/1.4.3/' +
9252
+ message += '\nhttp://errors.angularjs.org/1.4.4/' +
9253
9253
  (module ? module + '/' : '') + code;
9254
9254
 
9255
9255
  for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
@@ -9615,6 +9615,8 @@ function baseExtend(dst, objs, deep) {
9615
9615
  if (deep && isObject(src)) {
9616
9616
  if (isDate(src)) {
9617
9617
  dst[key] = new Date(src.valueOf());
9618
+ } else if (isRegExp(src)) {
9619
+ dst[key] = new RegExp(src);
9618
9620
  } else {
9619
9621
  if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {};
9620
9622
  baseExtend(dst[key], [src], true);
@@ -10245,22 +10247,39 @@ function equals(o1, o2) {
10245
10247
  }
10246
10248
 
10247
10249
  var csp = function() {
10248
- if (isDefined(csp.isActive_)) return csp.isActive_;
10250
+ if (!isDefined(csp.rules)) {
10249
10251
 
10250
- var active = !!(document.querySelector('[ng-csp]') ||
10251
- document.querySelector('[data-ng-csp]'));
10252
10252
 
10253
- if (!active) {
10253
+ var ngCspElement = (document.querySelector('[ng-csp]') ||
10254
+ document.querySelector('[data-ng-csp]'));
10255
+
10256
+ if (ngCspElement) {
10257
+ var ngCspAttribute = ngCspElement.getAttribute('ng-csp') ||
10258
+ ngCspElement.getAttribute('data-ng-csp');
10259
+ csp.rules = {
10260
+ noUnsafeEval: !ngCspAttribute || (ngCspAttribute.indexOf('no-unsafe-eval') !== -1),
10261
+ noInlineStyle: !ngCspAttribute || (ngCspAttribute.indexOf('no-inline-style') !== -1)
10262
+ };
10263
+ } else {
10264
+ csp.rules = {
10265
+ noUnsafeEval: noUnsafeEval(),
10266
+ noInlineStyle: false
10267
+ };
10268
+ }
10269
+ }
10270
+
10271
+ return csp.rules;
10272
+
10273
+ function noUnsafeEval() {
10254
10274
  try {
10255
10275
  /* jshint -W031, -W054 */
10256
10276
  new Function('');
10257
10277
  /* jshint +W031, +W054 */
10278
+ return false;
10258
10279
  } catch (e) {
10259
- active = true;
10280
+ return true;
10260
10281
  }
10261
10282
  }
10262
-
10263
- return (csp.isActive_ = active);
10264
10283
  };
10265
10284
 
10266
10285
  /**
@@ -10492,13 +10511,19 @@ function tryDecodeURIComponent(value) {
10492
10511
  * @returns {Object.<string,boolean|Array>}
10493
10512
  */
10494
10513
  function parseKeyValue(/**string*/keyValue) {
10495
- var obj = {}, key_value, key;
10514
+ var obj = {};
10496
10515
  forEach((keyValue || "").split('&'), function(keyValue) {
10516
+ var splitPoint, key, val;
10497
10517
  if (keyValue) {
10498
- key_value = keyValue.replace(/\+/g,'%20').split('=');
10499
- key = tryDecodeURIComponent(key_value[0]);
10518
+ key = keyValue = keyValue.replace(/\+/g,'%20');
10519
+ splitPoint = keyValue.indexOf('=');
10520
+ if (splitPoint !== -1) {
10521
+ key = keyValue.substring(0, splitPoint);
10522
+ val = keyValue.substring(splitPoint + 1);
10523
+ }
10524
+ key = tryDecodeURIComponent(key);
10500
10525
  if (isDefined(key)) {
10501
- var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
10526
+ val = isDefined(val) ? tryDecodeURIComponent(val) : true;
10502
10527
  if (!hasOwnProperty.call(obj, key)) {
10503
10528
  obj[key] = val;
10504
10529
  } else if (isArray(obj[key])) {
@@ -11094,8 +11119,8 @@ function setupModuleLoader(window) {
11094
11119
  * All modules (angular core or 3rd party) that should be available to an application must be
11095
11120
  * registered using this mechanism.
11096
11121
  *
11097
- * When passed two or more arguments, a new module is created. If passed only one argument, an
11098
- * existing module (the name passed as the first argument to `module`) is retrieved.
11122
+ * Passing one argument retrieves an existing {@link angular.Module},
11123
+ * whereas passing more than one argument creates a new {@link angular.Module}
11099
11124
  *
11100
11125
  *
11101
11126
  * # Module
@@ -11436,7 +11461,6 @@ function toDebugString(obj) {
11436
11461
  /* global angularModule: true,
11437
11462
  version: true,
11438
11463
 
11439
- $LocaleProvider,
11440
11464
  $CompileProvider,
11441
11465
 
11442
11466
  htmlAnchorDirective,
@@ -11453,7 +11477,6 @@ function toDebugString(obj) {
11453
11477
  ngClassDirective,
11454
11478
  ngClassEvenDirective,
11455
11479
  ngClassOddDirective,
11456
- ngCspDirective,
11457
11480
  ngCloakDirective,
11458
11481
  ngControllerDirective,
11459
11482
  ngFormDirective,
@@ -11490,6 +11513,7 @@ function toDebugString(obj) {
11490
11513
 
11491
11514
  $AnchorScrollProvider,
11492
11515
  $AnimateProvider,
11516
+ $CoreAnimateCssProvider,
11493
11517
  $$CoreAnimateQueueProvider,
11494
11518
  $$CoreAnimateRunnerProvider,
11495
11519
  $BrowserProvider,
@@ -11498,6 +11522,7 @@ function toDebugString(obj) {
11498
11522
  $DocumentProvider,
11499
11523
  $ExceptionHandlerProvider,
11500
11524
  $FilterProvider,
11525
+ $$ForceReflowProvider,
11501
11526
  $InterpolateProvider,
11502
11527
  $IntervalProvider,
11503
11528
  $$HashMapProvider,
@@ -11541,11 +11566,11 @@ function toDebugString(obj) {
11541
11566
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
11542
11567
  */
11543
11568
  var version = {
11544
- full: '1.4.3', // all of these placeholder strings will be replaced by grunt's
11569
+ full: '1.4.4', // all of these placeholder strings will be replaced by grunt's
11545
11570
  major: 1, // package task
11546
11571
  minor: 4,
11547
- dot: 3,
11548
- codeName: 'foam-acceleration'
11572
+ dot: 4,
11573
+ codeName: 'pylon-requirement'
11549
11574
  };
11550
11575
 
11551
11576
 
@@ -11584,11 +11609,6 @@ function publishExternalAPI(angular) {
11584
11609
  });
11585
11610
 
11586
11611
  angularModule = setupModuleLoader(window);
11587
- try {
11588
- angularModule('ngLocale');
11589
- } catch (e) {
11590
- angularModule('ngLocale', []).provider('$locale', $LocaleProvider);
11591
- }
11592
11612
 
11593
11613
  angularModule('ng', ['ngLocale'], ['$provide',
11594
11614
  function ngModule($provide) {
@@ -11651,6 +11671,7 @@ function publishExternalAPI(angular) {
11651
11671
  $provide.provider({
11652
11672
  $anchorScroll: $AnchorScrollProvider,
11653
11673
  $animate: $AnimateProvider,
11674
+ $animateCss: $CoreAnimateCssProvider,
11654
11675
  $$animateQueue: $$CoreAnimateQueueProvider,
11655
11676
  $$AnimateRunner: $$CoreAnimateRunnerProvider,
11656
11677
  $browser: $BrowserProvider,
@@ -11659,6 +11680,7 @@ function publishExternalAPI(angular) {
11659
11680
  $document: $DocumentProvider,
11660
11681
  $exceptionHandler: $ExceptionHandlerProvider,
11661
11682
  $filter: $FilterProvider,
11683
+ $$forceReflow: $$ForceReflowProvider,
11662
11684
  $interpolate: $InterpolateProvider,
11663
11685
  $interval: $IntervalProvider,
11664
11686
  $http: $HttpProvider,
@@ -12878,7 +12900,7 @@ var $$HashMapProvider = [function() {
12878
12900
  * Implicit module which gets automatically added to each {@link auto.$injector $injector}.
12879
12901
  */
12880
12902
 
12881
- var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
12903
+ var FN_ARGS = /^[^\(]*\(\s*([^\)]*)\)/m;
12882
12904
  var FN_ARG_SPLIT = /,/;
12883
12905
  var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/;
12884
12906
  var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
@@ -13534,6 +13556,7 @@ function createInjector(modulesToLoad, strictDi) {
13534
13556
  // Module Loading
13535
13557
  ////////////////////////////////////
13536
13558
  function loadModules(modulesToLoad) {
13559
+ assertArg(isUndefined(modulesToLoad) || isArray(modulesToLoad), 'modulesToLoad', 'not an array');
13537
13560
  var runBlocks = [], moduleFn;
13538
13561
  forEach(modulesToLoad, function(module) {
13539
13562
  if (loadedModules.get(module)) return;
@@ -14043,31 +14066,31 @@ var $$CoreAnimateQueueProvider = function() {
14043
14066
  };
14044
14067
 
14045
14068
  function addRemoveClassesPostDigest(element, add, remove) {
14046
- var data = postDigestQueue.get(element);
14047
- var classVal;
14069
+ var classVal, data = postDigestQueue.get(element);
14048
14070
 
14049
14071
  if (!data) {
14050
14072
  postDigestQueue.put(element, data = {});
14051
14073
  postDigestElements.push(element);
14052
14074
  }
14053
14075
 
14054
- if (add) {
14055
- forEach(add.split(' '), function(className) {
14056
- if (className) {
14057
- data[className] = true;
14058
- }
14059
- });
14060
- }
14061
-
14062
- if (remove) {
14063
- forEach(remove.split(' '), function(className) {
14064
- if (className) {
14065
- data[className] = false;
14066
- }
14067
- });
14068
- }
14076
+ var updateData = function(classes, value) {
14077
+ var changed = false;
14078
+ if (classes) {
14079
+ classes = isString(classes) ? classes.split(' ') :
14080
+ isArray(classes) ? classes : [];
14081
+ forEach(classes, function(className) {
14082
+ if (className) {
14083
+ changed = true;
14084
+ data[className] = value;
14085
+ }
14086
+ });
14087
+ }
14088
+ return changed;
14089
+ };
14069
14090
 
14070
- if (postDigestElements.length > 1) return;
14091
+ var classesAdded = updateData(add, true);
14092
+ var classesRemoved = updateData(remove, false);
14093
+ if ((!classesAdded && !classesRemoved) || postDigestElements.length > 1) return;
14071
14094
 
14072
14095
  $rootScope.$$postDigest(function() {
14073
14096
  forEach(postDigestElements, function(element) {
@@ -14526,15 +14549,88 @@ var $AnimateProvider = ['$provide', function($provide) {
14526
14549
  }];
14527
14550
  }];
14528
14551
 
14529
- function $$AsyncCallbackProvider() {
14530
- this.$get = ['$$rAF', '$timeout', function($$rAF, $timeout) {
14531
- return $$rAF.supported
14532
- ? function(fn) { return $$rAF(fn); }
14533
- : function(fn) {
14534
- return $timeout(fn, 0, false);
14552
+ /**
14553
+ * @ngdoc service
14554
+ * @name $animateCss
14555
+ * @kind object
14556
+ *
14557
+ * @description
14558
+ * This is the core version of `$animateCss`. By default, only when the `ngAnimate` is included,
14559
+ * then the `$animateCss` service will actually perform animations.
14560
+ *
14561
+ * Click here {@link ngAnimate.$animateCss to read the documentation for $animateCss}.
14562
+ */
14563
+ var $CoreAnimateCssProvider = function() {
14564
+ this.$get = ['$$rAF', '$q', function($$rAF, $q) {
14565
+
14566
+ var RAFPromise = function() {};
14567
+ RAFPromise.prototype = {
14568
+ done: function(cancel) {
14569
+ this.defer && this.defer[cancel === true ? 'reject' : 'resolve']();
14570
+ },
14571
+ end: function() {
14572
+ this.done();
14573
+ },
14574
+ cancel: function() {
14575
+ this.done(true);
14576
+ },
14577
+ getPromise: function() {
14578
+ if (!this.defer) {
14579
+ this.defer = $q.defer();
14580
+ }
14581
+ return this.defer.promise;
14582
+ },
14583
+ then: function(f1,f2) {
14584
+ return this.getPromise().then(f1,f2);
14585
+ },
14586
+ 'catch': function(f1) {
14587
+ return this.getPromise().catch(f1);
14588
+ },
14589
+ 'finally': function(f1) {
14590
+ return this.getPromise().finally(f1);
14591
+ }
14592
+ };
14593
+
14594
+ return function(element, options) {
14595
+ if (options.from) {
14596
+ element.css(options.from);
14597
+ options.from = null;
14598
+ }
14599
+
14600
+ var closed, runner = new RAFPromise();
14601
+ return {
14602
+ start: run,
14603
+ end: run
14535
14604
  };
14605
+
14606
+ function run() {
14607
+ $$rAF(function() {
14608
+ close();
14609
+ if (!closed) {
14610
+ runner.done();
14611
+ }
14612
+ closed = true;
14613
+ });
14614
+ return runner;
14615
+ }
14616
+
14617
+ function close() {
14618
+ if (options.addClass) {
14619
+ element.addClass(options.addClass);
14620
+ options.addClass = null;
14621
+ }
14622
+ if (options.removeClass) {
14623
+ element.removeClass(options.removeClass);
14624
+ options.removeClass = null;
14625
+ }
14626
+ if (options.to) {
14627
+ element.css(options.to);
14628
+ options.to = null;
14629
+ }
14630
+ }
14631
+ };
14536
14632
  }];
14537
- }
14633
+ };
14538
14634
 
14539
14635
  /* global stripHash: true */
14540
14636
 
@@ -15698,7 +15794,7 @@ function $TemplateCacheProvider() {
15698
15794
  * otherwise the {@link error:$compile:ctreq Missing Required Controller} error is thrown.
15699
15795
  *
15700
15796
  * Note that you can also require the directive's own controller - it will be made available like
15701
- * like any other controller.
15797
+ * any other controller.
15702
15798
  *
15703
15799
  * * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope.
15704
15800
  * This is the same as the `$transclude`
@@ -15724,7 +15820,7 @@ function $TemplateCacheProvider() {
15724
15820
  *
15725
15821
  * ### Transclusion
15726
15822
  *
15727
- * Transclusion is the process of extracting a collection of DOM element from one part of the DOM and
15823
+ * Transclusion is the process of extracting a collection of DOM elements from one part of the DOM and
15728
15824
  * copying them to another part of the DOM, while maintaining their connection to the original AngularJS
15729
15825
  * scope from where they were taken.
15730
15826
  *
@@ -16479,7 +16575,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16479
16575
 
16480
16576
  listeners.push(fn);
16481
16577
  $rootScope.$evalAsync(function() {
16482
- if (!listeners.$$inter && attrs.hasOwnProperty(key)) {
16578
+ if (!listeners.$$inter && attrs.hasOwnProperty(key) && !isUndefined(attrs[key])) {
16483
16579
  // no one registered attribute interpolation function, so lets call it manually
16484
16580
  fn(attrs[key]);
16485
16581
  }
@@ -17858,24 +17954,19 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
17858
17954
  lastValue,
17859
17955
  parentGet, parentSet, compare;
17860
17956
 
17861
- if (!hasOwnProperty.call(attrs, attrName)) {
17862
- // In the case of user defined a binding with the same name as a method in Object.prototype but didn't set
17863
- // the corresponding attribute. We need to make sure subsequent code won't access to the prototype function
17864
- attrs[attrName] = undefined;
17865
- }
17866
-
17867
17957
  switch (mode) {
17868
17958
 
17869
17959
  case '@':
17870
- if (!attrs[attrName] && !optional) {
17871
- destination[scopeName] = undefined;
17960
+ if (!optional && !hasOwnProperty.call(attrs, attrName)) {
17961
+ destination[scopeName] = attrs[attrName] = void 0;
17872
17962
  }
17873
-
17874
17963
  attrs.$observe(attrName, function(value) {
17875
- destination[scopeName] = value;
17964
+ if (isString(value)) {
17965
+ destination[scopeName] = value;
17966
+ }
17876
17967
  });
17877
17968
  attrs.$$observers[attrName].$$scope = scope;
17878
- if (attrs[attrName]) {
17969
+ if (isString(attrs[attrName])) {
17879
17970
  // If the attribute has been provided then we trigger an interpolation to ensure
17880
17971
  // the value is there for use in the link fn
17881
17972
  destination[scopeName] = $interpolate(attrs[attrName])(scope);
@@ -17883,11 +17974,13 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
17883
17974
  break;
17884
17975
 
17885
17976
  case '=':
17886
- if (optional && !attrs[attrName]) {
17887
- return;
17977
+ if (!hasOwnProperty.call(attrs, attrName)) {
17978
+ if (optional) break;
17979
+ attrs[attrName] = void 0;
17888
17980
  }
17889
- parentGet = $parse(attrs[attrName]);
17981
+ if (optional && !attrs[attrName]) break;
17890
17982
 
17983
+ parentGet = $parse(attrs[attrName]);
17891
17984
  if (parentGet.literal) {
17892
17985
  compare = equals;
17893
17986
  } else {
@@ -17926,7 +18019,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
17926
18019
  break;
17927
18020
 
17928
18021
  case '&':
17929
- parentGet = $parse(attrs[attrName]);
18022
+ // Don't assign Object.prototype method to scope
18023
+ parentGet = attrs.hasOwnProperty(attrName) ? $parse(attrs[attrName]) : noop;
17930
18024
 
17931
18025
  // Don't assign noop to destination if expression is not valid
17932
18026
  if (parentGet === noop && optional) break;
@@ -18303,6 +18397,29 @@ function $ExceptionHandlerProvider() {
18303
18397
  }];
18304
18398
  }
18305
18399
 
18400
+ var $$ForceReflowProvider = function() {
18401
+ this.$get = ['$document', function($document) {
18402
+ return function(domNode) {
18403
+ //the line below will force the browser to perform a repaint so
18404
+ //that all the animated elements within the animation frame will
18405
+ //be properly updated and drawn on screen. This is required to
18406
+ //ensure that the preparation animation is properly flushed so that
18407
+ //the active state picks up from there. DO NOT REMOVE THIS LINE.
18408
+ //DO NOT OPTIMIZE THIS LINE. THE MINIFIER WILL REMOVE IT OTHERWISE WHICH
18409
+ //WILL RESULT IN AN UNPREDICTABLE BUG THAT IS VERY HARD TO TRACK DOWN AND
18410
+ //WILL TAKE YEARS AWAY FROM YOUR LIFE.
18411
+ if (domNode) {
18412
+ if (!domNode.nodeType && domNode instanceof jqLite) {
18413
+ domNode = domNode[0];
18414
+ }
18415
+ } else {
18416
+ domNode = $document[0].body;
18417
+ }
18418
+ return domNode.offsetWidth + 1;
18419
+ };
18420
+ }];
18421
+ };
18422
+
18306
18423
  var APPLICATION_JSON = 'application/json';
18307
18424
  var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'};
18308
18425
  var JSON_START = /^\[|^\{(?!\{)/;
@@ -18311,6 +18428,12 @@ var JSON_ENDS = {
18311
18428
  '{': /}$/
18312
18429
  };
18313
18430
  var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/;
18431
+ var $httpMinErr = minErr('$http');
18432
+ var $httpMinErrLegacyFn = function(method) {
18433
+ return function() {
18434
+ throw $httpMinErr('legacy', 'The method `{0}` on the promise returned from `$http` has been disabled.', method);
18435
+ };
18436
+ };
18314
18437
 
18315
18438
  function serializeValue(v) {
18316
18439
  if (isObject(v)) {
@@ -18411,8 +18534,8 @@ function $HttpParamSerializerJQLikeProvider() {
18411
18534
  function serialize(toSerialize, prefix, topLevel) {
18412
18535
  if (toSerialize === null || isUndefined(toSerialize)) return;
18413
18536
  if (isArray(toSerialize)) {
18414
- forEach(toSerialize, function(value) {
18415
- serialize(value, prefix + '[]');
18537
+ forEach(toSerialize, function(value, index) {
18538
+ serialize(value, prefix + '[' + (isObject(value) ? index : '') + ']');
18416
18539
  });
18417
18540
  } else if (isObject(toSerialize) && !isDate(toSerialize)) {
18418
18541
  forEachSorted(toSerialize, function(value, key) {
@@ -18633,6 +18756,30 @@ function $HttpProvider() {
18633
18756
  return useApplyAsync;
18634
18757
  };
18635
18758
 
18759
+ var useLegacyPromise = true;
18760
+ /**
18761
+ * @ngdoc method
18762
+ * @name $httpProvider#useLegacyPromiseExtensions
18763
+ * @description
18764
+ *
18765
+ * Configure `$http` service to return promises without the shorthand methods `success` and `error`.
18766
+ * This should be used to make sure that applications work without these methods.
18767
+ *
18768
+ * Defaults to false. If no value is specified, returns the current configured value.
18769
+ *
18770
+ * @param {boolean=} value If true, `$http` will return a normal promise without the `success` and `error` methods.
18771
+ *
18772
+ * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining.
18773
+ * otherwise, returns the current configured value.
18774
+ **/
18775
+ this.useLegacyPromiseExtensions = function(value) {
18776
+ if (isDefined(value)) {
18777
+ useLegacyPromise = !!value;
18778
+ return this;
18779
+ }
18780
+ return useLegacyPromise;
18781
+ };
18782
+
18636
18783
  /**
18637
18784
  * @ngdoc property
18638
18785
  * @name $httpProvider#interceptors
@@ -18699,17 +18846,15 @@ function $HttpProvider() {
18699
18846
  *
18700
18847
  * ## General usage
18701
18848
  * The `$http` service is a function which takes a single argument — a configuration object —
18702
- * that is used to generate an HTTP request and returns a {@link ng.$q promise}
18703
- * with two $http specific methods: `success` and `error`.
18849
+ * that is used to generate an HTTP request and returns a {@link ng.$q promise}.
18704
18850
  *
18705
18851
  * ```js
18706
18852
  * // Simple GET request example :
18707
18853
  * $http.get('/someUrl').
18708
- * success(function(data, status, headers, config) {
18854
+ * then(function(response) {
18709
18855
  * // this callback will be called asynchronously
18710
18856
  * // when the response is available
18711
- * }).
18712
- * error(function(data, status, headers, config) {
18857
+ * }, function(response) {
18713
18858
  * // called asynchronously if an error occurs
18714
18859
  * // or server returns response with an error status.
18715
18860
  * });
@@ -18718,21 +18863,23 @@ function $HttpProvider() {
18718
18863
  * ```js
18719
18864
  * // Simple POST request example (passing data) :
18720
18865
  * $http.post('/someUrl', {msg:'hello word!'}).
18721
- * success(function(data, status, headers, config) {
18866
+ * then(function(response) {
18722
18867
  * // this callback will be called asynchronously
18723
18868
  * // when the response is available
18724
- * }).
18725
- * error(function(data, status, headers, config) {
18869
+ * }, function(response) {
18726
18870
  * // called asynchronously if an error occurs
18727
18871
  * // or server returns response with an error status.
18728
18872
  * });
18729
18873
  * ```
18730
18874
  *
18875
+ * The response object has these properties:
18731
18876
  *
18732
- * Since the returned value of calling the $http function is a `promise`, you can also use
18733
- * the `then` method to register callbacks, and these callbacks will receive a single argument –
18734
- * an object representing the response. See the API signature and type info below for more
18735
- * details.
18877
+ * - **data** `{string|Object}` The response body transformed with the transform
18878
+ * functions.
18879
+ * - **status** `{number}` HTTP status code of the response.
18880
+ * - **headers** – `{function([headerName])}` – Header getter function.
18881
+ * - **config** – `{Object}` – The configuration object that was used to generate the request.
18882
+ * - **statusText** – `{string}` – HTTP status text of the response.
18736
18883
  *
18737
18884
  * A response status code between 200 and 299 is considered a success status and
18738
18885
  * will result in the success callback being called. Note that if the response is a redirect,
@@ -18756,8 +18903,8 @@ function $HttpProvider() {
18756
18903
  * request data must be passed in for POST/PUT requests.
18757
18904
  *
18758
18905
  * ```js
18759
- * $http.get('/someUrl').success(successCallback);
18760
- * $http.post('/someUrl', data).success(successCallback);
18906
+ * $http.get('/someUrl').then(successCallback);
18907
+ * $http.post('/someUrl', data).then(successCallback);
18761
18908
  * ```
18762
18909
  *
18763
18910
  * Complete list of shortcut methods:
@@ -18771,6 +18918,14 @@ function $HttpProvider() {
18771
18918
  * - {@link ng.$http#patch $http.patch}
18772
18919
  *
18773
18920
  *
18921
+ * ## Deprecation Notice
18922
+ * <div class="alert alert-danger">
18923
+ * The `$http` legacy promise methods `success` and `error` have been deprecated.
18924
+ * Use the standard `then` method instead.
18925
+ * If {@link $httpProvider#useLegacyPromiseExtensions `$httpProvider.useLegacyPromiseExtensions`} is set to
18926
+ * `false` then these methods will throw {@link $http:legacy `$http/legacy`} error.
18927
+ * </div>
18928
+ *
18774
18929
  * ## Setting HTTP Headers
18775
18930
  *
18776
18931
  * The $http service will automatically add certain HTTP headers to all requests. These defaults
@@ -18814,7 +18969,7 @@ function $HttpProvider() {
18814
18969
  * data: { test: 'test' }
18815
18970
  * }
18816
18971
  *
18817
- * $http(req).success(function(){...}).error(function(){...});
18972
+ * $http(req).then(function(){...}, function(){...});
18818
18973
  * ```
18819
18974
  *
18820
18975
  * ## Transforming Requests and Responses
@@ -19046,7 +19201,6 @@ function $HttpProvider() {
19046
19201
  * In order to prevent collisions in environments where multiple Angular apps share the
19047
19202
  * same domain or subdomain, we recommend that each application uses unique cookie name.
19048
19203
  *
19049
- *
19050
19204
  * @param {object} config Object describing the request to be made and how it should be
19051
19205
  * processed. The object has following properties:
19052
19206
  *
@@ -19091,20 +19245,9 @@ function $HttpProvider() {
19091
19245
  * - **responseType** - `{string}` - see
19092
19246
  * [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype).
19093
19247
  *
19094
- * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the
19095
- * standard `then` method and two http specific methods: `success` and `error`. The `then`
19096
- * method takes two arguments a success and an error callback which will be called with a
19097
- * response object. The `success` and `error` methods take a single argument - a function that
19098
- * will be called when the request succeeds or fails respectively. The arguments passed into
19099
- * these functions are destructured representation of the response object passed into the
19100
- * `then` method. The response object has these properties:
19248
+ * @returns {HttpPromise} Returns a {@link ng.$q `Promise}` that will be resolved to a response object
19249
+ * when the request succeeds or fails.
19101
19250
  *
19102
- * - **data** – `{string|Object}` – The response body transformed with the transform
19103
- * functions.
19104
- * - **status** – `{number}` – HTTP status code of the response.
19105
- * - **headers** – `{function([headerName])}` – Header getter function.
19106
- * - **config** – `{Object}` – The configuration object that was used to generate the request.
19107
- * - **statusText** – `{string}` – HTTP status text of the response.
19108
19251
  *
19109
19252
  * @property {Array.<Object>} pendingRequests Array of config objects for currently pending
19110
19253
  * requests. This is primarily meant to be used for debugging purposes.
@@ -19146,13 +19289,12 @@ function $HttpProvider() {
19146
19289
  $scope.response = null;
19147
19290
 
19148
19291
  $http({method: $scope.method, url: $scope.url, cache: $templateCache}).
19149
- success(function(data, status) {
19150
- $scope.status = status;
19151
- $scope.data = data;
19152
- }).
19153
- error(function(data, status) {
19154
- $scope.data = data || "Request failed";
19155
- $scope.status = status;
19292
+ then(function(response) {
19293
+ $scope.status = response.status;
19294
+ $scope.data = response.data;
19295
+ }, function(response) {
19296
+ $scope.data = response.data || "Request failed";
19297
+ $scope.status = response.status;
19156
19298
  });
19157
19299
  };
19158
19300
 
@@ -19257,23 +19399,28 @@ function $HttpProvider() {
19257
19399
  promise = promise.then(thenFn, rejectFn);
19258
19400
  }
19259
19401
 
19260
- promise.success = function(fn) {
19261
- assertArgFn(fn, 'fn');
19402
+ if (useLegacyPromise) {
19403
+ promise.success = function(fn) {
19404
+ assertArgFn(fn, 'fn');
19262
19405
 
19263
- promise.then(function(response) {
19264
- fn(response.data, response.status, response.headers, config);
19265
- });
19266
- return promise;
19267
- };
19406
+ promise.then(function(response) {
19407
+ fn(response.data, response.status, response.headers, config);
19408
+ });
19409
+ return promise;
19410
+ };
19268
19411
 
19269
- promise.error = function(fn) {
19270
- assertArgFn(fn, 'fn');
19412
+ promise.error = function(fn) {
19413
+ assertArgFn(fn, 'fn');
19271
19414
 
19272
- promise.then(null, function(response) {
19273
- fn(response.data, response.status, response.headers, config);
19274
- });
19275
- return promise;
19276
- };
19415
+ promise.then(null, function(response) {
19416
+ fn(response.data, response.status, response.headers, config);
19417
+ });
19418
+ return promise;
19419
+ };
19420
+ } else {
19421
+ promise.success = $httpMinErrLegacyFn('success');
19422
+ promise.error = $httpMinErrLegacyFn('error');
19423
+ }
19277
19424
 
19278
19425
  return promise;
19279
19426
 
@@ -19652,7 +19799,7 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
19652
19799
  xhr.onload = function requestLoaded() {
19653
19800
  var statusText = xhr.statusText || '';
19654
19801
 
19655
- // responseText is the old-school way of retrieving response (supported by IE8 & 9)
19802
+ // responseText is the old-school way of retrieving response (supported by IE9)
19656
19803
  // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)
19657
19804
  var response = ('response' in xhr) ? xhr.response : xhr.responseText;
19658
19805
 
@@ -20290,7 +20437,7 @@ function $IntervalProvider() {
20290
20437
  * @description
20291
20438
  * Cancels a task associated with the `promise`.
20292
20439
  *
20293
- * @param {promise} promise returned by the `$interval` function.
20440
+ * @param {Promise=} promise returned by the `$interval` function.
20294
20441
  * @returns {boolean} Returns `true` if the task was successfully canceled.
20295
20442
  */
20296
20443
  interval.cancel = function(promise) {
@@ -20317,75 +20464,6 @@ function $IntervalProvider() {
20317
20464
  *
20318
20465
  * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`)
20319
20466
  */
20320
- function $LocaleProvider() {
20321
- this.$get = function() {
20322
- return {
20323
- id: 'en-us',
20324
-
20325
- NUMBER_FORMATS: {
20326
- DECIMAL_SEP: '.',
20327
- GROUP_SEP: ',',
20328
- PATTERNS: [
20329
- { // Decimal Pattern
20330
- minInt: 1,
20331
- minFrac: 0,
20332
- maxFrac: 3,
20333
- posPre: '',
20334
- posSuf: '',
20335
- negPre: '-',
20336
- negSuf: '',
20337
- gSize: 3,
20338
- lgSize: 3
20339
- },{ //Currency Pattern
20340
- minInt: 1,
20341
- minFrac: 2,
20342
- maxFrac: 2,
20343
- posPre: '\u00A4',
20344
- posSuf: '',
20345
- negPre: '(\u00A4',
20346
- negSuf: ')',
20347
- gSize: 3,
20348
- lgSize: 3
20349
- }
20350
- ],
20351
- CURRENCY_SYM: '$'
20352
- },
20353
-
20354
- DATETIME_FORMATS: {
20355
- MONTH:
20356
- 'January,February,March,April,May,June,July,August,September,October,November,December'
20357
- .split(','),
20358
- SHORTMONTH: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','),
20359
- DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','),
20360
- SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','),
20361
- AMPMS: ['AM','PM'],
20362
- medium: 'MMM d, y h:mm:ss a',
20363
- 'short': 'M/d/yy h:mm a',
20364
- fullDate: 'EEEE, MMMM d, y',
20365
- longDate: 'MMMM d, y',
20366
- mediumDate: 'MMM d, y',
20367
- shortDate: 'M/d/yy',
20368
- mediumTime: 'h:mm:ss a',
20369
- shortTime: 'h:mm a',
20370
- ERANAMES: [
20371
- "Before Christ",
20372
- "Anno Domini"
20373
- ],
20374
- ERAS: [
20375
- "BC",
20376
- "AD"
20377
- ]
20378
- },
20379
-
20380
- pluralCat: function(num) {
20381
- if (num === 1) {
20382
- return 'one';
20383
- }
20384
- return 'other';
20385
- }
20386
- };
20387
- };
20388
- }
20389
20467
 
20390
20468
  var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/,
20391
20469
  DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};
@@ -20476,12 +20554,12 @@ function serverBase(url) {
20476
20554
  *
20477
20555
  * @constructor
20478
20556
  * @param {string} appBase application base URL
20557
+ * @param {string} appBaseNoFile application base URL stripped of any filename
20479
20558
  * @param {string} basePrefix url path prefix
20480
20559
  */
20481
- function LocationHtml5Url(appBase, basePrefix) {
20560
+ function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {
20482
20561
  this.$$html5 = true;
20483
20562
  basePrefix = basePrefix || '';
20484
- var appBaseNoFile = stripFile(appBase);
20485
20563
  parseAbsoluteUrl(appBase, this);
20486
20564
 
20487
20565
 
@@ -20555,10 +20633,10 @@ function LocationHtml5Url(appBase, basePrefix) {
20555
20633
  *
20556
20634
  * @constructor
20557
20635
  * @param {string} appBase application base URL
20636
+ * @param {string} appBaseNoFile application base URL stripped of any filename
20558
20637
  * @param {string} hashPrefix hashbang prefix
20559
20638
  */
20560
- function LocationHashbangUrl(appBase, hashPrefix) {
20561
- var appBaseNoFile = stripFile(appBase);
20639
+ function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {
20562
20640
 
20563
20641
  parseAbsoluteUrl(appBase, this);
20564
20642
 
@@ -20667,14 +20745,13 @@ function LocationHashbangUrl(appBase, hashPrefix) {
20667
20745
  *
20668
20746
  * @constructor
20669
20747
  * @param {string} appBase application base URL
20748
+ * @param {string} appBaseNoFile application base URL stripped of any filename
20670
20749
  * @param {string} hashPrefix hashbang prefix
20671
20750
  */
20672
- function LocationHashbangInHtml5Url(appBase, hashPrefix) {
20751
+ function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) {
20673
20752
  this.$$html5 = true;
20674
20753
  LocationHashbangUrl.apply(this, arguments);
20675
20754
 
20676
- var appBaseNoFile = stripFile(appBase);
20677
-
20678
20755
  this.$$parseLinkUrl = function(url, relHref) {
20679
20756
  if (relHref && relHref[0] === '#') {
20680
20757
  // special case for links to hash fragments:
@@ -20704,7 +20781,7 @@ function LocationHashbangInHtml5Url(appBase, hashPrefix) {
20704
20781
  hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
20705
20782
 
20706
20783
  this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
20707
- // include hashPrefix in $$absUrl when $$url is empty so IE8 & 9 do not reload page because of removal of '#'
20784
+ // include hashPrefix in $$absUrl when $$url is empty so IE9 does not reload page because of removal of '#'
20708
20785
  this.$$absUrl = appBase + hashPrefix + this.$$url;
20709
20786
  };
20710
20787
 
@@ -21213,7 +21290,9 @@ function $LocationProvider() {
21213
21290
  appBase = stripHash(initialUrl);
21214
21291
  LocationMode = LocationHashbangUrl;
21215
21292
  }
21216
- $location = new LocationMode(appBase, '#' + hashPrefix);
21293
+ var appBaseNoFile = stripFile(appBase);
21294
+
21295
+ $location = new LocationMode(appBase, appBaseNoFile, '#' + hashPrefix);
21217
21296
  $location.$$parseLinkUrl(initialUrl, initialUrl);
21218
21297
 
21219
21298
  $location.$$state = $browser.state();
@@ -21293,6 +21372,13 @@ function $LocationProvider() {
21293
21372
 
21294
21373
  // update $location when $browser url changes
21295
21374
  $browser.onUrlChange(function(newUrl, newState) {
21375
+
21376
+ if (isUndefined(beginsWith(appBaseNoFile, newUrl))) {
21377
+ // If we are navigating outside of the app then force a reload
21378
+ $window.location.href = newUrl;
21379
+ return;
21380
+ }
21381
+
21296
21382
  $rootScope.$evalAsync(function() {
21297
21383
  var oldUrl = $location.absUrl();
21298
21384
  var oldState = $location.$$state;
@@ -23142,29 +23228,6 @@ Parser.prototype = {
23142
23228
  }
23143
23229
  };
23144
23230
 
23145
- //////////////////////////////////////////////////
23146
- // Parser helper functions
23147
- //////////////////////////////////////////////////
23148
-
23149
- function setter(obj, path, setValue, fullExp) {
23150
- ensureSafeObject(obj, fullExp);
23151
-
23152
- var element = path.split('.'), key;
23153
- for (var i = 0; element.length > 1; i++) {
23154
- key = ensureSafeMemberName(element.shift(), fullExp);
23155
- var propertyObj = ensureSafeObject(obj[key], fullExp);
23156
- if (!propertyObj) {
23157
- propertyObj = {};
23158
- obj[key] = propertyObj;
23159
- }
23160
- obj = propertyObj;
23161
- }
23162
- key = ensureSafeMemberName(element.shift(), fullExp);
23163
- ensureSafeObject(obj[key], fullExp);
23164
- obj[key] = setValue;
23165
- return setValue;
23166
- }
23167
-
23168
23231
  var getterFnCacheDefault = createMap();
23169
23232
  var getterFnCacheExpensive = createMap();
23170
23233
 
@@ -23233,13 +23296,14 @@ function $ParseProvider() {
23233
23296
  var cacheDefault = createMap();
23234
23297
  var cacheExpensive = createMap();
23235
23298
 
23236
- this.$get = ['$filter', '$sniffer', function($filter, $sniffer) {
23299
+ this.$get = ['$filter', function($filter) {
23300
+ var noUnsafeEval = csp().noUnsafeEval;
23237
23301
  var $parseOptions = {
23238
- csp: $sniffer.csp,
23302
+ csp: noUnsafeEval,
23239
23303
  expensiveChecks: false
23240
23304
  },
23241
23305
  $parseOptionsExpensive = {
23242
- csp: $sniffer.csp,
23306
+ csp: noUnsafeEval,
23243
23307
  expensiveChecks: true
23244
23308
  };
23245
23309
 
@@ -23714,8 +23778,11 @@ function qFactory(nextTick, exceptionHandler) {
23714
23778
  this.$$state = { status: 0 };
23715
23779
  }
23716
23780
 
23717
- Promise.prototype = {
23781
+ extend(Promise.prototype, {
23718
23782
  then: function(onFulfilled, onRejected, progressBack) {
23783
+ if (isUndefined(onFulfilled) && isUndefined(onRejected) && isUndefined(progressBack)) {
23784
+ return this;
23785
+ }
23719
23786
  var result = new Deferred();
23720
23787
 
23721
23788
  this.$$state.pending = this.$$state.pending || [];
@@ -23736,7 +23803,7 @@ function qFactory(nextTick, exceptionHandler) {
23736
23803
  return handleCallback(error, false, callback);
23737
23804
  }, progressBack);
23738
23805
  }
23739
- };
23806
+ });
23740
23807
 
23741
23808
  //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native
23742
23809
  function simpleBind(context, fn) {
@@ -23783,7 +23850,7 @@ function qFactory(nextTick, exceptionHandler) {
23783
23850
  this.notify = simpleBind(this, this.notify);
23784
23851
  }
23785
23852
 
23786
- Deferred.prototype = {
23853
+ extend(Deferred.prototype, {
23787
23854
  resolve: function(val) {
23788
23855
  if (this.promise.$$state.status) return;
23789
23856
  if (val === this.promise) {
@@ -23846,7 +23913,7 @@ function qFactory(nextTick, exceptionHandler) {
23846
23913
  });
23847
23914
  }
23848
23915
  }
23849
- };
23916
+ });
23850
23917
 
23851
23918
  /**
23852
23919
  * @ngdoc method
@@ -23929,6 +23996,9 @@ function qFactory(nextTick, exceptionHandler) {
23929
23996
  * the promise comes from a source that can't be trusted.
23930
23997
  *
23931
23998
  * @param {*} value Value or a promise
23999
+ * @param {Function=} successCallback
24000
+ * @param {Function=} errorCallback
24001
+ * @param {Function=} progressCallback
23932
24002
  * @returns {Promise} Returns a promise of the passed value or promise
23933
24003
  */
23934
24004
 
@@ -23948,6 +24018,9 @@ function qFactory(nextTick, exceptionHandler) {
23948
24018
  * Alias of {@link ng.$q#when when} to maintain naming consistency with ES6.
23949
24019
  *
23950
24020
  * @param {*} value Value or a promise
24021
+ * @param {Function=} successCallback
24022
+ * @param {Function=} errorCallback
24023
+ * @param {Function=} progressCallback
23951
24024
  * @returns {Promise} Returns a promise of the passed value or promise
23952
24025
  */
23953
24026
  var resolve = when;
@@ -24203,12 +24276,9 @@ function $RootScopeProvider() {
24203
24276
  * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the
24204
24277
  * {@link auto.$injector $injector}. Child scopes are created using the
24205
24278
  * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when
24206
- * compiled HTML template is executed.)
24279
+ * compiled HTML template is executed.) See also the {@link guide/scope Scopes guide} for
24280
+ * an in-depth introduction and usage examples.
24207
24281
  *
24208
- * Here is a simple scope snippet to show how you can interact with the scope.
24209
- * ```html
24210
- * <file src="./test/ng/rootScopeSpec.js" tag="docs1" />
24211
- * ```
24212
24282
  *
24213
24283
  * # Inheritance
24214
24284
  * A scope can inherit from a parent scope, as in this example:
@@ -24370,9 +24440,9 @@ function $RootScopeProvider() {
24370
24440
  *
24371
24441
  *
24372
24442
  * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called,
24373
- * you can register a `watchExpression` function with no `listener`. (Since `watchExpression`
24374
- * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a
24375
- * change is detected, be prepared for multiple calls to your listener.)
24443
+ * you can register a `watchExpression` function with no `listener`. (Be prepared for
24444
+ * multiple calls to your `watchExpression` because it will execute multiple times in a
24445
+ * single {@link ng.$rootScope.Scope#$digest $digest} cycle if a change is detected.)
24376
24446
  *
24377
24447
  * After a watcher is registered with the scope, the `listener` fn is called asynchronously
24378
24448
  * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the
@@ -25134,11 +25204,14 @@ function $RootScopeProvider() {
25134
25204
  $apply: function(expr) {
25135
25205
  try {
25136
25206
  beginPhase('$apply');
25137
- return this.$eval(expr);
25207
+ try {
25208
+ return this.$eval(expr);
25209
+ } finally {
25210
+ clearPhase();
25211
+ }
25138
25212
  } catch (e) {
25139
25213
  $exceptionHandler(e);
25140
25214
  } finally {
25141
- clearPhase();
25142
25215
  try {
25143
25216
  $rootScope.$digest();
25144
25217
  } catch (e) {
@@ -26054,10 +26127,10 @@ function $SceDelegateProvider() {
26054
26127
  * - There are exactly **two wildcard sequences** - `*` and `**`. All other characters
26055
26128
  * match themselves.
26056
26129
  * - `*`: matches zero or more occurrences of any character other than one of the following 6
26057
- * characters: '`:`', '`/`', '`.`', '`?`', '`&`' and ';'. It's a useful wildcard for use
26130
+ * characters: '`:`', '`/`', '`.`', '`?`', '`&`' and '`;`'. It's a useful wildcard for use
26058
26131
  * in a whitelist.
26059
26132
  * - `**`: matches zero or more occurrences of *any* character. As such, it's not
26060
- * not appropriate to use in for a scheme, domain, etc. as it would match too much. (e.g.
26133
+ * appropriate for use in a scheme, domain, etc. as it would match too much. (e.g.
26061
26134
  * http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might
26062
26135
  * not have been the intention.) Its usage at the very end of the path is ok. (e.g.
26063
26136
  * http://foo.example.com/templates/**).
@@ -26065,11 +26138,11 @@ function $SceDelegateProvider() {
26065
26138
  * - *Caveat*: While regular expressions are powerful and offer great flexibility, their syntax
26066
26139
  * (and all the inevitable escaping) makes them *harder to maintain*. It's easy to
26067
26140
  * accidentally introduce a bug when one updates a complex expression (imho, all regexes should
26068
- * have good test coverage.). For instance, the use of `.` in the regex is correct only in a
26141
+ * have good test coverage). For instance, the use of `.` in the regex is correct only in a
26069
26142
  * small number of cases. A `.` character in the regex used when matching the scheme or a
26070
26143
  * subdomain could be matched against a `:` or literal `.` that was likely not intended. It
26071
26144
  * is highly recommended to use the string patterns and only fall back to regular expressions
26072
- * if they as a last resort.
26145
+ * as a last resort.
26073
26146
  * - The regular expression must be an instance of RegExp (i.e. not a string.) It is
26074
26147
  * matched against the **entire** *normalized / absolute URL* of the resource being tested
26075
26148
  * (even when the RegExp did not have the `^` and `$` codes.) In addition, any flags
@@ -26079,7 +26152,7 @@ function $SceDelegateProvider() {
26079
26152
  * remember to escape your regular expression (and be aware that you might need more than
26080
26153
  * one level of escaping depending on your templating engine and the way you interpolated
26081
26154
  * the value.) Do make use of your platform's escaping mechanism as it might be good
26082
- * enough before coding your own. e.g. Ruby has
26155
+ * enough before coding your own. E.g. Ruby has
26083
26156
  * [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape)
26084
26157
  * and Python has [re.escape](http://docs.python.org/library/re.html#re.escape).
26085
26158
  * Javascript lacks a similar built in function for escaping. Take a look at Google
@@ -26967,20 +27040,13 @@ var originUrl = urlResolve(window.location.href);
26967
27040
  *
26968
27041
  * Implementation Notes for IE
26969
27042
  * ---------------------------
26970
- * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other
27043
+ * IE <= 10 normalizes the URL when assigned to the anchor node similar to the other
26971
27044
  * browsers. However, the parsed components will not be set if the URL assigned did not specify
26972
27045
  * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We
26973
27046
  * work around that by performing the parsing in a 2nd step by taking a previously normalized
26974
27047
  * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the
26975
27048
  * properties such as protocol, hostname, port, etc.
26976
27049
  *
26977
- * IE7 does not normalize the URL when assigned to an anchor node. (Apparently, it does, if one
26978
- * uses the inner HTML approach to assign the URL as part of an HTML snippet -
26979
- * http://stackoverflow.com/a/472729) However, setting img[src] does normalize the URL.
26980
- * Unfortunately, setting img[src] to something like "javascript:foo" on IE throws an exception.
26981
- * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that
26982
- * method and IE < 8 is unsupported.
26983
- *
26984
27050
  * References:
26985
27051
  * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement
26986
27052
  * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html
@@ -27260,6 +27326,7 @@ function $FilterProvider($provide) {
27260
27326
  * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores
27261
27327
  * (`myapp_subsection_filterx`).
27262
27328
  * </div>
27329
+ * @param {Function} factory If the first argument was a string, a factory function for the filter to be registered.
27263
27330
  * @returns {Object} Registered filter instance, or if a map of filters was provided then a map
27264
27331
  * of the registered filter instances.
27265
27332
  */
@@ -27607,9 +27674,9 @@ function getTypeForFilter(val) {
27607
27674
  }
27608
27675
  element(by.model('amount')).clear();
27609
27676
  element(by.model('amount')).sendKeys('-1234');
27610
- expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)');
27611
- expect(element(by.id('currency-custom')).getText()).toBe('(USD$1,234.00)');
27612
- expect(element(by.id('currency-no-fractions')).getText()).toBe('(USD$1,234)');
27677
+ expect(element(by.id('currency-default')).getText()).toBe('-$1,234.00');
27678
+ expect(element(by.id('currency-custom')).getText()).toBe('-USD$1,234.00');
27679
+ expect(element(by.id('currency-no-fractions')).getText()).toBe('-USD$1,234');
27613
27680
  });
27614
27681
  </file>
27615
27682
  </example>
@@ -28449,6 +28516,10 @@ function orderByFilter($parse) {
28449
28516
  if (sortPredicate.length === 0) { sortPredicate = ['+']; }
28450
28517
 
28451
28518
  var predicates = processPredicates(sortPredicate, reverseOrder);
28519
+ // Add a predicate at the end that evaluates to the element index. This makes the
28520
+ // sort stable as it works as a tie-breaker when all the input predicates cannot
28521
+ // distinguish between two elements.
28522
+ predicates.push({ get: function() { return {}; }, descending: reverseOrder ? -1 : 1});
28452
28523
 
28453
28524
  // The next three lines are a version of a Swartzian Transform idiom from Perl
28454
28525
  // (sometimes called the Decorate-Sort-Undecorate idiom)
@@ -29494,7 +29565,7 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
29494
29565
  * related scope, under this name.
29495
29566
  */
29496
29567
  var formDirectiveFactory = function(isNgForm) {
29497
- return ['$timeout', function($timeout) {
29568
+ return ['$timeout', '$parse', function($timeout, $parse) {
29498
29569
  var formDirective = {
29499
29570
  name: 'form',
29500
29571
  restrict: isNgForm ? 'EAC' : 'E',
@@ -29536,21 +29607,21 @@ var formDirectiveFactory = function(isNgForm) {
29536
29607
  }
29537
29608
 
29538
29609
  var parentFormCtrl = controller.$$parentForm;
29610
+ var setter = nameAttr ? getSetter(controller.$name) : noop;
29539
29611
 
29540
29612
  if (nameAttr) {
29541
- setter(scope, controller.$name, controller, controller.$name);
29613
+ setter(scope, controller);
29542
29614
  attr.$observe(nameAttr, function(newValue) {
29543
29615
  if (controller.$name === newValue) return;
29544
- setter(scope, controller.$name, undefined, controller.$name);
29616
+ setter(scope, undefined);
29545
29617
  parentFormCtrl.$$renameControl(controller, newValue);
29546
- setter(scope, controller.$name, controller, controller.$name);
29618
+ setter = getSetter(controller.$name);
29619
+ setter(scope, controller);
29547
29620
  });
29548
29621
  }
29549
29622
  formElement.on('$destroy', function() {
29550
29623
  parentFormCtrl.$removeControl(controller);
29551
- if (nameAttr) {
29552
- setter(scope, attr[nameAttr], undefined, controller.$name);
29553
- }
29624
+ setter(scope, undefined);
29554
29625
  extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards
29555
29626
  });
29556
29627
  }
@@ -29559,6 +29630,14 @@ var formDirectiveFactory = function(isNgForm) {
29559
29630
  };
29560
29631
 
29561
29632
  return formDirective;
29633
+
29634
+ function getSetter(expression) {
29635
+ if (expression === '') {
29636
+ //create an assignable expression, so forms with an empty name can be renamed later
29637
+ return $parse('this[""]').assign;
29638
+ }
29639
+ return $parse(expression).assign || noop;
29640
+ }
29562
29641
  }];
29563
29642
  };
29564
29643
 
@@ -29571,7 +29650,7 @@ var ngFormDirective = formDirectiveFactory(true);
29571
29650
  DIRTY_CLASS: false,
29572
29651
  UNTOUCHED_CLASS: false,
29573
29652
  TOUCHED_CLASS: false,
29574
- $ngModelMinErr: false,
29653
+ ngModelMinErr: false,
29575
29654
  */
29576
29655
 
29577
29656
  // Regex code is obtained from SO: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231
@@ -30693,7 +30772,11 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
30693
30772
  element.on('change', listener);
30694
30773
 
30695
30774
  ctrl.$render = function() {
30696
- element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue);
30775
+ // Workaround for Firefox validation #12102.
30776
+ var value = ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue;
30777
+ if (element.val() !== value) {
30778
+ element.val(value);
30779
+ }
30697
30780
  };
30698
30781
  }
30699
30782
 
@@ -30804,7 +30887,7 @@ function createDateInputType(type, regexp, parseDate, format) {
30804
30887
 
30805
30888
  ctrl.$formatters.push(function(value) {
30806
30889
  if (value && !isDate(value)) {
30807
- throw $ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value);
30890
+ throw ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value);
30808
30891
  }
30809
30892
  if (isValidDate(value)) {
30810
30893
  previousDate = value;
@@ -30880,7 +30963,7 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
30880
30963
  ctrl.$formatters.push(function(value) {
30881
30964
  if (!ctrl.$isEmpty(value)) {
30882
30965
  if (!isNumber(value)) {
30883
- throw $ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value);
30966
+ throw ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value);
30884
30967
  }
30885
30968
  value = value.toString();
30886
30969
  }
@@ -30973,7 +31056,7 @@ function parseConstantExpr($parse, context, name, expression, fallback) {
30973
31056
  if (isDefined(expression)) {
30974
31057
  parseFn = $parse(expression);
30975
31058
  if (!parseFn.constant) {
30976
- throw minErr('ngModel')('constexpr', 'Expected constant expression for `{0}`, but saw ' +
31059
+ throw ngModelMinErr('constexpr', 'Expected constant expression for `{0}`, but saw ' +
30977
31060
  '`{1}`.', name, expression);
30978
31061
  }
30979
31062
  return parseFn(context);
@@ -32259,27 +32342,29 @@ var ngControllerDirective = [function() {
32259
32342
  *
32260
32343
  * @element html
32261
32344
  * @description
32262
- * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support.
32345
+ *
32346
+ * Angular has some features that can break certain
32347
+ * [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) rules.
32348
+ *
32349
+ * If you intend to implement these rules then you must tell Angular not to use these features.
32263
32350
  *
32264
32351
  * This is necessary when developing things like Google Chrome Extensions or Universal Windows Apps.
32265
32352
  *
32266
- * CSP forbids apps to use `eval` or `Function(string)` generated functions (among other things).
32267
- * For Angular to be CSP compatible there are only two things that we need to do differently:
32268
32353
  *
32269
- * - don't use `Function` constructor to generate optimized value getters
32270
- * - don't inject custom stylesheet into the document
32354
+ * The following rules affect Angular:
32271
32355
  *
32272
- * AngularJS uses `Function(string)` generated functions as a speed optimization. Applying the `ngCsp`
32273
- * directive will cause Angular to use CSP compatibility mode. When this mode is on AngularJS will
32274
- * evaluate all expressions up to 30% slower than in non-CSP mode, but no security violations will
32275
- * be raised.
32356
+ * * `unsafe-eval`: this rule forbids apps to use `eval` or `Function(string)` generated functions
32357
+ * (among other things). Angular makes use of this in the {@link $parse} service to provide a 30%
32358
+ * increase in the speed of evaluating Angular expressions.
32276
32359
  *
32277
- * CSP forbids JavaScript to inline stylesheet rules. In non CSP mode Angular automatically
32278
- * includes some CSS rules (e.g. {@link ng.directive:ngCloak ngCloak}).
32279
- * To make those directives work in CSP mode, include the `angular-csp.css` manually.
32360
+ * * `unsafe-inline`: this rule forbids apps from inject custom styles into the document. Angular
32361
+ * makes use of this to include some CSS rules (e.g. {@link ngCloak} and {@link ngHide}).
32362
+ * To make these directives work when a CSP rule is blocking inline styles, you must link to the
32363
+ * `angular-csp.css` in your HTML manually.
32280
32364
  *
32281
- * Angular tries to autodetect if CSP is active and automatically turn on the CSP-safe mode. This
32282
- * autodetection however triggers a CSP error to be logged in the console:
32365
+ * If you do not provide `ngCsp` then Angular tries to autodetect if CSP is blocking unsafe-eval
32366
+ * and automatically deactivates this feature in the {@link $parse} service. This autodetection,
32367
+ * however, triggers a CSP error to be logged in the console:
32283
32368
  *
32284
32369
  * ```
32285
32370
  * Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of
@@ -32288,11 +32373,39 @@ var ngControllerDirective = [function() {
32288
32373
  * ```
32289
32374
  *
32290
32375
  * This error is harmless but annoying. To prevent the error from showing up, put the `ngCsp`
32291
- * directive on the root element of the application or on the `angular.js` script tag, whichever
32292
- * appears first in the html document.
32376
+ * directive on an element of the HTML document that appears before the `<script>` tag that loads
32377
+ * the `angular.js` file.
32293
32378
  *
32294
32379
  * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.*
32295
32380
  *
32381
+ * You can specify which of the CSP related Angular features should be deactivated by providing
32382
+ * a value for the `ng-csp` attribute. The options are as follows:
32383
+ *
32384
+ * * no-inline-style: this stops Angular from injecting CSS styles into the DOM
32385
+ *
32386
+ * * no-unsafe-eval: this stops Angular from optimising $parse with unsafe eval of strings
32387
+ *
32388
+ * You can use these values in the following combinations:
32389
+ *
32390
+ *
32391
+ * * No declaration means that Angular will assume that you can do inline styles, but it will do
32392
+ * a runtime check for unsafe-eval. E.g. `<body>`. This is backwardly compatible with previous versions
32393
+ * of Angular.
32394
+ *
32395
+ * * A simple `ng-csp` (or `data-ng-csp`) attribute will tell Angular to deactivate both inline
32396
+ * styles and unsafe eval. E.g. `<body ng-csp>`. This is backwardly compatible with previous versions
32397
+ * of Angular.
32398
+ *
32399
+ * * Specifying only `no-unsafe-eval` tells Angular that we must not use eval, but that we can inject
32400
+ * inline styles. E.g. `<body ng-csp="no-unsafe-eval">`.
32401
+ *
32402
+ * * Specifying only `no-inline-style` tells Angular that we must not inject styles, but that we can
32403
+ * run eval - no automcatic check for unsafe eval will occur. E.g. `<body ng-csp="no-inline-style">`
32404
+ *
32405
+ * * Specifying both `no-unsafe-eval` and `no-inline-style` tells Angular that we must not inject
32406
+ * styles nor use eval, which is the same as an empty: ng-csp.
32407
+ * E.g.`<body ng-csp="no-inline-style;no-unsafe-eval">`
32408
+ *
32296
32409
  * @example
32297
32410
  * This example shows how to apply the `ngCsp` directive to the `html` tag.
32298
32411
  ```html
@@ -32424,7 +32537,7 @@ var ngControllerDirective = [function() {
32424
32537
 
32425
32538
  // ngCsp is not implemented as a proper directive any more, because we need it be processed while we
32426
32539
  // bootstrap the system (before $parse is instantiated), for this reason we just have
32427
- // the csp.isActive() fn that looks for ng-csp attribute anywhere in the current doc
32540
+ // the csp() fn that looks for the `ng-csp` attribute anywhere in the current doc
32428
32541
 
32429
32542
  /**
32430
32543
  * @ngdoc directive
@@ -33540,8 +33653,7 @@ var VALID_CLASS = 'ng-valid',
33540
33653
  TOUCHED_CLASS = 'ng-touched',
33541
33654
  PENDING_CLASS = 'ng-pending';
33542
33655
 
33543
-
33544
- var $ngModelMinErr = new minErr('ngModel');
33656
+ var ngModelMinErr = minErr('ngModel');
33545
33657
 
33546
33658
  /**
33547
33659
  * @ngdoc type
@@ -33792,7 +33904,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
33792
33904
  }
33793
33905
  };
33794
33906
  } else if (!parsedNgModel.assign) {
33795
- throw $ngModelMinErr('nonassign', "Expression '{0}' is non-assignable. Element: {1}",
33907
+ throw ngModelMinErr('nonassign', "Expression '{0}' is non-assignable. Element: {1}",
33796
33908
  $attr.ngModel, startingTag($element));
33797
33909
  }
33798
33910
  };
@@ -34123,7 +34235,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
34123
34235
  forEach(ctrl.$asyncValidators, function(validator, name) {
34124
34236
  var promise = validator(modelValue, viewValue);
34125
34237
  if (!isPromiseLike(promise)) {
34126
- throw $ngModelMinErr("$asyncValidators",
34238
+ throw ngModelMinErr("$asyncValidators",
34127
34239
  "Expected asynchronous validator to return a promise but got '{0}' instead.", promise);
34128
34240
  }
34129
34241
  setValidity(name, undefined);
@@ -34977,7 +35089,7 @@ var ngOptionsMinErr = minErr('ngOptions');
34977
35089
  * Consider the following example:
34978
35090
  *
34979
35091
  * ```html
34980
- * <select ng-options="item.subItem as item.label for item in values track by item.id" ng-model="selected">
35092
+ * <select ng-options="item.subItem as item.label for item in values track by item.id" ng-model="selected"></select>
34981
35093
  * ```
34982
35094
  *
34983
35095
  * ```js
@@ -35439,7 +35551,7 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
35439
35551
 
35440
35552
  forEach(selectedValues, function(value) {
35441
35553
  var option = options.selectValueMap[value];
35442
- if (!option.disabled) selections.push(options.getViewValueFromOption(option));
35554
+ if (option && !option.disabled) selections.push(options.getViewValueFromOption(option));
35443
35555
  });
35444
35556
 
35445
35557
  return selections;
@@ -37535,6 +37647,146 @@ var minlengthDirective = function() {
37535
37647
  };
37536
37648
  };
37537
37649
 
37650
+ if (window.angular.bootstrap) {
37651
+ //AngularJS is already loaded, so we can return here...
37652
+ console.log('WARNING: Tried to load angular more than once.');
37653
+ return;
37654
+ }
37655
+
37656
+ //try to bind to jquery now so that one can write jqLite(document).ready()
37657
+ //but we will rebind on bootstrap again.
37658
+ bindJQuery();
37659
+
37660
+ publishExternalAPI(angular);
37661
+
37662
+ angular.module("ngLocale", [], ["$provide", function($provide) {
37663
+ var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"};
37664
+ function getDecimals(n) {
37665
+ n = n + '';
37666
+ var i = n.indexOf('.');
37667
+ return (i == -1) ? 0 : n.length - i - 1;
37668
+ }
37669
+
37670
+ function getVF(n, opt_precision) {
37671
+ var v = opt_precision;
37672
+
37673
+ if (undefined === v) {
37674
+ v = Math.min(getDecimals(n), 3);
37675
+ }
37676
+
37677
+ var base = Math.pow(10, v);
37678
+ var f = ((n * base) | 0) % base;
37679
+ return {v: v, f: f};
37680
+ }
37681
+
37682
+ $provide.value("$locale", {
37683
+ "DATETIME_FORMATS": {
37684
+ "AMPMS": [
37685
+ "AM",
37686
+ "PM"
37687
+ ],
37688
+ "DAY": [
37689
+ "Sunday",
37690
+ "Monday",
37691
+ "Tuesday",
37692
+ "Wednesday",
37693
+ "Thursday",
37694
+ "Friday",
37695
+ "Saturday"
37696
+ ],
37697
+ "ERANAMES": [
37698
+ "Before Christ",
37699
+ "Anno Domini"
37700
+ ],
37701
+ "ERAS": [
37702
+ "BC",
37703
+ "AD"
37704
+ ],
37705
+ "FIRSTDAYOFWEEK": 6,
37706
+ "MONTH": [
37707
+ "January",
37708
+ "February",
37709
+ "March",
37710
+ "April",
37711
+ "May",
37712
+ "June",
37713
+ "July",
37714
+ "August",
37715
+ "September",
37716
+ "October",
37717
+ "November",
37718
+ "December"
37719
+ ],
37720
+ "SHORTDAY": [
37721
+ "Sun",
37722
+ "Mon",
37723
+ "Tue",
37724
+ "Wed",
37725
+ "Thu",
37726
+ "Fri",
37727
+ "Sat"
37728
+ ],
37729
+ "SHORTMONTH": [
37730
+ "Jan",
37731
+ "Feb",
37732
+ "Mar",
37733
+ "Apr",
37734
+ "May",
37735
+ "Jun",
37736
+ "Jul",
37737
+ "Aug",
37738
+ "Sep",
37739
+ "Oct",
37740
+ "Nov",
37741
+ "Dec"
37742
+ ],
37743
+ "WEEKENDRANGE": [
37744
+ 5,
37745
+ 6
37746
+ ],
37747
+ "fullDate": "EEEE, MMMM d, y",
37748
+ "longDate": "MMMM d, y",
37749
+ "medium": "MMM d, y h:mm:ss a",
37750
+ "mediumDate": "MMM d, y",
37751
+ "mediumTime": "h:mm:ss a",
37752
+ "short": "M/d/yy h:mm a",
37753
+ "shortDate": "M/d/yy",
37754
+ "shortTime": "h:mm a"
37755
+ },
37756
+ "NUMBER_FORMATS": {
37757
+ "CURRENCY_SYM": "$",
37758
+ "DECIMAL_SEP": ".",
37759
+ "GROUP_SEP": ",",
37760
+ "PATTERNS": [
37761
+ {
37762
+ "gSize": 3,
37763
+ "lgSize": 3,
37764
+ "maxFrac": 3,
37765
+ "minFrac": 0,
37766
+ "minInt": 1,
37767
+ "negPre": "-",
37768
+ "negSuf": "",
37769
+ "posPre": "",
37770
+ "posSuf": ""
37771
+ },
37772
+ {
37773
+ "gSize": 3,
37774
+ "lgSize": 3,
37775
+ "maxFrac": 2,
37776
+ "minFrac": 2,
37777
+ "minInt": 1,
37778
+ "negPre": "-\u00a4",
37779
+ "negSuf": "",
37780
+ "posPre": "\u00a4",
37781
+ "posSuf": ""
37782
+ }
37783
+ ]
37784
+ },
37785
+ "id": "en-us",
37786
+ "pluralCat": function(n, opt_precision) { var i = n | 0; var vf = getVF(n, opt_precision); if (i == 1 && vf.v == 0) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;}
37787
+ });
37788
+ }]);
37789
+
37538
37790
  /**
37539
37791
  * Setup file for the Scenario.
37540
37792
  * Must be first in the compilation/bootstrap list.
@@ -39768,5 +40020,5 @@ if (config.autotest) {
39768
40020
  })(window, document);
39769
40021
 
39770
40022
 
39771
- !window.angular.$$csp() && window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";\n\n[ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],\n.ng-cloak, .x-ng-cloak,\n.ng-hide:not(.ng-hide-animate) {\n display: none !important;\n}\n\nng\\:form {\n display: block;\n}\n\n.ng-animate-shim {\n visibility:hidden;\n}\n\n.ng-anchor {\n position:absolute;\n}\n</style>');
39772
- !window.angular.$$csp() && window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";\n/* CSS Document */\n\n/** Structure */\nbody {\n font-family: Arial, sans-serif;\n margin: 0;\n font-size: 14px;\n}\n\n#system-error {\n font-size: 1.5em;\n text-align: center;\n}\n\n#json, #xml {\n display: none;\n}\n\n#header {\n position: fixed;\n width: 100%;\n}\n\n#specs {\n padding-top: 50px;\n}\n\n#header .angular {\n font-family: Courier New, monospace;\n font-weight: bold;\n}\n\n#header h1 {\n font-weight: normal;\n float: left;\n font-size: 30px;\n line-height: 30px;\n margin: 0;\n padding: 10px 10px;\n height: 30px;\n}\n\n#application h2,\n#specs h2 {\n margin: 0;\n padding: 0.5em;\n font-size: 1.1em;\n}\n\n#status-legend {\n margin-top: 10px;\n margin-right: 10px;\n}\n\n#header,\n#application,\n.test-info,\n.test-actions li {\n overflow: hidden;\n}\n\n#application {\n margin: 10px;\n}\n\n#application iframe {\n width: 100%;\n height: 758px;\n}\n\n#application .popout {\n float: right;\n}\n\n#application iframe {\n border: none;\n}\n\n.tests li,\n.test-actions li,\n.test-it li,\n.test-it ol,\n.status-display {\n list-style-type: none;\n}\n\n.tests,\n.test-it ol,\n.status-display {\n margin: 0;\n padding: 0;\n}\n\n.test-info {\n margin-left: 1em;\n margin-top: 0.5em;\n border-radius: 8px 0 0 8px;\n -webkit-border-radius: 8px 0 0 8px;\n -moz-border-radius: 8px 0 0 8px;\n cursor: pointer;\n}\n\n.test-info:hover .test-name {\n text-decoration: underline;\n}\n\n.test-info .closed:before {\n content: \'\\25b8\\00A0\';\n}\n\n.test-info .open:before {\n content: \'\\25be\\00A0\';\n font-weight: bold;\n}\n\n.test-it ol {\n margin-left: 2.5em;\n}\n\n.status-display,\n.status-display li {\n float: right;\n}\n\n.status-display li {\n padding: 5px 10px;\n}\n\n.timer-result,\n.test-title {\n display: inline-block;\n margin: 0;\n padding: 4px;\n}\n\n.test-actions .test-title,\n.test-actions .test-result {\n display: table-cell;\n padding-left: 0.5em;\n padding-right: 0.5em;\n}\n\n.test-actions {\n display: table;\n}\n\n.test-actions li {\n display: table-row;\n}\n\n.timer-result {\n width: 4em;\n padding: 0 10px;\n text-align: right;\n font-family: monospace;\n}\n\n.test-it pre,\n.test-actions pre {\n clear: left;\n color: black;\n margin-left: 6em;\n}\n\n.test-describe {\n padding-bottom: 0.5em;\n}\n\n.test-describe .test-describe {\n margin: 5px 5px 10px 2em;\n}\n\n.test-actions .status-pending .test-title:before {\n content: \'\\00bb\\00A0\';\n}\n\n.scrollpane {\n max-height: 20em;\n overflow: auto;\n}\n\n/** Colors */\n\n#header {\n background-color: #F2C200;\n}\n\n#specs h2 {\n border-top: 2px solid #BABAD1;\n}\n\n#specs h2,\n#application h2 {\n background-color: #efefef;\n}\n\n#application {\n border: 1px solid #BABAD1;\n}\n\n.test-describe .test-describe {\n border-left: 1px solid #BABAD1;\n border-right: 1px solid #BABAD1;\n border-bottom: 1px solid #BABAD1;\n}\n\n.status-display {\n border: 1px solid #777;\n}\n\n.status-display .status-pending,\n.status-pending .test-info {\n background-color: #F9EEBC;\n}\n\n.status-display .status-success,\n.status-success .test-info {\n background-color: #B1D7A1;\n}\n\n.status-display .status-failure,\n.status-failure .test-info {\n background-color: #FF8286;\n}\n\n.status-display .status-error,\n.status-error .test-info {\n background-color: black;\n color: white;\n}\n\n.test-actions .status-success .test-title {\n color: #30B30A;\n}\n\n.test-actions .status-failure .test-title {\n color: #DF0000;\n}\n\n.test-actions .status-error .test-title {\n color: black;\n}\n\n.test-actions .timer-result {\n color: #888;\n}\n</style>');
40023
+ !window.angular.$$csp().noInlineStyle && window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";\n\n[ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],\n.ng-cloak, .x-ng-cloak,\n.ng-hide:not(.ng-hide-animate) {\n display: none !important;\n}\n\nng\\:form {\n display: block;\n}\n\n.ng-animate-shim {\n visibility:hidden;\n}\n\n.ng-anchor {\n position:absolute;\n}\n</style>');
40024
+ !window.angular.$$csp().noInlineStyle && window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";\n/* CSS Document */\n\n/** Structure */\nbody {\n font-family: Arial, sans-serif;\n margin: 0;\n font-size: 14px;\n}\n\n#system-error {\n font-size: 1.5em;\n text-align: center;\n}\n\n#json, #xml {\n display: none;\n}\n\n#header {\n position: fixed;\n width: 100%;\n}\n\n#specs {\n padding-top: 50px;\n}\n\n#header .angular {\n font-family: Courier New, monospace;\n font-weight: bold;\n}\n\n#header h1 {\n font-weight: normal;\n float: left;\n font-size: 30px;\n line-height: 30px;\n margin: 0;\n padding: 10px 10px;\n height: 30px;\n}\n\n#application h2,\n#specs h2 {\n margin: 0;\n padding: 0.5em;\n font-size: 1.1em;\n}\n\n#status-legend {\n margin-top: 10px;\n margin-right: 10px;\n}\n\n#header,\n#application,\n.test-info,\n.test-actions li {\n overflow: hidden;\n}\n\n#application {\n margin: 10px;\n}\n\n#application iframe {\n width: 100%;\n height: 758px;\n}\n\n#application .popout {\n float: right;\n}\n\n#application iframe {\n border: none;\n}\n\n.tests li,\n.test-actions li,\n.test-it li,\n.test-it ol,\n.status-display {\n list-style-type: none;\n}\n\n.tests,\n.test-it ol,\n.status-display {\n margin: 0;\n padding: 0;\n}\n\n.test-info {\n margin-left: 1em;\n margin-top: 0.5em;\n border-radius: 8px 0 0 8px;\n -webkit-border-radius: 8px 0 0 8px;\n -moz-border-radius: 8px 0 0 8px;\n cursor: pointer;\n}\n\n.test-info:hover .test-name {\n text-decoration: underline;\n}\n\n.test-info .closed:before {\n content: \'\\25b8\\00A0\';\n}\n\n.test-info .open:before {\n content: \'\\25be\\00A0\';\n font-weight: bold;\n}\n\n.test-it ol {\n margin-left: 2.5em;\n}\n\n.status-display,\n.status-display li {\n float: right;\n}\n\n.status-display li {\n padding: 5px 10px;\n}\n\n.timer-result,\n.test-title {\n display: inline-block;\n margin: 0;\n padding: 4px;\n}\n\n.test-actions .test-title,\n.test-actions .test-result {\n display: table-cell;\n padding-left: 0.5em;\n padding-right: 0.5em;\n}\n\n.test-actions {\n display: table;\n}\n\n.test-actions li {\n display: table-row;\n}\n\n.timer-result {\n width: 4em;\n padding: 0 10px;\n text-align: right;\n font-family: monospace;\n}\n\n.test-it pre,\n.test-actions pre {\n clear: left;\n color: black;\n margin-left: 6em;\n}\n\n.test-describe {\n padding-bottom: 0.5em;\n}\n\n.test-describe .test-describe {\n margin: 5px 5px 10px 2em;\n}\n\n.test-actions .status-pending .test-title:before {\n content: \'\\00bb\\00A0\';\n}\n\n.scrollpane {\n max-height: 20em;\n overflow: auto;\n}\n\n/** Colors */\n\n#header {\n background-color: #F2C200;\n}\n\n#specs h2 {\n border-top: 2px solid #BABAD1;\n}\n\n#specs h2,\n#application h2 {\n background-color: #efefef;\n}\n\n#application {\n border: 1px solid #BABAD1;\n}\n\n.test-describe .test-describe {\n border-left: 1px solid #BABAD1;\n border-right: 1px solid #BABAD1;\n border-bottom: 1px solid #BABAD1;\n}\n\n.status-display {\n border: 1px solid #777;\n}\n\n.status-display .status-pending,\n.status-pending .test-info {\n background-color: #F9EEBC;\n}\n\n.status-display .status-success,\n.status-success .test-info {\n background-color: #B1D7A1;\n}\n\n.status-display .status-failure,\n.status-failure .test-info {\n background-color: #FF8286;\n}\n\n.status-display .status-error,\n.status-error .test-info {\n background-color: black;\n color: white;\n}\n\n.test-actions .status-success .test-title {\n color: #30B30A;\n}\n\n.test-actions .status-failure .test-title {\n color: #DF0000;\n}\n\n.test-actions .status-error .test-title {\n color: black;\n}\n\n.test-actions .timer-result {\n color: #888;\n}\n</style>');