diff --git a/packages/ember-runtime/lib/system/core_object.js b/packages/ember-runtime/lib/system/core_object.js index 00cf79c7c97..d1bccac6ffa 100644 --- a/packages/ember-runtime/lib/system/core_object.js +++ b/packages/ember-runtime/lib/system/core_object.js @@ -130,6 +130,8 @@ function makeCtor(base) { assert(messageFor(receiver, property), value === undefined); }, }); + + FACTORY_FOR.set(self, FACTORY_FOR.get(this)); } let m = meta(self); diff --git a/packages/ember-runtime/tests/system/core_object_test.js b/packages/ember-runtime/tests/system/core_object_test.js index 1963dae7399..a8ff980089b 100644 --- a/packages/ember-runtime/tests/system/core_object_test.js +++ b/packages/ember-runtime/tests/system/core_object_test.js @@ -1,4 +1,4 @@ -import { getOwner } from 'ember-utils'; +import { getOwner, setOwner } from 'ember-utils'; import { get } from 'ember-metal'; import CoreObject from '../../lib/system/core_object'; import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; @@ -74,5 +74,23 @@ moduleFor( // should not trigger an assertion getOwner(proxy); } + + ['@test can use getOwner in a proxy init GH#16484'](assert) { + let owner = {}; + let options = {}; + setOwner(options, owner); + + CoreObject.extend({ + init() { + this._super(...arguments); + let localOwner = getOwner(this); + + assert.equal(localOwner, owner, 'should be able to `getOwner` in init'); + }, + unknownProperty() { + return undefined; + }, + }).create(options); + } } ); diff --git a/packages/ember-runtime/tests/system/object/create_test.js b/packages/ember-runtime/tests/system/object/create_test.js index c21f660a37d..e396ffe409e 100644 --- a/packages/ember-runtime/tests/system/object/create_test.js +++ b/packages/ember-runtime/tests/system/object/create_test.js @@ -1,3 +1,4 @@ +import { getOwner, setOwner } from 'ember-utils'; import { computed, Mixin, observer } from 'ember-metal'; import { MANDATORY_SETTER } from 'ember/features'; import EmberObject from '../../../lib/system/object'; @@ -112,5 +113,23 @@ moduleFor( let o = EmberObject.create(undefined); assert.deepEqual(EmberObject.create(), o); } + + ['@test can use getOwner in a proxy init GH#16484'](assert) { + let owner = {}; + let options = {}; + setOwner(options, owner); + + EmberObject.extend({ + init() { + this._super(...arguments); + let localOwner = getOwner(this); + + assert.equal(localOwner, owner, 'should be able to `getOwner` in init'); + }, + unknownProperty() { + return undefined; + }, + }).create(options); + } } ); diff --git a/packages/ember/tests/service_injection_test.js b/packages/ember/tests/service_injection_test.js index 39f8ba6e87d..a942d3446f4 100644 --- a/packages/ember/tests/service_injection_test.js +++ b/packages/ember/tests/service_injection_test.js @@ -1,6 +1,6 @@ -import { Controller } from 'ember-runtime'; +import { getOwner } from 'ember-utils'; +import { Controller, inject, Service, _ProxyMixin } from 'ember-runtime'; import { moduleFor, ApplicationTestCase } from 'internal-test-helpers'; -import { inject, Service } from 'ember-runtime'; import { computed } from 'ember-metal'; import { EMBER_METAL_ES5_GETTERS, EMBER_MODULE_UNIFICATION } from 'ember/features'; @@ -23,6 +23,32 @@ moduleFor( assert.ok(controller.get('myService') instanceof MyService); }); } + + ['@test Service can be an object proxy and access owner in init GH#16484'](assert) { + let serviceOwner; + + this.add( + 'controller:application', + Controller.extend({ + myService: inject.service('my-service'), + }) + ); + let MyService = Service.extend(_ProxyMixin, { + init() { + this._super(...arguments); + + serviceOwner = getOwner(this); + }, + }); + this.add('service:my-service', MyService); + this.addTemplate('application', ''); + + this.visit('/').then(instance => { + let controller = this.applicationInstance.lookup('controller:application'); + assert.ok(controller.get('myService') instanceof MyService); + assert.equal(serviceOwner, instance, 'should be able to `getOwner` in init'); + }); + } } );