angularjs-rails 1.2.19 → 1.2.20

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: d5b053cde702e705c4a0d3cf314a2eae1b4b5d9b
4
- data.tar.gz: ec1dccc42dee2b82402cade5825ee72a5b1da416
3
+ metadata.gz: 2c4bf4ceba404ee9290e2ea88558badc93abc014
4
+ data.tar.gz: 3cc597cb2ae8b9cebbf812cc467760019e9d043b
5
5
  SHA512:
6
- metadata.gz: d8e256e13363b40424d6ae102292675ea4bf993e0e581b644cceb1f28b34739c040c611e28c65fc310a82e4cef518ea1daea42f650c80682cb8cb7d51fe4ac87
7
- data.tar.gz: a475a737e4338a8ce1b7203c20657ef81d829950b2cfd4457a7f0cef9746dabdb3a2bb5809093de9671c66beab1bd665f457aac4979a3dc1a10ce2a6f29b13df
6
+ metadata.gz: 32d4690d0e7a7e7b6cdfd042d1786e58f60d7ff187999ba72c3449974b4e00f1d85b2bedaf659a44492dff62ee1cd4a6e7fe1360d31b47a879968cebdf20d099
7
+ data.tar.gz: 0951e4ecd0101b7c46192a61879642e3d807a253af6e4afe2a1000d32c591d3eea9d148fb4cb52579c93486107977513aa6734d27e0d9fc9bfc44e87194cd8da
@@ -1,6 +1,6 @@
1
1
  module AngularJS
2
2
  module Rails
3
- VERSION = "1.2.19"
4
- UNSTABLE_VERSION = "1.3.0-beta.14"
3
+ VERSION = "1.2.20"
4
+ UNSTABLE_VERSION = "1.3.0-beta.15"
5
5
  end
6
6
  end
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.19
2
+ * @license AngularJS v1.2.20
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -64,8 +64,22 @@
64
64
  * <ANY class="slide" ng-include="..."></ANY>
65
65
  * ```
66
66
  *
67
- * Keep in mind that if an animation is running, any child elements cannot be animated until the parent element's
68
- * animation has completed.
67
+ * Keep in mind that, by default, if an animation is running, any child elements cannot be animated
68
+ * until the parent element's animation has completed. This blocking feature can be overridden by
69
+ * placing the `ng-animate-children` attribute on a parent container tag.
70
+ *
71
+ * ```html
72
+ * <div class="slide-animation" ng-if="on" ng-animate-children>
73
+ * <div class="fade-animation" ng-if="on">
74
+ * <div class="explode-animation" ng-if="on">
75
+ * ...
76
+ * </div>
77
+ * </div>
78
+ * </div>
79
+ * ```
80
+ *
81
+ * When the `on` expression value changes and an animation is triggered then each of the elements within
82
+ * will all animate without the block being applied to child elements.
69
83
  *
70
84
  * <h2>CSS-defined Animations</h2>
71
85
  * The animate service will automatically apply two CSS classes to the animated element and these two CSS classes
@@ -255,6 +269,19 @@ angular.module('ngAnimate', ['ng'])
255
269
  * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application.
256
270
  *
257
271
  */
272
+ .directive('ngAnimateChildren', function() {
273
+ var NG_ANIMATE_CHILDREN = '$$ngAnimateChildren';
274
+ return function(scope, element, attrs) {
275
+ var val = attrs.ngAnimateChildren;
276
+ if(angular.isString(val) && val.length === 0) { //empty attribute
277
+ element.data(NG_ANIMATE_CHILDREN, true);
278
+ } else {
279
+ scope.$watch(val, function(value) {
280
+ element.data(NG_ANIMATE_CHILDREN, !!value);
281
+ });
282
+ }
283
+ };
284
+ })
258
285
 
259
286
  //this private service is only used within CSS-enabled animations
260
287
  //IE8 + IE9 do not support rAF natively, but that is fine since they
@@ -283,6 +310,7 @@ angular.module('ngAnimate', ['ng'])
283
310
 
284
311
  var ELEMENT_NODE = 1;
285
312
  var NG_ANIMATE_STATE = '$$ngAnimateState';
313
+ var NG_ANIMATE_CHILDREN = '$$ngAnimateChildren';
286
314
  var NG_ANIMATE_CLASS_NAME = 'ng-animate';
287
315
  var rootAnimateState = {running: true};
288
316
 
@@ -332,6 +360,12 @@ angular.module('ngAnimate', ['ng'])
332
360
  return classNameFilter.test(className);
333
361
  };
334
362
 
363
+ function blockElementAnimations(element) {
364
+ var data = element.data(NG_ANIMATE_STATE) || {};
365
+ data.running = true;
366
+ element.data(NG_ANIMATE_STATE, data);
367
+ }
368
+
335
369
  function lookup(name) {
336
370
  if (name) {
337
371
  var matches = [],
@@ -558,7 +592,7 @@ angular.module('ngAnimate', ['ng'])
558
592
  parentElement = prepareElement(parentElement);
559
593
  afterElement = prepareElement(afterElement);
560
594
 
561
- this.enabled(false, element);
595
+ blockElementAnimations(element);
562
596
  $delegate.enter(element, parentElement, afterElement);
563
597
  $rootScope.$$postDigest(function() {
564
598
  element = stripCommentsFromElement(element);
@@ -596,7 +630,7 @@ angular.module('ngAnimate', ['ng'])
596
630
  leave : function(element, doneCallback) {
597
631
  element = angular.element(element);
598
632
  cancelChildAnimations(element);
599
- this.enabled(false, element);
633
+ blockElementAnimations(element);
600
634
  $rootScope.$$postDigest(function() {
601
635
  performAnimation('leave', 'ng-leave', stripCommentsFromElement(element), null, null, function() {
602
636
  $delegate.leave(element);
@@ -640,7 +674,7 @@ angular.module('ngAnimate', ['ng'])
640
674
  afterElement = prepareElement(afterElement);
641
675
 
642
676
  cancelChildAnimations(element);
643
- this.enabled(false, element);
677
+ blockElementAnimations(element);
644
678
  $delegate.move(element, parentElement, afterElement);
645
679
  $rootScope.$$postDigest(function() {
646
680
  element = stripCommentsFromElement(element);
@@ -814,9 +848,12 @@ angular.module('ngAnimate', ['ng'])
814
848
 
815
849
  //only allow animations if the currently running animation is not structural
816
850
  //or if there is no animation running at all
817
- var skipAnimations = runner.isClassBased ?
818
- ngAnimateState.disabled || (lastAnimation && !lastAnimation.isClassBased) :
819
- false;
851
+ var skipAnimations;
852
+ if (runner.isClassBased) {
853
+ skipAnimations = ngAnimateState.running ||
854
+ ngAnimateState.disabled ||
855
+ (lastAnimation && !lastAnimation.isClassBased);
856
+ }
820
857
 
821
858
  //skip the animation if animations are disabled, a parent is already being animated,
822
859
  //the element is not currently attached to the document body or then completely close
@@ -1033,30 +1070,49 @@ angular.module('ngAnimate', ['ng'])
1033
1070
  }
1034
1071
 
1035
1072
  function animationsDisabled(element, parentElement) {
1036
- if (rootAnimateState.disabled) return true;
1073
+ if (rootAnimateState.disabled) {
1074
+ return true;
1075
+ }
1037
1076
 
1038
- if(isMatchingElement(element, $rootElement)) {
1039
- return rootAnimateState.disabled || rootAnimateState.running;
1077
+ if (isMatchingElement(element, $rootElement)) {
1078
+ return rootAnimateState.running;
1040
1079
  }
1041
1080
 
1081
+ var allowChildAnimations, parentRunningAnimation, hasParent;
1042
1082
  do {
1043
1083
  //the element did not reach the root element which means that it
1044
1084
  //is not apart of the DOM. Therefore there is no reason to do
1045
1085
  //any animations on it
1046
- if(parentElement.length === 0) break;
1086
+ if (parentElement.length === 0) break;
1047
1087
 
1048
1088
  var isRoot = isMatchingElement(parentElement, $rootElement);
1049
- var state = isRoot ? rootAnimateState : parentElement.data(NG_ANIMATE_STATE);
1050
- var result = state && (!!state.disabled || state.running || state.totalActive > 0);
1051
- if(isRoot || result) {
1052
- return result;
1089
+ var state = isRoot ? rootAnimateState : (parentElement.data(NG_ANIMATE_STATE) || {});
1090
+ if (state.disabled) {
1091
+ return true;
1092
+ }
1093
+
1094
+ //no matter what, for an animation to work it must reach the root element
1095
+ //this implies that the element is attached to the DOM when the animation is run
1096
+ if (isRoot) {
1097
+ hasParent = true;
1053
1098
  }
1054
1099
 
1055
- if(isRoot) return true;
1100
+ //once a flag is found that is strictly false then everything before
1101
+ //it will be discarded and all child animations will be restricted
1102
+ if (allowChildAnimations !== false) {
1103
+ var animateChildrenFlag = parentElement.data(NG_ANIMATE_CHILDREN);
1104
+ if(angular.isDefined(animateChildrenFlag)) {
1105
+ allowChildAnimations = animateChildrenFlag;
1106
+ }
1107
+ }
1108
+
1109
+ parentRunningAnimation = parentRunningAnimation ||
1110
+ state.running ||
1111
+ (state.last && !state.last.isClassBased);
1056
1112
  }
1057
1113
  while(parentElement = parentElement.parent());
1058
1114
 
1059
- return true;
1115
+ return !hasParent || (!allowChildAnimations && parentRunningAnimation);
1060
1116
  }
1061
1117
  }]);
1062
1118
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.19
2
+ * @license AngularJS v1.2.20
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -39,12 +39,13 @@ angular.module('ngCookies', ['ng']).
39
39
  * @example
40
40
  *
41
41
  * ```js
42
- * function ExampleController($cookies) {
43
- * // Retrieving a cookie
44
- * var favoriteCookie = $cookies.myFavorite;
45
- * // Setting a cookie
46
- * $cookies.myFavorite = 'oatmeal';
47
- * }
42
+ * angular.module('cookiesExample', ['ngCookies'])
43
+ * .controller('ExampleController', ['$cookies', function($cookies) {
44
+ * // Retrieving a cookie
45
+ * var favoriteCookie = $cookies.myFavorite;
46
+ * // Setting a cookie
47
+ * $cookies.myFavorite = 'oatmeal';
48
+ * }]);
48
49
  * ```
49
50
  */
50
51
  factory('$cookies', ['$rootScope', '$browser', function ($rootScope, $browser) {
@@ -142,14 +143,15 @@ angular.module('ngCookies', ['ng']).
142
143
  * @example
143
144
  *
144
145
  * ```js
145
- * function ExampleController($cookies) {
146
- * // Put cookie
147
- * $cookieStore.put('myFavorite','oatmeal');
148
- * // Get cookie
149
- * var favoriteCookie = $cookieStore.get('myFavorite');
150
- * // Removing a cookie
151
- * $cookieStore.remove('myFavorite');
152
- * }
146
+ * angular.module('cookieStoreExample', ['ngCookies'])
147
+ * .controller('ExampleController', ['$cookieStore', function($cookieStore) {
148
+ * // Put cookie
149
+ * $cookieStore.put('myFavorite','oatmeal');
150
+ * // Get cookie
151
+ * var favoriteCookie = $cookieStore.get('myFavorite');
152
+ * // Removing a cookie
153
+ * $cookieStore.remove('myFavorite');
154
+ * }]);
153
155
  * ```
154
156
  */
155
157
  factory('$cookieStore', ['$cookies', function($cookies) {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.19
2
+ * @license AngularJS v1.2.20
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.19/' +
72
+ message = message + '\nhttp://errors.angularjs.org/1.2.20/' +
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.19
2
+ * @license AngularJS v1.2.20
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.19
2
+ * @license AngularJS v1.2.20
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.19
2
+ * @license AngularJS v1.2.20
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.19
2
+ * @license AngularJS v1.2.20
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -57,20 +57,21 @@ var $sanitizeMinErr = angular.$$minErr('$sanitize');
57
57
  * @returns {string} Sanitized html.
58
58
  *
59
59
  * @example
60
- <example module="ngSanitize" deps="angular-sanitize.js">
60
+ <example module="sanitizeExample" deps="angular-sanitize.js">
61
61
  <file name="index.html">
62
62
  <script>
63
- function Ctrl($scope, $sce) {
64
- $scope.snippet =
65
- '<p style="color:blue">an html\n' +
66
- '<em onmouseover="this.textContent=\'PWN3D!\'">click here</em>\n' +
67
- 'snippet</p>';
68
- $scope.deliberatelyTrustDangerousSnippet = function() {
69
- return $sce.trustAsHtml($scope.snippet);
70
- };
71
- }
63
+ angular.module('sanitizeExample', ['ngSanitize'])
64
+ .controller('ExampleController', ['$scope', '$sce', function($scope, $sce) {
65
+ $scope.snippet =
66
+ '<p style="color:blue">an html\n' +
67
+ '<em onmouseover="this.textContent=\'PWN3D!\'">click here</em>\n' +
68
+ 'snippet</p>';
69
+ $scope.deliberatelyTrustDangerousSnippet = function() {
70
+ return $sce.trustAsHtml($scope.snippet);
71
+ };
72
+ }]);
72
73
  </script>
73
- <div ng-controller="Ctrl">
74
+ <div ng-controller="ExampleController">
74
75
  Snippet: <textarea ng-model="snippet" cols="60" rows="3"></textarea>
75
76
  <table>
76
77
  <tr>
@@ -498,20 +499,21 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
498
499
  <span ng-bind-html="linky_expression | linky"></span>
499
500
  *
500
501
  * @example
501
- <example module="ngSanitize" deps="angular-sanitize.js">
502
+ <example module="linkyExample" deps="angular-sanitize.js">
502
503
  <file name="index.html">
503
504
  <script>
504
- function Ctrl($scope) {
505
- $scope.snippet =
506
- 'Pretty text with some links:\n'+
507
- 'http://angularjs.org/,\n'+
508
- 'mailto:us@somewhere.org,\n'+
509
- 'another@somewhere.org,\n'+
510
- 'and one more: ftp://127.0.0.1/.';
511
- $scope.snippetWithTarget = 'http://angularjs.org/';
512
- }
505
+ angular.module('linkyExample', ['ngSanitize'])
506
+ .controller('ExampleController', ['$scope', function($scope) {
507
+ $scope.snippet =
508
+ 'Pretty text with some links:\n'+
509
+ 'http://angularjs.org/,\n'+
510
+ 'mailto:us@somewhere.org,\n'+
511
+ 'another@somewhere.org,\n'+
512
+ 'and one more: ftp://127.0.0.1/.';
513
+ $scope.snippetWithTarget = 'http://angularjs.org/';
514
+ }]);
513
515
  </script>
514
- <div ng-controller="Ctrl">
516
+ <div ng-controller="ExampleController">
515
517
  Snippet: <textarea ng-model="snippet" cols="60" rows="3"></textarea>
516
518
  <table>
517
519
  <tr>
@@ -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.19
9793
+ * @license AngularJS v1.2.20
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.19/' +
9863
+ message = message + '\nhttp://errors.angularjs.org/1.2.20/' +
9864
9864
  (module ? module + '/' : '') + code;
9865
9865
  for (i = 2; i < arguments.length; i++) {
9866
9866
  message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
@@ -10602,9 +10602,9 @@ function isLeafNode (node) {
10602
10602
  * @returns {*} The copy or updated `destination`, if `destination` was specified.
10603
10603
  *
10604
10604
  * @example
10605
- <example>
10605
+ <example module="copyExample">
10606
10606
  <file name="index.html">
10607
- <div ng-controller="Controller">
10607
+ <div ng-controller="ExampleController">
10608
10608
  <form novalidate class="simple-form">
10609
10609
  Name: <input type="text" ng-model="user.name" /><br />
10610
10610
  E-mail: <input type="email" ng-model="user.email" /><br />
@@ -10618,21 +10618,22 @@ function isLeafNode (node) {
10618
10618
  </div>
10619
10619
 
10620
10620
  <script>
10621
- function Controller($scope) {
10622
- $scope.master= {};
10621
+ angular.module('copyExample')
10622
+ .controller('ExampleController', ['$scope', function($scope) {
10623
+ $scope.master= {};
10623
10624
 
10624
- $scope.update = function(user) {
10625
- // Example with 1 argument
10626
- $scope.master= angular.copy(user);
10627
- };
10625
+ $scope.update = function(user) {
10626
+ // Example with 1 argument
10627
+ $scope.master= angular.copy(user);
10628
+ };
10628
10629
 
10629
- $scope.reset = function() {
10630
- // Example with 2 arguments
10631
- angular.copy($scope.master, $scope.user);
10632
- };
10630
+ $scope.reset = function() {
10631
+ // Example with 2 arguments
10632
+ angular.copy($scope.master, $scope.user);
10633
+ };
10633
10634
 
10634
- $scope.reset();
10635
- }
10635
+ $scope.reset();
10636
+ }]);
10636
10637
  </script>
10637
10638
  </file>
10638
10639
  </example>
@@ -10976,7 +10977,7 @@ function parseKeyValue(/**string*/keyValue) {
10976
10977
  key = tryDecodeURIComponent(key_value[0]);
10977
10978
  if ( isDefined(key) ) {
10978
10979
  var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
10979
- if (!obj[key]) {
10980
+ if (!hasOwnProperty.call(obj, key)) {
10980
10981
  obj[key] = val;
10981
10982
  } else if(isArray(obj[key])) {
10982
10983
  obj[key].push(val);
@@ -11750,11 +11751,11 @@ function setupModuleLoader(window) {
11750
11751
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
11751
11752
  */
11752
11753
  var version = {
11753
- full: '1.2.19', // all of these placeholder strings will be replaced by grunt's
11754
+ full: '1.2.20', // all of these placeholder strings will be replaced by grunt's
11754
11755
  major: 1, // package task
11755
11756
  minor: 2,
11756
- dot: 19,
11757
- codeName: 'precognitive-flashbacks'
11757
+ dot: 20,
11758
+ codeName: 'accidental-beautification'
11758
11759
  };
11759
11760
 
11760
11761
 
@@ -15033,7 +15034,7 @@ function $TemplateCacheProvider() {
15033
15034
  * local name. Given `<widget my-attr="count = count + value">` and widget definition of
15034
15035
  * `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to
15035
15036
  * a function wrapper for the `count = count + value` expression. Often it's desirable to
15036
- * pass data from the isolated scope via an expression and to the parent scope, this can be
15037
+ * pass data from the isolated scope via an expression to the parent scope, this can be
15037
15038
  * done by passing a map of local variable names and values into the expression wrapper fn.
15038
15039
  * For example, if the expression is `increment(amount)` then we can specify the amount value
15039
15040
  * by calling the `localFn` as `localFn({amount: 22})`.
@@ -15260,10 +15261,10 @@ function $TemplateCacheProvider() {
15260
15261
  * to illustrate how `$compile` works.
15261
15262
  * </div>
15262
15263
  *
15263
- <example module="compile">
15264
+ <example module="compileExample">
15264
15265
  <file name="index.html">
15265
15266
  <script>
15266
- angular.module('compile', [], function($compileProvider) {
15267
+ angular.module('compileExample', [], function($compileProvider) {
15267
15268
  // configure new 'compile' directive by passing a directive
15268
15269
  // factory function. The factory function injects the '$compile'
15269
15270
  $compileProvider.directive('compile', function($compile) {
@@ -15287,15 +15288,14 @@ function $TemplateCacheProvider() {
15287
15288
  }
15288
15289
  );
15289
15290
  };
15290
- })
15291
- });
15292
-
15293
- function Ctrl($scope) {
15291
+ });
15292
+ })
15293
+ .controller('GreeterController', ['$scope', function($scope) {
15294
15294
  $scope.name = 'Angular';
15295
15295
  $scope.html = 'Hello {{name}}';
15296
- }
15296
+ }]);
15297
15297
  </script>
15298
- <div ng-controller="Ctrl">
15298
+ <div ng-controller="GreeterController">
15299
15299
  <input ng-model="name"> <br>
15300
15300
  <textarea ng-model="html"></textarea> <br>
15301
15301
  <div compile="html"></div>
@@ -17031,18 +17031,19 @@ function $ControllerProvider() {
17031
17031
  * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object.
17032
17032
  *
17033
17033
  * @example
17034
- <example>
17034
+ <example module="documentExample">
17035
17035
  <file name="index.html">
17036
- <div ng-controller="MainCtrl">
17036
+ <div ng-controller="ExampleController">
17037
17037
  <p>$document title: <b ng-bind="title"></b></p>
17038
17038
  <p>window.document title: <b ng-bind="windowTitle"></b></p>
17039
17039
  </div>
17040
17040
  </file>
17041
17041
  <file name="script.js">
17042
- function MainCtrl($scope, $document) {
17043
- $scope.title = $document[0].title;
17044
- $scope.windowTitle = angular.element(window.document)[0].title;
17045
- }
17042
+ angular.module('documentExample', [])
17043
+ .controller('ExampleController', ['$scope', '$document', function($scope, $document) {
17044
+ $scope.title = $document[0].title;
17045
+ $scope.windowTitle = angular.element(window.document)[0].title;
17046
+ }]);
17046
17047
  </file>
17047
17048
  </example>
17048
17049
  */
@@ -17175,12 +17176,39 @@ function isSuccess(status) {
17175
17176
  }
17176
17177
 
17177
17178
 
17179
+ /**
17180
+ * @ngdoc provider
17181
+ * @name $httpProvider
17182
+ * @description
17183
+ * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service.
17184
+ * */
17178
17185
  function $HttpProvider() {
17179
17186
  var JSON_START = /^\s*(\[|\{[^\{])/,
17180
17187
  JSON_END = /[\}\]]\s*$/,
17181
17188
  PROTECTION_PREFIX = /^\)\]\}',?\n/,
17182
17189
  CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': 'application/json;charset=utf-8'};
17183
17190
 
17191
+ /**
17192
+ * @ngdoc property
17193
+ * @name $httpProvider#defaults
17194
+ * @description
17195
+ *
17196
+ * Object containing default values for all {@link ng.$http $http} requests.
17197
+ *
17198
+ * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token.
17199
+ * Defaults value is `'XSRF-TOKEN'`.
17200
+ *
17201
+ * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the
17202
+ * XSRF token. Defaults value is `'X-XSRF-TOKEN'`.
17203
+ *
17204
+ * - **`defaults.headers`** - {Object} - Default headers for all $http requests.
17205
+ * Refer to {@link ng.$http#setting-http-headers $http} for documentation on
17206
+ * setting default headers.
17207
+ * - **`defaults.headers.common`**
17208
+ * - **`defaults.headers.post`**
17209
+ * - **`defaults.headers.put`**
17210
+ * - **`defaults.headers.patch`**
17211
+ **/
17184
17212
  var defaults = this.defaults = {
17185
17213
  // transform incoming response data
17186
17214
  transformResponse: [function(data) {
@@ -17670,9 +17698,9 @@ function $HttpProvider() {
17670
17698
  *
17671
17699
  *
17672
17700
  * @example
17673
- <example>
17701
+ <example module="httpExample">
17674
17702
  <file name="index.html">
17675
- <div ng-controller="FetchCtrl">
17703
+ <div ng-controller="FetchController">
17676
17704
  <select ng-model="method">
17677
17705
  <option>GET</option>
17678
17706
  <option>JSONP</option>
@@ -17694,30 +17722,32 @@ function $HttpProvider() {
17694
17722
  </div>
17695
17723
  </file>
17696
17724
  <file name="script.js">
17697
- function FetchCtrl($scope, $http, $templateCache) {
17698
- $scope.method = 'GET';
17699
- $scope.url = 'http-hello.html';
17700
-
17701
- $scope.fetch = function() {
17702
- $scope.code = null;
17703
- $scope.response = null;
17704
-
17705
- $http({method: $scope.method, url: $scope.url, cache: $templateCache}).
17706
- success(function(data, status) {
17707
- $scope.status = status;
17708
- $scope.data = data;
17709
- }).
17710
- error(function(data, status) {
17711
- $scope.data = data || "Request failed";
17712
- $scope.status = status;
17713
- });
17714
- };
17725
+ angular.module('httpExample', [])
17726
+ .controller('FetchController', ['$scope', '$http', '$templateCache',
17727
+ function($scope, $http, $templateCache) {
17728
+ $scope.method = 'GET';
17729
+ $scope.url = 'http-hello.html';
17730
+
17731
+ $scope.fetch = function() {
17732
+ $scope.code = null;
17733
+ $scope.response = null;
17734
+
17735
+ $http({method: $scope.method, url: $scope.url, cache: $templateCache}).
17736
+ success(function(data, status) {
17737
+ $scope.status = status;
17738
+ $scope.data = data;
17739
+ }).
17740
+ error(function(data, status) {
17741
+ $scope.data = data || "Request failed";
17742
+ $scope.status = status;
17743
+ });
17744
+ };
17715
17745
 
17716
- $scope.updateModel = function(method, url) {
17717
- $scope.method = method;
17718
- $scope.url = url;
17719
- };
17720
- }
17746
+ $scope.updateModel = function(method, url) {
17747
+ $scope.method = method;
17748
+ $scope.url = url;
17749
+ };
17750
+ }]);
17721
17751
  </file>
17722
17752
  <file name="http-hello.html">
17723
17753
  Hello, $http!
@@ -17771,7 +17801,7 @@ function $HttpProvider() {
17771
17801
  var reqData = transformData(config.data, headersGetter(headers), config.transformRequest);
17772
17802
 
17773
17803
  // strip content-type if data is undefined
17774
- if (isUndefined(config.data)) {
17804
+ if (isUndefined(reqData)) {
17775
17805
  forEach(headers, function(value, header) {
17776
17806
  if (lowercase(header) === 'content-type') {
17777
17807
  delete headers[header];
@@ -17840,10 +17870,6 @@ function $HttpProvider() {
17840
17870
 
17841
17871
  defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]);
17842
17872
 
17843
- // execute if header value is function
17844
- execHeaders(defHeaders);
17845
- execHeaders(reqHeaders);
17846
-
17847
17873
  // using for-in instead of forEach to avoid unecessary iteration after header has been found
17848
17874
  defaultHeadersIteration:
17849
17875
  for (defHeaderName in defHeaders) {
@@ -17858,6 +17884,8 @@ function $HttpProvider() {
17858
17884
  reqHeaders[defHeaderName] = defHeaders[defHeaderName];
17859
17885
  }
17860
17886
 
17887
+ // execute if header value is a function for merged headers
17888
+ execHeaders(reqHeaders);
17861
17889
  return reqHeaders;
17862
17890
 
17863
17891
  function execHeaders(headers) {
@@ -18633,25 +18661,27 @@ function $IntervalProvider() {
18633
18661
  * @returns {promise} A promise which will be notified on each iteration.
18634
18662
  *
18635
18663
  * @example
18636
- * <example module="time">
18637
- * <file name="index.html">
18638
- * <script>
18639
- * function Ctrl2($scope,$interval) {
18640
- * $scope.format = 'M/d/yy h:mm:ss a';
18641
- * $scope.blood_1 = 100;
18642
- * $scope.blood_2 = 120;
18664
+ * <example module="intervalExample">
18665
+ * <file name="index.html">
18666
+ * <script>
18667
+ * angular.module('intervalExample', [])
18668
+ * .controller('ExampleController', ['$scope', '$interval',
18669
+ * function($scope, $interval) {
18670
+ * $scope.format = 'M/d/yy h:mm:ss a';
18671
+ * $scope.blood_1 = 100;
18672
+ * $scope.blood_2 = 120;
18643
18673
  *
18644
- * var stop;
18645
- * $scope.fight = function() {
18646
- * // Don't start a new fight if we are already fighting
18647
- * if ( angular.isDefined(stop) ) return;
18674
+ * var stop;
18675
+ * $scope.fight = function() {
18676
+ * // Don't start a new fight if we are already fighting
18677
+ * if ( angular.isDefined(stop) ) return;
18648
18678
  *
18649
18679
  * stop = $interval(function() {
18650
18680
  * if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {
18651
- * $scope.blood_1 = $scope.blood_1 - 3;
18652
- * $scope.blood_2 = $scope.blood_2 - 4;
18681
+ * $scope.blood_1 = $scope.blood_1 - 3;
18682
+ * $scope.blood_2 = $scope.blood_2 - 4;
18653
18683
  * } else {
18654
- * $scope.stopFight();
18684
+ * $scope.stopFight();
18655
18685
  * }
18656
18686
  * }, 100);
18657
18687
  * };
@@ -18666,22 +18696,21 @@ function $IntervalProvider() {
18666
18696
  * $scope.resetFight = function() {
18667
18697
  * $scope.blood_1 = 100;
18668
18698
  * $scope.blood_2 = 120;
18669
- * }
18699
+ * };
18670
18700
  *
18671
18701
  * $scope.$on('$destroy', function() {
18672
- * // Make sure that the interval is destroyed too
18702
+ * // Make sure that the interval nis destroyed too
18673
18703
  * $scope.stopFight();
18674
18704
  * });
18675
- * }
18676
- *
18677
- * angular.module('time', [])
18678
- * // Register the 'myCurrentTime' directive factory method.
18679
- * // We inject $interval and dateFilter service since the factory method is DI.
18680
- * .directive('myCurrentTime', function($interval, dateFilter) {
18705
+ * })
18706
+ * // Register the 'myCurrentTime' directive factory method.
18707
+ * // We inject $interval and dateFilter service since the factory method is DI.
18708
+ * .directive('myCurrentTime', ['$interval', 'dateFilter',
18709
+ * function($interval, dateFilter) {
18681
18710
  * // return the directive link function. (compile function not needed)
18682
18711
  * return function(scope, element, attrs) {
18683
18712
  * var format, // date format
18684
- * stopTime; // so that we can cancel the time updates
18713
+ * stopTime; // so that we can cancel the time updates
18685
18714
  *
18686
18715
  * // used to update the UI
18687
18716
  * function updateTime() {
@@ -18697,28 +18726,28 @@ function $IntervalProvider() {
18697
18726
  * stopTime = $interval(updateTime, 1000);
18698
18727
  *
18699
18728
  * // listen on DOM destroy (removal) event, and cancel the next UI update
18700
- * // to prevent updating time ofter the DOM element was removed.
18729
+ * // to prevent updating time after the DOM element was removed.
18701
18730
  * element.bind('$destroy', function() {
18702
18731
  * $interval.cancel(stopTime);
18703
18732
  * });
18704
18733
  * }
18705
18734
  * });
18706
- * </script>
18735
+ * </script>
18707
18736
  *
18708
- * <div>
18709
- * <div ng-controller="Ctrl2">
18710
- * Date format: <input ng-model="format"> <hr/>
18711
- * Current time is: <span my-current-time="format"></span>
18712
- * <hr/>
18713
- * Blood 1 : <font color='red'>{{blood_1}}</font>
18714
- * Blood 2 : <font color='red'>{{blood_2}}</font>
18715
- * <button type="button" data-ng-click="fight()">Fight</button>
18716
- * <button type="button" data-ng-click="stopFight()">StopFight</button>
18717
- * <button type="button" data-ng-click="resetFight()">resetFight</button>
18718
- * </div>
18737
+ * <div>
18738
+ * <div ng-controller="ExampleController">
18739
+ * Date format: <input ng-model="format"> <hr/>
18740
+ * Current time is: <span my-current-time="format"></span>
18741
+ * <hr/>
18742
+ * Blood 1 : <font color='red'>{{blood_1}}</font>
18743
+ * Blood 2 : <font color='red'>{{blood_2}}</font>
18744
+ * <button type="button" data-ng-click="fight()">Fight</button>
18745
+ * <button type="button" data-ng-click="stopFight()">StopFight</button>
18746
+ * <button type="button" data-ng-click="resetFight()">resetFight</button>
18719
18747
  * </div>
18748
+ * </div>
18720
18749
  *
18721
- * </file>
18750
+ * </file>
18722
18751
  * </example>
18723
18752
  */
18724
18753
  function interval(fn, delay, count, invokeApply) {
@@ -19275,14 +19304,17 @@ LocationHashbangInHtml5Url.prototype =
19275
19304
  * If the argument is a hash object containing an array of values, these values will be encoded
19276
19305
  * as duplicate search parameters in the url.
19277
19306
  *
19278
- * @param {(string|Array<string>)=} paramValue If `search` is a string, then `paramValue` will
19279
- * override only a single search property.
19307
+ * @param {(string|Array<string>|boolean)=} paramValue If `search` is a string, then `paramValue`
19308
+ * will override only a single search property.
19280
19309
  *
19281
19310
  * If `paramValue` is an array, it will override the property of the `search` component of
19282
19311
  * `$location` specified via the first argument.
19283
19312
  *
19284
19313
  * If `paramValue` is `null`, the property specified via the first argument will be deleted.
19285
19314
  *
19315
+ * If `paramValue` is `true`, the property specified via the first argument will be added with no
19316
+ * value nor trailing equal sign.
19317
+ *
19286
19318
  * @return {Object} If called with no arguments returns the parsed `search` object. If called with
19287
19319
  * one or more arguments returns `$location` object itself.
19288
19320
  */
@@ -19294,6 +19326,11 @@ LocationHashbangInHtml5Url.prototype =
19294
19326
  if (isString(search)) {
19295
19327
  this.$$search = parseKeyValue(search);
19296
19328
  } else if (isObject(search)) {
19329
+ // remove object undefined or null properties
19330
+ forEach(search, function(value, key) {
19331
+ if (value == null) delete search[key];
19332
+ });
19333
+
19297
19334
  this.$$search = search;
19298
19335
  } else {
19299
19336
  throw $locationMinErr('isrcharg',
@@ -19615,15 +19652,16 @@ function $LocationProvider(){
19615
19652
  * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this.
19616
19653
  *
19617
19654
  * @example
19618
- <example>
19655
+ <example module="logExample">
19619
19656
  <file name="script.js">
19620
- function LogCtrl($scope, $log) {
19621
- $scope.$log = $log;
19622
- $scope.message = 'Hello World!';
19623
- }
19657
+ angular.module('logExample', [])
19658
+ .controller('LogController', ['$scope', '$log', function($scope, $log) {
19659
+ $scope.$log = $log;
19660
+ $scope.message = 'Hello World!';
19661
+ }]);
19624
19662
  </file>
19625
19663
  <file name="index.html">
19626
- <div ng-controller="LogCtrl">
19664
+ <div ng-controller="LogController">
19627
19665
  <p>Reload this page with open console, enter text and hit the log button...</p>
19628
19666
  Message:
19629
19667
  <input type="text" ng-model="message"/>
@@ -19647,7 +19685,7 @@ function $LogProvider(){
19647
19685
  self = this;
19648
19686
 
19649
19687
  /**
19650
- * @ngdoc property
19688
+ * @ngdoc method
19651
19689
  * @name $logProvider#debugEnabled
19652
19690
  * @description
19653
19691
  * @param {boolean=} flag enable or disable debug level messages
@@ -20746,26 +20784,6 @@ function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {
20746
20784
  };
20747
20785
  }
20748
20786
 
20749
- function simpleGetterFn1(key0, fullExp) {
20750
- ensureSafeMemberName(key0, fullExp);
20751
-
20752
- return function simpleGetterFn1(scope, locals) {
20753
- if (scope == null) return undefined;
20754
- return ((locals && locals.hasOwnProperty(key0)) ? locals : scope)[key0];
20755
- };
20756
- }
20757
-
20758
- function simpleGetterFn2(key0, key1, fullExp) {
20759
- ensureSafeMemberName(key0, fullExp);
20760
- ensureSafeMemberName(key1, fullExp);
20761
-
20762
- return function simpleGetterFn2(scope, locals) {
20763
- if (scope == null) return undefined;
20764
- scope = ((locals && locals.hasOwnProperty(key0)) ? locals : scope)[key0];
20765
- return scope == null ? undefined : scope[key1];
20766
- };
20767
- }
20768
-
20769
20787
  function getterFn(path, options, fullExp) {
20770
20788
  // Check whether the cache has this getter already.
20771
20789
  // We can use hasOwnProperty directly on the cache because we ensure,
@@ -20778,13 +20796,8 @@ function getterFn(path, options, fullExp) {
20778
20796
  pathKeysLength = pathKeys.length,
20779
20797
  fn;
20780
20798
 
20781
- // When we have only 1 or 2 tokens, use optimized special case closures.
20782
20799
  // http://jsperf.com/angularjs-parse-getter/6
20783
- if (!options.unwrapPromises && pathKeysLength === 1) {
20784
- fn = simpleGetterFn1(pathKeys[0], fullExp);
20785
- } else if (!options.unwrapPromises && pathKeysLength === 2) {
20786
- fn = simpleGetterFn2(pathKeys[0], pathKeys[1], fullExp);
20787
- } else if (options.csp) {
20800
+ if (options.csp) {
20788
20801
  if (pathKeysLength < 6) {
20789
20802
  fn = cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp,
20790
20803
  options);
@@ -22911,19 +22924,21 @@ function adjustMatchers(matchers) {
22911
22924
  *
22912
22925
  * Here is what a secure configuration for this scenario might look like:
22913
22926
  *
22914
- * <pre class="prettyprint">
22915
- * angular.module('myApp', []).config(function($sceDelegateProvider) {
22916
- * $sceDelegateProvider.resourceUrlWhitelist([
22917
- * // Allow same origin resource loads.
22918
- * 'self',
22919
- * // Allow loading from our assets domain. Notice the difference between * and **.
22920
- * 'http://srv*.assets.example.com/**']);
22921
- *
22922
- * // The blacklist overrides the whitelist so the open redirect here is blocked.
22923
- * $sceDelegateProvider.resourceUrlBlacklist([
22924
- * 'http://myapp.example.com/clickThru**']);
22925
- * });
22926
- * </pre>
22927
+ * ```
22928
+ * angular.module('myApp', []).config(function($sceDelegateProvider) {
22929
+ * $sceDelegateProvider.resourceUrlWhitelist([
22930
+ * // Allow same origin resource loads.
22931
+ * 'self',
22932
+ * // Allow loading from our assets domain. Notice the difference between * and **.
22933
+ * 'http://srv*.assets.example.com/**'
22934
+ * ]);
22935
+ *
22936
+ * // The blacklist overrides the whitelist so the open redirect here is blocked.
22937
+ * $sceDelegateProvider.resourceUrlBlacklist([
22938
+ * 'http://myapp.example.com/clickThru**'
22939
+ * ]);
22940
+ * });
22941
+ * ```
22927
22942
  */
22928
22943
 
22929
22944
  function $SceDelegateProvider() {
@@ -23218,10 +23233,10 @@ function $SceDelegateProvider() {
23218
23233
  *
23219
23234
  * Here's an example of a binding in a privileged context:
23220
23235
  *
23221
- * <pre class="prettyprint">
23222
- * <input ng-model="userHtml">
23223
- * <div ng-bind-html="userHtml">
23224
- * </pre>
23236
+ * ```
23237
+ * <input ng-model="userHtml">
23238
+ * <div ng-bind-html="userHtml"></div>
23239
+ * ```
23225
23240
  *
23226
23241
  * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user. With SCE
23227
23242
  * disabled, this application allows the user to render arbitrary HTML into the DIV.
@@ -23261,15 +23276,15 @@ function $SceDelegateProvider() {
23261
23276
  * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}. Here's the actual code (slightly
23262
23277
  * simplified):
23263
23278
  *
23264
- * <pre class="prettyprint">
23265
- * var ngBindHtmlDirective = ['$sce', function($sce) {
23266
- * return function(scope, element, attr) {
23267
- * scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {
23268
- * element.html(value || '');
23269
- * });
23270
- * };
23271
- * }];
23272
- * </pre>
23279
+ * ```
23280
+ * var ngBindHtmlDirective = ['$sce', function($sce) {
23281
+ * return function(scope, element, attr) {
23282
+ * scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {
23283
+ * element.html(value || '');
23284
+ * });
23285
+ * };
23286
+ * }];
23287
+ * ```
23273
23288
  *
23274
23289
  * ## Impact on loading templates
23275
23290
  *
@@ -23373,66 +23388,65 @@ function $SceDelegateProvider() {
23373
23388
  *
23374
23389
  * ## Show me an example using SCE.
23375
23390
  *
23376
- * @example
23377
- <example module="mySceApp" deps="angular-sanitize.js">
23378
- <file name="index.html">
23379
- <div ng-controller="myAppController as myCtrl">
23380
- <i ng-bind-html="myCtrl.explicitlyTrustedHtml" id="explicitlyTrustedHtml"></i><br><br>
23381
- <b>User comments</b><br>
23382
- By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when
23383
- $sanitize is available. If $sanitize isn't available, this results in an error instead of an
23384
- exploit.
23385
- <div class="well">
23386
- <div ng-repeat="userComment in myCtrl.userComments">
23387
- <b>{{userComment.name}}</b>:
23388
- <span ng-bind-html="userComment.htmlComment" class="htmlComment"></span>
23389
- <br>
23390
- </div>
23391
- </div>
23392
- </div>
23393
- </file>
23394
-
23395
- <file name="script.js">
23396
- var mySceApp = angular.module('mySceApp', ['ngSanitize']);
23397
-
23398
- mySceApp.controller("myAppController", function myAppController($http, $templateCache, $sce) {
23399
- var self = this;
23400
- $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) {
23401
- self.userComments = userComments;
23402
- });
23403
- self.explicitlyTrustedHtml = $sce.trustAsHtml(
23404
- '<span onmouseover="this.textContent=&quot;Explicitly trusted HTML bypasses ' +
23405
- 'sanitization.&quot;">Hover over this text.</span>');
23406
- });
23407
- </file>
23408
-
23409
- <file name="test_data.json">
23410
- [
23411
- { "name": "Alice",
23412
- "htmlComment":
23413
- "<span onmouseover='this.textContent=\"PWN3D!\"'>Is <i>anyone</i> reading this?</span>"
23414
- },
23415
- { "name": "Bob",
23416
- "htmlComment": "<i>Yes!</i> Am I the only other one?"
23417
- }
23418
- ]
23419
- </file>
23420
-
23421
- <file name="protractor.js" type="protractor">
23422
- describe('SCE doc demo', function() {
23423
- it('should sanitize untrusted values', function() {
23424
- expect(element(by.css('.htmlComment')).getInnerHtml())
23425
- .toBe('<span>Is <i>anyone</i> reading this?</span>');
23426
- });
23427
-
23428
- it('should NOT sanitize explicitly trusted values', function() {
23429
- expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe(
23430
- '<span onmouseover="this.textContent=&quot;Explicitly trusted HTML bypasses ' +
23431
- 'sanitization.&quot;">Hover over this text.</span>');
23432
- });
23433
- });
23434
- </file>
23435
- </example>
23391
+ * <example module="mySceApp" deps="angular-sanitize.js">
23392
+ * <file name="index.html">
23393
+ * <div ng-controller="myAppController as myCtrl">
23394
+ * <i ng-bind-html="myCtrl.explicitlyTrustedHtml" id="explicitlyTrustedHtml"></i><br><br>
23395
+ * <b>User comments</b><br>
23396
+ * By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when
23397
+ * $sanitize is available. If $sanitize isn't available, this results in an error instead of an
23398
+ * exploit.
23399
+ * <div class="well">
23400
+ * <div ng-repeat="userComment in myCtrl.userComments">
23401
+ * <b>{{userComment.name}}</b>:
23402
+ * <span ng-bind-html="userComment.htmlComment" class="htmlComment"></span>
23403
+ * <br>
23404
+ * </div>
23405
+ * </div>
23406
+ * </div>
23407
+ * </file>
23408
+ *
23409
+ * <file name="script.js">
23410
+ * var mySceApp = angular.module('mySceApp', ['ngSanitize']);
23411
+ *
23412
+ * mySceApp.controller("myAppController", function myAppController($http, $templateCache, $sce) {
23413
+ * var self = this;
23414
+ * $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) {
23415
+ * self.userComments = userComments;
23416
+ * });
23417
+ * self.explicitlyTrustedHtml = $sce.trustAsHtml(
23418
+ * '<span onmouseover="this.textContent=&quot;Explicitly trusted HTML bypasses ' +
23419
+ * 'sanitization.&quot;">Hover over this text.</span>');
23420
+ * });
23421
+ * </file>
23422
+ *
23423
+ * <file name="test_data.json">
23424
+ * [
23425
+ * { "name": "Alice",
23426
+ * "htmlComment":
23427
+ * "<span onmouseover='this.textContent=\"PWN3D!\"'>Is <i>anyone</i> reading this?</span>"
23428
+ * },
23429
+ * { "name": "Bob",
23430
+ * "htmlComment": "<i>Yes!</i> Am I the only other one?"
23431
+ * }
23432
+ * ]
23433
+ * </file>
23434
+ *
23435
+ * <file name="protractor.js" type="protractor">
23436
+ * describe('SCE doc demo', function() {
23437
+ * it('should sanitize untrusted values', function() {
23438
+ * expect(element.all(by.css('.htmlComment')).first().getInnerHtml())
23439
+ * .toBe('<span>Is <i>anyone</i> reading this?</span>');
23440
+ * });
23441
+ *
23442
+ * it('should NOT sanitize explicitly trusted values', function() {
23443
+ * expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe(
23444
+ * '<span onmouseover="this.textContent=&quot;Explicitly trusted HTML bypasses ' +
23445
+ * 'sanitization.&quot;">Hover over this text.</span>');
23446
+ * });
23447
+ * });
23448
+ * </file>
23449
+ * </example>
23436
23450
  *
23437
23451
  *
23438
23452
  *
@@ -23446,13 +23460,13 @@ function $SceDelegateProvider() {
23446
23460
  *
23447
23461
  * That said, here's how you can completely disable SCE:
23448
23462
  *
23449
- * <pre class="prettyprint">
23450
- * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {
23451
- * // Completely disable SCE. For demonstration purposes only!
23452
- * // Do not use in new projects.
23453
- * $sceProvider.enabled(false);
23454
- * });
23455
- * </pre>
23463
+ * ```
23464
+ * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {
23465
+ * // Completely disable SCE. For demonstration purposes only!
23466
+ * // Do not use in new projects.
23467
+ * $sceProvider.enabled(false);
23468
+ * });
23469
+ * ```
23456
23470
  *
23457
23471
  */
23458
23472
  /* jshint maxlen: 100 */
@@ -24149,17 +24163,18 @@ function urlIsSameOrigin(requestUrl) {
24149
24163
  * expression.
24150
24164
  *
24151
24165
  * @example
24152
- <example>
24166
+ <example module="windowExample">
24153
24167
  <file name="index.html">
24154
24168
  <script>
24155
- function Ctrl($scope, $window) {
24156
- $scope.greeting = 'Hello, World!';
24157
- $scope.doGreeting = function(greeting) {
24169
+ angular.module('windowExample', [])
24170
+ .controller('ExampleController', ['$scope', '$window', function ($scope, $window) {
24171
+ $scope.greeting = 'Hello, World!';
24172
+ $scope.doGreeting = function(greeting) {
24158
24173
  $window.alert(greeting);
24159
- };
24160
- }
24174
+ };
24175
+ }]);
24161
24176
  </script>
24162
- <div ng-controller="Ctrl">
24177
+ <div ng-controller="ExampleController">
24163
24178
  <input type="text" ng-model="greeting" />
24164
24179
  <button ng-click="doGreeting(greeting)">ALERT</button>
24165
24180
  </div>
@@ -24558,14 +24573,15 @@ function filterFilter() {
24558
24573
  *
24559
24574
  *
24560
24575
  * @example
24561
- <example>
24576
+ <example module="currencyExample">
24562
24577
  <file name="index.html">
24563
24578
  <script>
24564
- function Ctrl($scope) {
24565
- $scope.amount = 1234.56;
24566
- }
24579
+ angular.module('currencyExample', [])
24580
+ .controller('ExampleController', ['$scope', function($scope) {
24581
+ $scope.amount = 1234.56;
24582
+ }]);
24567
24583
  </script>
24568
- <div ng-controller="Ctrl">
24584
+ <div ng-controller="ExampleController">
24569
24585
  <input type="number" ng-model="amount"> <br>
24570
24586
  default currency symbol ($): <span id="currency-default">{{amount | currency}}</span><br>
24571
24587
  custom currency identifier (USD$): <span>{{amount | currency:"USD$"}}</span>
@@ -24617,14 +24633,15 @@ function currencyFilter($locale) {
24617
24633
  * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit.
24618
24634
  *
24619
24635
  * @example
24620
- <example>
24636
+ <example module="numberFilterExample">
24621
24637
  <file name="index.html">
24622
24638
  <script>
24623
- function Ctrl($scope) {
24624
- $scope.val = 1234.56789;
24625
- }
24639
+ angular.module('numberFilterExample', [])
24640
+ .controller('ExampleController', ['$scope', function($scope) {
24641
+ $scope.val = 1234.56789;
24642
+ }]);
24626
24643
  </script>
24627
- <div ng-controller="Ctrl">
24644
+ <div ng-controller="ExampleController">
24628
24645
  Enter number: <input ng-model='val'><br>
24629
24646
  Default formatting: <span id='number-default'>{{val | number}}</span><br>
24630
24647
  No fractions: <span>{{val | number:0}}</span><br>
@@ -25048,17 +25065,18 @@ var uppercaseFilter = valueFn(uppercase);
25048
25065
  * had less than `limit` elements.
25049
25066
  *
25050
25067
  * @example
25051
- <example>
25068
+ <example module="limitToExample">
25052
25069
  <file name="index.html">
25053
25070
  <script>
25054
- function Ctrl($scope) {
25055
- $scope.numbers = [1,2,3,4,5,6,7,8,9];
25056
- $scope.letters = "abcdefghi";
25057
- $scope.numLimit = 3;
25058
- $scope.letterLimit = 3;
25059
- }
25071
+ angular.module('limitToExample', [])
25072
+ .controller('ExampleController', ['$scope', function($scope) {
25073
+ $scope.numbers = [1,2,3,4,5,6,7,8,9];
25074
+ $scope.letters = "abcdefghi";
25075
+ $scope.numLimit = 3;
25076
+ $scope.letterLimit = 3;
25077
+ }]);
25060
25078
  </script>
25061
- <div ng-controller="Ctrl">
25079
+ <div ng-controller="ExampleController">
25062
25080
  Limit {{numbers}} to: <input type="integer" ng-model="numLimit">
25063
25081
  <p>Output numbers: {{ numbers | limitTo:numLimit }}</p>
25064
25082
  Limit {{letters}} to: <input type="integer" ng-model="letterLimit">
@@ -25170,20 +25188,21 @@ function limitToFilter(){
25170
25188
  * @returns {Array} Sorted copy of the source array.
25171
25189
  *
25172
25190
  * @example
25173
- <example>
25191
+ <example module="orderByExample">
25174
25192
  <file name="index.html">
25175
25193
  <script>
25176
- function Ctrl($scope) {
25177
- $scope.friends =
25178
- [{name:'John', phone:'555-1212', age:10},
25179
- {name:'Mary', phone:'555-9876', age:19},
25180
- {name:'Mike', phone:'555-4321', age:21},
25181
- {name:'Adam', phone:'555-5678', age:35},
25182
- {name:'Julie', phone:'555-8765', age:29}]
25183
- $scope.predicate = '-age';
25184
- }
25194
+ angular.module('orderByExample', [])
25195
+ .controller('ExampleController', ['$scope', function($scope) {
25196
+ $scope.friends =
25197
+ [{name:'John', phone:'555-1212', age:10},
25198
+ {name:'Mary', phone:'555-9876', age:19},
25199
+ {name:'Mike', phone:'555-4321', age:21},
25200
+ {name:'Adam', phone:'555-5678', age:35},
25201
+ {name:'Julie', phone:'555-8765', age:29}];
25202
+ $scope.predicate = '-age';
25203
+ }]);
25185
25204
  </script>
25186
- <div ng-controller="Ctrl">
25205
+ <div ng-controller="ExampleController">
25187
25206
  <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>
25188
25207
  <hr/>
25189
25208
  [ <a href="" ng-click="predicate=''">unsorted</a> ]
@@ -25211,7 +25230,7 @@ function limitToFilter(){
25211
25230
  * Example:
25212
25231
  *
25213
25232
  * @example
25214
- <example>
25233
+ <example module="orderByExample">
25215
25234
  <file name="index.html">
25216
25235
  <div ng-controller="Ctrl">
25217
25236
  <table class="friend">
@@ -25231,21 +25250,21 @@ function limitToFilter(){
25231
25250
  </file>
25232
25251
 
25233
25252
  <file name="script.js">
25234
- function Ctrl($scope, $filter) {
25235
- var orderBy = $filter('orderBy');
25236
- $scope.friends = [
25237
- { name: 'John', phone: '555-1212', age: 10 },
25238
- { name: 'Mary', phone: '555-9876', age: 19 },
25239
- { name: 'Mike', phone: '555-4321', age: 21 },
25240
- { name: 'Adam', phone: '555-5678', age: 35 },
25241
- { name: 'Julie', phone: '555-8765', age: 29 }
25242
- ];
25243
-
25244
- $scope.order = function(predicate, reverse) {
25245
- $scope.friends = orderBy($scope.friends, predicate, reverse);
25246
- };
25247
- $scope.order('-age',false);
25248
- }
25253
+ angular.module('orderByExample', [])
25254
+ .controller('ExampleController', ['$scope', '$filter', function($scope, $filter) {
25255
+ var orderBy = $filter('orderBy');
25256
+ $scope.friends = [
25257
+ { name: 'John', phone: '555-1212', age: 10 },
25258
+ { name: 'Mary', phone: '555-9876', age: 19 },
25259
+ { name: 'Mike', phone: '555-4321', age: 21 },
25260
+ { name: 'Adam', phone: '555-5678', age: 35 },
25261
+ { name: 'Julie', phone: '555-8765', age: 29 }
25262
+ ];
25263
+ $scope.order = function(predicate, reverse) {
25264
+ $scope.friends = orderBy($scope.friends, predicate, reverse);
25265
+ };
25266
+ $scope.order('-age',false);
25267
+ }]);
25249
25268
  </file>
25250
25269
  </example>
25251
25270
  */
@@ -25431,7 +25450,7 @@ var htmlAnchorDirective = valueFn({
25431
25450
  return browser.driver.getCurrentUrl().then(function(url) {
25432
25451
  return url.match(/\/123$/);
25433
25452
  });
25434
- }, 1000, 'page should navigate to /123');
25453
+ }, 5000, 'page should navigate to /123');
25435
25454
  });
25436
25455
 
25437
25456
  xit('should execute ng-click but not reload when href empty string and name specified', function() {
@@ -25459,7 +25478,7 @@ var htmlAnchorDirective = valueFn({
25459
25478
  return browser.driver.getCurrentUrl().then(function(url) {
25460
25479
  return url.match(/\/6$/);
25461
25480
  });
25462
- }, 1000, 'page should navigate to /6');
25481
+ }, 5000, 'page should navigate to /6');
25463
25482
  });
25464
25483
  </file>
25465
25484
  </example>
@@ -26075,12 +26094,13 @@ function FormController(element, attrs, $scope, $animate) {
26075
26094
  * </pre>
26076
26095
  *
26077
26096
  * @example
26078
- <example deps="angular-animate.js" animations="true" fixBase="true">
26097
+ <example deps="angular-animate.js" animations="true" fixBase="true" module="formExample">
26079
26098
  <file name="index.html">
26080
26099
  <script>
26081
- function Ctrl($scope) {
26082
- $scope.userType = 'guest';
26083
- }
26100
+ angular.module('formExample', [])
26101
+ .controller('FormController', ['$scope', function($scope) {
26102
+ $scope.userType = 'guest';
26103
+ }]);
26084
26104
  </script>
26085
26105
  <style>
26086
26106
  .my-form {
@@ -26092,7 +26112,7 @@ function FormController(element, attrs, $scope, $animate) {
26092
26112
  background: red;
26093
26113
  }
26094
26114
  </style>
26095
- <form name="myForm" ng-controller="Ctrl" class="my-form">
26115
+ <form name="myForm" ng-controller="FormController" class="my-form">
26096
26116
  userType: <input name="input" ng-model="userType" required>
26097
26117
  <span class="error" ng-show="myForm.input.$error.required">Required!</span><br>
26098
26118
  <tt>userType = {{userType}}</tt><br>
@@ -26195,7 +26215,7 @@ var ngFormDirective = formDirectiveFactory(true);
26195
26215
  */
26196
26216
 
26197
26217
  var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
26198
- var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*$/i;
26218
+ var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;
26199
26219
  var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/;
26200
26220
 
26201
26221
  var inputType = {
@@ -26225,15 +26245,16 @@ var inputType = {
26225
26245
  * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
26226
26246
  *
26227
26247
  * @example
26228
- <example name="text-input-directive">
26248
+ <example name="text-input-directive" module="textInputExample">
26229
26249
  <file name="index.html">
26230
26250
  <script>
26231
- function Ctrl($scope) {
26232
- $scope.text = 'guest';
26233
- $scope.word = /^\s*\w*\s*$/;
26234
- }
26251
+ angular.module('textInputExample', [])
26252
+ .controller('ExampleController', ['$scope', function($scope) {
26253
+ $scope.text = 'guest';
26254
+ $scope.word = /^\s*\w*\s*$/;
26255
+ }]);
26235
26256
  </script>
26236
- <form name="myForm" ng-controller="Ctrl">
26257
+ <form name="myForm" ng-controller="ExampleController">
26237
26258
  Single word: <input type="text" name="input" ng-model="text"
26238
26259
  ng-pattern="word" required ng-trim="false">
26239
26260
  <span class="error" ng-show="myForm.input.$error.required">
@@ -26305,14 +26326,15 @@ var inputType = {
26305
26326
  * interaction with the input element.
26306
26327
  *
26307
26328
  * @example
26308
- <example name="number-input-directive">
26329
+ <example name="number-input-directive" module="numberExample">
26309
26330
  <file name="index.html">
26310
26331
  <script>
26311
- function Ctrl($scope) {
26312
- $scope.value = 12;
26313
- }
26332
+ angular.module('numberExample', [])
26333
+ .controller('ExampleController', ['$scope', function($scope) {
26334
+ $scope.value = 12;
26335
+ }]);
26314
26336
  </script>
26315
- <form name="myForm" ng-controller="Ctrl">
26337
+ <form name="myForm" ng-controller="ExampleController">
26316
26338
  Number: <input type="number" name="input" ng-model="value"
26317
26339
  min="0" max="99" required>
26318
26340
  <span class="error" ng-show="myForm.input.$error.required">
@@ -26380,14 +26402,15 @@ var inputType = {
26380
26402
  * interaction with the input element.
26381
26403
  *
26382
26404
  * @example
26383
- <example name="url-input-directive">
26405
+ <example name="url-input-directive" module="urlExample">
26384
26406
  <file name="index.html">
26385
26407
  <script>
26386
- function Ctrl($scope) {
26387
- $scope.text = 'http://google.com';
26388
- }
26408
+ angular.module('urlExample', [])
26409
+ .controller('ExampleController', ['$scope', function($scope) {
26410
+ $scope.text = 'http://google.com';
26411
+ }]);
26389
26412
  </script>
26390
- <form name="myForm" ng-controller="Ctrl">
26413
+ <form name="myForm" ng-controller="ExampleController">
26391
26414
  URL: <input type="url" name="input" ng-model="text" required>
26392
26415
  <span class="error" ng-show="myForm.input.$error.required">
26393
26416
  Required!</span>
@@ -26456,14 +26479,15 @@ var inputType = {
26456
26479
  * interaction with the input element.
26457
26480
  *
26458
26481
  * @example
26459
- <example name="email-input-directive">
26482
+ <example name="email-input-directive" module="emailExample">
26460
26483
  <file name="index.html">
26461
26484
  <script>
26462
- function Ctrl($scope) {
26463
- $scope.text = 'me@example.com';
26464
- }
26485
+ angular.module('emailExample', [])
26486
+ .controller('ExampleController', ['$scope', function($scope) {
26487
+ $scope.text = 'me@example.com';
26488
+ }]);
26465
26489
  </script>
26466
- <form name="myForm" ng-controller="Ctrl">
26490
+ <form name="myForm" ng-controller="ExampleController">
26467
26491
  Email: <input type="email" name="input" ng-model="text" required>
26468
26492
  <span class="error" ng-show="myForm.input.$error.required">
26469
26493
  Required!</span>
@@ -26522,18 +26546,19 @@ var inputType = {
26522
26546
  * be set when selected.
26523
26547
  *
26524
26548
  * @example
26525
- <example name="radio-input-directive">
26549
+ <example name="radio-input-directive" module="radioExample">
26526
26550
  <file name="index.html">
26527
26551
  <script>
26528
- function Ctrl($scope) {
26529
- $scope.color = 'blue';
26530
- $scope.specialValue = {
26531
- "id": "12345",
26532
- "value": "green"
26533
- };
26534
- }
26552
+ angular.module('radioExample', [])
26553
+ .controller('ExampleController', ['$scope', function($scope) {
26554
+ $scope.color = 'blue';
26555
+ $scope.specialValue = {
26556
+ "id": "12345",
26557
+ "value": "green"
26558
+ };
26559
+ }]);
26535
26560
  </script>
26536
- <form name="myForm" ng-controller="Ctrl">
26561
+ <form name="myForm" ng-controller="ExampleController">
26537
26562
  <input type="radio" ng-model="color" value="red"> Red <br/>
26538
26563
  <input type="radio" ng-model="color" ng-value="specialValue"> Green <br/>
26539
26564
  <input type="radio" ng-model="color" value="blue"> Blue <br/>
@@ -26572,15 +26597,16 @@ var inputType = {
26572
26597
  * interaction with the input element.
26573
26598
  *
26574
26599
  * @example
26575
- <example name="checkbox-input-directive">
26600
+ <example name="checkbox-input-directive" module="checkboxExample">
26576
26601
  <file name="index.html">
26577
26602
  <script>
26578
- function Ctrl($scope) {
26579
- $scope.value1 = true;
26580
- $scope.value2 = 'YES'
26581
- }
26603
+ angular.module('checkboxExample', [])
26604
+ .controller('ExampleController', ['$scope', function($scope) {
26605
+ $scope.value1 = true;
26606
+ $scope.value2 = 'YES'
26607
+ }]);
26582
26608
  </script>
26583
- <form name="myForm" ng-controller="Ctrl">
26609
+ <form name="myForm" ng-controller="ExampleController">
26584
26610
  Value1: <input type="checkbox" ng-model="value1"> <br/>
26585
26611
  Value2: <input type="checkbox" ng-model="value2"
26586
26612
  ng-true-value="YES" ng-false-value="NO"> <br/>
@@ -26980,14 +27006,15 @@ function checkboxInputType(scope, element, attr, ctrl) {
26980
27006
  * interaction with the input element.
26981
27007
  *
26982
27008
  * @example
26983
- <example name="input-directive">
27009
+ <example name="input-directive" module="inputExample">
26984
27010
  <file name="index.html">
26985
27011
  <script>
26986
- function Ctrl($scope) {
26987
- $scope.user = {name: 'guest', last: 'visitor'};
26988
- }
27012
+ angular.module('inputExample', [])
27013
+ .controller('ExampleController', ['$scope', function($scope) {
27014
+ $scope.user = {name: 'guest', last: 'visitor'};
27015
+ }]);
26989
27016
  </script>
26990
- <div ng-controller="Ctrl">
27017
+ <div ng-controller="ExampleController">
26991
27018
  <form name="myForm">
26992
27019
  User name: <input type="text" name="userName" ng-model="user.name" required>
26993
27020
  <span class="error" ng-show="myForm.userName.$error.required">
@@ -27505,12 +27532,13 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
27505
27532
  * </pre>
27506
27533
  *
27507
27534
  * @example
27508
- * <example deps="angular-animate.js" animations="true" fixBase="true">
27535
+ * <example deps="angular-animate.js" animations="true" fixBase="true" module="inputExample">
27509
27536
  <file name="index.html">
27510
27537
  <script>
27511
- function Ctrl($scope) {
27512
- $scope.val = '1';
27513
- }
27538
+ angular.module('inputExample', [])
27539
+ .controller('ExampleController', ['$scope', function($scope) {
27540
+ $scope.val = '1';
27541
+ }]);
27514
27542
  </script>
27515
27543
  <style>
27516
27544
  .my-input {
@@ -27525,7 +27553,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
27525
27553
  </style>
27526
27554
  Update input to see transitions when valid/invalid.
27527
27555
  Integer is a valid value.
27528
- <form name="testForm" ng-controller="Ctrl">
27556
+ <form name="testForm" ng-controller="ExampleController">
27529
27557
  <input ng-model="val" ng-pattern="/^\d+$/" name="anim" class="my-input" />
27530
27558
  </form>
27531
27559
  </file>
@@ -27569,17 +27597,18 @@ var ngModelDirective = function() {
27569
27597
  * in input value.
27570
27598
  *
27571
27599
  * @example
27572
- * <example name="ngChange-directive">
27600
+ * <example name="ngChange-directive" module="changeExample">
27573
27601
  * <file name="index.html">
27574
27602
  * <script>
27575
- * function Controller($scope) {
27576
- * $scope.counter = 0;
27577
- * $scope.change = function() {
27578
- * $scope.counter++;
27579
- * };
27580
- * }
27603
+ * angular.module('changeExample', [])
27604
+ * .controller('ExampleController', ['$scope', function($scope) {
27605
+ * $scope.counter = 0;
27606
+ * $scope.change = function() {
27607
+ * $scope.counter++;
27608
+ * };
27609
+ * }]);
27581
27610
  * </script>
27582
- * <div ng-controller="Controller">
27611
+ * <div ng-controller="ExampleController">
27583
27612
  * <input type="checkbox" ng-model="confirmed" ng-change="change()" id="ng-change-example1" />
27584
27613
  * <input type="checkbox" ng-model="confirmed" id="ng-change-example2" />
27585
27614
  * <label for="ng-change-example2">Confirmed</label><br />
@@ -27660,14 +27689,15 @@ var requiredDirective = function() {
27660
27689
  * specified in form `/something/` then the value will be converted into a regular expression.
27661
27690
  *
27662
27691
  * @example
27663
- <example name="ngList-directive">
27692
+ <example name="ngList-directive" module="listExample">
27664
27693
  <file name="index.html">
27665
27694
  <script>
27666
- function Ctrl($scope) {
27667
- $scope.names = ['igor', 'misko', 'vojta'];
27668
- }
27695
+ angular.module('listExample', [])
27696
+ .controller('ExampleController', ['$scope', function($scope) {
27697
+ $scope.names = ['igor', 'misko', 'vojta'];
27698
+ }]);
27669
27699
  </script>
27670
- <form name="myForm" ng-controller="Ctrl">
27700
+ <form name="myForm" ng-controller="ExampleController">
27671
27701
  List: <input name="namesInput" ng-model="names" ng-list required>
27672
27702
  <span class="error" ng-show="myForm.namesInput.$error.required">
27673
27703
  Required!</span>
@@ -27759,15 +27789,16 @@ var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
27759
27789
  * of the `input` element
27760
27790
  *
27761
27791
  * @example
27762
- <example name="ngValue-directive">
27792
+ <example name="ngValue-directive" module="valueExample">
27763
27793
  <file name="index.html">
27764
27794
  <script>
27765
- function Ctrl($scope) {
27766
- $scope.names = ['pizza', 'unicorns', 'robots'];
27767
- $scope.my = { favorite: 'unicorns' };
27768
- }
27795
+ angular.module('valueExample', [])
27796
+ .controller('ExampleController', ['$scope', function($scope) {
27797
+ $scope.names = ['pizza', 'unicorns', 'robots'];
27798
+ $scope.my = { favorite: 'unicorns' };
27799
+ }]);
27769
27800
  </script>
27770
- <form ng-controller="Ctrl">
27801
+ <form ng-controller="ExampleController">
27771
27802
  <h2>Which is your favorite?</h2>
27772
27803
  <label ng-repeat="name in names" for="{{name}}">
27773
27804
  {{name}}
@@ -27838,14 +27869,15 @@ var ngValueDirective = function() {
27838
27869
  *
27839
27870
  * @example
27840
27871
  * Enter a name in the Live Preview text box; the greeting below the text box changes instantly.
27841
- <example>
27872
+ <example module="bindExample">
27842
27873
  <file name="index.html">
27843
27874
  <script>
27844
- function Ctrl($scope) {
27845
- $scope.name = 'Whirled';
27846
- }
27875
+ angular.module('bindExample', [])
27876
+ .controller('ExampleController', ['$scope', function($scope) {
27877
+ $scope.name = 'Whirled';
27878
+ }]);
27847
27879
  </script>
27848
- <div ng-controller="Ctrl">
27880
+ <div ng-controller="ExampleController">
27849
27881
  Enter name: <input type="text" ng-model="name"><br>
27850
27882
  Hello <span ng-bind="name"></span>!
27851
27883
  </div>
@@ -27896,15 +27928,16 @@ var ngBindDirective = ngDirective({
27896
27928
  *
27897
27929
  * @example
27898
27930
  * Try it here: enter text in text box and watch the greeting change.
27899
- <example>
27931
+ <example module="bindExample">
27900
27932
  <file name="index.html">
27901
27933
  <script>
27902
- function Ctrl($scope) {
27903
- $scope.salutation = 'Hello';
27904
- $scope.name = 'World';
27905
- }
27934
+ angular.module('bindExample', [])
27935
+ .controller('ExampleController', ['$scope', function ($scope) {
27936
+ $scope.salutation = 'Hello';
27937
+ $scope.name = 'World';
27938
+ }]);
27906
27939
  </script>
27907
- <div ng-controller="Ctrl">
27940
+ <div ng-controller="ExampleController">
27908
27941
  Salutation: <input type="text" ng-model="salutation"><br>
27909
27942
  Name: <input type="text" ng-model="name"><br>
27910
27943
  <pre ng-bind-template="{{salutation}} {{name}}!"></pre>
@@ -27962,20 +27995,20 @@ var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
27962
27995
  * @example
27963
27996
  Try it here: enter text in text box and watch the greeting change.
27964
27997
 
27965
- <example module="ngBindHtmlExample" deps="angular-sanitize.js">
27998
+ <example module="bindHtmlExample" deps="angular-sanitize.js">
27966
27999
  <file name="index.html">
27967
- <div ng-controller="ngBindHtmlCtrl">
28000
+ <div ng-controller="ExampleController">
27968
28001
  <p ng-bind-html="myHTML"></p>
27969
28002
  </div>
27970
28003
  </file>
27971
28004
 
27972
28005
  <file name="script.js">
27973
- angular.module('ngBindHtmlExample', ['ngSanitize'])
27974
-
27975
- .controller('ngBindHtmlCtrl', ['$scope', function ngBindHtmlCtrl($scope) {
27976
- $scope.myHTML =
27977
- 'I am an <code>HTML</code>string with <a href="#">links!</a> and other <em>stuff</em>';
27978
- }]);
28006
+ angular.module('bindHtmlExample', ['ngSanitize'])
28007
+ .controller('ExampleController', ['$scope', function($scope) {
28008
+ $scope.myHTML =
28009
+ 'I am an <code>HTML</code>string with ' +
28010
+ '<a href="#">links!</a> and other <em>stuff</em>';
28011
+ }]);
27979
28012
  </file>
27980
28013
 
27981
28014
  <file name="protractor.js" type="protractor">
@@ -28474,7 +28507,7 @@ var ngCloakDirective = ngDirective({
28474
28507
  *
28475
28508
  * This example demonstrates the `controller as` syntax.
28476
28509
  *
28477
- * <example name="ngControllerAs">
28510
+ * <example name="ngControllerAs" module="controllerAsExample">
28478
28511
  * <file name="index.html">
28479
28512
  * <div id="ctrl-as-exmpl" ng-controller="SettingsController1 as settings">
28480
28513
  * Name: <input type="text" ng-model="settings.name"/>
@@ -28495,6 +28528,9 @@ var ngCloakDirective = ngDirective({
28495
28528
  * </div>
28496
28529
  * </file>
28497
28530
  * <file name="app.js">
28531
+ * angular.module('controllerAsExample', [])
28532
+ * .controller('SettingsController1', SettingsController1);
28533
+ *
28498
28534
  * function SettingsController1() {
28499
28535
  * this.name = "John Smith";
28500
28536
  * this.contacts = [
@@ -28523,29 +28559,29 @@ var ngCloakDirective = ngDirective({
28523
28559
  * <file name="protractor.js" type="protractor">
28524
28560
  * it('should check controller as', function() {
28525
28561
  * var container = element(by.id('ctrl-as-exmpl'));
28526
- * expect(container.findElement(by.model('settings.name'))
28562
+ * expect(container.element(by.model('settings.name'))
28527
28563
  * .getAttribute('value')).toBe('John Smith');
28528
28564
  *
28529
28565
  * var firstRepeat =
28530
- * container.findElement(by.repeater('contact in settings.contacts').row(0));
28566
+ * container.element(by.repeater('contact in settings.contacts').row(0));
28531
28567
  * var secondRepeat =
28532
- * container.findElement(by.repeater('contact in settings.contacts').row(1));
28568
+ * container.element(by.repeater('contact in settings.contacts').row(1));
28533
28569
  *
28534
- * expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))
28570
+ * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
28535
28571
  * .toBe('408 555 1212');
28536
28572
  *
28537
- * expect(secondRepeat.findElement(by.model('contact.value')).getAttribute('value'))
28573
+ * expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))
28538
28574
  * .toBe('john.smith@example.org');
28539
28575
  *
28540
- * firstRepeat.findElement(by.linkText('clear')).click();
28576
+ * firstRepeat.element(by.linkText('clear')).click();
28541
28577
  *
28542
- * expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))
28578
+ * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
28543
28579
  * .toBe('');
28544
28580
  *
28545
- * container.findElement(by.linkText('add')).click();
28581
+ * container.element(by.linkText('add')).click();
28546
28582
  *
28547
- * expect(container.findElement(by.repeater('contact in settings.contacts').row(2))
28548
- * .findElement(by.model('contact.value'))
28583
+ * expect(container.element(by.repeater('contact in settings.contacts').row(2))
28584
+ * .element(by.model('contact.value'))
28549
28585
  * .getAttribute('value'))
28550
28586
  * .toBe('yourname@example.org');
28551
28587
  * });
@@ -28554,7 +28590,7 @@ var ngCloakDirective = ngDirective({
28554
28590
  *
28555
28591
  * This example demonstrates the "attach to `$scope`" style of controller.
28556
28592
  *
28557
- * <example name="ngController">
28593
+ * <example name="ngController" module="controllerExample">
28558
28594
  * <file name="index.html">
28559
28595
  * <div id="ctrl-exmpl" ng-controller="SettingsController2">
28560
28596
  * Name: <input type="text" ng-model="name"/>
@@ -28575,6 +28611,9 @@ var ngCloakDirective = ngDirective({
28575
28611
  * </div>
28576
28612
  * </file>
28577
28613
  * <file name="app.js">
28614
+ * angular.module('controllerExample', [])
28615
+ * .controller('SettingsController2', ['$scope', SettingsController2]);
28616
+ *
28578
28617
  * function SettingsController2($scope) {
28579
28618
  * $scope.name = "John Smith";
28580
28619
  * $scope.contacts = [
@@ -28604,28 +28643,28 @@ var ngCloakDirective = ngDirective({
28604
28643
  * it('should check controller', function() {
28605
28644
  * var container = element(by.id('ctrl-exmpl'));
28606
28645
  *
28607
- * expect(container.findElement(by.model('name'))
28646
+ * expect(container.element(by.model('name'))
28608
28647
  * .getAttribute('value')).toBe('John Smith');
28609
28648
  *
28610
28649
  * var firstRepeat =
28611
- * container.findElement(by.repeater('contact in contacts').row(0));
28650
+ * container.element(by.repeater('contact in contacts').row(0));
28612
28651
  * var secondRepeat =
28613
- * container.findElement(by.repeater('contact in contacts').row(1));
28652
+ * container.element(by.repeater('contact in contacts').row(1));
28614
28653
  *
28615
- * expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))
28654
+ * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
28616
28655
  * .toBe('408 555 1212');
28617
- * expect(secondRepeat.findElement(by.model('contact.value')).getAttribute('value'))
28656
+ * expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))
28618
28657
  * .toBe('john.smith@example.org');
28619
28658
  *
28620
- * firstRepeat.findElement(by.linkText('clear')).click();
28659
+ * firstRepeat.element(by.linkText('clear')).click();
28621
28660
  *
28622
- * expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))
28661
+ * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
28623
28662
  * .toBe('');
28624
28663
  *
28625
- * container.findElement(by.linkText('add')).click();
28664
+ * container.element(by.linkText('add')).click();
28626
28665
  *
28627
- * expect(container.findElement(by.repeater('contact in contacts').row(2))
28628
- * .findElement(by.model('contact.value'))
28666
+ * expect(container.element(by.repeater('contact in contacts').row(2))
28667
+ * .element(by.model('contact.value'))
28629
28668
  * .getAttribute('value'))
28630
28669
  * .toBe('yourname@example.org');
28631
28670
  * });
@@ -28996,21 +29035,22 @@ forEach(
28996
29035
  * ({@link guide/expression#-event- Event object is available as `$event`})
28997
29036
  *
28998
29037
  * @example
28999
- <example>
29038
+ <example module="submitExample">
29000
29039
  <file name="index.html">
29001
29040
  <script>
29002
- function Ctrl($scope) {
29003
- $scope.list = [];
29004
- $scope.text = 'hello';
29005
- $scope.submit = function() {
29006
- if ($scope.text) {
29007
- $scope.list.push(this.text);
29008
- $scope.text = '';
29009
- }
29010
- };
29011
- }
29041
+ angular.module('submitExample', [])
29042
+ .controller('ExampleController', ['$scope', function($scope) {
29043
+ $scope.list = [];
29044
+ $scope.text = 'hello';
29045
+ $scope.submit = function() {
29046
+ if ($scope.text) {
29047
+ $scope.list.push(this.text);
29048
+ $scope.text = '';
29049
+ }
29050
+ };
29051
+ }]);
29012
29052
  </script>
29013
- <form ng-submit="submit()" ng-controller="Ctrl">
29053
+ <form ng-submit="submit()" ng-controller="ExampleController">
29014
29054
  Enter text and hit enter:
29015
29055
  <input type="text" ng-model="text" name="text" />
29016
29056
  <input type="submit" id="submit" value="Submit" />
@@ -29022,7 +29062,7 @@ forEach(
29022
29062
  expect(element(by.binding('list')).getText()).toBe('list=[]');
29023
29063
  element(by.css('#submit')).click();
29024
29064
  expect(element(by.binding('list')).getText()).toContain('hello');
29025
- expect(element(by.input('text')).getAttribute('value')).toBe('');
29065
+ expect(element(by.model('text')).getAttribute('value')).toBe('');
29026
29066
  });
29027
29067
  it('should ignore empty strings', function() {
29028
29068
  expect(element(by.binding('list')).getText()).toBe('list=[]');
@@ -29295,9 +29335,9 @@ var ngIfDirective = ['$animate', function($animate) {
29295
29335
  * - Otherwise enable scrolling only if the expression evaluates to truthy value.
29296
29336
  *
29297
29337
  * @example
29298
- <example module="ngAnimate" deps="angular-animate.js" animations="true">
29338
+ <example module="includeExample" deps="angular-animate.js" animations="true">
29299
29339
  <file name="index.html">
29300
- <div ng-controller="Ctrl">
29340
+ <div ng-controller="ExampleController">
29301
29341
  <select ng-model="template" ng-options="t.name for t in templates">
29302
29342
  <option value="">(blank)</option>
29303
29343
  </select>
@@ -29309,12 +29349,13 @@ var ngIfDirective = ['$animate', function($animate) {
29309
29349
  </div>
29310
29350
  </file>
29311
29351
  <file name="script.js">
29312
- function Ctrl($scope) {
29313
- $scope.templates =
29314
- [ { name: 'template1.html', url: 'template1.html'},
29315
- { name: 'template2.html', url: 'template2.html'} ];
29316
- $scope.template = $scope.templates[0];
29317
- }
29352
+ angular.module('includeExample', ['ngAnimate'])
29353
+ .controller('ExampleController', ['$scope', function($scope) {
29354
+ $scope.templates =
29355
+ [ { name: 'template1.html', url: 'template1.html'},
29356
+ { name: 'template2.html', url: 'template2.html'} ];
29357
+ $scope.template = $scope.templates[0];
29358
+ }]);
29318
29359
  </file>
29319
29360
  <file name="template1.html">
29320
29361
  Content of template1.html
@@ -29377,7 +29418,7 @@ var ngIfDirective = ['$animate', function($animate) {
29377
29418
  return;
29378
29419
  }
29379
29420
  templateSelect.click();
29380
- templateSelect.element.all(by.css('option')).get(2).click();
29421
+ templateSelect.all(by.css('option')).get(2).click();
29381
29422
  expect(includeElem.getText()).toMatch(/Content of template2.html/);
29382
29423
  });
29383
29424
 
@@ -29387,7 +29428,7 @@ var ngIfDirective = ['$animate', function($animate) {
29387
29428
  return;
29388
29429
  }
29389
29430
  templateSelect.click();
29390
- templateSelect.element.all(by.css('option')).get(0).click();
29431
+ templateSelect.all(by.css('option')).get(0).click();
29391
29432
  expect(includeElem.isPresent()).toBe(false);
29392
29433
  });
29393
29434
  </file>
@@ -29539,14 +29580,15 @@ var ngIncludeFillContentDirective = ['$compile',
29539
29580
  * @param {expression} ngInit {@link guide/expression Expression} to eval.
29540
29581
  *
29541
29582
  * @example
29542
- <example>
29583
+ <example module="initExample">
29543
29584
  <file name="index.html">
29544
29585
  <script>
29545
- function Ctrl($scope) {
29546
- $scope.list = [['a', 'b'], ['c', 'd']];
29547
- }
29586
+ angular.module('initExample', [])
29587
+ .controller('ExampleController', ['$scope', function($scope) {
29588
+ $scope.list = [['a', 'b'], ['c', 'd']];
29589
+ }]);
29548
29590
  </script>
29549
- <div ng-controller="Ctrl">
29591
+ <div ng-controller="ExampleController">
29550
29592
  <div ng-repeat="innerList in list" ng-init="outerIndex = $index">
29551
29593
  <div ng-repeat="value in innerList" ng-init="innerIndex = $index">
29552
29594
  <span class="example-init">list[ {{outerIndex}} ][ {{innerIndex}} ] = {{value}};</span>
@@ -29699,16 +29741,17 @@ var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
29699
29741
  * @param {number=} offset Offset to deduct from the total number.
29700
29742
  *
29701
29743
  * @example
29702
- <example>
29744
+ <example module="pluralizeExample">
29703
29745
  <file name="index.html">
29704
29746
  <script>
29705
- function Ctrl($scope) {
29706
- $scope.person1 = 'Igor';
29707
- $scope.person2 = 'Misko';
29708
- $scope.personCount = 1;
29709
- }
29747
+ angular.module('pluralizeExample', [])
29748
+ .controller('ExampleController', ['$scope', function($scope) {
29749
+ $scope.person1 = 'Igor';
29750
+ $scope.person2 = 'Misko';
29751
+ $scope.personCount = 1;
29752
+ }]);
29710
29753
  </script>
29711
- <div ng-controller="Ctrl">
29754
+ <div ng-controller="ExampleController">
29712
29755
  Person 1:<input type="text" ng-model="person1" value="Igor" /><br/>
29713
29756
  Person 2:<input type="text" ng-model="person2" value="Misko" /><br/>
29714
29757
  Number of People:<input type="text" ng-model="personCount" value="1" /><br/>
@@ -30642,9 +30685,9 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
30642
30685
  *
30643
30686
  *
30644
30687
  * @example
30645
- <example module="ngAnimate" deps="angular-animate.js" animations="true">
30688
+ <example module="switchExample" deps="angular-animate.js" animations="true">
30646
30689
  <file name="index.html">
30647
- <div ng-controller="Ctrl">
30690
+ <div ng-controller="ExampleController">
30648
30691
  <select ng-model="selection" ng-options="item for item in items">
30649
30692
  </select>
30650
30693
  <tt>selection={{selection}}</tt>
@@ -30658,10 +30701,11 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
30658
30701
  </div>
30659
30702
  </file>
30660
30703
  <file name="script.js">
30661
- function Ctrl($scope) {
30662
- $scope.items = ['settings', 'home', 'other'];
30663
- $scope.selection = $scope.items[0];
30664
- }
30704
+ angular.module('switchExample', ['ngAnimate'])
30705
+ .controller('ExampleController', ['$scope', function($scope) {
30706
+ $scope.items = ['settings', 'home', 'other'];
30707
+ $scope.selection = $scope.items[0];
30708
+ }]);
30665
30709
  </file>
30666
30710
  <file name="animations.css">
30667
30711
  .animate-switch-container {
@@ -30704,11 +30748,11 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
30704
30748
  expect(switchElem.getText()).toMatch(/Settings Div/);
30705
30749
  });
30706
30750
  it('should change to home', function() {
30707
- select.element.all(by.css('option')).get(1).click();
30751
+ select.all(by.css('option')).get(1).click();
30708
30752
  expect(switchElem.getText()).toMatch(/Home Span/);
30709
30753
  });
30710
30754
  it('should select default', function() {
30711
- select.element.all(by.css('option')).get(2).click();
30755
+ select.all(by.css('option')).get(2).click();
30712
30756
  expect(switchElem.getText()).toMatch(/default/);
30713
30757
  });
30714
30758
  </file>
@@ -30800,15 +30844,10 @@ var ngSwitchDefaultDirective = ngDirective({
30800
30844
  * @element ANY
30801
30845
  *
30802
30846
  * @example
30803
- <example module="transclude">
30847
+ <example module="transcludeExample">
30804
30848
  <file name="index.html">
30805
30849
  <script>
30806
- function Ctrl($scope) {
30807
- $scope.title = 'Lorem Ipsum';
30808
- $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';
30809
- }
30810
-
30811
- angular.module('transclude', [])
30850
+ angular.module('transcludeExample', [])
30812
30851
  .directive('pane', function(){
30813
30852
  return {
30814
30853
  restrict: 'E',
@@ -30819,9 +30858,13 @@ var ngSwitchDefaultDirective = ngDirective({
30819
30858
  '<div ng-transclude></div>' +
30820
30859
  '</div>'
30821
30860
  };
30822
- });
30861
+ })
30862
+ .controller('ExampleController', ['$scope', function($scope) {
30863
+ $scope.title = 'Lorem Ipsum';
30864
+ $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';
30865
+ }]);
30823
30866
  </script>
30824
- <div ng-controller="Ctrl">
30867
+ <div ng-controller="ExampleController">
30825
30868
  <input ng-model="title"><br>
30826
30869
  <textarea ng-model="text"></textarea> <br/>
30827
30870
  <pane title="{{title}}">{{text}}</pane>
@@ -30980,21 +31023,22 @@ var ngOptionsMinErr = minErr('ngOptions');
30980
31023
  * `value` variable (e.g. `value.propertyName`).
30981
31024
  *
30982
31025
  * @example
30983
- <example>
31026
+ <example module="selectExample">
30984
31027
  <file name="index.html">
30985
31028
  <script>
30986
- function MyCntrl($scope) {
30987
- $scope.colors = [
30988
- {name:'black', shade:'dark'},
30989
- {name:'white', shade:'light'},
30990
- {name:'red', shade:'dark'},
30991
- {name:'blue', shade:'dark'},
30992
- {name:'yellow', shade:'light'}
30993
- ];
30994
- $scope.myColor = $scope.colors[2]; // red
30995
- }
31029
+ angular.module('selectExample', [])
31030
+ .controller('ExampleController', ['$scope', function($scope) {
31031
+ $scope.colors = [
31032
+ {name:'black', shade:'dark'},
31033
+ {name:'white', shade:'light'},
31034
+ {name:'red', shade:'dark'},
31035
+ {name:'blue', shade:'dark'},
31036
+ {name:'yellow', shade:'light'}
31037
+ ];
31038
+ $scope.myColor = $scope.colors[2]; // red
31039
+ }]);
30996
31040
  </script>
30997
- <div ng-controller="MyCntrl">
31041
+ <div ng-controller="ExampleController">
30998
31042
  <ul>
30999
31043
  <li ng-repeat="color in colors">
31000
31044
  Name: <input ng-model="color.name">
@@ -31031,7 +31075,7 @@ var ngOptionsMinErr = minErr('ngOptions');
31031
31075
  <file name="protractor.js" type="protractor">
31032
31076
  it('should check ng-options', function() {
31033
31077
  expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red');
31034
- element.all(by.select('myColor')).first().click();
31078
+ element.all(by.model('myColor')).first().click();
31035
31079
  element.all(by.css('select[ng-model="myColor"] option')).first().click();
31036
31080
  expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black');
31037
31081
  element(by.css('.nullable select[ng-model="myColor"]')).click();