angular-gem 1.2.21 → 1.2.22

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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.21
2
+ * @license AngularJS v1.2.22
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.21
2
+ * @license AngularJS v1.2.22
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.21
2
+ * @license AngularJS v1.2.22
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.21/' +
72
+ message = message + '\nhttp://errors.angularjs.org/1.2.22/' +
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.21
2
+ * @license AngularJS v1.2.22
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1786,7 +1786,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
1786
1786
  * use the `passThrough` request handler of `when` instead of `respond`.
1787
1787
  *
1788
1788
  * Additionally, we don't want to manually have to flush mocked out requests like we do during unit
1789
- * testing. For this reason the e2e $httpBackend automatically flushes mocked out requests
1789
+ * testing. For this reason the e2e $httpBackend flushes mocked out requests
1790
1790
  * automatically, closely simulating the behavior of the XMLHttpRequest object.
1791
1791
  *
1792
1792
  * To setup the application to run with this http backend, you have to create a module that depends
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.21
2
+ * @license AngularJS v1.2.22
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -99,8 +99,10 @@ function shallowClearAndCopy(src, dst) {
99
99
  * Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in
100
100
  * URL `/path/greet?salutation=Hello`.
101
101
  *
102
- * If the parameter value is prefixed with `@` then the value of that parameter will be taken
103
- * from the corresponding key on the data object (useful for non-GET operations).
102
+ * If the parameter value is prefixed with `@` then the value for that parameter will be extracted
103
+ * from the corresponding property on the `data` object (provided when calling an action method). For
104
+ * example, if the `defaultParam` object is `{someParam: '@someProp'}` then the value of `someParam`
105
+ * will be `data.someProp`.
104
106
  *
105
107
  * @param {Object.<Object>=} actions Hash with declaration of custom action that should extend
106
108
  * the default set of resource actions. The declaration should be created in the format of {@link
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.21
2
+ * @license AngularJS v1.2.22
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.21
2
+ * @license AngularJS v1.2.22
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -237,6 +237,13 @@ function makeMap(str) {
237
237
  * @param {object} handler
238
238
  */
239
239
  function htmlParser( html, handler ) {
240
+ if (typeof html !== 'string') {
241
+ if (html === null || typeof html === 'undefined') {
242
+ html = '';
243
+ } else {
244
+ html = '' + html;
245
+ }
246
+ }
240
247
  var index, chars, match, stack = [], last = html, text;
241
248
  stack.last = function() { return stack[ stack.length - 1 ]; };
242
249
 
@@ -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.21
9793
+ * @license AngularJS v1.2.22
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.21/' +
9863
+ message = message + '\nhttp://errors.angularjs.org/1.2.22/' +
9864
9864
  (module ? module + '/' : '') + code;
9865
9865
  for (i = 2; i < arguments.length; i++) {
9866
9866
  message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
@@ -11769,11 +11769,11 @@ function setupModuleLoader(window) {
11769
11769
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
11770
11770
  */
11771
11771
  var version = {
11772
- full: '1.2.21', // all of these placeholder strings will be replaced by grunt's
11772
+ full: '1.2.22', // all of these placeholder strings will be replaced by grunt's
11773
11773
  major: 1, // package task
11774
11774
  minor: 2,
11775
- dot: 21,
11776
- codeName: 'wizard-props'
11775
+ dot: 22,
11776
+ codeName: 'finicky-pleasure'
11777
11777
  };
11778
11778
 
11779
11779
 
@@ -11786,11 +11786,11 @@ function publishExternalAPI(angular){
11786
11786
  'element': jqLite,
11787
11787
  'forEach': forEach,
11788
11788
  'injector': createInjector,
11789
- 'noop':noop,
11790
- 'bind':bind,
11789
+ 'noop': noop,
11790
+ 'bind': bind,
11791
11791
  'toJson': toJson,
11792
11792
  'fromJson': fromJson,
11793
- 'identity':identity,
11793
+ 'identity': identity,
11794
11794
  'isUndefined': isUndefined,
11795
11795
  'isDefined': isDefined,
11796
11796
  'isString': isString,
@@ -12849,21 +12849,37 @@ forEach({
12849
12849
 
12850
12850
  clone: jqLiteClone,
12851
12851
 
12852
- triggerHandler: function(element, eventName, eventData) {
12853
- // Copy event handlers in case event handlers array is modified during execution.
12854
- var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName],
12855
- eventFnsCopy = shallowCopy(eventFns || []);
12852
+ triggerHandler: function(element, event, extraParameters) {
12856
12853
 
12857
- eventData = eventData || [];
12854
+ var dummyEvent, eventFnsCopy, handlerArgs;
12855
+ var eventName = event.type || event;
12856
+ var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName];
12858
12857
 
12859
- var event = [{
12860
- preventDefault: noop,
12861
- stopPropagation: noop
12862
- }];
12858
+ if (eventFns) {
12863
12859
 
12864
- forEach(eventFnsCopy, function(fn) {
12865
- fn.apply(element, event.concat(eventData));
12866
- });
12860
+ // Create a dummy event to pass to the handlers
12861
+ dummyEvent = {
12862
+ preventDefault: function() { this.defaultPrevented = true; },
12863
+ isDefaultPrevented: function() { return this.defaultPrevented === true; },
12864
+ stopPropagation: noop,
12865
+ type: eventName,
12866
+ target: element
12867
+ };
12868
+
12869
+ // If a custom event was provided then extend our dummy event with it
12870
+ if (event.type) {
12871
+ dummyEvent = extend(dummyEvent, event);
12872
+ }
12873
+
12874
+ // Copy event handlers in case event handlers array is modified during execution.
12875
+ eventFnsCopy = shallowCopy(eventFns);
12876
+ handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent];
12877
+
12878
+ forEach(eventFnsCopy, function(fn) {
12879
+ fn.apply(element, handlerArgs);
12880
+ });
12881
+
12882
+ }
12867
12883
  }
12868
12884
  }, function(fn, name){
12869
12885
  /**
@@ -15108,7 +15124,7 @@ function $TemplateCacheProvider() {
15108
15124
  *
15109
15125
  * #### `template`
15110
15126
  * HTML markup that may:
15111
- * * Replace the contents of the directive's element (defualt).
15127
+ * * Replace the contents of the directive's element (default).
15112
15128
  * * Replace the directive's element itself (if `replace` is true - DEPRECATED).
15113
15129
  * * Wrap the contents of the directive's element (if `transclude` is true).
15114
15130
  *
@@ -16368,7 +16384,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16368
16384
  if (parentGet.literal) {
16369
16385
  compare = equals;
16370
16386
  } else {
16371
- compare = function(a,b) { return a === b; };
16387
+ compare = function(a,b) { return a === b || (a !== a && b !== b); };
16372
16388
  }
16373
16389
  parentSet = parentGet.assign || function() {
16374
16390
  // reset the change, or we will throw this exception on every $digest
@@ -17396,6 +17412,7 @@ function $HttpProvider() {
17396
17412
  * - {@link ng.$http#put $http.put}
17397
17413
  * - {@link ng.$http#delete $http.delete}
17398
17414
  * - {@link ng.$http#jsonp $http.jsonp}
17415
+ * - {@link ng.$http#patch $http.patch}
17399
17416
  *
17400
17417
  *
17401
17418
  * # Setting HTTP Headers
@@ -17697,7 +17714,7 @@ function $HttpProvider() {
17697
17714
  * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise}
17698
17715
  * that should abort the request when resolved.
17699
17716
  * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the
17700
- * XHR object. See [requests with credentials]https://developer.mozilla.org/en/http_access_control#section_5
17717
+ * XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials)
17701
17718
  * for more information.
17702
17719
  * - **responseType** - `{string}` - see
17703
17720
  * [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType).
@@ -18066,7 +18083,8 @@ function $HttpProvider() {
18066
18083
  promise.then(removePendingReq, removePendingReq);
18067
18084
 
18068
18085
 
18069
- if ((config.cache || defaults.cache) && config.cache !== false && config.method == 'GET') {
18086
+ if ((config.cache || defaults.cache) && config.cache !== false &&
18087
+ (config.method === 'GET' || config.method === 'JSONP')) {
18070
18088
  cache = isObject(config.cache) ? config.cache
18071
18089
  : isObject(defaults.cache) ? defaults.cache
18072
18090
  : defaultCache;
@@ -19538,6 +19556,8 @@ function $LocationProvider(){
19538
19556
  $location = new LocationMode(appBase, '#' + hashPrefix);
19539
19557
  $location.$$parse($location.$$rewrite(initialUrl));
19540
19558
 
19559
+ var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i;
19560
+
19541
19561
  $rootElement.on('click', function(event) {
19542
19562
  // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)
19543
19563
  // currently we open nice url link and redirect then
@@ -19560,6 +19580,9 @@ function $LocationProvider(){
19560
19580
  absHref = urlResolve(absHref.animVal).href;
19561
19581
  }
19562
19582
 
19583
+ // Ignore when url is started with javascript: or mailto:
19584
+ if (IGNORE_URI_REGEXP.test(absHref)) return;
19585
+
19563
19586
  // Make relative links work in HTML5 mode for legacy browsers (or at least IE8 & 9)
19564
19587
  // The href should be a regular url e.g. /link/somewhere or link/somewhere or ../somewhere or
19565
19588
  // somewhere#anchor or http://example.com/somewhere
@@ -20431,9 +20454,9 @@ Parser.prototype = {
20431
20454
  var middle;
20432
20455
  var token;
20433
20456
  if ((token = this.expect('?'))) {
20434
- middle = this.ternary();
20457
+ middle = this.assignment();
20435
20458
  if ((token = this.expect(':'))) {
20436
- return this.ternaryFn(left, middle, this.ternary());
20459
+ return this.ternaryFn(left, middle, this.assignment());
20437
20460
  } else {
20438
20461
  this.throwError('expected :', token);
20439
20462
  }
@@ -20521,7 +20544,9 @@ Parser.prototype = {
20521
20544
  return getter(self || object(scope, locals));
20522
20545
  }, {
20523
20546
  assign: function(scope, value, locals) {
20524
- return setter(object(scope, locals), field, value, parser.text, parser.options);
20547
+ var o = object(scope, locals);
20548
+ if (!o) object.assign(scope, o = {});
20549
+ return setter(o, field, value, parser.text, parser.options);
20525
20550
  }
20526
20551
  });
20527
20552
  },
@@ -20551,10 +20576,11 @@ Parser.prototype = {
20551
20576
  return v;
20552
20577
  }, {
20553
20578
  assign: function(self, value, locals) {
20554
- var key = indexFn(self, locals);
20579
+ var key = ensureSafeMemberName(indexFn(self, locals), parser.text);
20555
20580
  // prevent overwriting of Function.constructor which would break ensureSafeObject check
20556
- var safe = ensureSafeObject(obj(self, locals), parser.text);
20557
- return safe[key] = value;
20581
+ var o = ensureSafeObject(obj(self, locals), parser.text);
20582
+ if (!o) obj.assign(self, o = {});
20583
+ return o[key] = value;
20558
20584
  }
20559
20585
  });
20560
20586
  },
@@ -24920,7 +24946,7 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+
24920
24946
  * (e.g. `"h 'o''clock'"`).
24921
24947
  *
24922
24948
  * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or
24923
- * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.SSSZ and its
24949
+ * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its
24924
24950
  * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is
24925
24951
  * specified in the string input, the time is considered to be in the local timezone.
24926
24952
  * @param {string=} format Formatting rules (see Description). If not specified,
@@ -29084,6 +29110,13 @@ forEach(
29084
29110
  * server and reloading the current page), but only if the form does not contain `action`,
29085
29111
  * `data-action`, or `x-action` attributes.
29086
29112
  *
29113
+ * <div class="alert alert-warning">
29114
+ * **Warning:** Be careful not to cause "double-submission" by using both the `ngClick` and
29115
+ * `ngSubmit` handlers together. See the
29116
+ * {@link form#submitting-a-form-and-preventing-the-default-action `form` directive documentation}
29117
+ * for a detailed discussion of when `ngSubmit` may be triggered.
29118
+ * </div>
29119
+ *
29087
29120
  * @element form
29088
29121
  * @priority 0
29089
29122
  * @param {expression} ngSubmit {@link guide/expression Expression} to eval.
@@ -31401,21 +31434,37 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
31401
31434
  value = valueFn(scope, locals);
31402
31435
  }
31403
31436
  }
31404
- // Update the null option's selected property here so $render cleans it up correctly
31405
- if (optionGroupsCache[0].length > 1) {
31406
- if (optionGroupsCache[0][1].id !== key) {
31407
- optionGroupsCache[0][1].selected = false;
31408
- }
31409
- }
31410
31437
  }
31411
31438
  ctrl.$setViewValue(value);
31439
+ render();
31412
31440
  });
31413
31441
  });
31414
31442
 
31415
31443
  ctrl.$render = render;
31416
31444
 
31417
- // TODO(vojta): can't we optimize this ?
31418
- scope.$watch(render);
31445
+ scope.$watchCollection(valuesFn, render);
31446
+ if ( multiple ) {
31447
+ scope.$watchCollection(function() { return ctrl.$modelValue; }, render);
31448
+ }
31449
+
31450
+ function getSelectedSet() {
31451
+ var selectedSet = false;
31452
+ if (multiple) {
31453
+ var modelValue = ctrl.$modelValue;
31454
+ if (trackFn && isArray(modelValue)) {
31455
+ selectedSet = new HashMap([]);
31456
+ var locals = {};
31457
+ for (var trackIndex = 0; trackIndex < modelValue.length; trackIndex++) {
31458
+ locals[valueName] = modelValue[trackIndex];
31459
+ selectedSet.put(trackFn(scope, locals), modelValue[trackIndex]);
31460
+ }
31461
+ } else {
31462
+ selectedSet = new HashMap(modelValue);
31463
+ }
31464
+ }
31465
+ return selectedSet;
31466
+ }
31467
+
31419
31468
 
31420
31469
  function render() {
31421
31470
  // Temporary location for the option groups before we render them
@@ -31433,22 +31482,11 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
31433
31482
  groupIndex, index,
31434
31483
  locals = {},
31435
31484
  selected,
31436
- selectedSet = false, // nothing is selected yet
31485
+ selectedSet = getSelectedSet(),
31437
31486
  lastElement,
31438
31487
  element,
31439
31488
  label;
31440
31489
 
31441
- if (multiple) {
31442
- if (trackFn && isArray(modelValue)) {
31443
- selectedSet = new HashMap([]);
31444
- for (var trackIndex = 0; trackIndex < modelValue.length; trackIndex++) {
31445
- locals[valueName] = modelValue[trackIndex];
31446
- selectedSet.put(trackFn(scope, locals), modelValue[trackIndex]);
31447
- }
31448
- } else {
31449
- selectedSet = new HashMap(modelValue);
31450
- }
31451
- }
31452
31490
 
31453
31491
  // We now build up the list of options we need (we merge later)
31454
31492
  for (index = 0; length = keys.length, index < length; index++) {
@@ -31544,7 +31582,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
31544
31582
  lastElement.val(existingOption.id = option.id);
31545
31583
  }
31546
31584
  // lastElement.prop('selected') provided by jQuery has side-effects
31547
- if (existingOption.selected !== option.selected) {
31585
+ if (lastElement[0].selected !== option.selected) {
31548
31586
  lastElement.prop('selected', (existingOption.selected = option.selected));
31549
31587
  if (msie) {
31550
31588
  // See #7692
@@ -31567,6 +31605,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
31567
31605
  (element = optionTemplate.clone())
31568
31606
  .val(option.id)
31569
31607
  .prop('selected', option.selected)
31608
+ .attr('selected', option.selected)
31570
31609
  .text(option.label);
31571
31610
  }
31572
31611
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.21
2
+ * @license AngularJS v1.2.22
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.21
2
+ * @license AngularJS v1.2.22
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -68,7 +68,7 @@ function minErr(module) {
68
68
  return match;
69
69
  });
70
70
 
71
- message = message + '\nhttp://errors.angularjs.org/1.2.21/' +
71
+ message = message + '\nhttp://errors.angularjs.org/1.2.22/' +
72
72
  (module ? module + '/' : '') + code;
73
73
  for (i = 2; i < arguments.length; i++) {
74
74
  message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
@@ -1977,11 +1977,11 @@ function setupModuleLoader(window) {
1977
1977
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
1978
1978
  */
1979
1979
  var version = {
1980
- full: '1.2.21', // all of these placeholder strings will be replaced by grunt's
1980
+ full: '1.2.22', // all of these placeholder strings will be replaced by grunt's
1981
1981
  major: 1, // package task
1982
1982
  minor: 2,
1983
- dot: 21,
1984
- codeName: 'wizard-props'
1983
+ dot: 22,
1984
+ codeName: 'finicky-pleasure'
1985
1985
  };
1986
1986
 
1987
1987
 
@@ -1994,11 +1994,11 @@ function publishExternalAPI(angular){
1994
1994
  'element': jqLite,
1995
1995
  'forEach': forEach,
1996
1996
  'injector': createInjector,
1997
- 'noop':noop,
1998
- 'bind':bind,
1997
+ 'noop': noop,
1998
+ 'bind': bind,
1999
1999
  'toJson': toJson,
2000
2000
  'fromJson': fromJson,
2001
- 'identity':identity,
2001
+ 'identity': identity,
2002
2002
  'isUndefined': isUndefined,
2003
2003
  'isDefined': isDefined,
2004
2004
  'isString': isString,
@@ -3057,21 +3057,37 @@ forEach({
3057
3057
 
3058
3058
  clone: jqLiteClone,
3059
3059
 
3060
- triggerHandler: function(element, eventName, eventData) {
3061
- // Copy event handlers in case event handlers array is modified during execution.
3062
- var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName],
3063
- eventFnsCopy = shallowCopy(eventFns || []);
3060
+ triggerHandler: function(element, event, extraParameters) {
3064
3061
 
3065
- eventData = eventData || [];
3062
+ var dummyEvent, eventFnsCopy, handlerArgs;
3063
+ var eventName = event.type || event;
3064
+ var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName];
3066
3065
 
3067
- var event = [{
3068
- preventDefault: noop,
3069
- stopPropagation: noop
3070
- }];
3066
+ if (eventFns) {
3071
3067
 
3072
- forEach(eventFnsCopy, function(fn) {
3073
- fn.apply(element, event.concat(eventData));
3074
- });
3068
+ // Create a dummy event to pass to the handlers
3069
+ dummyEvent = {
3070
+ preventDefault: function() { this.defaultPrevented = true; },
3071
+ isDefaultPrevented: function() { return this.defaultPrevented === true; },
3072
+ stopPropagation: noop,
3073
+ type: eventName,
3074
+ target: element
3075
+ };
3076
+
3077
+ // If a custom event was provided then extend our dummy event with it
3078
+ if (event.type) {
3079
+ dummyEvent = extend(dummyEvent, event);
3080
+ }
3081
+
3082
+ // Copy event handlers in case event handlers array is modified during execution.
3083
+ eventFnsCopy = shallowCopy(eventFns);
3084
+ handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent];
3085
+
3086
+ forEach(eventFnsCopy, function(fn) {
3087
+ fn.apply(element, handlerArgs);
3088
+ });
3089
+
3090
+ }
3075
3091
  }
3076
3092
  }, function(fn, name){
3077
3093
  /**
@@ -5316,7 +5332,7 @@ function $TemplateCacheProvider() {
5316
5332
  *
5317
5333
  * #### `template`
5318
5334
  * HTML markup that may:
5319
- * * Replace the contents of the directive's element (defualt).
5335
+ * * Replace the contents of the directive's element (default).
5320
5336
  * * Replace the directive's element itself (if `replace` is true - DEPRECATED).
5321
5337
  * * Wrap the contents of the directive's element (if `transclude` is true).
5322
5338
  *
@@ -6576,7 +6592,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
6576
6592
  if (parentGet.literal) {
6577
6593
  compare = equals;
6578
6594
  } else {
6579
- compare = function(a,b) { return a === b; };
6595
+ compare = function(a,b) { return a === b || (a !== a && b !== b); };
6580
6596
  }
6581
6597
  parentSet = parentGet.assign || function() {
6582
6598
  // reset the change, or we will throw this exception on every $digest
@@ -7604,6 +7620,7 @@ function $HttpProvider() {
7604
7620
  * - {@link ng.$http#put $http.put}
7605
7621
  * - {@link ng.$http#delete $http.delete}
7606
7622
  * - {@link ng.$http#jsonp $http.jsonp}
7623
+ * - {@link ng.$http#patch $http.patch}
7607
7624
  *
7608
7625
  *
7609
7626
  * # Setting HTTP Headers
@@ -7905,7 +7922,7 @@ function $HttpProvider() {
7905
7922
  * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise}
7906
7923
  * that should abort the request when resolved.
7907
7924
  * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the
7908
- * XHR object. See [requests with credentials]https://developer.mozilla.org/en/http_access_control#section_5
7925
+ * XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials)
7909
7926
  * for more information.
7910
7927
  * - **responseType** - `{string}` - see
7911
7928
  * [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType).
@@ -8274,7 +8291,8 @@ function $HttpProvider() {
8274
8291
  promise.then(removePendingReq, removePendingReq);
8275
8292
 
8276
8293
 
8277
- if ((config.cache || defaults.cache) && config.cache !== false && config.method == 'GET') {
8294
+ if ((config.cache || defaults.cache) && config.cache !== false &&
8295
+ (config.method === 'GET' || config.method === 'JSONP')) {
8278
8296
  cache = isObject(config.cache) ? config.cache
8279
8297
  : isObject(defaults.cache) ? defaults.cache
8280
8298
  : defaultCache;
@@ -9746,6 +9764,8 @@ function $LocationProvider(){
9746
9764
  $location = new LocationMode(appBase, '#' + hashPrefix);
9747
9765
  $location.$$parse($location.$$rewrite(initialUrl));
9748
9766
 
9767
+ var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i;
9768
+
9749
9769
  $rootElement.on('click', function(event) {
9750
9770
  // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)
9751
9771
  // currently we open nice url link and redirect then
@@ -9768,6 +9788,9 @@ function $LocationProvider(){
9768
9788
  absHref = urlResolve(absHref.animVal).href;
9769
9789
  }
9770
9790
 
9791
+ // Ignore when url is started with javascript: or mailto:
9792
+ if (IGNORE_URI_REGEXP.test(absHref)) return;
9793
+
9771
9794
  // Make relative links work in HTML5 mode for legacy browsers (or at least IE8 & 9)
9772
9795
  // The href should be a regular url e.g. /link/somewhere or link/somewhere or ../somewhere or
9773
9796
  // somewhere#anchor or http://example.com/somewhere
@@ -10639,9 +10662,9 @@ Parser.prototype = {
10639
10662
  var middle;
10640
10663
  var token;
10641
10664
  if ((token = this.expect('?'))) {
10642
- middle = this.ternary();
10665
+ middle = this.assignment();
10643
10666
  if ((token = this.expect(':'))) {
10644
- return this.ternaryFn(left, middle, this.ternary());
10667
+ return this.ternaryFn(left, middle, this.assignment());
10645
10668
  } else {
10646
10669
  this.throwError('expected :', token);
10647
10670
  }
@@ -10729,7 +10752,9 @@ Parser.prototype = {
10729
10752
  return getter(self || object(scope, locals));
10730
10753
  }, {
10731
10754
  assign: function(scope, value, locals) {
10732
- return setter(object(scope, locals), field, value, parser.text, parser.options);
10755
+ var o = object(scope, locals);
10756
+ if (!o) object.assign(scope, o = {});
10757
+ return setter(o, field, value, parser.text, parser.options);
10733
10758
  }
10734
10759
  });
10735
10760
  },
@@ -10759,10 +10784,11 @@ Parser.prototype = {
10759
10784
  return v;
10760
10785
  }, {
10761
10786
  assign: function(self, value, locals) {
10762
- var key = indexFn(self, locals);
10787
+ var key = ensureSafeMemberName(indexFn(self, locals), parser.text);
10763
10788
  // prevent overwriting of Function.constructor which would break ensureSafeObject check
10764
- var safe = ensureSafeObject(obj(self, locals), parser.text);
10765
- return safe[key] = value;
10789
+ var o = ensureSafeObject(obj(self, locals), parser.text);
10790
+ if (!o) obj.assign(self, o = {});
10791
+ return o[key] = value;
10766
10792
  }
10767
10793
  });
10768
10794
  },
@@ -15128,7 +15154,7 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+
15128
15154
  * (e.g. `"h 'o''clock'"`).
15129
15155
  *
15130
15156
  * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or
15131
- * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.SSSZ and its
15157
+ * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its
15132
15158
  * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is
15133
15159
  * specified in the string input, the time is considered to be in the local timezone.
15134
15160
  * @param {string=} format Formatting rules (see Description). If not specified,
@@ -19292,6 +19318,13 @@ forEach(
19292
19318
  * server and reloading the current page), but only if the form does not contain `action`,
19293
19319
  * `data-action`, or `x-action` attributes.
19294
19320
  *
19321
+ * <div class="alert alert-warning">
19322
+ * **Warning:** Be careful not to cause "double-submission" by using both the `ngClick` and
19323
+ * `ngSubmit` handlers together. See the
19324
+ * {@link form#submitting-a-form-and-preventing-the-default-action `form` directive documentation}
19325
+ * for a detailed discussion of when `ngSubmit` may be triggered.
19326
+ * </div>
19327
+ *
19295
19328
  * @element form
19296
19329
  * @priority 0
19297
19330
  * @param {expression} ngSubmit {@link guide/expression Expression} to eval.
@@ -21609,21 +21642,37 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
21609
21642
  value = valueFn(scope, locals);
21610
21643
  }
21611
21644
  }
21612
- // Update the null option's selected property here so $render cleans it up correctly
21613
- if (optionGroupsCache[0].length > 1) {
21614
- if (optionGroupsCache[0][1].id !== key) {
21615
- optionGroupsCache[0][1].selected = false;
21616
- }
21617
- }
21618
21645
  }
21619
21646
  ctrl.$setViewValue(value);
21647
+ render();
21620
21648
  });
21621
21649
  });
21622
21650
 
21623
21651
  ctrl.$render = render;
21624
21652
 
21625
- // TODO(vojta): can't we optimize this ?
21626
- scope.$watch(render);
21653
+ scope.$watchCollection(valuesFn, render);
21654
+ if ( multiple ) {
21655
+ scope.$watchCollection(function() { return ctrl.$modelValue; }, render);
21656
+ }
21657
+
21658
+ function getSelectedSet() {
21659
+ var selectedSet = false;
21660
+ if (multiple) {
21661
+ var modelValue = ctrl.$modelValue;
21662
+ if (trackFn && isArray(modelValue)) {
21663
+ selectedSet = new HashMap([]);
21664
+ var locals = {};
21665
+ for (var trackIndex = 0; trackIndex < modelValue.length; trackIndex++) {
21666
+ locals[valueName] = modelValue[trackIndex];
21667
+ selectedSet.put(trackFn(scope, locals), modelValue[trackIndex]);
21668
+ }
21669
+ } else {
21670
+ selectedSet = new HashMap(modelValue);
21671
+ }
21672
+ }
21673
+ return selectedSet;
21674
+ }
21675
+
21627
21676
 
21628
21677
  function render() {
21629
21678
  // Temporary location for the option groups before we render them
@@ -21641,22 +21690,11 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
21641
21690
  groupIndex, index,
21642
21691
  locals = {},
21643
21692
  selected,
21644
- selectedSet = false, // nothing is selected yet
21693
+ selectedSet = getSelectedSet(),
21645
21694
  lastElement,
21646
21695
  element,
21647
21696
  label;
21648
21697
 
21649
- if (multiple) {
21650
- if (trackFn && isArray(modelValue)) {
21651
- selectedSet = new HashMap([]);
21652
- for (var trackIndex = 0; trackIndex < modelValue.length; trackIndex++) {
21653
- locals[valueName] = modelValue[trackIndex];
21654
- selectedSet.put(trackFn(scope, locals), modelValue[trackIndex]);
21655
- }
21656
- } else {
21657
- selectedSet = new HashMap(modelValue);
21658
- }
21659
- }
21660
21698
 
21661
21699
  // We now build up the list of options we need (we merge later)
21662
21700
  for (index = 0; length = keys.length, index < length; index++) {
@@ -21752,7 +21790,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
21752
21790
  lastElement.val(existingOption.id = option.id);
21753
21791
  }
21754
21792
  // lastElement.prop('selected') provided by jQuery has side-effects
21755
- if (existingOption.selected !== option.selected) {
21793
+ if (lastElement[0].selected !== option.selected) {
21756
21794
  lastElement.prop('selected', (existingOption.selected = option.selected));
21757
21795
  if (msie) {
21758
21796
  // See #7692
@@ -21775,6 +21813,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
21775
21813
  (element = optionTemplate.clone())
21776
21814
  .val(option.id)
21777
21815
  .prop('selected', option.selected)
21816
+ .attr('selected', option.selected)
21778
21817
  .text(option.label);
21779
21818
  }
21780
21819