angular-gem 1.3.6 → 1.3.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (27) hide show
  1. checksums.yaml +8 -8
  2. data/lib/angular-gem/version.rb +1 -1
  3. data/vendor/assets/javascripts/1.3.7/angular-animate.js +2137 -0
  4. data/vendor/assets/javascripts/1.3.7/angular-aria.js +332 -0
  5. data/vendor/assets/javascripts/1.3.7/angular-cookies.js +206 -0
  6. data/vendor/assets/javascripts/1.3.7/angular-loader.js +405 -0
  7. data/vendor/assets/javascripts/1.3.7/angular-messages.js +400 -0
  8. data/vendor/assets/javascripts/1.3.7/angular-mocks.js +2382 -0
  9. data/vendor/assets/javascripts/1.3.7/angular-resource.js +667 -0
  10. data/vendor/assets/javascripts/1.3.7/angular-route.js +995 -0
  11. data/vendor/assets/javascripts/1.3.7/angular-sanitize.js +680 -0
  12. data/vendor/assets/javascripts/1.3.7/angular-scenario.js +37391 -0
  13. data/vendor/assets/javascripts/1.3.7/angular-touch.js +622 -0
  14. data/vendor/assets/javascripts/1.3.7/angular.js +26037 -0
  15. data/vendor/assets/javascripts/angular-animate.js +1 -1
  16. data/vendor/assets/javascripts/angular-aria.js +1 -1
  17. data/vendor/assets/javascripts/angular-cookies.js +1 -1
  18. data/vendor/assets/javascripts/angular-loader.js +2 -2
  19. data/vendor/assets/javascripts/angular-messages.js +1 -1
  20. data/vendor/assets/javascripts/angular-mocks.js +1 -1
  21. data/vendor/assets/javascripts/angular-resource.js +2 -2
  22. data/vendor/assets/javascripts/angular-route.js +1 -1
  23. data/vendor/assets/javascripts/angular-sanitize.js +1 -1
  24. data/vendor/assets/javascripts/angular-scenario.js +137 -100
  25. data/vendor/assets/javascripts/angular-touch.js +1 -1
  26. data/vendor/assets/javascripts/angular.js +137 -100
  27. metadata +15 -3
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.6
2
+ * @license AngularJS v1.3.7
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.3.6
2
+ * @license AngularJS v1.3.7
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.3.6
2
+ * @license AngularJS v1.3.7
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.3.6
2
+ * @license AngularJS v1.3.7
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -55,7 +55,7 @@ function minErr(module, ErrorConstructor) {
55
55
  return match;
56
56
  });
57
57
 
58
- message = message + '\nhttp://errors.angularjs.org/1.3.6/' +
58
+ message = message + '\nhttp://errors.angularjs.org/1.3.7/' +
59
59
  (module ? module + '/' : '') + code;
60
60
  for (i = 2; i < arguments.length; i++) {
61
61
  message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.6
2
+ * @license AngularJS v1.3.7
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.3.6
2
+ * @license AngularJS v1.3.7
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.3.6
2
+ * @license AngularJS v1.3.7
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -116,7 +116,7 @@ function shallowClearAndCopy(src, dst) {
116
116
  * example, if the `defaultParam` object is `{someParam: '@someProp'}` then the value of `someParam`
117
117
  * will be `data.someProp`.
118
118
  *
119
- * @param {Object.<Object>=} actions Hash with declaration of custom action that should extend
119
+ * @param {Object.<Object>=} actions Hash with declaration of custom actions that should extend
120
120
  * the default set of resource actions. The declaration should be created in the format of {@link
121
121
  * ng.$http#usage $http.config}:
122
122
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.6
2
+ * @license AngularJS v1.3.7
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.3.6
2
+ * @license AngularJS v1.3.7
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -9190,7 +9190,7 @@ return jQuery;
9190
9190
  }));
9191
9191
 
9192
9192
  /**
9193
- * @license AngularJS v1.3.6
9193
+ * @license AngularJS v1.3.7
9194
9194
  * (c) 2010-2014 Google, Inc. http://angularjs.org
9195
9195
  * License: MIT
9196
9196
  */
@@ -9246,7 +9246,7 @@ function minErr(module, ErrorConstructor) {
9246
9246
  return match;
9247
9247
  });
9248
9248
 
9249
- message = message + '\nhttp://errors.angularjs.org/1.3.6/' +
9249
+ message = message + '\nhttp://errors.angularjs.org/1.3.7/' +
9250
9250
  (module ? module + '/' : '') + code;
9251
9251
  for (i = 2; i < arguments.length; i++) {
9252
9252
  message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
@@ -9301,6 +9301,7 @@ function minErr(module, ErrorConstructor) {
9301
9301
  isWindow: true,
9302
9302
  isScope: true,
9303
9303
  isFile: true,
9304
+ isFormData: true,
9304
9305
  isBlob: true,
9305
9306
  isBoolean: true,
9306
9307
  isPromiseLike: true,
@@ -9822,6 +9823,11 @@ function isFile(obj) {
9822
9823
  }
9823
9824
 
9824
9825
 
9826
+ function isFormData(obj) {
9827
+ return toString.call(obj) === '[object FormData]';
9828
+ }
9829
+
9830
+
9825
9831
  function isBlob(obj) {
9826
9832
  return toString.call(obj) === '[object Blob]';
9827
9833
  }
@@ -10684,7 +10690,12 @@ function reloadWithDebugInfo() {
10684
10690
  * @param {DOMElement} element DOM element which is the root of angular application.
10685
10691
  */
10686
10692
  function getTestability(rootElement) {
10687
- return angular.element(rootElement).injector().get('$$testability');
10693
+ var injector = angular.element(rootElement).injector();
10694
+ if (!injector) {
10695
+ throw ngMinErr('test',
10696
+ 'no injector found for element argument to getTestability');
10697
+ }
10698
+ return injector.get('$$testability');
10688
10699
  }
10689
10700
 
10690
10701
  var SNAKE_CASE_REGEXP = /[A-Z]/g;
@@ -11297,11 +11308,11 @@ function toDebugString(obj) {
11297
11308
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
11298
11309
  */
11299
11310
  var version = {
11300
- full: '1.3.6', // all of these placeholder strings will be replaced by grunt's
11311
+ full: '1.3.7', // all of these placeholder strings will be replaced by grunt's
11301
11312
  major: 1, // package task
11302
11313
  minor: 3,
11303
- dot: 6,
11304
- codeName: 'robofunky-danceblaster'
11314
+ dot: 7,
11315
+ codeName: 'leaky-obstruction'
11305
11316
  };
11306
11317
 
11307
11318
 
@@ -16314,7 +16325,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16314
16325
  // support ngAttr attribute binding
16315
16326
  ngAttrName = directiveNormalize(name);
16316
16327
  if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) {
16317
- name = snake_case(ngAttrName.substr(6), '-');
16328
+ name = name.replace(PREFIX_REGEXP, '')
16329
+ .substr(8).replace(/_(.)/g, function(match, letter) {
16330
+ return letter.toUpperCase();
16331
+ });
16318
16332
  }
16319
16333
 
16320
16334
  var directiveNName = ngAttrName.replace(/(Start|End)$/, '');
@@ -17226,7 +17240,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
17226
17240
 
17227
17241
 
17228
17242
  function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) {
17229
- var interpolateFn = $interpolate(value, true);
17243
+ var trustedContext = getTrustedContext(node, name);
17244
+ allOrNothing = ALL_OR_NOTHING_ATTRS[name] || allOrNothing;
17245
+
17246
+ var interpolateFn = $interpolate(value, true, trustedContext, allOrNothing);
17230
17247
 
17231
17248
  // no interpolation found -> ignore
17232
17249
  if (!interpolateFn) return;
@@ -17251,16 +17268,16 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
17251
17268
  "ng- versions (such as ng-click instead of onclick) instead.");
17252
17269
  }
17253
17270
 
17254
- // If the attribute was removed, then we are done
17255
- if (!attr[name]) {
17256
- return;
17271
+ // If the attribute has changed since last $interpolate()ed
17272
+ var newValue = attr[name];
17273
+ if (newValue !== value) {
17274
+ // we need to interpolate again since the attribute value has been updated
17275
+ // (e.g. by another directive's compile function)
17276
+ // ensure unset/empty values make interpolateFn falsy
17277
+ interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing);
17278
+ value = newValue;
17257
17279
  }
17258
17280
 
17259
- // we need to interpolate again, in case the attribute value has been updated
17260
- // (e.g. by another directive's compile function)
17261
- interpolateFn = $interpolate(attr[name], true, getTrustedContext(node, name),
17262
- ALL_OR_NOTHING_ATTRS[name] || allOrNothing);
17263
-
17264
17281
  // if attribute was updated so that there is no interpolation going on we don't want to
17265
17282
  // register any observers
17266
17283
  if (!interpolateFn) return;
@@ -17721,23 +17738,34 @@ function $ExceptionHandlerProvider() {
17721
17738
 
17722
17739
  var APPLICATION_JSON = 'application/json';
17723
17740
  var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'};
17724
- var JSON_START = /^\s*(\[|\{[^\{])/;
17725
- var JSON_END = /[\}\]]\s*$/;
17741
+ var JSON_START = /^\[|^\{(?!\{)/;
17742
+ var JSON_ENDS = {
17743
+ '[': /]$/,
17744
+ '{': /}$/
17745
+ };
17726
17746
  var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/;
17727
17747
 
17728
17748
  function defaultHttpResponseTransform(data, headers) {
17729
17749
  if (isString(data)) {
17730
- // strip json vulnerability protection prefix
17731
- data = data.replace(JSON_PROTECTION_PREFIX, '');
17732
- var contentType = headers('Content-Type');
17733
- if ((contentType && contentType.indexOf(APPLICATION_JSON) === 0 && data.trim()) ||
17734
- (JSON_START.test(data) && JSON_END.test(data))) {
17735
- data = fromJson(data);
17750
+ // Strip json vulnerability protection prefix and trim whitespace
17751
+ var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim();
17752
+
17753
+ if (tempData) {
17754
+ var contentType = headers('Content-Type');
17755
+ if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) {
17756
+ data = fromJson(tempData);
17757
+ }
17736
17758
  }
17737
17759
  }
17760
+
17738
17761
  return data;
17739
17762
  }
17740
17763
 
17764
+ function isJsonLike(str) {
17765
+ var jsonStart = str.match(JSON_START);
17766
+ return jsonStart && JSON_ENDS[jsonStart[0]].test(str);
17767
+ }
17768
+
17741
17769
  /**
17742
17770
  * Parse headers into key value object
17743
17771
  *
@@ -17800,16 +17828,17 @@ function headersGetter(headers) {
17800
17828
  * This function is used for both request and response transforming
17801
17829
  *
17802
17830
  * @param {*} data Data to transform.
17803
- * @param {function(string=)} headers Http headers getter fn.
17831
+ * @param {function(string=)} headers HTTP headers getter fn.
17832
+ * @param {number} status HTTP status code of the response.
17804
17833
  * @param {(Function|Array.<Function>)} fns Function or an array of functions.
17805
17834
  * @returns {*} Transformed data.
17806
17835
  */
17807
- function transformData(data, headers, fns) {
17836
+ function transformData(data, headers, status, fns) {
17808
17837
  if (isFunction(fns))
17809
- return fns(data, headers);
17838
+ return fns(data, headers, status);
17810
17839
 
17811
17840
  forEach(fns, function(fn) {
17812
- data = fn(data, headers);
17841
+ data = fn(data, headers, status);
17813
17842
  });
17814
17843
 
17815
17844
  return data;
@@ -17861,7 +17890,7 @@ function $HttpProvider() {
17861
17890
 
17862
17891
  // transform outgoing request data
17863
17892
  transformRequest: [function(d) {
17864
- return isObject(d) && !isFile(d) && !isBlob(d) ? toJson(d) : d;
17893
+ return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d;
17865
17894
  }],
17866
17895
 
17867
17896
  // default headers
@@ -18088,7 +18117,7 @@ function $HttpProvider() {
18088
18117
  *
18089
18118
  * Both requests and responses can be transformed using transformation functions: `transformRequest`
18090
18119
  * and `transformResponse`. These properties can be a single function that returns
18091
- * the transformed value (`{function(data, headersGetter)`) or an array of such transformation functions,
18120
+ * the transformed value (`{function(data, headersGetter, status)`) or an array of such transformation functions,
18092
18121
  * which allows you to `push` or `unshift` a new transformation function into the transformation chain.
18093
18122
  *
18094
18123
  * ### Default Transformations
@@ -18332,9 +18361,9 @@ function $HttpProvider() {
18332
18361
  * See {@link ng.$http#overriding-the-default-transformations-per-request
18333
18362
  * Overriding the Default Transformations}
18334
18363
  * - **transformResponse** –
18335
- * `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
18364
+ * `{function(data, headersGetter, status)|Array.<function(data, headersGetter, status)>}` –
18336
18365
  * transform function or an array of such functions. The transform function takes the http
18337
- * response body and headers and returns its transformed (typically deserialized) version.
18366
+ * response body, headers and status and returns its transformed (typically deserialized) version.
18338
18367
  * See {@link ng.$http#overriding-the-default-transformations-per-request
18339
18368
  * Overriding the Default Transformations}
18340
18369
  * - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
@@ -18457,24 +18486,23 @@ function $HttpProvider() {
18457
18486
  </example>
18458
18487
  */
18459
18488
  function $http(requestConfig) {
18460
- var config = {
18461
- method: 'get',
18462
- transformRequest: defaults.transformRequest,
18463
- transformResponse: defaults.transformResponse
18464
- };
18465
- var headers = mergeHeaders(requestConfig);
18466
18489
 
18467
18490
  if (!angular.isObject(requestConfig)) {
18468
18491
  throw minErr('$http')('badreq', 'Http request configuration must be an object. Received: {0}', requestConfig);
18469
18492
  }
18470
18493
 
18471
- extend(config, requestConfig);
18472
- config.headers = headers;
18494
+ var config = extend({
18495
+ method: 'get',
18496
+ transformRequest: defaults.transformRequest,
18497
+ transformResponse: defaults.transformResponse
18498
+ }, requestConfig);
18499
+
18500
+ config.headers = mergeHeaders(requestConfig);
18473
18501
  config.method = uppercase(config.method);
18474
18502
 
18475
18503
  var serverRequest = function(config) {
18476
- headers = config.headers;
18477
- var reqData = transformData(config.data, headersGetter(headers), config.transformRequest);
18504
+ var headers = config.headers;
18505
+ var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest);
18478
18506
 
18479
18507
  // strip content-type if data is undefined
18480
18508
  if (isUndefined(reqData)) {
@@ -18490,7 +18518,7 @@ function $HttpProvider() {
18490
18518
  }
18491
18519
 
18492
18520
  // send request
18493
- return sendReq(config, reqData, headers).then(transformResponse, transformResponse);
18521
+ return sendReq(config, reqData).then(transformResponse, transformResponse);
18494
18522
  };
18495
18523
 
18496
18524
  var chain = [serverRequest, undefined];
@@ -18535,13 +18563,30 @@ function $HttpProvider() {
18535
18563
  if (!response.data) {
18536
18564
  resp.data = response.data;
18537
18565
  } else {
18538
- resp.data = transformData(response.data, response.headers, config.transformResponse);
18566
+ resp.data = transformData(response.data, response.headers, response.status, config.transformResponse);
18539
18567
  }
18540
18568
  return (isSuccess(response.status))
18541
18569
  ? resp
18542
18570
  : $q.reject(resp);
18543
18571
  }
18544
18572
 
18573
+ function executeHeaderFns(headers) {
18574
+ var headerContent, processedHeaders = {};
18575
+
18576
+ forEach(headers, function(headerFn, header) {
18577
+ if (isFunction(headerFn)) {
18578
+ headerContent = headerFn();
18579
+ if (headerContent != null) {
18580
+ processedHeaders[header] = headerContent;
18581
+ }
18582
+ } else {
18583
+ processedHeaders[header] = headerFn;
18584
+ }
18585
+ });
18586
+
18587
+ return processedHeaders;
18588
+ }
18589
+
18545
18590
  function mergeHeaders(config) {
18546
18591
  var defHeaders = defaults.headers,
18547
18592
  reqHeaders = extend({}, config.headers),
@@ -18564,23 +18609,7 @@ function $HttpProvider() {
18564
18609
  }
18565
18610
 
18566
18611
  // execute if header value is a function for merged headers
18567
- execHeaders(reqHeaders);
18568
- return reqHeaders;
18569
-
18570
- function execHeaders(headers) {
18571
- var headerContent;
18572
-
18573
- forEach(headers, function(headerFn, header) {
18574
- if (isFunction(headerFn)) {
18575
- headerContent = headerFn();
18576
- if (headerContent != null) {
18577
- headers[header] = headerContent;
18578
- } else {
18579
- delete headers[header];
18580
- }
18581
- }
18582
- });
18583
- }
18612
+ return executeHeaderFns(reqHeaders);
18584
18613
  }
18585
18614
  }
18586
18615
 
@@ -18723,11 +18752,12 @@ function $HttpProvider() {
18723
18752
  * !!! ACCESSES CLOSURE VARS:
18724
18753
  * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests
18725
18754
  */
18726
- function sendReq(config, reqData, reqHeaders) {
18755
+ function sendReq(config, reqData) {
18727
18756
  var deferred = $q.defer(),
18728
18757
  promise = deferred.promise,
18729
18758
  cache,
18730
18759
  cachedResp,
18760
+ reqHeaders = config.headers,
18731
18761
  url = buildUrl(config.url, config.params);
18732
18762
 
18733
18763
  $http.pendingRequests.push(config);
@@ -20427,8 +20457,8 @@ function $LocationProvider() {
20427
20457
  * @param {string=} oldState History state object that was before it was changed.
20428
20458
  */
20429
20459
 
20430
- this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement',
20431
- function($rootScope, $browser, $sniffer, $rootElement) {
20460
+ this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window',
20461
+ function($rootScope, $browser, $sniffer, $rootElement, $window) {
20432
20462
  var $location,
20433
20463
  LocationMode,
20434
20464
  baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''
@@ -20510,7 +20540,7 @@ function $LocationProvider() {
20510
20540
  if ($location.absUrl() != $browser.url()) {
20511
20541
  $rootScope.$apply();
20512
20542
  // hack to work around FF6 bug 684208 when scenario runner clicks on links
20513
- window.angular['ff-684208-preventDefault'] = true;
20543
+ $window.angular['ff-684208-preventDefault'] = true;
20514
20544
  }
20515
20545
  }
20516
20546
  }
@@ -21126,6 +21156,8 @@ Parser.prototype = {
21126
21156
  primary = this.arrayDeclaration();
21127
21157
  } else if (this.expect('{')) {
21128
21158
  primary = this.object();
21159
+ } else if (this.peek().identifier && this.peek().text in CONSTANTS) {
21160
+ primary = CONSTANTS[this.consume().text];
21129
21161
  } else if (this.peek().identifier) {
21130
21162
  primary = this.identifier();
21131
21163
  } else if (this.peek().constant) {
@@ -21228,7 +21260,7 @@ Parser.prototype = {
21228
21260
  id += this.consume().text + this.consume().text;
21229
21261
  }
21230
21262
 
21231
- return CONSTANTS[id] || getterFn(id, this.options, this.text);
21263
+ return getterFn(id, this.options, this.text);
21232
21264
  },
21233
21265
 
21234
21266
  constant: function() {
@@ -21418,17 +21450,16 @@ Parser.prototype = {
21418
21450
  },
21419
21451
 
21420
21452
  fieldAccess: function(object) {
21421
- var expression = this.text;
21422
- var field = this.consume().text;
21423
- var getter = getterFn(field, this.options, expression);
21453
+ var getter = this.identifier();
21424
21454
 
21425
21455
  return extend(function $parseFieldAccess(scope, locals, self) {
21426
- return getter(self || object(scope, locals));
21456
+ var o = self || object(scope, locals);
21457
+ return (o == null) ? undefined : getter(o);
21427
21458
  }, {
21428
21459
  assign: function(scope, value, locals) {
21429
21460
  var o = object(scope, locals);
21430
21461
  if (!o) object.assign(scope, o = {});
21431
- return setter(o, field, value, expression);
21462
+ return getter.assign(o, value);
21432
21463
  }
21433
21464
  });
21434
21465
  },
@@ -22586,12 +22617,10 @@ function qFactory(nextTick, exceptionHandler) {
22586
22617
  function $$RAFProvider() { //rAF
22587
22618
  this.$get = ['$window', '$timeout', function($window, $timeout) {
22588
22619
  var requestAnimationFrame = $window.requestAnimationFrame ||
22589
- $window.webkitRequestAnimationFrame ||
22590
- $window.mozRequestAnimationFrame;
22620
+ $window.webkitRequestAnimationFrame;
22591
22621
 
22592
22622
  var cancelAnimationFrame = $window.cancelAnimationFrame ||
22593
22623
  $window.webkitCancelAnimationFrame ||
22594
- $window.mozCancelAnimationFrame ||
22595
22624
  $window.webkitCancelRequestAnimationFrame;
22596
22625
 
22597
22626
  var rafSupported = !!requestAnimationFrame;
@@ -22720,7 +22749,6 @@ function $RootScopeProvider() {
22720
22749
  var child = parent.$new();
22721
22750
 
22722
22751
  parent.salutation = "Hello";
22723
- child.name = "World";
22724
22752
  expect(child.salutation).toEqual('Hello');
22725
22753
 
22726
22754
  child.salutation = "Welcome";
@@ -23358,7 +23386,7 @@ function $RootScopeProvider() {
23358
23386
  while (asyncQueue.length) {
23359
23387
  try {
23360
23388
  asyncTask = asyncQueue.shift();
23361
- asyncTask.scope.$eval(asyncTask.expression);
23389
+ asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals);
23362
23390
  } catch (e) {
23363
23391
  $exceptionHandler(e);
23364
23392
  }
@@ -23573,8 +23601,9 @@ function $RootScopeProvider() {
23573
23601
  * - `string`: execute using the rules as defined in {@link guide/expression expression}.
23574
23602
  * - `function(scope)`: execute the function with the current `scope` parameter.
23575
23603
  *
23604
+ * @param {(object)=} locals Local variables object, useful for overriding values in scope.
23576
23605
  */
23577
- $evalAsync: function(expr) {
23606
+ $evalAsync: function(expr, locals) {
23578
23607
  // if we are outside of an $digest loop and this is the first time we are scheduling async
23579
23608
  // task also schedule async auto-flush
23580
23609
  if (!$rootScope.$$phase && !asyncQueue.length) {
@@ -23585,7 +23614,7 @@ function $RootScopeProvider() {
23585
23614
  });
23586
23615
  }
23587
23616
 
23588
- asyncQueue.push({scope: this, expression: expr});
23617
+ asyncQueue.push({scope: this, expression: expr, locals: locals});
23589
23618
  },
23590
23619
 
23591
23620
  $$postDigest: function(fn) {
@@ -26277,8 +26306,8 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d
26277
26306
  * * `'.sss' or ',sss'`: Millisecond in second, padded (000-999)
26278
26307
  * * `'a'`: AM/PM marker
26279
26308
  * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)
26280
- * * `'ww'`: ISO-8601 week of year (00-53)
26281
- * * `'w'`: ISO-8601 week of year (0-53)
26309
+ * * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year
26310
+ * * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year
26282
26311
  *
26283
26312
  * `format` string can also be one of the following predefined
26284
26313
  * {@link guide/i18n localizable formats}:
@@ -26763,29 +26792,37 @@ function orderByFilter($parse) {
26763
26792
  ? function(a, b) {return comp(b,a);}
26764
26793
  : comp;
26765
26794
  }
26795
+
26796
+ function isPrimitive(value) {
26797
+ switch (typeof value) {
26798
+ case 'number': /* falls through */
26799
+ case 'boolean': /* falls through */
26800
+ case 'string':
26801
+ return true;
26802
+ default:
26803
+ return false;
26804
+ }
26805
+ }
26806
+
26807
+ function objectToString(value) {
26808
+ if (value === null) return 'null';
26809
+ if (typeof value.toString === 'function') {
26810
+ value = value.toString();
26811
+ if (isPrimitive(value)) return value;
26812
+ }
26813
+ if (typeof value.valueOf === 'function') {
26814
+ value = value.valueOf();
26815
+ if (isPrimitive(value)) return value;
26816
+ }
26817
+ return '';
26818
+ }
26819
+
26766
26820
  function compare(v1, v2) {
26767
26821
  var t1 = typeof v1;
26768
26822
  var t2 = typeof v2;
26769
- // Prepare values for Abstract Relational Comparison
26770
- // (http://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5):
26771
- // If the resulting values are identical, return 0 to prevent
26772
- // incorrect re-ordering.
26773
26823
  if (t1 === t2 && t1 === "object") {
26774
- // If types are both numbers, emulate abstract ToPrimitive() operation
26775
- // in order to get primitive values suitable for comparison
26776
- t1 = typeof (v1.valueOf ? v1 = v1.valueOf() : v1);
26777
- t2 = typeof (v2.valueOf ? v2 = v2.valueOf() : v2);
26778
- if (t1 === t2 && t1 === "object") {
26779
- // Object.prototype.valueOf will return the original object, by
26780
- // default. If we do not receive a primitive value, use ToString()
26781
- // instead.
26782
- t1 = typeof (v1.toString ? v1 = v1.toString() : v1);
26783
- t2 = typeof (v2.toString ? v2 = v2.toString() : v2);
26784
-
26785
- // If the end result of toString() for each item is the same, do not
26786
- // perform relational comparison, and do not re-order objects.
26787
- if (t1 === t2 && v1 === v2 || t1 === "object") return 0;
26788
- }
26824
+ v1 = objectToString(v1);
26825
+ v2 = objectToString(v2);
26789
26826
  }
26790
26827
  if (t1 === t2) {
26791
26828
  if (t1 === "string") {
@@ -33519,7 +33556,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
33519
33556
  var aliasAs = match[3];
33520
33557
  var trackByExp = match[4];
33521
33558
 
33522
- match = lhs.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);
33559
+ match = lhs.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/);
33523
33560
 
33524
33561
  if (!match) {
33525
33562
  throw ngRepeatMinErr('iidexp', "'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.",