angular-gem 1.2.7 → 1.2.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.7
2
+ * @license AngularJS v1.2.8
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.7
2
+ * @license AngularJS v1.2.8
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.7
2
+ * @license AngularJS v1.2.8
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.7/' +
72
+ message = message + '\nhttp://errors.angularjs.org/1.2.8/' +
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.7
2
+ * @license AngularJS v1.2.8
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -2086,6 +2086,20 @@ if(window.jasmine || window.mocha) {
2086
2086
  *
2087
2087
  * @param {...Function} fns any number of functions which will be injected using the injector.
2088
2088
  */
2089
+
2090
+
2091
+
2092
+ var ErrorAddingDeclarationLocationStack = function(e, errorForStack) {
2093
+ this.message = e.message;
2094
+ this.name = e.name;
2095
+ if (e.line) this.line = e.line;
2096
+ if (e.sourceId) this.sourceId = e.sourceId;
2097
+ if (e.stack && errorForStack)
2098
+ this.stack = e.stack + '\n' + errorForStack.stack;
2099
+ if (e.stackArray) this.stackArray = e.stackArray;
2100
+ };
2101
+ ErrorAddingDeclarationLocationStack.prototype.toString = Error.prototype.toString;
2102
+
2089
2103
  window.inject = angular.mock.inject = function() {
2090
2104
  var blockFns = Array.prototype.slice.call(arguments, 0);
2091
2105
  var errorForStack = new Error('Declaration Location');
@@ -2106,7 +2120,9 @@ if(window.jasmine || window.mocha) {
2106
2120
  injector.invoke(blockFns[i] || angular.noop, this);
2107
2121
  /* jshint +W040 */
2108
2122
  } catch (e) {
2109
- if(e.stack && errorForStack) e.stack += '\n' + errorForStack.stack;
2123
+ if (e.stack && errorForStack) {
2124
+ throw new ErrorAddingDeclarationLocationStack(e, errorForStack);
2125
+ }
2110
2126
  throw e;
2111
2127
  } finally {
2112
2128
  errorForStack = null;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.7
2
+ * @license AngularJS v1.2.8
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -95,7 +95,7 @@ function shallowClearAndCopy(src, dst) {
95
95
  * when a param value needs to be obtained for a request (unless the param was overridden).
96
96
  *
97
97
  * Each key value in the parameter object is first bound to url template if present and then any
98
- * excess keys are appended to the url seapph query after the `?`.
98
+ * excess keys are appended to the url search query after the `?`.
99
99
  *
100
100
  * Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in
101
101
  * URL `/path/greet?salutation=Hello`.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.7
2
+ * @license AngularJS v1.2.8
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.7
2
+ * @license AngularJS v1.2.8
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -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.7
9793
+ * @license AngularJS v1.2.8
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.7/' +
9863
+ message = message + '\nhttp://errors.angularjs.org/1.2.8/' +
9864
9864
  (module ? module + '/' : '') + code;
9865
9865
  for (i = 2; i < arguments.length; i++) {
9866
9866
  message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
@@ -11625,11 +11625,11 @@ function setupModuleLoader(window) {
11625
11625
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
11626
11626
  */
11627
11627
  var version = {
11628
- full: '1.2.7', // all of these placeholder strings will be replaced by grunt's
11628
+ full: '1.2.8', // all of these placeholder strings will be replaced by grunt's
11629
11629
  major: 1, // package task
11630
11630
  minor: 2,
11631
- dot: 7,
11632
- codeName: 'emoji-clairvoyance'
11631
+ dot: 8,
11632
+ codeName: 'interdimensional-cartography'
11633
11633
  };
11634
11634
 
11635
11635
 
@@ -16440,7 +16440,7 @@ function directiveNormalize(name) {
16440
16440
  *
16441
16441
  *
16442
16442
  * @param {string} name Normalized element attribute name of the property to modify. The name is
16443
- * revers translated using the {@link ng.$compile.directive.Attributes#$attr $attr}
16443
+ * reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr}
16444
16444
  * property to the original name.
16445
16445
  * @param {string} value Value to set the attribute to. The value can be an interpolated string.
16446
16446
  */
@@ -16578,8 +16578,7 @@ function $ControllerProvider() {
16578
16578
  * @requires $window
16579
16579
  *
16580
16580
  * @description
16581
- * A {@link angular.element jQuery (lite)}-wrapped reference to the browser's `window.document`
16582
- * element.
16581
+ * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object.
16583
16582
  */
16584
16583
  function $DocumentProvider(){
16585
16584
  this.$get = ['$window', function(window){
@@ -16918,7 +16917,15 @@ function $HttpProvider() {
16918
16917
  * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }.
16919
16918
  *
16920
16919
  * The defaults can also be set at runtime via the `$http.defaults` object in the same
16921
- * fashion. In addition, you can supply a `headers` property in the config object passed when
16920
+ * fashion. For example:
16921
+ *
16922
+ * ```
16923
+ * module.run(function($http) {
16924
+ * $http.defaults.headers.common.Authentication = 'Basic YmVlcDpib29w'
16925
+ * });
16926
+ * ```
16927
+ *
16928
+ * In addition, you can supply a `headers` property in the config object passed when
16922
16929
  * calling `$http(config)`, which overrides the defaults without changing them globally.
16923
16930
  *
16924
16931
  *
@@ -16942,7 +16949,9 @@ function $HttpProvider() {
16942
16949
  * properties. These properties are by default an array of transform functions, which allows you
16943
16950
  * to `push` or `unshift` a new transformation function into the transformation chain. You can
16944
16951
  * also decide to completely override any default transformations by assigning your
16945
- * transformation functions to these properties directly without the array wrapper.
16952
+ * transformation functions to these properties directly without the array wrapper. These defaults
16953
+ * are again available on the $http factory at run-time, which may be useful if you have run-time
16954
+ * services you wish to be involved in your transformations.
16946
16955
  *
16947
16956
  * Similarly, to locally override the request/response transforms, augment the
16948
16957
  * `transformRequest` and/or `transformResponse` properties of the configuration object passed
@@ -17156,7 +17165,8 @@ function $HttpProvider() {
17156
17165
  * for added security.
17157
17166
  *
17158
17167
  * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName
17159
- * properties of either $httpProvider.defaults, or the per-request config object.
17168
+ * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time,
17169
+ * or the per-request config object.
17160
17170
  *
17161
17171
  *
17162
17172
  * @param {object} config Object describing the request to be made and how it should be
@@ -17719,7 +17729,7 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
17719
17729
  } else {
17720
17730
  completeRequest(callback, status || -2);
17721
17731
  }
17722
- delete callbacks[callbackId];
17732
+ callbacks[callbackId] = angular.noop;
17723
17733
  });
17724
17734
  } else {
17725
17735
 
@@ -17736,7 +17746,7 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
17736
17746
  // response is in the cache. the promise api will ensure that to the app code the api is
17737
17747
  // always async
17738
17748
  xhr.onreadystatechange = function() {
17739
- // onreadystatechange might by called multiple times with readyState === 4 on mobile webkit caused by
17749
+ // onreadystatechange might get called multiple times with readyState === 4 on mobile webkit caused by
17740
17750
  // xhrs that are resolved while the app is in the background (see #5426).
17741
17751
  // since calling completeRequest sets the `xhr` variable to null, we just check if it's not null before
17742
17752
  // continuing
@@ -17749,11 +17759,12 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
17749
17759
 
17750
17760
  if(status !== ABORTED) {
17751
17761
  responseHeaders = xhr.getAllResponseHeaders();
17752
- response = xhr.responseType ? xhr.response : xhr.responseText;
17762
+
17763
+ // responseText is the old-school way of retrieving response (supported by IE8 & 9)
17764
+ // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)
17765
+ response = ('response' in xhr) ? xhr.response : xhr.responseText;
17753
17766
  }
17754
17767
 
17755
- // responseText is the old-school way of retrieving response (supported by IE8 & 9)
17756
- // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)
17757
17768
  completeRequest(callback,
17758
17769
  status || xhr.status,
17759
17770
  response,
@@ -17786,14 +17797,14 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
17786
17797
  }
17787
17798
 
17788
17799
  function completeRequest(callback, status, response, headersString) {
17789
- var protocol = urlResolve(url).protocol;
17790
-
17791
17800
  // cancel timeout and subsequent timeout promise resolution
17792
17801
  timeoutId && $browserDefer.cancel(timeoutId);
17793
17802
  jsonpDone = xhr = null;
17794
17803
 
17795
- // fix status code for file protocol (it's always 0)
17796
- status = (protocol == 'file' && status === 0) ? (response ? 200 : 404) : status;
17804
+ // fix status code when it is 0 (0 status is undocumented).
17805
+ // Occurs when accessing file resources.
17806
+ // On Android 4.1 stock browser it occurs while retrieving files from application cache.
17807
+ status = (status === 0) ? (response ? 200 : 404) : status;
17797
17808
 
17798
17809
  // normalize IE bug (http://bugs.jquery.com/ticket/1450)
17799
17810
  status = status == 1223 ? 204 : status;
@@ -18907,7 +18918,7 @@ function $LocationProvider(){
18907
18918
  * Broadcasted before a URL will change. This change can be prevented by calling
18908
18919
  * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more
18909
18920
  * details about event object. Upon successful change
18910
- * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired.
18921
+ * {@link ng.$location#events_$locationChangeSuccess $locationChangeSuccess} is fired.
18911
18922
  *
18912
18923
  * @param {Object} angularEvent Synthetic event object.
18913
18924
  * @param {string} newUrl New URL
@@ -20098,16 +20109,20 @@ function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {
20098
20109
  if (pathVal == null) return pathVal;
20099
20110
  pathVal = pathVal[key0];
20100
20111
 
20101
- if (pathVal == null) return key1 ? undefined : pathVal;
20112
+ if (!key1) return pathVal;
20113
+ if (pathVal == null) return undefined;
20102
20114
  pathVal = pathVal[key1];
20103
20115
 
20104
- if (pathVal == null) return key2 ? undefined : pathVal;
20116
+ if (!key2) return pathVal;
20117
+ if (pathVal == null) return undefined;
20105
20118
  pathVal = pathVal[key2];
20106
20119
 
20107
- if (pathVal == null) return key3 ? undefined : pathVal;
20120
+ if (!key3) return pathVal;
20121
+ if (pathVal == null) return undefined;
20108
20122
  pathVal = pathVal[key3];
20109
20123
 
20110
- if (pathVal == null) return key4 ? undefined : pathVal;
20124
+ if (!key4) return pathVal;
20125
+ if (pathVal == null) return undefined;
20111
20126
  pathVal = pathVal[key4];
20112
20127
 
20113
20128
  return pathVal;
@@ -20128,8 +20143,9 @@ function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {
20128
20143
  }
20129
20144
  pathVal = pathVal.$$v;
20130
20145
  }
20131
- if (pathVal == null) return key1 ? undefined : pathVal;
20132
20146
 
20147
+ if (!key1) return pathVal;
20148
+ if (pathVal == null) return undefined;
20133
20149
  pathVal = pathVal[key1];
20134
20150
  if (pathVal && pathVal.then) {
20135
20151
  promiseWarning(fullExp);
@@ -20140,8 +20156,9 @@ function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {
20140
20156
  }
20141
20157
  pathVal = pathVal.$$v;
20142
20158
  }
20143
- if (pathVal == null) return key2 ? undefined : pathVal;
20144
20159
 
20160
+ if (!key2) return pathVal;
20161
+ if (pathVal == null) return undefined;
20145
20162
  pathVal = pathVal[key2];
20146
20163
  if (pathVal && pathVal.then) {
20147
20164
  promiseWarning(fullExp);
@@ -20152,8 +20169,9 @@ function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {
20152
20169
  }
20153
20170
  pathVal = pathVal.$$v;
20154
20171
  }
20155
- if (pathVal == null) return key3 ? undefined : pathVal;
20156
20172
 
20173
+ if (!key3) return pathVal;
20174
+ if (pathVal == null) return undefined;
20157
20175
  pathVal = pathVal[key3];
20158
20176
  if (pathVal && pathVal.then) {
20159
20177
  promiseWarning(fullExp);
@@ -20164,8 +20182,9 @@ function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {
20164
20182
  }
20165
20183
  pathVal = pathVal.$$v;
20166
20184
  }
20167
- if (pathVal == null) return key4 ? undefined : pathVal;
20168
20185
 
20186
+ if (!key4) return pathVal;
20187
+ if (pathVal == null) return undefined;
20169
20188
  pathVal = pathVal[key4];
20170
20189
  if (pathVal && pathVal.then) {
20171
20190
  promiseWarning(fullExp);
@@ -21163,7 +21182,7 @@ function $RootScopeProvider(){
21163
21182
  } else {
21164
21183
  ChildScope = function() {}; // should be anonymous; This is so that when the minifier munges
21165
21184
  // the name it does not become random set of chars. This will then show up as class
21166
- // name in the debugger.
21185
+ // name in the web inspector.
21167
21186
  ChildScope.prototype = this;
21168
21187
  child = new ChildScope();
21169
21188
  child.$id = nextUid();
@@ -21264,7 +21283,7 @@ function $RootScopeProvider(){
21264
21283
  // No digest has been run so the counter will be zero
21265
21284
  expect(scope.foodCounter).toEqual(0);
21266
21285
 
21267
- // Run the digest but since food has not changed cout will still be zero
21286
+ // Run the digest but since food has not changed count will still be zero
21268
21287
  scope.$digest();
21269
21288
  expect(scope.foodCounter).toEqual(0);
21270
21289
 
@@ -23687,8 +23706,8 @@ function $FilterProvider($provide) {
23687
23706
  *
23688
23707
  * Can be one of:
23689
23708
  *
23690
- * - `string`: Predicate that results in a substring match using the value of `expression`
23691
- * string. All strings or objects with string properties in `array` that contain this string
23709
+ * - `string`: The string is evaluated as an expression and the resulting value is used for substring match against
23710
+ * the contents of the `array`. All strings or objects with string properties in `array` that contain this string
23692
23711
  * will be returned. The predicate can be negated by prefixing the string with `!`.
23693
23712
  *
23694
23713
  * - `Object`: A pattern object can be used to filter specific properties on objects contained
@@ -23846,23 +23865,12 @@ function filterFilter() {
23846
23865
  case "object":
23847
23866
  // jshint +W086
23848
23867
  for (var key in expression) {
23849
- if (key == '$') {
23850
- (function() {
23851
- if (!expression[key]) return;
23852
- var path = key;
23853
- predicates.push(function(value) {
23854
- return search(value, expression[path]);
23855
- });
23856
- })();
23857
- } else {
23858
- (function() {
23859
- if (typeof(expression[key]) == 'undefined') { return; }
23860
- var path = key;
23861
- predicates.push(function(value) {
23862
- return search(getter(value,path), expression[path]);
23863
- });
23864
- })();
23865
- }
23868
+ (function(path) {
23869
+ if (typeof expression[path] == 'undefined') return;
23870
+ predicates.push(function(value) {
23871
+ return search(path == '$' ? value : getter(value, path), expression[path]);
23872
+ });
23873
+ })(key);
23866
23874
  }
23867
23875
  break;
23868
23876
  case 'function':
@@ -24983,12 +24991,10 @@ forEach(BOOLEAN_ATTR, function(propName, attrName) {
24983
24991
  ngAttributeAliasDirectives[normalized] = function() {
24984
24992
  return {
24985
24993
  priority: 100,
24986
- compile: function() {
24987
- return function(scope, element, attr) {
24988
- scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {
24989
- attr.$set(attrName, !!value);
24990
- });
24991
- };
24994
+ link: function(scope, element, attr) {
24995
+ scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {
24996
+ attr.$set(attrName, !!value);
24997
+ });
24992
24998
  }
24993
24999
  };
24994
25000
  };
@@ -25268,10 +25274,10 @@ function FormController(element, attrs) {
25268
25274
  *
25269
25275
  *
25270
25276
  * # CSS classes
25271
- * - `ng-valid` Is set if the form is valid.
25272
- * - `ng-invalid` Is set if the form is invalid.
25273
- * - `ng-pristine` Is set if the form is pristine.
25274
- * - `ng-dirty` Is set if the form is dirty.
25277
+ * - `ng-valid` is set if the form is valid.
25278
+ * - `ng-invalid` is set if the form is invalid.
25279
+ * - `ng-pristine` is set if the form is pristine.
25280
+ * - `ng-dirty` is set if the form is dirty.
25275
25281
  *
25276
25282
  *
25277
25283
  * # Submitting a form and preventing the default action
@@ -25788,6 +25794,12 @@ var inputType = {
25788
25794
  'reset': noop
25789
25795
  };
25790
25796
 
25797
+ // A helper function to call $setValidity and return the value / undefined,
25798
+ // a pattern that is repeated a lot in the input validation logic.
25799
+ function validate(ctrl, validatorName, validity, value){
25800
+ ctrl.$setValidity(validatorName, validity);
25801
+ return validity ? value : undefined;
25802
+ }
25791
25803
 
25792
25804
  function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
25793
25805
  // In composition mode, users are still inputing intermediate text buffer,
@@ -25872,22 +25884,15 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
25872
25884
  patternValidator,
25873
25885
  match;
25874
25886
 
25875
- var validate = function(regexp, value) {
25876
- if (ctrl.$isEmpty(value) || regexp.test(value)) {
25877
- ctrl.$setValidity('pattern', true);
25878
- return value;
25879
- } else {
25880
- ctrl.$setValidity('pattern', false);
25881
- return undefined;
25882
- }
25883
- };
25884
-
25885
25887
  if (pattern) {
25888
+ var validateRegex = function(regexp, value) {
25889
+ return validate(ctrl, 'pattern', ctrl.$isEmpty(value) || regexp.test(value), value);
25890
+ };
25886
25891
  match = pattern.match(/^\/(.*)\/([gim]*)$/);
25887
25892
  if (match) {
25888
25893
  pattern = new RegExp(match[1], match[2]);
25889
25894
  patternValidator = function(value) {
25890
- return validate(pattern, value);
25895
+ return validateRegex(pattern, value);
25891
25896
  };
25892
25897
  } else {
25893
25898
  patternValidator = function(value) {
@@ -25898,7 +25903,7 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
25898
25903
  'Expected {0} to be a RegExp but was {1}. Element: {2}', pattern,
25899
25904
  patternObj, startingTag(element));
25900
25905
  }
25901
- return validate(patternObj, value);
25906
+ return validateRegex(patternObj, value);
25902
25907
  };
25903
25908
  }
25904
25909
 
@@ -25910,13 +25915,7 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
25910
25915
  if (attr.ngMinlength) {
25911
25916
  var minlength = int(attr.ngMinlength);
25912
25917
  var minLengthValidator = function(value) {
25913
- if (!ctrl.$isEmpty(value) && value.length < minlength) {
25914
- ctrl.$setValidity('minlength', false);
25915
- return undefined;
25916
- } else {
25917
- ctrl.$setValidity('minlength', true);
25918
- return value;
25919
- }
25918
+ return validate(ctrl, 'minlength', ctrl.$isEmpty(value) || value.length >= minlength, value);
25920
25919
  };
25921
25920
 
25922
25921
  ctrl.$parsers.push(minLengthValidator);
@@ -25927,13 +25926,7 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
25927
25926
  if (attr.ngMaxlength) {
25928
25927
  var maxlength = int(attr.ngMaxlength);
25929
25928
  var maxLengthValidator = function(value) {
25930
- if (!ctrl.$isEmpty(value) && value.length > maxlength) {
25931
- ctrl.$setValidity('maxlength', false);
25932
- return undefined;
25933
- } else {
25934
- ctrl.$setValidity('maxlength', true);
25935
- return value;
25936
- }
25929
+ return validate(ctrl, 'maxlength', ctrl.$isEmpty(value) || value.length <= maxlength, value);
25937
25930
  };
25938
25931
 
25939
25932
  ctrl.$parsers.push(maxLengthValidator);
@@ -25962,13 +25955,7 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
25962
25955
  if (attr.min) {
25963
25956
  var minValidator = function(value) {
25964
25957
  var min = parseFloat(attr.min);
25965
- if (!ctrl.$isEmpty(value) && value < min) {
25966
- ctrl.$setValidity('min', false);
25967
- return undefined;
25968
- } else {
25969
- ctrl.$setValidity('min', true);
25970
- return value;
25971
- }
25958
+ return validate(ctrl, 'min', ctrl.$isEmpty(value) || value >= min, value);
25972
25959
  };
25973
25960
 
25974
25961
  ctrl.$parsers.push(minValidator);
@@ -25978,13 +25965,7 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
25978
25965
  if (attr.max) {
25979
25966
  var maxValidator = function(value) {
25980
25967
  var max = parseFloat(attr.max);
25981
- if (!ctrl.$isEmpty(value) && value > max) {
25982
- ctrl.$setValidity('max', false);
25983
- return undefined;
25984
- } else {
25985
- ctrl.$setValidity('max', true);
25986
- return value;
25987
- }
25968
+ return validate(ctrl, 'max', ctrl.$isEmpty(value) || value <= max, value);
25988
25969
  };
25989
25970
 
25990
25971
  ctrl.$parsers.push(maxValidator);
@@ -25992,14 +25973,7 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
25992
25973
  }
25993
25974
 
25994
25975
  ctrl.$formatters.push(function(value) {
25995
-
25996
- if (ctrl.$isEmpty(value) || isNumber(value)) {
25997
- ctrl.$setValidity('number', true);
25998
- return value;
25999
- } else {
26000
- ctrl.$setValidity('number', false);
26001
- return undefined;
26002
- }
25976
+ return validate(ctrl, 'number', ctrl.$isEmpty(value) || isNumber(value), value);
26003
25977
  });
26004
25978
  }
26005
25979
 
@@ -26007,13 +25981,7 @@ function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
26007
25981
  textInputType(scope, element, attr, ctrl, $sniffer, $browser);
26008
25982
 
26009
25983
  var urlValidator = function(value) {
26010
- if (ctrl.$isEmpty(value) || URL_REGEXP.test(value)) {
26011
- ctrl.$setValidity('url', true);
26012
- return value;
26013
- } else {
26014
- ctrl.$setValidity('url', false);
26015
- return undefined;
26016
- }
25984
+ return validate(ctrl, 'url', ctrl.$isEmpty(value) || URL_REGEXP.test(value), value);
26017
25985
  };
26018
25986
 
26019
25987
  ctrl.$formatters.push(urlValidator);
@@ -26024,13 +25992,7 @@ function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
26024
25992
  textInputType(scope, element, attr, ctrl, $sniffer, $browser);
26025
25993
 
26026
25994
  var emailValidator = function(value) {
26027
- if (ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value)) {
26028
- ctrl.$setValidity('email', true);
26029
- return value;
26030
- } else {
26031
- ctrl.$setValidity('email', false);
26032
- return undefined;
26033
- }
25995
+ return validate(ctrl, 'email', ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value), value);
26034
25996
  };
26035
25997
 
26036
25998
  ctrl.$formatters.push(emailValidator);
@@ -27634,13 +27596,13 @@ var ngControllerDirective = [function() {
27634
27596
  </button>
27635
27597
  count: {{count}}
27636
27598
  </doc:source>
27637
- <doc:scenario>
27599
+ <doc:protractor>
27638
27600
  it('should check ng-click', function() {
27639
- expect(binding('count')).toBe('0');
27640
- element('.doc-example-live :button').click();
27641
- expect(binding('count')).toBe('1');
27601
+ expect(element(by.binding('count')).getText()).toMatch('0');
27602
+ element(by.css('.doc-example-live button')).click();
27603
+ expect(element(by.binding('count')).getText()).toMatch('1');
27642
27604
  });
27643
- </doc:scenario>
27605
+ </doc:protractor>
27644
27606
  </doc:example>
27645
27607
  */
27646
27608
  /*
@@ -28719,6 +28681,8 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp
28719
28681
  * | `$even` | {@type boolean} | true if the iterator position `$index` is even (otherwise false). |
28720
28682
  * | `$odd` | {@type boolean} | true if the iterator position `$index` is odd (otherwise false). |
28721
28683
  *
28684
+ * Creating aliases for these properties is possible with {@link api/ng.directive:ngInit `ngInit`}.
28685
+ * This may be useful when, for instance, nesting ngRepeats.
28722
28686
  *
28723
28687
  * # Special repeat start and end points
28724
28688
  * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending
@@ -29601,11 +29565,9 @@ var ngSwitchWhenDirective = ngDirective({
29601
29565
  transclude: 'element',
29602
29566
  priority: 800,
29603
29567
  require: '^ngSwitch',
29604
- compile: function(element, attrs) {
29605
- return function(scope, element, attr, ctrl, $transclude) {
29606
- ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []);
29607
- ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element });
29608
- };
29568
+ link: function(scope, element, attrs, ctrl, $transclude) {
29569
+ ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []);
29570
+ ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element });
29609
29571
  }
29610
29572
  });
29611
29573
 
@@ -29700,10 +29662,14 @@ var ngTranscludeDirective = ngDirective({
29700
29662
  * @restrict E
29701
29663
  *
29702
29664
  * @description
29703
- * Load content of a script tag, with type `text/ng-template`, into `$templateCache`, so that the
29704
- * template can be used by `ngInclude`, `ngView` or directive templates.
29665
+ * Load the content of a `<script>` element into {@link api/ng.$templateCache `$templateCache`}, so that the
29666
+ * template can be used by {@link api/ng.directive:ngInclude `ngInclude`},
29667
+ * {@link api/ngRoute.directive:ngView `ngView`}, or {@link guide/directive directives}. The type of the
29668
+ * `<script>` element must be specified as `text/ng-template`, and a cache name for the template must be
29669
+ * assigned through the element's `id`, which can then be used as a directive's `templateUrl`.
29705
29670
  *
29706
- * @param {'text/ng-template'} type must be set to `'text/ng-template'`
29671
+ * @param {'text/ng-template'} type Must be set to `'text/ng-template'`.
29672
+ * @param {string} id Cache name of the template.
29707
29673
  *
29708
29674
  * @example
29709
29675
  <doc:example>
@@ -29867,8 +29833,8 @@ var ngOptionsMinErr = minErr('ngOptions');
29867
29833
  var ngOptionsDirective = valueFn({ terminal: true });
29868
29834
  // jshint maxlen: false
29869
29835
  var selectDirective = ['$compile', '$parse', function($compile, $parse) {
29870
- //0000111110000000000022220000000000000000000000333300000000000000444444444444444000000000555555555555555000000066666666666666600000000000000007777000000000000000000088888
29871
- var NG_OPTIONS_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/,
29836
+ //000011111111110000000000022222222220000000000000000000003333333333000000000000004444444444444440000000005555555555555550000000666666666666666000000000000000777777777700000000000000000008888888888
29837
+ var NG_OPTIONS_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,
29872
29838
  nullModelCtrl = {$setViewValue: noop};
29873
29839
  // jshint maxlen: 100
29874
29840