diff --git a/packages/ember-application/lib/system/application.js b/packages/ember-application/lib/system/application.js index 3e7dbde685c..473ed979743 100644 --- a/packages/ember-application/lib/system/application.js +++ b/packages/ember-application/lib/system/application.js @@ -37,7 +37,7 @@ import LegacyEachView from 'ember-views/views/legacy_each_view'; import LinkToComponent from 'ember-routing-views/views/link'; import RoutingService from 'ember-routing/services/routing'; import ContainerDebugAdapter from 'ember-extension-support/container_debug_adapter'; - +import { _loaded } from 'ember-runtime/system/lazy_load'; import environment from 'ember-metal/environment'; function props(obj) { @@ -772,6 +772,10 @@ var Application = Namespace.extend({ this._bootPromise = null; this._bootResolver = null; + if (_loaded.application === this) { + _loaded.application = undefined; + } + if (this.__deprecatedInstance__) { this.__deprecatedInstance__.destroy(); } diff --git a/packages/ember-application/tests/system/application_test.js b/packages/ember-application/tests/system/application_test.js index 205c78ac075..fbe44e2383a 100644 --- a/packages/ember-application/tests/system/application_test.js +++ b/packages/ember-application/tests/system/application_test.js @@ -12,6 +12,7 @@ import EmberObject from 'ember-runtime/system/object'; import EmberRoute from 'ember-routing/system/route'; import jQuery from 'ember-views/system/jquery'; import compile from 'ember-template-compiler/system/compile'; +import { _loaded } from 'ember-runtime/system/lazy_load'; var trim = jQuery.trim; @@ -332,3 +333,11 @@ QUnit.test('registers controls onto to container', function() { ok(app.__container__.lookup('view:select'), 'Select control is registered into views'); }); + +QUnit.test('does not leak itself in onLoad._loaded', function() { + equal(_loaded.application, undefined); + var app = run(Application, 'create'); + equal(_loaded.application, app); + run(app, 'destroy'); + equal(_loaded.application, undefined); +}); diff --git a/packages/ember-runtime/lib/system/lazy_load.js b/packages/ember-runtime/lib/system/lazy_load.js index d98ceaef9f9..6de926c5069 100644 --- a/packages/ember-runtime/lib/system/lazy_load.js +++ b/packages/ember-runtime/lib/system/lazy_load.js @@ -10,6 +10,7 @@ import 'ember-runtime/system/native_array'; // make sure Ember.A is setup. var loadHooks = Ember.ENV.EMBER_LOAD_HOOKS || {}; var loaded = {}; +export var _loaded = loaded; /** Detects when a specific package of Ember (e.g. 'Ember.Application') @@ -31,12 +32,12 @@ var loaded = {}; @private */ export function onLoad(name, callback) { - var object; + var object = loaded[name]; loadHooks[name] = loadHooks[name] || Ember.A(); loadHooks[name].pushObject(callback); - if (object = loaded[name]) { + if (object) { callback(object); } } diff --git a/packages/ember-testing/lib/test.js b/packages/ember-testing/lib/test.js index a00a5db6738..5e87f2c05bb 100644 --- a/packages/ember-testing/lib/test.js +++ b/packages/ember-testing/lib/test.js @@ -453,6 +453,7 @@ EmberApplication.reopen({ for (var name in helpers) { this.helperContainer[name] = this.originalMethods[name]; + delete Test.Promise.prototype[name]; delete this.testHelpers[name]; delete this.originalMethods[name]; } diff --git a/packages/ember-testing/tests/helpers_test.js b/packages/ember-testing/tests/helpers_test.js index 56f4e4007f8..1b52661c6da 100644 --- a/packages/ember-testing/tests/helpers_test.js +++ b/packages/ember-testing/tests/helpers_test.js @@ -99,17 +99,28 @@ QUnit.module('ember-testing: Helper setup', { teardown() { cleanup(); } }); +function registerHelper() { + Test.registerHelper('LeakyMcLeakLeak', function(app) { + }); +} + QUnit.test('Ember.Application#injectTestHelpers/#removeTestHelpers', function() { App = run(EmberApplication, EmberApplication.create); assertNoHelpers(App); + registerHelper(); + App.injectTestHelpers(); assertHelpers(App); + ok(Ember.Test.Promise.prototype.LeakyMcLeakLeak, 'helper in question SHOULD be present'); App.removeTestHelpers(); assertNoHelpers(App); + + equal(Ember.Test.Promise.prototype.LeakyMcLeakLeak, undefined, 'should NOT leak test promise extensions'); }); + QUnit.test('Ember.Application#setupForTesting', function() { run(function() { App = EmberApplication.create();