angularjs-rails 1.2.21 → 1.2.22

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a63cada1847d18af23c53daaedf6da7310dda04c
4
- data.tar.gz: a8b16446fc75fbbea5971496239befcd7d03e91b
3
+ metadata.gz: 649f17ca80321144324cca4ae9bb9feb10bfdfa7
4
+ data.tar.gz: 66f31ac37434d76ebaf6d4e2247b3d84731c9947
5
5
  SHA512:
6
- metadata.gz: 5210b4dd49396750d8ba3a6dade71ac067e7ce330dd9b5f4eb8a9aaa730ae189bad890da7c88b07fae09bb81b31a2572eb22fc8faab40849552ecd66a1f221a5
7
- data.tar.gz: c4622afaa1ab5a350942e0301e8baa8c6a2309c46212a174350139b839304b80b462177745b3b62209f47f3d5673741efa1507c5ce39b023c6cf59cc211990c2
6
+ metadata.gz: 4597d4e60774c5f3ae525efae1938f0f9d00abb4863742d117bccf0a97797803a766c7e5c9e4c5abf0bcb29d64398c97d874c7be263f24e51fa4848a15ff1027
7
+ data.tar.gz: 1317b9faa6e5c66f713454010b50867d6f1eb6936d7f71488f299119d8d894ea1c376a910a8c9f650c9b0a59e971e303c6e1b5bda075b68e740547268a8f757a
@@ -1,6 +1,6 @@
1
1
  module AngularJS
2
2
  module Rails
3
- VERSION = "1.2.21"
4
- UNSTABLE_VERSION = "1.3.0-beta.17"
3
+ VERSION = "1.2.22"
4
+ UNSTABLE_VERSION = "1.3.0-beta.18"
5
5
  end
6
6
  end
@@ -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