ember-source 2.13.0.beta.1 → 2.13.0.beta.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,7 +6,7 @@
6
6
  * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
7
7
  * @license Licensed under MIT license
8
8
  * See https://raw.github.com/emberjs/ember.js/master/LICENSE
9
- * @version 2.13.0-beta.1
9
+ * @version 2.13.0-beta.2
10
10
  */
11
11
 
12
12
  var enifed, requireModule, Ember;
@@ -1225,13 +1225,15 @@ enifed('ember-testing/setup_for_testing', ['exports', 'ember-debug', 'ember-view
1225
1225
  _emberTestingTestAdapter.setAdapter(typeof self.QUnit === 'undefined' ? new _emberTestingAdaptersAdapter.default() : new _emberTestingAdaptersQunit.default());
1226
1226
  }
1227
1227
 
1228
- _emberViews.jQuery(document).off('ajaxSend', _emberTestingTestPending_requests.incrementPendingRequests);
1229
- _emberViews.jQuery(document).off('ajaxComplete', _emberTestingTestPending_requests.decrementPendingRequests);
1228
+ if (_emberViews.jQuery) {
1229
+ _emberViews.jQuery(document).off('ajaxSend', _emberTestingTestPending_requests.incrementPendingRequests);
1230
+ _emberViews.jQuery(document).off('ajaxComplete', _emberTestingTestPending_requests.decrementPendingRequests);
1230
1231
 
1231
- _emberTestingTestPending_requests.clearPendingRequests();
1232
+ _emberTestingTestPending_requests.clearPendingRequests();
1232
1233
 
1233
- _emberViews.jQuery(document).on('ajaxSend', _emberTestingTestPending_requests.incrementPendingRequests);
1234
- _emberViews.jQuery(document).on('ajaxComplete', _emberTestingTestPending_requests.decrementPendingRequests);
1234
+ _emberViews.jQuery(document).on('ajaxSend', _emberTestingTestPending_requests.incrementPendingRequests);
1235
+ _emberViews.jQuery(document).on('ajaxComplete', _emberTestingTestPending_requests.decrementPendingRequests);
1236
+ }
1235
1237
  }
1236
1238
  });
1237
1239
  enifed('ember-testing/support', ['exports', 'ember-debug', 'ember-views', 'ember-environment'], function (exports, _emberDebug, _emberViews, _emberEnvironment) {
@@ -6,7 +6,7 @@
6
6
  * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
7
7
  * @license Licensed under MIT license
8
8
  * See https://raw.github.com/emberjs/ember.js/master/LICENSE
9
- * @version 2.13.0-beta.1
9
+ * @version 2.13.0-beta.2
10
10
  */
11
11
 
12
12
  var enifed, requireModule, Ember;
@@ -6784,6 +6784,34 @@ enifed('ember-debug/tests/main_test', ['exports', 'ember-environment', 'ember-ru
6784
6784
 
6785
6785
  _emberDebugIndex.warn('foo', false, {});
6786
6786
  });
6787
+
6788
+ QUnit.test('warn without options.id nor test triggers a deprecation', function (assert) {
6789
+ assert.expect(2);
6790
+
6791
+ _emberDebugDeprecate.registerHandler(function (message) {
6792
+ assert.equal(message, _emberDebugWarn.missingOptionsIdDeprecation, 'deprecation is triggered when options is missing');
6793
+ });
6794
+
6795
+ _emberDebugWarn.registerHandler(function (message) {
6796
+ assert.equal(message, 'foo', 'original warning is triggered');
6797
+ });
6798
+
6799
+ _emberDebugIndex.warn('foo', {});
6800
+ });
6801
+
6802
+ QUnit.test('warn without test but with options does not trigger a deprecation', function (assert) {
6803
+ assert.expect(1);
6804
+
6805
+ _emberDebugDeprecate.registerHandler(function (message) {
6806
+ assert.ok(false, 'there should be no deprecation ' + message);
6807
+ });
6808
+
6809
+ _emberDebugWarn.registerHandler(function (message) {
6810
+ assert.equal(message, 'foo', 'warning was triggered');
6811
+ });
6812
+
6813
+ _emberDebugIndex.warn('foo', { id: 'ember-debug.do-not-raise' });
6814
+ });
6787
6815
  });
6788
6816
  enifed('ember-debug/tests/main_test.lint-test', ['exports'], function (exports) {
6789
6817
  'use strict';
@@ -27145,6 +27173,42 @@ babelHelpers.classCallCheck(this, _class2);
27145
27173
  this.assertText('Click me');
27146
27174
  };
27147
27175
 
27176
+ _class2.prototype['@test action handler that shifts element attributes doesn\'t trigger multiple invocations'] = function testActionHandlerThatShiftsElementAttributesDoesnTTriggerMultipleInvocations() {
27177
+ var _this34 = this;
27178
+
27179
+ var actionCount = 0;
27180
+ var ExampleComponent = _emberGlimmerTestsUtilsHelpers.Component.extend({
27181
+ selected: false,
27182
+ actions: {
27183
+ toggleSelected: function () {
27184
+ actionCount++;
27185
+ this.toggleProperty('selected');
27186
+ }
27187
+ }
27188
+ });
27189
+
27190
+ this.registerComponent('example-component', {
27191
+ ComponentClass: ExampleComponent,
27192
+ template: '<button class="{{if selected \'selected\'}}" {{action "toggleSelected"}}>Toggle Selected</button>'
27193
+ });
27194
+
27195
+ this.render('{{example-component}}');
27196
+
27197
+ this.runTask(function () {
27198
+ _this34.$('button').click();
27199
+ });
27200
+
27201
+ this.assert.equal(actionCount, 1, 'Click action only fired once.');
27202
+ this.assert.ok(this.$('button').hasClass('selected'), 'Element with action handler has properly updated it\'s conditional class');
27203
+
27204
+ this.runTask(function () {
27205
+ _this34.$('button').click();
27206
+ });
27207
+
27208
+ this.assert.equal(actionCount, 2, 'Second click action only fired once.');
27209
+ this.assert.ok(!this.$('button').hasClass('selected'), 'Element with action handler has properly updated it\'s conditional class');
27210
+ };
27211
+
27148
27212
  return _class2;
27149
27213
  })(_emberGlimmerTestsUtilsTestCase.RenderingTest));
27150
27214
  });
@@ -41294,7 +41358,7 @@ enifed('ember-metal/tests/expand_properties_test', ['exports', 'ember-metal/expa
41294
41358
  expect(1);
41295
41359
 
41296
41360
  expectAssertion(function () {
41297
- _emberMetalExpand_properties.default([], addProperty);
41361
+ _emberMetalExpand_properties.default([1, 2], addProperty);
41298
41362
  }, /A computed property key must be a string/);
41299
41363
  });
41300
41364
 
@@ -42480,7 +42544,7 @@ enifed('ember-metal/tests/meta_test', ['exports', 'ember-metal/meta'], function
42480
42544
  assert.equal(matching[0], t);
42481
42545
  m.removeFromListeners('hello', t, 'm');
42482
42546
  matching = m.matchingListeners('hello');
42483
- assert.equal(matching.length, 0);
42547
+ assert.equal(matching, undefined);
42484
42548
  });
42485
42549
 
42486
42550
  QUnit.test('meta.listeners inheritance', function (assert) {
@@ -42499,7 +42563,7 @@ enifed('ember-metal/tests/meta_test', ['exports', 'ember-metal/meta'], function
42499
42563
  assert.equal(matching[2], 0);
42500
42564
  m.removeFromListeners('hello', target, 'm');
42501
42565
  matching = m.matchingListeners('hello');
42502
- assert.equal(matching.length, 0);
42566
+ assert.equal(matching, undefined);
42503
42567
  matching = parentMeta.matchingListeners('hello');
42504
42568
  assert.equal(matching.length, 3);
42505
42569
  });
@@ -47962,6 +48026,23 @@ enifed('ember-routing/tests/location/history_location_test', ['exports', 'ember-
47962
48026
 
47963
48027
  equal(location.getURL(), '/foo/bar?time=morphin#pink-power-ranger');
47964
48028
  });
48029
+
48030
+ QUnit.test('HistoryLocation.getURL() drops duplicate slashes', function () {
48031
+ expect(1);
48032
+
48033
+ HistoryTestLocation.reopen({
48034
+ init: function () {
48035
+ this._super.apply(this, arguments);
48036
+ var location = mockBrowserLocation('//');
48037
+ location.pathname = '//'; // mockBrowserLocation does not allow for `//`, so force it
48038
+ _emberMetal.set(this, 'location', location);
48039
+ }
48040
+ });
48041
+
48042
+ createLocation();
48043
+
48044
+ equal(location.getURL(), '/');
48045
+ });
47965
48046
  });
47966
48047
  enifed('ember-routing/tests/location/history_location_test.lint-test', ['exports'], function (exports) {
47967
48048
  'use strict';
@@ -6,7 +6,7 @@
6
6
  * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
7
7
  * @license Licensed under MIT license
8
8
  * See https://raw.github.com/emberjs/ember.js/master/LICENSE
9
- * @version 2.13.0-beta.1
9
+ * @version 2.13.0-beta.2
10
10
  */
11
11
 
12
12
  var enifed, requireModule, Ember;
@@ -6773,6 +6773,34 @@ enifed('ember-debug/tests/main_test', ['exports', 'ember-environment', 'ember-ru
6773
6773
 
6774
6774
  _emberDebugIndex.warn('foo', false, {});
6775
6775
  });
6776
+
6777
+ QUnit.test('warn without options.id nor test triggers a deprecation', function (assert) {
6778
+ assert.expect(2);
6779
+
6780
+ _emberDebugDeprecate.registerHandler(function (message) {
6781
+ assert.equal(message, _emberDebugWarn.missingOptionsIdDeprecation, 'deprecation is triggered when options is missing');
6782
+ });
6783
+
6784
+ _emberDebugWarn.registerHandler(function (message) {
6785
+ assert.equal(message, 'foo', 'original warning is triggered');
6786
+ });
6787
+
6788
+ _emberDebugIndex.warn('foo', {});
6789
+ });
6790
+
6791
+ QUnit.test('warn without test but with options does not trigger a deprecation', function (assert) {
6792
+ assert.expect(1);
6793
+
6794
+ _emberDebugDeprecate.registerHandler(function (message) {
6795
+ assert.ok(false, 'there should be no deprecation ' + message);
6796
+ });
6797
+
6798
+ _emberDebugWarn.registerHandler(function (message) {
6799
+ assert.equal(message, 'foo', 'warning was triggered');
6800
+ });
6801
+
6802
+ _emberDebugIndex.warn('foo', { id: 'ember-debug.do-not-raise' });
6803
+ });
6776
6804
  });
6777
6805
  enifed('ember-debug/tests/main_test.lint-test', ['exports'], function (exports) {
6778
6806
  'use strict';
@@ -26997,6 +27025,42 @@ babelHelpers.inherits(_class2, _RenderingTest2);
26997
27025
  this.assertText('Click me');
26998
27026
  };
26999
27027
 
27028
+ _class2.prototype['@test action handler that shifts element attributes doesn\'t trigger multiple invocations'] = function testActionHandlerThatShiftsElementAttributesDoesnTTriggerMultipleInvocations() {
27029
+ var _this34 = this;
27030
+
27031
+ var actionCount = 0;
27032
+ var ExampleComponent = _emberGlimmerTestsUtilsHelpers.Component.extend({
27033
+ selected: false,
27034
+ actions: {
27035
+ toggleSelected: function () {
27036
+ actionCount++;
27037
+ this.toggleProperty('selected');
27038
+ }
27039
+ }
27040
+ });
27041
+
27042
+ this.registerComponent('example-component', {
27043
+ ComponentClass: ExampleComponent,
27044
+ template: '<button class="{{if selected \'selected\'}}" {{action "toggleSelected"}}>Toggle Selected</button>'
27045
+ });
27046
+
27047
+ this.render('{{example-component}}');
27048
+
27049
+ this.runTask(function () {
27050
+ _this34.$('button').click();
27051
+ });
27052
+
27053
+ this.assert.equal(actionCount, 1, 'Click action only fired once.');
27054
+ this.assert.ok(this.$('button').hasClass('selected'), 'Element with action handler has properly updated it\'s conditional class');
27055
+
27056
+ this.runTask(function () {
27057
+ _this34.$('button').click();
27058
+ });
27059
+
27060
+ this.assert.equal(actionCount, 2, 'Second click action only fired once.');
27061
+ this.assert.ok(!this.$('button').hasClass('selected'), 'Element with action handler has properly updated it\'s conditional class');
27062
+ };
27063
+
27000
27064
  return _class2;
27001
27065
  })(_emberGlimmerTestsUtilsTestCase.RenderingTest));
27002
27066
  });
@@ -40916,7 +40980,7 @@ enifed('ember-metal/tests/expand_properties_test', ['exports', 'ember-metal/expa
40916
40980
  expect(1);
40917
40981
 
40918
40982
  expectAssertion(function () {
40919
- _emberMetalExpand_properties.default([], addProperty);
40983
+ _emberMetalExpand_properties.default([1, 2], addProperty);
40920
40984
  }, /A computed property key must be a string/);
40921
40985
  });
40922
40986
 
@@ -42102,7 +42166,7 @@ enifed('ember-metal/tests/meta_test', ['exports', 'ember-metal/meta'], function
42102
42166
  assert.equal(matching[0], t);
42103
42167
  m.removeFromListeners('hello', t, 'm');
42104
42168
  matching = m.matchingListeners('hello');
42105
- assert.equal(matching.length, 0);
42169
+ assert.equal(matching, undefined);
42106
42170
  });
42107
42171
 
42108
42172
  QUnit.test('meta.listeners inheritance', function (assert) {
@@ -42121,7 +42185,7 @@ enifed('ember-metal/tests/meta_test', ['exports', 'ember-metal/meta'], function
42121
42185
  assert.equal(matching[2], 0);
42122
42186
  m.removeFromListeners('hello', target, 'm');
42123
42187
  matching = m.matchingListeners('hello');
42124
- assert.equal(matching.length, 0);
42188
+ assert.equal(matching, undefined);
42125
42189
  matching = parentMeta.matchingListeners('hello');
42126
42190
  assert.equal(matching.length, 3);
42127
42191
  });
@@ -47584,6 +47648,23 @@ enifed('ember-routing/tests/location/history_location_test', ['exports', 'ember-
47584
47648
 
47585
47649
  equal(location.getURL(), '/foo/bar?time=morphin#pink-power-ranger');
47586
47650
  });
47651
+
47652
+ QUnit.test('HistoryLocation.getURL() drops duplicate slashes', function () {
47653
+ expect(1);
47654
+
47655
+ HistoryTestLocation.reopen({
47656
+ init: function () {
47657
+ this._super.apply(this, arguments);
47658
+ var location = mockBrowserLocation('//');
47659
+ location.pathname = '//'; // mockBrowserLocation does not allow for `//`, so force it
47660
+ _emberMetal.set(this, 'location', location);
47661
+ }
47662
+ });
47663
+
47664
+ createLocation();
47665
+
47666
+ equal(location.getURL(), '/');
47667
+ });
47587
47668
  });
47588
47669
  enifed('ember-routing/tests/location/history_location_test.lint-test', ['exports'], function (exports) {
47589
47670
  'use strict';
@@ -6,7 +6,7 @@
6
6
  * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
7
7
  * @license Licensed under MIT license
8
8
  * See https://raw.github.com/emberjs/ember.js/master/LICENSE
9
- * @version 2.13.0-beta.1
9
+ * @version 2.13.0-beta.2
10
10
  */
11
11
 
12
12
  var enifed, requireModule, Ember;
@@ -3697,6 +3697,7 @@ enifed('container/container', ['exports', 'ember-debug', 'ember-utils', 'ember-e
3697
3697
  this.fullName = fullName;
3698
3698
  this.normalizedName = normalizedName;
3699
3699
  this.madeToString = undefined;
3700
+ this.injections = undefined;
3700
3701
  }
3701
3702
 
3702
3703
  FactoryManager.prototype.create = function create() {
@@ -3704,7 +3705,13 @@ enifed('container/container', ['exports', 'ember-debug', 'ember-utils', 'ember-e
3704
3705
 
3705
3706
  var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
3706
3707
 
3707
- var injections = injectionsFor(this.container, this.normalizedName);
3708
+ var injections = this.injections;
3709
+ if (injections === undefined) {
3710
+ injections = injectionsFor(this.container, this.normalizedName);
3711
+ if (areInjectionsDynamic(injections) === false) {
3712
+ this.injections = injections;
3713
+ }
3714
+ }
3708
3715
  var props = _emberUtils.assign({}, injections, options);
3709
3716
 
3710
3717
  props[_emberUtils.NAME_KEY] = this.madeToString || (this.madeToString = this.container.registry.makeToString(this.class, this.fullName));
@@ -8347,6 +8354,10 @@ enifed('ember-debug/warn', ['exports', 'ember-console', 'ember-debug/deprecate',
8347
8354
  */
8348
8355
 
8349
8356
  function warn(message, test, options) {
8357
+ if (arguments.length === 2 && typeof test === 'object') {
8358
+ options = test;
8359
+ test = false;
8360
+ }
8350
8361
  if (!options) {
8351
8362
  _emberDebugDeprecate.default(missingOptionsDeprecation, false, {
8352
8363
  id: 'ember-debug.warn-options-missing',
@@ -8363,7 +8374,7 @@ enifed('ember-debug/warn', ['exports', 'ember-console', 'ember-debug/deprecate',
8363
8374
  });
8364
8375
  }
8365
8376
 
8366
- _emberDebugHandlers.invoke.apply(undefined, ['warn'].concat(babelHelpers.slice.call(arguments)));
8377
+ _emberDebugHandlers.invoke('warn', message, test, options);
8367
8378
  }
8368
8379
  });
8369
8380
  enifed('ember-environment/global', ['exports'], function (exports) {
@@ -18759,18 +18770,18 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/property_get', 'ember-meta
18759
18770
  // It is false for the root of a chain (because we have no parent)
18760
18771
  // and for global paths (because the parent node is the object with
18761
18772
  // the observer on it)
18762
- this._watching = value === undefined;
18773
+ var isWatching = this._watching = value === undefined;
18763
18774
 
18764
18775
  this._chains = undefined;
18765
18776
  this._object = undefined;
18766
18777
  this.count = 0;
18767
18778
 
18768
18779
  this._value = value;
18769
- this._paths = {};
18770
- if (this._watching) {
18780
+ this._paths = undefined;
18781
+ if (isWatching === true) {
18771
18782
  var obj = parent.value();
18772
18783
 
18773
- if (!isObject(obj)) {
18784
+ if (!isObject(obj) === true) {
18774
18785
  return;
18775
18786
  }
18776
18787
 
@@ -18781,7 +18792,7 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/property_get', 'ember-meta
18781
18792
  }
18782
18793
 
18783
18794
  ChainNode.prototype.value = function value() {
18784
- if (this._value === undefined && this._watching) {
18795
+ if (this._value === undefined && this._watching === true) {
18785
18796
  var obj = this._parent.value();
18786
18797
  this._value = lazyGet(obj, this._key);
18787
18798
  }
@@ -18789,7 +18800,7 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/property_get', 'ember-meta
18789
18800
  };
18790
18801
 
18791
18802
  ChainNode.prototype.destroy = function destroy() {
18792
- if (this._watching) {
18803
+ if (this._watching === true) {
18793
18804
  var obj = this._object;
18794
18805
  if (obj) {
18795
18806
  removeChainWatcher(obj, this._key, this);
@@ -18804,13 +18815,14 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/property_get', 'ember-meta
18804
18815
  var ret = new ChainNode(null, null, obj);
18805
18816
  var paths = this._paths;
18806
18817
  var path = undefined;
18807
-
18808
- for (path in paths) {
18809
- // this check will also catch non-number vals.
18810
- if (paths[path] <= 0) {
18811
- continue;
18818
+ if (paths !== undefined) {
18819
+ for (path in paths) {
18820
+ // this check will also catch non-number vals.
18821
+ if (paths[path] <= 0) {
18822
+ continue;
18823
+ }
18824
+ ret.add(path);
18812
18825
  }
18813
- ret.add(path);
18814
18826
  }
18815
18827
  return ret;
18816
18828
  };
@@ -18819,7 +18831,7 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/property_get', 'ember-meta
18819
18831
  // path.
18820
18832
 
18821
18833
  ChainNode.prototype.add = function add(path) {
18822
- var paths = this._paths;
18834
+ var paths = this._paths || (this._paths = {});
18823
18835
  paths[path] = (paths[path] || 0) + 1;
18824
18836
 
18825
18837
  var key = firstKey(path);
@@ -18833,6 +18845,9 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/property_get', 'ember-meta
18833
18845
 
18834
18846
  ChainNode.prototype.remove = function remove(path) {
18835
18847
  var paths = this._paths;
18848
+ if (paths === undefined) {
18849
+ return;
18850
+ }
18836
18851
  if (paths[path] > 0) {
18837
18852
  paths[path]--;
18838
18853
  }
@@ -18886,11 +18901,11 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/property_get', 'ember-meta
18886
18901
  };
18887
18902
 
18888
18903
  ChainNode.prototype.notify = function notify(revalidate, affected) {
18889
- if (revalidate && this._watching) {
18904
+ if (revalidate && this._watching === true) {
18890
18905
  var parentValue = this._parent.value();
18891
18906
 
18892
18907
  if (parentValue !== this._object) {
18893
- if (this._object) {
18908
+ if (this._object !== undefined) {
18894
18909
  removeChainWatcher(this._object, this._key, this);
18895
18910
  }
18896
18911
 
@@ -18907,7 +18922,7 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/property_get', 'ember-meta
18907
18922
  // then notify chains...
18908
18923
  var chains = this._chains;
18909
18924
  var node = undefined;
18910
- if (chains) {
18925
+ if (chains !== undefined) {
18911
18926
  for (var key in chains) {
18912
18927
  node = chains[key];
18913
18928
  if (node !== undefined) {
@@ -18946,12 +18961,12 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/property_get', 'ember-meta
18946
18961
  var meta = _emberMetalMeta.peekMeta(obj);
18947
18962
 
18948
18963
  // check if object meant only to be a prototype
18949
- if (meta && meta.proto === obj) {
18964
+ if (meta !== undefined && meta.proto === obj) {
18950
18965
  return;
18951
18966
  }
18952
18967
 
18953
18968
  // Use `get` if the return value is an EachProxy or an uncacheable value.
18954
- if (isVolatile(obj[key])) {
18969
+ if (isVolatile(obj[key]) === true) {
18955
18970
  return _emberMetalProperty_get.get(obj, key);
18956
18971
  // Otherwise attempt to get the cached value of the computed property
18957
18972
  } else {
@@ -18965,17 +18980,17 @@ enifed('ember-metal/chains', ['exports', 'ember-metal/property_get', 'ember-meta
18965
18980
  function finishChains(obj) {
18966
18981
  // We only create meta if we really have to
18967
18982
  var m = _emberMetalMeta.peekMeta(obj);
18968
- if (m) {
18983
+ if (m !== undefined) {
18969
18984
  m = _emberMetalMeta.meta(obj);
18970
18985
 
18971
18986
  // finish any current chains node watchers that reference obj
18972
18987
  var chainWatchers = m.readableChainWatchers();
18973
- if (chainWatchers) {
18988
+ if (chainWatchers !== undefined) {
18974
18989
  chainWatchers.revalidateAll();
18975
18990
  }
18976
18991
  // ensure that if we have inherited any chains they have been
18977
18992
  // copied onto our own meta.
18978
- if (m.readableChains()) {
18993
+ if (m.readableChains() !== undefined) {
18979
18994
  m.writableChains(_emberMetalWatch_path.makeChainNode);
18980
18995
  }
18981
18996
  }
@@ -19853,6 +19868,9 @@ enifed('ember-metal/events', ['exports', 'ember-utils', 'ember-metal/meta', 'emb
19853
19868
  return;
19854
19869
  }
19855
19870
  var actions = meta.matchingListeners(eventName);
19871
+ if (actions === undefined) {
19872
+ return;
19873
+ }
19856
19874
  var newActions = [];
19857
19875
 
19858
19876
  for (var i = actions.length - 3; i >= 0; i -= 3) {
@@ -20070,7 +20088,8 @@ enifed('ember-metal/events', ['exports', 'ember-utils', 'ember-metal/meta', 'emb
20070
20088
  if (!meta) {
20071
20089
  return false;
20072
20090
  }
20073
- return meta.matchingListeners(eventName).length > 0;
20091
+ var matched = meta.matchingListeners(eventName);
20092
+ return matched !== undefined && matched.length > 0;
20074
20093
  }
20075
20094
 
20076
20095
  /**
@@ -20176,7 +20195,7 @@ enifed('ember-metal/expand_properties', ['exports', 'ember-debug'], function (ex
20176
20195
  */
20177
20196
 
20178
20197
  function expandProperties(pattern, callback) {
20179
- _emberDebug.assert('A computed property key must be a string', typeof pattern === 'string');
20198
+ _emberDebug.assert('A computed property key must be a string, you passed ' + typeof pattern + ' ' + pattern, typeof pattern === 'string');
20180
20199
  _emberDebug.assert('Brace expanded properties cannot contain spaces, e.g. "user.{firstName, lastName}" should be "user.{firstName,lastName}"', pattern.indexOf(' ') === -1);
20181
20200
 
20182
20201
  var unbalancedNestedError = 'Brace expanded properties have to be balanced and cannot be nested, pattern: ' + pattern;
@@ -22227,23 +22246,24 @@ enifed('ember-metal/meta_listeners', ['exports'], function (exports) {
22227
22246
 
22228
22247
  matchingListeners: function (eventName) {
22229
22248
  var pointer = this;
22230
- var result = [];
22231
- while (pointer) {
22249
+ var result = undefined;
22250
+ while (pointer !== undefined) {
22232
22251
  var listeners = pointer._listeners;
22233
- if (listeners) {
22252
+ if (listeners !== undefined) {
22234
22253
  for (var index = 0; index < listeners.length - 3; index += 4) {
22235
22254
  if (listeners[index] === eventName) {
22255
+ result = result || [];
22236
22256
  pushUniqueListener(result, listeners, index);
22237
22257
  }
22238
22258
  }
22239
22259
  }
22240
- if (pointer._listenersFinalized) {
22260
+ if (pointer._listenersFinalized === true) {
22241
22261
  break;
22242
22262
  }
22243
22263
  pointer = pointer.parent;
22244
22264
  }
22245
22265
  var sus = this._suspendedListeners;
22246
- if (sus) {
22266
+ if (sus !== undefined && result !== undefined) {
22247
22267
  for (var susIndex = 0; susIndex < sus.length - 2; susIndex += 3) {
22248
22268
  if (eventName === sus[susIndex]) {
22249
22269
  for (var resultIndex = 0; resultIndex < result.length - 2; resultIndex += 3) {
@@ -26561,7 +26581,7 @@ enifed('ember-routing/location/history_location', ['exports', 'ember-metal', 'em
26561
26581
  baseURL = baseURL.replace(/\/$/, '');
26562
26582
 
26563
26583
  // remove baseURL and rootURL from start of path
26564
- var url = path.replace(new RegExp('^' + baseURL + '(?=/|$)'), '').replace(new RegExp('^' + rootURL + '(?=/|$)'), '');
26584
+ var url = path.replace(new RegExp('^' + baseURL + '(?=/|$)'), '').replace(new RegExp('^' + rootURL + '(?=/|$)'), '').replace(/\/\/$/g, '/'); // remove extra slashes
26565
26585
 
26566
26586
  var search = location.search || '';
26567
26587
  url += search + this.getHash();
@@ -41401,13 +41421,15 @@ enifed('ember-testing/setup_for_testing', ['exports', 'ember-debug', 'ember-view
41401
41421
  _emberTestingTestAdapter.setAdapter(typeof self.QUnit === 'undefined' ? new _emberTestingAdaptersAdapter.default() : new _emberTestingAdaptersQunit.default());
41402
41422
  }
41403
41423
 
41404
- _emberViews.jQuery(document).off('ajaxSend', _emberTestingTestPending_requests.incrementPendingRequests);
41405
- _emberViews.jQuery(document).off('ajaxComplete', _emberTestingTestPending_requests.decrementPendingRequests);
41424
+ if (_emberViews.jQuery) {
41425
+ _emberViews.jQuery(document).off('ajaxSend', _emberTestingTestPending_requests.incrementPendingRequests);
41426
+ _emberViews.jQuery(document).off('ajaxComplete', _emberTestingTestPending_requests.decrementPendingRequests);
41406
41427
 
41407
- _emberTestingTestPending_requests.clearPendingRequests();
41428
+ _emberTestingTestPending_requests.clearPendingRequests();
41408
41429
 
41409
- _emberViews.jQuery(document).on('ajaxSend', _emberTestingTestPending_requests.incrementPendingRequests);
41410
- _emberViews.jQuery(document).on('ajaxComplete', _emberTestingTestPending_requests.decrementPendingRequests);
41430
+ _emberViews.jQuery(document).on('ajaxSend', _emberTestingTestPending_requests.incrementPendingRequests);
41431
+ _emberViews.jQuery(document).on('ajaxComplete', _emberTestingTestPending_requests.decrementPendingRequests);
41432
+ }
41411
41433
  }
41412
41434
  });
41413
41435
  enifed('ember-testing/support', ['exports', 'ember-debug', 'ember-views', 'ember-environment'], function (exports, _emberDebug, _emberViews, _emberEnvironment) {
@@ -44207,6 +44229,7 @@ enifed('ember-views/system/event_dispatcher', ['exports', 'ember-utils', 'ember-
44207
44229
 
44208
44230
  rootElement.on(event + '.ember', '[data-ember-action]', function (evt) {
44209
44231
  var attributes = evt.currentTarget.attributes;
44232
+ var handledActions = [];
44210
44233
 
44211
44234
  for (var i = 0; i < attributes.length; i++) {
44212
44235
  var attr = attributes.item(i);
@@ -44218,8 +44241,12 @@ enifed('ember-views/system/event_dispatcher', ['exports', 'ember-utils', 'ember-
44218
44241
  // We have to check for action here since in some cases, jQuery will trigger
44219
44242
  // an event on `removeChild` (i.e. focusout) after we've already torn down the
44220
44243
  // action handlers for the view.
44221
- if (action && action.eventName === eventName) {
44244
+ if (action && action.eventName === eventName && handledActions.indexOf(action) === -1) {
44222
44245
  action.handler(evt);
44246
+ // Action handlers can mutate state which in turn creates new attributes on the element.
44247
+ // This effect could cause the `data-ember-action` attribute to shift down and be invoked twice.
44248
+ // To avoid this, we keep track of which actions have been handled.
44249
+ handledActions.push(action);
44223
44250
  }
44224
44251
  }
44225
44252
  }
@@ -45426,7 +45453,7 @@ enifed('ember/index', ['exports', 'require', 'ember-environment', 'ember-utils',
45426
45453
  enifed("ember/version", ["exports"], function (exports) {
45427
45454
  "use strict";
45428
45455
 
45429
- exports.default = "2.13.0-beta.1";
45456
+ exports.default = "2.13.0-beta.2";
45430
45457
  });
45431
45458
  enifed('internal-test-helpers/apply-mixins', ['exports', 'ember-utils'], function (exports, _emberUtils) {
45432
45459
  'use strict';