diff --git a/features.json b/features.json index fdec4ab6604..dfe8382126b 100644 --- a/features.json +++ b/features.json @@ -8,6 +8,7 @@ "ember-debug-handlers": true, "ember-routing-routable-components": null, "ember-metal-ember-assign": null, - "ember-contextual-components": true + "ember-contextual-components": true, + "ember-container-inject-owner": null } } diff --git a/packages/container/lib/container.js b/packages/container/lib/container.js index 3bf392585d5..ca0db6a768a 100644 --- a/packages/container/lib/container.js +++ b/packages/container/lib/container.js @@ -1,6 +1,8 @@ import Ember from 'ember-metal/core'; import { assert } from 'ember-metal/debug'; import dictionary from 'ember-metal/dictionary'; +import isEnabled from 'ember-metal/features'; +import { setOwner } from './owner'; /** A container used to instantiate and cache objects. @@ -17,12 +19,20 @@ import dictionary from 'ember-metal/dictionary'; */ function Container(registry, options) { this.registry = registry; + this.owner = options && options.owner ? options.owner : null; this.cache = dictionary(options && options.cache ? options.cache : null); this.factoryCache = dictionary(options && options.factoryCache ? options.factoryCache : null); this.validationCache = dictionary(options && options.validationCache ? options.validationCache : null); } Container.prototype = { + /** + @private + @property owner + @type Object + */ + owner: null, + /** @private @property registry @@ -232,6 +242,11 @@ function factoryFor(container, fullName) { factoryInjections._toString = registry.makeToString(factory, fullName); var injectedFactory = factory.extend(injections); + + if (isEnabled('ember-container-inject-owner')) { + injectDeprecatedContainer(injectedFactory.prototype, container); + } + injectedFactory.reopenClass(factoryInjections); if (factory && typeof factory._onLookup === 'function') { @@ -255,7 +270,14 @@ function injectionsFor(container, fullName) { registry.getTypeInjections(type), registry.getInjections(fullName)); injections._debugContainerKey = fullName; - injections.container = container; + + setOwner(injections, container.owner); + + // TODO - Inject a `FakeContainer` instead here. The `FakeContainer` will + // proxy all properties of the container with deprecations. + if (!isEnabled('ember-container-inject-owner')) { + injections.container = container; + } return injections; } @@ -299,18 +321,40 @@ function instantiate(container, fullName) { validationCache[fullName] = true; + let obj; + if (typeof factory.extend === 'function') { // assume the factory was extendable and is already injected - return factory.create(); + obj = factory.create(); } else { // assume the factory was extendable // to create time injections // TODO: support new'ing for instantiation and merge injections for pure JS Functions - return factory.create(injectionsFor(container, fullName)); + obj = factory.create(injectionsFor(container, fullName)); + + if (isEnabled('ember-container-inject-owner')) { + injectDeprecatedContainer(obj, container); + } } + + return obj; } } +// TODO - remove when Ember reaches v3.0.0 +function injectDeprecatedContainer(object, container) { + Object.defineProperty(object, 'container', { + configurable: true, + enumerable: false, + get() { + Ember.deprecate('Using the injected `container` is deprecated. Please use the `getOwner` helper instead to access the owner of this object.', + false, + { id: 'ember-application.injected-container', until: '3.0.0' }); + return container; + } + }); +} + function eachDestroyable(container, callback) { var cache = container.cache; var keys = Object.keys(cache); diff --git a/packages/container/lib/main.js b/packages/container/lib/main.js index f80c8bdacc1..3172f78c88a 100644 --- a/packages/container/lib/main.js +++ b/packages/container/lib/main.js @@ -20,5 +20,6 @@ if (Ember.ENV && typeof Ember.ENV.MODEL_FACTORY_INJECTIONS !== 'undefined') { import Registry from 'container/registry'; import Container from 'container/container'; +import { getOwner, setOwner } from 'container/owner'; -export { Registry, Container }; +export { Registry, Container, getOwner, setOwner }; diff --git a/packages/container/lib/owner.js b/packages/container/lib/owner.js new file mode 100644 index 00000000000..71d0b7b0acb --- /dev/null +++ b/packages/container/lib/owner.js @@ -0,0 +1,11 @@ +import { symbol } from 'ember-metal/utils'; + +export const OWNER = symbol('OWNER'); + +export function getOwner(object) { + return object[OWNER]; +} + +export function setOwner(object, owner) { + object[OWNER] = owner; +} diff --git a/packages/container/tests/container_test.js b/packages/container/tests/container_test.js index 73ad1418b3a..5c4719ebb25 100644 --- a/packages/container/tests/container_test.js +++ b/packages/container/tests/container_test.js @@ -1,6 +1,7 @@ import Ember from 'ember-metal/core'; import Registry from 'container/registry'; -import { factory } from 'container/tests/container_helper'; +import factory from 'container/tests/test-helpers/factory'; +import isEnabled from 'ember-metal/features'; var originalModelInjections; @@ -57,8 +58,6 @@ QUnit.test('A factory returned from lookupFactory has a debugkey', function() { registry.register('controller:post', PostController); var PostFactory = container.lookupFactory('controller:post'); - - ok(!PostFactory.container, 'factory instance receives a container'); equal(PostFactory._debugContainerKey, 'controller:post', 'factory instance receives _debugContainerKey'); }); @@ -76,8 +75,6 @@ QUnit.test('fallback for to create time injections if factory has no extend', fu var postController = container.lookup('controller:post'); - ok(postController.container, 'instance receives a container'); - equal(postController.container, container, 'instance receives the correct container'); equal(postController._debugContainerKey, 'controller:post', 'instance receives _debugContainerKey'); ok(postController.apple instanceof AppleController, 'instance receives an apple of instance AppleController'); }); @@ -91,7 +88,6 @@ QUnit.test('The descendants of a factory returned from lookupFactory have a cont registry.register('controller:post', PostController); instance = container.lookupFactory('controller:post').create(); - ok(instance.container, 'factory instance receives a container'); equal(instance._debugContainerKey, 'controller:post', 'factory instance receives _debugContainerKey'); ok(instance instanceof PostController, 'factory instance is instance of factory'); @@ -120,18 +116,6 @@ QUnit.test('A registered factory returns a fresh instance if singleton: false is ok(postController4 instanceof PostController, 'All instances are instances of the registered factory'); }); -QUnit.test('A container lookup has access to the container', function() { - var registry = new Registry(); - var container = registry.container(); - var PostController = factory(); - - registry.register('controller:post', PostController); - - var postController = container.lookup('controller:post'); - - equal(postController.container, container); -}); - QUnit.test('A factory type with a registered injection\'s instances receive that injection', function() { var registry = new Registry(); var container = registry.container(); @@ -163,10 +147,8 @@ QUnit.test('An individual factory with a registered injection receives the injec var postController = container.lookup('controller:post'); var store = container.lookup('store:main'); - equal(store.container, container); equal(store._debugContainerKey, 'store:main'); - equal(postController.container, container); equal(postController._debugContainerKey, 'controller:post'); equal(postController.store, store, 'has the correct store injected'); }); @@ -535,3 +517,32 @@ QUnit.test('Lazy injection validations are cached', function() { container.lookup('apple:main'); container.lookup('apple:main'); }); + +if (isEnabled('ember-container-inject-owner')) { + QUnit.test('A deprecated `container` property is appended to every instantiated object', function() { + let registry = new Registry(); + let container = registry.container(); + let PostController = factory(); + registry.register('controller:post', PostController); + let postController = container.lookup('controller:post'); + + expectDeprecation(function() { + Ember.get(postController, 'container'); + }, 'Using the injected `container` is deprecated. Please use the `getOwner` helper instead to access the owner of this object.'); + + expectDeprecation(function() { + let c = postController.container; + strictEqual(c, container); + }, 'Using the injected `container` is deprecated. Please use the `getOwner` helper instead to access the owner of this object.'); + }); +} else { + QUnit.test('A `container` property is appended to every instantiated object', function() { + const registry = new Registry(); + const container = registry.container(); + const PostController = factory(); + registry.register('controller:post', PostController); + const postController = container.lookup('controller:post'); + + strictEqual(postController.container, container, ''); + }); +} diff --git a/packages/container/tests/owner_test.js b/packages/container/tests/owner_test.js new file mode 100644 index 00000000000..a166d89de84 --- /dev/null +++ b/packages/container/tests/owner_test.js @@ -0,0 +1,16 @@ +import { getOwner, setOwner, OWNER } from 'container/owner'; + +QUnit.module('Owner', {}); + +QUnit.test('An owner can be set with `setOwner` and retrieved with `getOwner`', function() { + let owner = {}; + let obj = {}; + + strictEqual(getOwner(obj), undefined, 'owner has not been set'); + + setOwner(obj, owner); + + strictEqual(getOwner(obj), owner, 'owner has been set'); + + strictEqual(obj[OWNER], owner, 'owner has been set to the OWNER symbol'); +}); diff --git a/packages/container/tests/registry_test.js b/packages/container/tests/registry_test.js index 35c3347ed09..fbaa5fbff19 100644 --- a/packages/container/tests/registry_test.js +++ b/packages/container/tests/registry_test.js @@ -1,6 +1,6 @@ import Ember from 'ember-metal/core'; import { Registry } from 'container'; -import { factory } from 'container/tests/container_helper'; +import factory from 'container/tests/test-helpers/factory'; var originalModelInjections; diff --git a/packages/container/tests/test-helpers/build-owner.js b/packages/container/tests/test-helpers/build-owner.js new file mode 100644 index 00000000000..555ca5401ab --- /dev/null +++ b/packages/container/tests/test-helpers/build-owner.js @@ -0,0 +1,15 @@ +import EmberObject from 'ember-runtime/system/object'; +import Registry from 'container/registry'; +import RegistryProxy from 'ember-runtime/mixins/registry_proxy'; +import ContainerProxy from 'ember-runtime/mixins/container_proxy'; + +export default function buildOwner(props) { + let Owner = EmberObject.extend(RegistryProxy, ContainerProxy, { + init() { + this._super(...arguments); + const registry = this.__registry__ = new Registry(); + this.__container__ = registry.container({ owner: this }); + } + }); + return Owner.create(props); +} diff --git a/packages/container/tests/container_helper.js b/packages/container/tests/test-helpers/factory.js similarity index 94% rename from packages/container/tests/container_helper.js rename to packages/container/tests/test-helpers/factory.js index e64ffab9c3f..06d2f848442 100644 --- a/packages/container/tests/container_helper.js +++ b/packages/container/tests/test-helpers/factory.js @@ -8,7 +8,7 @@ var setProperties = function(object, properties) { var guids = 0; -var factory = function() { +export default function factory() { /*jshint validthis: true */ var Klass = function(options) { @@ -61,9 +61,4 @@ var factory = function() { return Child; } -}; - -export { - factory, - setProperties -}; +} diff --git a/packages/ember-application/lib/system/application-instance.js b/packages/ember-application/lib/system/application-instance.js index 04648b4b194..efa7a81312f 100644 --- a/packages/ember-application/lib/system/application-instance.js +++ b/packages/ember-application/lib/system/application-instance.js @@ -101,7 +101,7 @@ let ApplicationInstance = EmberObject.extend(RegistryProxy, ContainerProxy, { registry.makeToString = applicationRegistry.makeToString; // Create a per-instance container from the instance's registry - this.__container__ = registry.container(); + this.__container__ = registry.container({ owner: this }); // Register this instance in the per-instance registry. // diff --git a/packages/ember-extension-support/lib/container_debug_adapter.js b/packages/ember-extension-support/lib/container_debug_adapter.js index a976d6aad41..5a25aeb3601 100644 --- a/packages/ember-extension-support/lib/container_debug_adapter.js +++ b/packages/ember-extension-support/lib/container_debug_adapter.js @@ -49,17 +49,6 @@ import EmberObject from 'ember-runtime/system/object'; @public */ export default EmberObject.extend({ - /** - The container of the application being debugged. - This property will be injected - on creation. - - @property container - @default null - @public - */ - container: null, - /** The resolver instance of the application being debugged. This property will be injected diff --git a/packages/ember-extension-support/lib/data_adapter.js b/packages/ember-extension-support/lib/data_adapter.js index 8fadf4256d9..981ee145cd0 100644 --- a/packages/ember-extension-support/lib/data_adapter.js +++ b/packages/ember-extension-support/lib/data_adapter.js @@ -5,6 +5,7 @@ import Namespace from 'ember-runtime/system/namespace'; import EmberObject from 'ember-runtime/system/object'; import { A as emberA } from 'ember-runtime/system/native_array'; import Application from 'ember-application/system/application'; +import { getOwner } from 'container/owner'; /** @module ember @@ -59,19 +60,6 @@ export default EmberObject.extend({ this.releaseMethods = emberA(); }, - /** - The container of the application being debugged. - This property will be injected - on creation. - - @property container - @default null - @since 1.3.0 - @public - */ - container: null, - - /** The container-debug-adapter which is used to list all models. @@ -171,7 +159,7 @@ export default EmberObject.extend({ _nameToClass(type) { if (typeof type === 'string') { - type = this.container.lookupFactory(`model:${type}`); + type = getOwner(this)._lookupFactory(`model:${type}`); } return type; }, diff --git a/packages/ember-extension-support/tests/container_debug_adapter_test.js b/packages/ember-extension-support/tests/container_debug_adapter_test.js index 183af4ca428..8b2b5bf5b45 100644 --- a/packages/ember-extension-support/tests/container_debug_adapter_test.js +++ b/packages/ember-extension-support/tests/container_debug_adapter_test.js @@ -3,7 +3,7 @@ import EmberController from 'ember-runtime/controllers/controller'; import 'ember-extension-support'; // Must be required to export Ember.ContainerDebugAdapter import Application from 'ember-application/system/application'; -var adapter, App; +var adapter, App, appInstance; function boot() { @@ -19,14 +19,16 @@ QUnit.module('Container Debug Adapter', { }); boot(); run(function() { - adapter = App.__container__.lookup('container-debug-adapter:main'); + appInstance = App.__deprecatedInstance__; + adapter = appInstance.lookup('container-debug-adapter:main'); }); }, teardown() { run(function() { adapter.destroy(); + appInstance.destroy(); App.destroy(); - App = null; + App = appInstance = adapter = null; }); } }); diff --git a/packages/ember-htmlbars/lib/hooks/component.js b/packages/ember-htmlbars/lib/hooks/component.js index 8f5fc8f1d62..927052f1656 100644 --- a/packages/ember-htmlbars/lib/hooks/component.js +++ b/packages/ember-htmlbars/lib/hooks/component.js @@ -81,7 +81,7 @@ export default function componentHook(renderNode, env, scope, _tagName, params, let component, layout; if (isDasherized || !isAngleBracket) { - let result = lookupComponent(env.container, tagName); + let result = lookupComponent(env.owner, tagName); component = result.component; layout = result.layout; diff --git a/packages/ember-htmlbars/lib/hooks/has-helper.js b/packages/ember-htmlbars/lib/hooks/has-helper.js index 4fc24db1a6d..647285b12d4 100644 --- a/packages/ember-htmlbars/lib/hooks/has-helper.js +++ b/packages/ember-htmlbars/lib/hooks/has-helper.js @@ -5,10 +5,10 @@ export default function hasHelperHook(env, scope, helperName) { return true; } - var container = env.container; - if (validateLazyHelperName(helperName, container, env.hooks.keywords)) { - var containerName = 'helper:' + helperName; - if (container.registry.has(containerName)) { + const owner = env.owner; + if (validateLazyHelperName(helperName, owner, env.hooks.keywords)) { + var registrationName = 'helper:' + helperName; + if (owner.hasRegistration(registrationName)) { return true; } } diff --git a/packages/ember-htmlbars/lib/keywords/closure-component.js b/packages/ember-htmlbars/lib/keywords/closure-component.js index 9027af7e370..0d153a4f9d8 100644 --- a/packages/ember-htmlbars/lib/keywords/closure-component.js +++ b/packages/ember-htmlbars/lib/keywords/closure-component.js @@ -64,7 +64,7 @@ function createClosureComponentCell(env, originalComponentPath, params, hash, la } function isValidComponentPath(env, path) { - const result = lookupComponent(env.container, path); + const result = lookupComponent(env.owner, path); return !!(result.component || result.layout); } @@ -88,7 +88,7 @@ function createNestedClosureComponentCell(componentCell, params, hash) { } function createNewClosureComponentCell(env, componentPath, params, hash) { - let positionalParams = getPositionalParams(env.container, componentPath); + let positionalParams = getPositionalParams(env.owner, componentPath); // This needs to be done in each nesting level to avoid raising assertions processPositionalParams(null, positionalParams, params, hash); diff --git a/packages/ember-htmlbars/lib/keywords/collection.js b/packages/ember-htmlbars/lib/keywords/collection.js index a1f8a65719e..fec80ad3b41 100644 --- a/packages/ember-htmlbars/lib/keywords/collection.js +++ b/packages/ember-htmlbars/lib/keywords/collection.js @@ -138,7 +138,7 @@ export default { return assign({}, state, { parentView: env.view, - viewClassOrInstance: getView(read(params[0]), env.container) + viewClassOrInstance: getView(read(params[0]), env.owner) }); }, diff --git a/packages/ember-htmlbars/lib/keywords/outlet.js b/packages/ember-htmlbars/lib/keywords/outlet.js index 7c78b1692a5..5f3dc5255a6 100644 --- a/packages/ember-htmlbars/lib/keywords/outlet.js +++ b/packages/ember-htmlbars/lib/keywords/outlet.js @@ -107,13 +107,13 @@ export default { var parentView = env.view; var outletState = state.outletState; var toRender = outletState.render; - var namespace = env.container.lookup('application:main'); + var namespace = env.owner.lookup('application:main'); var LOG_VIEW_LOOKUPS = get(namespace, 'LOG_VIEW_LOOKUPS'); var ViewClass = outletState.render.ViewClass; if (!state.hasParentOutlet && !ViewClass) { - ViewClass = env.container.lookupFactory('view:toplevel'); + ViewClass = env.owner._lookupFactory('view:toplevel'); } var Component; diff --git a/packages/ember-htmlbars/lib/keywords/view.js b/packages/ember-htmlbars/lib/keywords/view.js index 1aed411156a..5dca82e9360 100644 --- a/packages/ember-htmlbars/lib/keywords/view.js +++ b/packages/ember-htmlbars/lib/keywords/view.js @@ -191,7 +191,7 @@ export default { var targetObject = read(scope.getSelf()); var viewClassOrInstance = state.viewClassOrInstance; if (!viewClassOrInstance) { - viewClassOrInstance = getView(read(params[0]), env.container); + viewClassOrInstance = getView(read(params[0]), env.owner); } // if parentView exists, use its controller (the default @@ -258,17 +258,17 @@ export default { } }; -function getView(viewPath, container) { +function getView(viewPath, owner) { var viewClassOrInstance; if (!viewPath) { - if (container) { - viewClassOrInstance = container.lookupFactory('view:toplevel'); + if (owner) { + viewClassOrInstance = owner._lookupFactory('view:toplevel'); } else { viewClassOrInstance = EmberView; } } else { - viewClassOrInstance = readViewFactory(viewPath, container); + viewClassOrInstance = readViewFactory(viewPath, owner); } return viewClassOrInstance; diff --git a/packages/ember-htmlbars/lib/node-managers/component-node-manager.js b/packages/ember-htmlbars/lib/node-managers/component-node-manager.js index 8f5118369c2..d039646029f 100644 --- a/packages/ember-htmlbars/lib/node-managers/component-node-manager.js +++ b/packages/ember-htmlbars/lib/node-managers/component-node-manager.js @@ -9,6 +9,7 @@ import LegacyEmberComponent from 'ember-views/components/component'; import GlimmerComponent from 'ember-htmlbars/glimmer-component'; import extractPositionalParams from 'ember-htmlbars/utils/extract-positional-params'; import { symbol } from 'ember-metal/utils'; +import { getOwner, setOwner } from 'container/owner'; // These symbols will be used to limit link-to's public API surface area. export let HAS_BLOCK = symbol('HAS_BLOCK'); @@ -232,13 +233,15 @@ export function createComponent(_component, isAngleBracket, props, renderNode, e props._isAngleBracket = true; } - props.renderer = props.parentView ? props.parentView.renderer : env.container.lookup('renderer:-dom'); - props._viewRegistry = props.parentView ? props.parentView._viewRegistry : env.container.lookup('-view-registry:main'); + props.renderer = props.parentView ? props.parentView.renderer : env.owner.lookup('renderer:-dom'); + props._viewRegistry = props.parentView ? props.parentView._viewRegistry : env.owner.lookup('-view-registry:main'); - let component = _component.create(props); + const component = _component.create(props); // for the fallback case - component.container = component.container || env.container; + if (!getOwner(component)) { + setOwner(component, env.owner); + } if (props.parentView) { props.parentView.appendChild(component); diff --git a/packages/ember-htmlbars/lib/node-managers/view-node-manager.js b/packages/ember-htmlbars/lib/node-managers/view-node-manager.js index c8a14ee5184..19136854c41 100644 --- a/packages/ember-htmlbars/lib/node-managers/view-node-manager.js +++ b/packages/ember-htmlbars/lib/node-managers/view-node-manager.js @@ -9,6 +9,7 @@ import { MUTABLE_CELL } from 'ember-views/compat/attrs-proxy'; import getCellOrValue from 'ember-htmlbars/hooks/get-cell-or-value'; import { instrument } from 'ember-htmlbars/system/instrumentation-support'; import { takeLegacySnapshot } from 'ember-htmlbars/node-managers/component-node-manager'; +import { getOwner, setOwner } from 'container/owner'; // In theory this should come through the env, but it should // be safe to import this until we make the hook system public @@ -180,9 +181,12 @@ export function createOrUpdateComponent(component, options, createOptions, rende } mergeBindings(props, snapshot); - props.container = options.parentView ? options.parentView.container : env.container; - props.renderer = options.parentView ? options.parentView.renderer : props.container && props.container.lookup('renderer:-dom'); - props._viewRegistry = options.parentView ? options.parentView._viewRegistry : props.container && props.container.lookup('-view-registry:main'); + + const owner = options.parentView ? getOwner(options.parentView) : env.owner; + + setOwner(props, owner); + props.renderer = options.parentView ? options.parentView.renderer : owner && owner.lookup('renderer:-dom'); + props._viewRegistry = options.parentView ? options.parentView._viewRegistry : owner && owner.lookup('-view-registry:main'); if (proto.controller !== defaultController || hasSuppliedController) { delete props._context; diff --git a/packages/ember-htmlbars/lib/system/lookup-helper.js b/packages/ember-htmlbars/lib/system/lookup-helper.js index 361187f7299..c187c3e5c91 100644 --- a/packages/ember-htmlbars/lib/system/lookup-helper.js +++ b/packages/ember-htmlbars/lib/system/lookup-helper.js @@ -36,11 +36,11 @@ export function findHelper(name, view, env) { var helper = env.helpers[name]; if (!helper) { - var container = env.container; - if (validateLazyHelperName(name, container, env.hooks.keywords)) { + const owner = env.owner; + if (validateLazyHelperName(name, owner, env.hooks.keywords)) { var helperName = 'helper:' + name; - if (container.registry.has(helperName)) { - helper = container.lookupFactory(helperName); + if (owner.hasRegistration(helperName)) { + helper = owner._lookupFactory(helperName); assert(`Expected to find an Ember.Helper with the name ${helperName}, but found an object of type ${typeof helper} instead.`, helper.isHelperFactory || helper.isHelperInstance); } } diff --git a/packages/ember-htmlbars/lib/system/render-env.js b/packages/ember-htmlbars/lib/system/render-env.js index 5e1d664cc87..e5c2bccdec8 100644 --- a/packages/ember-htmlbars/lib/system/render-env.js +++ b/packages/ember-htmlbars/lib/system/render-env.js @@ -1,5 +1,6 @@ import defaultEnv from 'ember-htmlbars/env'; import { MorphSet } from 'ember-metal-views/renderer'; +import { getOwner } from 'container/owner'; export default function RenderEnv(options) { this.lifecycleHooks = options.lifecycleHooks || []; @@ -9,7 +10,7 @@ export default function RenderEnv(options) { this.view = options.view; this.outletState = options.outletState; - this.container = options.container; + this.owner = options.owner; this.renderer = options.renderer; this.dom = options.dom; @@ -23,7 +24,7 @@ RenderEnv.build = function(view) { return new RenderEnv({ view: view, outletState: view.outletState, - container: view.container, + owner: getOwner(view), renderer: view.renderer, dom: view.renderer._dom }); @@ -33,7 +34,7 @@ RenderEnv.prototype.childWithView = function(view) { return new RenderEnv({ view: view, outletState: this.outletState, - container: this.container, + owner: this.owner, renderer: this.renderer, dom: this.dom, lifecycleHooks: this.lifecycleHooks, @@ -47,7 +48,7 @@ RenderEnv.prototype.childWithOutletState = function(outletState, hasParentOutlet return new RenderEnv({ view: this.view, outletState: outletState, - container: this.container, + owner: this.owner, renderer: this.renderer, dom: this.dom, lifecycleHooks: this.lifecycleHooks, diff --git a/packages/ember-htmlbars/lib/utils/is-component.js b/packages/ember-htmlbars/lib/utils/is-component.js index 5ce2b08e26e..6953874b9ad 100644 --- a/packages/ember-htmlbars/lib/utils/is-component.js +++ b/packages/ember-htmlbars/lib/utils/is-component.js @@ -15,8 +15,8 @@ import { isStream } from 'ember-metal/streams/utils'; name was found in the container. */ export default function isComponent(env, scope, path) { - var container = env.container; - if (!container) { return false; } + const owner = env.owner; + if (!owner) { return false; } if (typeof path === 'string') { if (CONTAINS_DOT_CACHE.get(path)) { let stream = env.hooks.get(env, scope, path); @@ -28,7 +28,7 @@ export default function isComponent(env, scope, path) { } } if (!CONTAINS_DASH_CACHE.get(path)) { return false; } - return container.registry.has('component:' + path) || - container.registry.has('template:components/' + path); + return owner.hasRegistration('component:' + path) || + owner.hasRegistration('template:components/' + path); } } diff --git a/packages/ember-htmlbars/tests/compat/view_helper_test.js b/packages/ember-htmlbars/tests/compat/view_helper_test.js index 60780c2586d..6f04796e01c 100644 --- a/packages/ember-htmlbars/tests/compat/view_helper_test.js +++ b/packages/ember-htmlbars/tests/compat/view_helper_test.js @@ -4,7 +4,8 @@ import EmberView from 'ember-views/views/view'; import EmberSelectView from 'ember-views/views/select'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import compile from 'ember-template-compiler/system/compile'; -import Registry from 'container/registry'; +import { OWNER } from 'container/owner'; +import buildOwner from 'container/tests/test-helpers/build-owner'; import { registerAstPlugin, removeAstPlugin } from 'ember-htmlbars/tests/utils'; import AssertNoViewHelper from 'ember-template-compiler/plugins/assert-no-view-helper'; @@ -12,7 +13,7 @@ import AssertNoViewHelper from 'ember-template-compiler/plugins/assert-no-view-h import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; -let component, registry, container, originalViewKeyword; +let component, owner, originalViewKeyword; QUnit.module('ember-htmlbars: compat - view helper', { setup() { @@ -21,15 +22,14 @@ QUnit.module('ember-htmlbars: compat - view helper', { originalViewKeyword = registerKeyword('view', viewKeyword); - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); }, teardown() { runDestroy(component); - runDestroy(container); + runDestroy(owner); removeAstPlugin(AssertNoViewHelper); Ember.ENV._ENABLE_LEGACY_VIEW_SUPPORT = true; - registry = container = component = null; + owner = component = null; resetKeyword('view', originalViewKeyword); } @@ -39,12 +39,12 @@ QUnit.test('using the view helper fails assertion', function(assert) { const ViewClass = EmberView.extend({ template: compile('fooView') }); - registry.register('view:foo', ViewClass); + owner.register('view:foo', ViewClass); expectAssertion(function() { component = EmberComponent.extend({ - layout: compile('{{view \'foo\'}}'), - container + [OWNER]: owner, + layout: compile('{{view \'foo\'}}') }).create(); runAppend(component); @@ -55,13 +55,12 @@ QUnit.module('ember-htmlbars: compat - view helper [LEGACY]', { setup() { originalViewKeyword = registerKeyword('view', viewKeyword); - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); }, teardown() { runDestroy(component); - runDestroy(container); - registry = container = component = null; + runDestroy(owner); + owner = component = null; resetKeyword('view', originalViewKeyword); } @@ -71,12 +70,12 @@ QUnit.test('using the view helper with a string (inline form) fails assertion [L const ViewClass = EmberView.extend({ template: compile('fooView') }); - registry.register('view:foo', ViewClass); + owner.register('view:foo', ViewClass); ignoreAssertion(function() { component = EmberComponent.extend({ - layout: compile('{{view \'foo\'}}'), - container + [OWNER]: owner, + layout: compile('{{view \'foo\'}}') }).create(); runAppend(component); @@ -89,12 +88,12 @@ QUnit.test('using the view helper with a string (block form) fails assertion [LE const ViewClass = EmberView.extend({ template: compile('Foo says: {{yield}}') }); - registry.register('view:foo', ViewClass); + owner.register('view:foo', ViewClass); ignoreAssertion(function() { component = EmberComponent.extend({ - layout: compile('{{#view \'foo\'}}I am foo{{/view}}'), - container + [OWNER]: owner, + layout: compile('{{#view \'foo\'}}I am foo{{/view}}') }).create(); runAppend(component); @@ -104,12 +103,12 @@ QUnit.test('using the view helper with a string (block form) fails assertion [LE }); QUnit.test('using the view helper with string "select" fails assertion [LEGACY]', function(assert) { - registry.register('view:select', EmberSelectView); + owner.register('view:select', EmberSelectView); ignoreAssertion(function() { component = EmberComponent.extend({ - layout: compile('{{view \'select\'}}'), - container + [OWNER]: owner, + layout: compile('{{view \'select\'}}') }).create(); runAppend(component); diff --git a/packages/ember-htmlbars/tests/glimmer-component/render-test.js b/packages/ember-htmlbars/tests/glimmer-component/render-test.js index 3bad1fd3cad..204e37b91be 100644 --- a/packages/ember-htmlbars/tests/glimmer-component/render-test.js +++ b/packages/ember-htmlbars/tests/glimmer-component/render-test.js @@ -1,10 +1,11 @@ -import Registry from 'container/registry'; import View from 'ember-views/views/view'; import GlimmerComponent from 'ember-htmlbars/glimmer-component'; import compile from 'ember-template-compiler/system/compile'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import ComponentLookup from 'ember-views/component_lookup'; import isEnabled from 'ember-metal/features'; +import { OWNER } from 'container/owner'; +import buildOwner from 'container/tests/test-helpers/build-owner'; let view; @@ -47,12 +48,12 @@ function renderComponent(tag, component) { .map(key => `${key}=${hash[key]}`) .join(' '); - let registry = new Registry(); - registry.register('component-lookup:main', ComponentLookup); - registry.register(`component:${tag}`, implementation); + const owner = buildOwner(); + owner.register('component-lookup:main', ComponentLookup); + owner.register(`component:${tag}`, implementation); view = View.extend({ - container: registry.container(), + [OWNER]: owner, template: compile(`<${tag} ${stringParams} ${stringHash}>${yielded}`) }).create(); diff --git a/packages/ember-htmlbars/tests/helpers/closure_component_test.js b/packages/ember-htmlbars/tests/helpers/closure_component_test.js index f2c6201d8fa..5b3c37ef7e9 100644 --- a/packages/ember-htmlbars/tests/helpers/closure_component_test.js +++ b/packages/ember-htmlbars/tests/helpers/closure_component_test.js @@ -1,39 +1,42 @@ -import Registry from 'container/registry'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import ComponentLookup from 'ember-views/component_lookup'; import Component from 'ember-views/components/component'; import compile from 'ember-template-compiler/system/compile'; import run from 'ember-metal/run_loop'; import isEnabled from 'ember-metal/features'; +import { OWNER } from 'container/owner'; +import buildOwner from 'container/tests/test-helpers/build-owner'; -let component, registry, container; +let component, owner; if (isEnabled('ember-contextual-components')) { QUnit.module('ember-htmlbars: closure component helper', { setup() { - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); - registry.optionsForType('template', { instantiate: false }); - registry.register('component-lookup:main', ComponentLookup); + owner.registerOptionsForType('template', { instantiate: false }); + owner.register('component-lookup:main', ComponentLookup); }, teardown() { runDestroy(component); - runDestroy(container); - registry = container = component = null; + runDestroy(owner); + owner = component = null; } }); QUnit.test('renders with component helper', function() { let expectedText = 'Hodi'; - registry.register( + owner.register( 'template:components/-looked-up', compile(expectedText) ); let template = compile('{{component (component "-looked-up")}}'); - component = Component.extend({ container, template }).create(); + component = Component.extend({ + [OWNER]: owner, + template + }).create(); runAppend(component); equal(component.$().text(), expectedText, '-looked-up component rendered'); @@ -44,11 +47,11 @@ if (isEnabled('ember-contextual-components')) { LookedUp.reopenClass({ positionalParams: ['name'] }); - registry.register( + owner.register( 'component:-looked-up', LookedUp ); - registry.register( + owner.register( 'template:components/-looked-up', compile(`{{greeting}} {{name}}`) ); @@ -56,7 +59,10 @@ if (isEnabled('ember-contextual-components')) { let template = compile( `{{component (component "-looked-up") "Hodari" greeting="Hodi"}}` ); - component = Component.extend({ container, template }).create(); + component = Component.extend({ + [OWNER]: owner, + template + }).create(); runAppend(component); equal(component.$().text(), 'Hodi Hodari', '-looked-up component rendered'); @@ -67,11 +73,11 @@ if (isEnabled('ember-contextual-components')) { LookedUp.reopenClass({ positionalParams: ['name'] }); - registry.register( + owner.register( 'component:-looked-up', LookedUp ); - registry.register( + owner.register( 'template:components/-looked-up', compile(`{{greeting}} {{name}}`) ); @@ -79,7 +85,10 @@ if (isEnabled('ember-contextual-components')) { let template = compile( `{{component (component "-looked-up" "Hodari" greeting="Hodi") greeting="Hola"}}` ); - component = Component.extend({ container, template }).create(); + component = Component.extend({ + [OWNER]: owner, + template + }).create(); runAppend(component); equal(component.$().text(), 'Hola Hodari', '-looked-up component rendered'); @@ -87,22 +96,22 @@ if (isEnabled('ember-contextual-components')) { QUnit.test('updates when component path is bound', function() { let Mandarin = Component.extend(); - registry.register( + owner.register( 'component:-mandarin', Mandarin ); - registry.register( + owner.register( 'template:components/-mandarin', compile(`ni hao`) ); - registry.register( + owner.register( 'template:components/-hindi', compile(`Namaste`) ); let template = compile('{{component (component lookupComponent)}}'); component = Component.extend({ - container, + [OWNER]: owner, template, lookupComponent: '-mandarin' }).create(); @@ -119,7 +128,7 @@ if (isEnabled('ember-contextual-components')) { }); QUnit.test('updates when curried hash argument is bound', function() { - registry.register( + owner.register( 'template:components/-looked-up', compile(`{{greeting}}`) ); @@ -127,7 +136,11 @@ if (isEnabled('ember-contextual-components')) { let template = compile( `{{component (component "-looked-up" greeting=greeting)}}` ); - component = Component.extend({ container, template }).create(); + + component = Component.extend({ + [OWNER]: owner, + template + }).create(); runAppend(component); equal(component.$().text(), '', '-looked-up component rendered'); @@ -143,11 +156,11 @@ if (isEnabled('ember-contextual-components')) { LookedUp.reopenClass({ positionalParams: ['name', 'age'] }); - registry.register( + owner.register( 'component:-looked-up', LookedUp ); - registry.register( + owner.register( 'template:components/-looked-up', compile(`{{name}} {{age}}`) ); @@ -158,14 +171,18 @@ if (isEnabled('ember-contextual-components')) { "Marvin" 21) "Hodari"}}` ); - component = Component.extend({ container, template }).create(); + + component = Component.extend({ + [OWNER]: owner, + template + }).create(); runAppend(component); equal(component.$().text(), 'Hodari 21', '-looked-up component rendered'); }); QUnit.test('nested components overwrites hash parameters', function() { - registry.register( + owner.register( 'template:components/-looked-up', compile(`{{greeting}} {{name}} {{age}}`) ); @@ -176,7 +193,12 @@ if (isEnabled('ember-contextual-components')) { greeting="Hej" name="Sigmundur") greeting=greeting}}` ); - component = Component.extend({ container, template, greeting: 'Hodi' }).create(); + + component = Component.extend({ + [OWNER]: owner, + template, + greeting: 'Hodi' + }).create(); runAppend(component); @@ -188,11 +210,11 @@ if (isEnabled('ember-contextual-components')) { InnerComponent.reopenClass({ positionalParams: ['comp'] }); - registry.register( + owner.register( 'component:-inner-component', InnerComponent ); - registry.register( + owner.register( 'template:components/-inner-component', compile(`{{component comp "Inner"}}`) ); @@ -201,11 +223,11 @@ if (isEnabled('ember-contextual-components')) { LookedUp.reopenClass({ positionalParams: ['name', 'age'] }); - registry.register( + owner.register( 'component:-looked-up', LookedUp ); - registry.register( + owner.register( 'template:components/-looked-up', compile(`{{name}} {{age}}`) ); @@ -214,7 +236,7 @@ if (isEnabled('ember-contextual-components')) { `{{component "-inner-component" (component "-looked-up" outerName outerAge)}}` ); component = Component.extend({ - container, + [OWNER]: owner, template, outerName: 'Outer', outerAge: 28 @@ -229,11 +251,11 @@ if (isEnabled('ember-contextual-components')) { InnerComponent.reopenClass({ positionalParams: ['comp'] }); - registry.register( + owner.register( 'component:-inner-component', InnerComponent ); - registry.register( + owner.register( 'template:components/-inner-component', compile(`{{component comp name="Inner"}}`) ); @@ -241,11 +263,11 @@ if (isEnabled('ember-contextual-components')) { let LookedUp = Component.extend(); LookedUp.reopenClass({ }); - registry.register( + owner.register( 'component:-looked-up', LookedUp ); - registry.register( + owner.register( 'template:components/-looked-up', compile(`{{name}} {{age}}`) ); @@ -254,7 +276,7 @@ if (isEnabled('ember-contextual-components')) { `{{component "-inner-component" (component "-looked-up" name=outerName age=outerAge)}}` ); component = Component.extend({ - container, + [OWNER]: owner, template, outerName: 'Outer', outerAge: 28 @@ -269,11 +291,11 @@ if (isEnabled('ember-contextual-components')) { LookedUp.reopenClass({ positionalParams: ['name'] }); - registry.register( + owner.register( 'component:-looked-up', LookedUp ); - registry.register( + owner.register( 'template:components/-looked-up', compile(`{{greeting}} {{name}}`) ); @@ -281,7 +303,10 @@ if (isEnabled('ember-contextual-components')) { let template = compile( `{{component (component "-looked-up" "Hodari" name="Sergio") "Hodari" greeting="Hodi"}}` ); - component = Component.extend({ container, template }).create(); + component = Component.extend({ + [OWNER]: owner, + template + }).create(); expectAssertion(function() { runAppend(component); @@ -293,11 +318,11 @@ if (isEnabled('ember-contextual-components')) { LookedUp.reopenClass({ positionalParams: ['name'] }); - registry.register( + owner.register( 'component:-looked-up', LookedUp ); - registry.register( + owner.register( 'template:components/-looked-up', compile(`{{greeting}} {{name}}`) ); @@ -305,7 +330,10 @@ if (isEnabled('ember-contextual-components')) { let template = compile( `{{component (component "-looked-up" "Hodari") name="Sergio" greeting="Hodi"}}` ); - component = Component.extend({ container, template }).create(); + component = Component.extend({ + [OWNER]: owner, + template + }).create(); runAppend(component); equal(component.$().text(), 'Hodi Sergio', 'component is rendered'); @@ -313,7 +341,10 @@ if (isEnabled('ember-contextual-components')) { QUnit.test('raises an assertion when component path is null', function() { let template = compile(`{{component (component lookupComponent)}}`); - component = Component.extend({ container, template }).create(); + component = Component.extend({ + [OWNER]: owner, + template + }).create(); expectAssertion(() => { runAppend(component); @@ -322,7 +353,10 @@ if (isEnabled('ember-contextual-components')) { QUnit.test('raises an assertion when component path is not a component name', function() { let template = compile(`{{component (component "not-a-component")}}`); - component = Component.extend({ container, template }).create(); + component = Component.extend({ + [OWNER]: owner, + template + }).create(); expectAssertion(() => { runAppend(component); @@ -330,7 +364,7 @@ if (isEnabled('ember-contextual-components')) { template = compile(`{{component (component compName)}}`); component = Component.extend({ - container, + [OWNER]: owner, template, compName: 'not-a-component' }).create(); @@ -342,13 +376,16 @@ if (isEnabled('ember-contextual-components')) { QUnit.test('renders with dot path', function() { let expectedText = 'Hodi'; - registry.register( + owner.register( 'template:components/-looked-up', compile(expectedText) ); let template = compile('{{#with (hash lookedup=(component "-looked-up")) as |object|}}{{object.lookedup}}{{/with}}'); - component = Component.extend({ container, template }).create(); + component = Component.extend({ + [OWNER]: owner, + template + }).create(); runAppend(component); equal(component.$().text(), expectedText, '-looked-up component rendered'); @@ -356,13 +393,16 @@ if (isEnabled('ember-contextual-components')) { QUnit.test('renders with dot path and attr', function() { let expectedText = 'Hodi'; - registry.register( + owner.register( 'template:components/-looked-up', compile('{{expectedText}}') ); let template = compile('{{#with (hash lookedup=(component "-looked-up")) as |object|}}{{object.lookedup expectedText=expectedText}}{{/with}}'); - component = Component.extend({ container, template }).create({ + component = Component.extend({ + [OWNER]: owner, + template + }).create({ expectedText }); @@ -372,13 +412,16 @@ if (isEnabled('ember-contextual-components')) { QUnit.test('renders with dot path curried over attr', function() { let expectedText = 'Hodi'; - registry.register( + owner.register( 'template:components/-looked-up', compile('{{expectedText}}') ); let template = compile('{{#with (hash lookedup=(component "-looked-up" expectedText=expectedText)) as |object|}}{{object.lookedup}}{{/with}}'); - component = Component.extend({ container, template }).create({ + component = Component.extend({ + [OWNER]: owner, + template + }).create({ expectedText }); @@ -387,12 +430,12 @@ if (isEnabled('ember-contextual-components')) { }); QUnit.test('adding parameters to a closure component\'s instance does not add it to other instances', function(assert) { - registry.register( + owner.register( 'template:components/select-box', compile('{{yield (hash option=(component "select-box-option"))}}') ); - registry.register( + owner.register( 'template:components/select-box-option', compile('{{label}}') ); @@ -401,7 +444,10 @@ if (isEnabled('ember-contextual-components')) { '{{#select-box as |sb|}}{{sb.option label="Foo"}}{{sb.option}}{{/select-box}}' ); - component = Component.extend({ container, template }).create(); + component = Component.extend({ + [OWNER]: owner, + template + }).create(); runAppend(component); equal(component.$().text(), 'Foo', 'there is only one Foo'); diff --git a/packages/ember-htmlbars/tests/helpers/collection_test.js b/packages/ember-htmlbars/tests/helpers/collection_test.js index 54a0547f4fc..8c02552c79c 100644 --- a/packages/ember-htmlbars/tests/helpers/collection_test.js +++ b/packages/ember-htmlbars/tests/helpers/collection_test.js @@ -6,7 +6,6 @@ import { computed } from 'ember-metal/computed'; import EmberObject from 'ember-runtime/system/object'; import ArrayProxy from 'ember-runtime/system/array_proxy'; import Namespace from 'ember-runtime/system/namespace'; -import { Registry } from 'ember-runtime/system/container'; import { A as emberA } from 'ember-runtime/system/native_array'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import CollectionView from 'ember-views/views/collection_view'; @@ -14,6 +13,9 @@ import EmberView from 'ember-views/views/view'; import jQuery from 'ember-views/system/jquery'; import compile from 'ember-template-compiler/system/compile'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; + import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; @@ -22,7 +24,7 @@ var trim = jQuery.trim; var view; var originalLookup = Ember.lookup; -var TemplateTests, registry, container, lookup, originalViewKeyword; +var TemplateTests, owner, lookup, originalViewKeyword; function nthChild(view, nth) { @@ -41,17 +43,16 @@ QUnit.module('collection helper [LEGACY]', { Ember.lookup = lookup = {}; lookup.TemplateTests = TemplateTests = Namespace.create(); - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); - registry.optionsForType('template', { instantiate: false }); - registry.register('view:toplevel', EmberView.extend()); + owner.registerOptionsForType('template', { instantiate: false }); + owner.register('view:toplevel', EmberView.extend()); }, teardown() { - runDestroy(container); + runDestroy(owner); runDestroy(view); - registry = container = view = null; + owner = view = null; Ember.lookup = lookup = originalLookup; TemplateTests = null; @@ -101,12 +102,12 @@ QUnit.test('itemViewClass works in the #collection helper with a property', func }); QUnit.test('itemViewClass works in the #collection via container', function() { - registry.register('view:example-item', EmberView.extend({ + owner.register('view:example-item', EmberView.extend({ isAlsoCustom: true })); view = EmberView.create({ - container: container, + [OWNER]: owner, exampleCollectionView: CollectionView.extend(), exampleController: ArrayProxy.create({ content: emberA(['alpha']) @@ -137,18 +138,15 @@ QUnit.test('passing a block to the collection helper sets it as the template for }); QUnit.test('collection helper should try to use container to resolve view', function() { - var registry = new Registry(); - var container = registry.container(); - var ACollectionView = CollectionView.extend({ tagName: 'ul', content: emberA(['foo', 'bar', 'baz']) }); - registry.register('view:collectionTest', ACollectionView); + owner.register('view:collectionTest', ACollectionView); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{#collection "collectionTest"}} {{/collection}}') }); @@ -204,7 +202,6 @@ QUnit.test('empty views should be removed when content is added to the collectio }); QUnit.test('should be able to specify which class should be used for the empty view', function() { - var registry = new Registry(); var App; run(function() { @@ -215,10 +212,10 @@ QUnit.test('should be able to specify which class should be used for the empty v template: compile('This is an empty view') }); - registry.register('view:empty-view', EmptyView); + owner.register('view:empty-view', EmptyView); view = EmberView.create({ - container: registry.container(), + [OWNER]: owner, template: compile('{{collection emptyViewClass="empty-view"}}') }); @@ -361,20 +358,18 @@ QUnit.test('should give its item views the class specified by itemClass binding' }); QUnit.test('should give its item views the property specified by itemProperty', function() { - var registry = new Registry(); - var ItemPropertyBindingTestItemView = EmberView.extend({ tagName: 'li' }); - registry.register('view:item-property-binding-test-item-view', ItemPropertyBindingTestItemView); + owner.register('view:item-property-binding-test-item-view', ItemPropertyBindingTestItemView); // Use preserveContext=false so the itemView handlebars context is the view context // Set itemView bindings using item* view = EmberView.create({ + [OWNER]: owner, baz: 'baz', content: emberA([EmberObject.create(), EmberObject.create(), EmberObject.create()]), - container: registry.container(), template: compile('{{#collection content=view.content tagName="ul" itemViewClass="item-property-binding-test-item-view" itemProperty=view.baz preserveContext=false}}{{view.property}}{{/collection}}') }); @@ -511,20 +506,18 @@ QUnit.test('itemClassNames adds classes to items', function() { }); QUnit.test('should render nested collections', function() { - var registry = new Registry(); - var container = registry.container(); - registry.register('view:inner-list', CollectionView.extend({ + owner.register('view:inner-list', CollectionView.extend({ tagName: 'ul', content: emberA(['one', 'two', 'three']) })); - registry.register('view:outer-list', CollectionView.extend({ + owner.register('view:outer-list', CollectionView.extend({ tagName: 'ul', content: emberA(['foo']) })); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{#collection "outer-list" class="outer"}}{{content}}{{#collection "inner-list" class="inner"}}{{content}}{{/collection}}{{/collection}}') }); @@ -628,21 +621,18 @@ QUnit.test('should allow view objects to be swapped out without throwing an erro QUnit.test('context should be content', function() { var view; - registry = new Registry(); - container = registry.container(); - var items = emberA([ EmberObject.create({ name: 'Dave' }), EmberObject.create({ name: 'Mary' }), EmberObject.create({ name: 'Sara' }) ]); - registry.register('view:an-item', EmberView.extend({ + owner.register('view:an-item', EmberView.extend({ template: compile('Greetings {{name}}') })); view = EmberView.create({ - container: container, + [OWNER]: owner, controller: { items: items }, diff --git a/packages/ember-htmlbars/tests/helpers/component_test.js b/packages/ember-htmlbars/tests/helpers/component_test.js index e9edc3bf0c1..8c140ed52c6 100644 --- a/packages/ember-htmlbars/tests/helpers/component_test.js +++ b/packages/ember-htmlbars/tests/helpers/component_test.js @@ -2,52 +2,52 @@ import Controller from 'ember-runtime/controllers/controller'; import { set } from 'ember-metal/property_set'; import { get } from 'ember-metal/property_get'; import run from 'ember-metal/run_loop'; -import Registry from 'container/registry'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import ComponentLookup from 'ember-views/component_lookup'; import EmberView from 'ember-views/views/view'; import Component from 'ember-views/components/component'; import compile from 'ember-template-compiler/system/compile'; import computed from 'ember-metal/computed'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var view, registry, container; +var view, owner; QUnit.module('ember-htmlbars: {{#component}} helper', { setup() { - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); - registry.optionsForType('template', { instantiate: false }); - registry.register('component-lookup:main', ComponentLookup); + owner.registerOptionsForType('template', { instantiate: false }); + owner.register('component-lookup:main', ComponentLookup); }, teardown() { runDestroy(view); - runDestroy(container); - registry = container = view = null; + runDestroy(owner); + owner = view = null; } }); QUnit.test('component helper with bound properties are updating correctly in init of component', function() { - registry.register('component:foo-bar', Component.extend({ + owner.register('component:foo-bar', Component.extend({ init: function() { this._super(...arguments); equal(get(this, 'location'), 'Caracas', 'location is bound on init'); } })); - registry.register('component:baz-qux', Component.extend({ + owner.register('component:baz-qux', Component.extend({ init: function() { this._super(...arguments); equal(get(this, 'location'), 'Loisaida', 'location is bound on init'); } })); - registry.register('template:components/foo-bar', compile('yippie! {{location}} {{yield}}')); - registry.register('template:components/baz-qux', compile('yummy {{location}} {{yield}}')); + owner.register('template:components/foo-bar', compile('yippie! {{location}} {{yield}}')); + owner.register('template:components/baz-qux', compile('yummy {{location}} {{yield}}')); view = EmberView.extend({ - container: container, + [OWNER]: owner, dynamicComponent: computed('location', function() { var location = get(this, 'location'); @@ -76,11 +76,11 @@ QUnit.test('component helper with bound properties are updating correctly in ini }); QUnit.test('component helper with unquoted string is bound', function() { - registry.register('template:components/foo-bar', compile('yippie! {{attrs.location}} {{yield}}')); - registry.register('template:components/baz-qux', compile('yummy {{attrs.location}} {{yield}}')); + owner.register('template:components/foo-bar', compile('yippie! {{attrs.location}} {{yield}}')); + owner.register('template:components/baz-qux', compile('yummy {{attrs.location}} {{yield}}')); view = EmberView.create({ - container: container, + [OWNER]: owner, dynamicComponent: 'foo-bar', location: 'Caracas', template: compile('{{#component view.dynamicComponent location=view.location}}arepas!{{/component}}') @@ -99,7 +99,7 @@ QUnit.test('component helper with unquoted string is bound', function() { QUnit.test('component helper destroys underlying component when it is swapped out', function() { var currentComponent; var destroyCalls = 0; - registry.register('component:foo-bar', Component.extend({ + owner.register('component:foo-bar', Component.extend({ init() { this._super(...arguments); currentComponent = 'foo-bar'; @@ -108,7 +108,7 @@ QUnit.test('component helper destroys underlying component when it is swapped ou destroyCalls++; } })); - registry.register('component:baz-qux', Component.extend({ + owner.register('component:baz-qux', Component.extend({ init() { this._super(...arguments); currentComponent = 'baz-qux'; @@ -119,7 +119,7 @@ QUnit.test('component helper destroys underlying component when it is swapped ou })); view = EmberView.create({ - container: container, + [OWNER]: owner, dynamicComponent: 'foo-bar', template: compile('{{component view.dynamicComponent}}') }); @@ -145,8 +145,8 @@ QUnit.test('component helper destroys underlying component when it is swapped ou }); QUnit.test('component helper with actions', function() { - registry.register('template:components/foo-bar', compile('yippie! {{yield}}')); - registry.register('component:foo-bar', Component.extend({ + owner.register('template:components/foo-bar', compile('yippie! {{yield}}')); + owner.register('component:foo-bar', Component.extend({ classNames: 'foo-bar', didInsertElement() { // trigger action on click in absence of app's EventDispatcher @@ -170,7 +170,7 @@ QUnit.test('component helper with actions', function() { } }).create(); view = EmberView.create({ - container: container, + [OWNER]: owner, controller: controller, template: compile('{{#component dynamicComponent fooBarred="mappedAction"}}arepas!{{/component}}') }); @@ -183,16 +183,16 @@ QUnit.test('component helper with actions', function() { }); QUnit.test('component helper maintains expected logical parentView', function() { - registry.register('template:components/foo-bar', compile('yippie! {{yield}}')); + owner.register('template:components/foo-bar', compile('yippie! {{yield}}')); var componentInstance; - registry.register('component:foo-bar', Component.extend({ + owner.register('component:foo-bar', Component.extend({ didInsertElement() { componentInstance = this; } })); view = EmberView.create({ - container: container, + [OWNER]: owner, dynamicComponent: 'foo-bar', template: compile('{{#component view.dynamicComponent}}arepas!{{/component}}') }); @@ -202,12 +202,12 @@ QUnit.test('component helper maintains expected logical parentView', function() }); QUnit.test('nested component helpers', function() { - registry.register('template:components/foo-bar', compile('yippie! {{attrs.location}} {{yield}}')); - registry.register('template:components/baz-qux', compile('yummy {{attrs.location}} {{yield}}')); - registry.register('template:components/corge-grault', compile('delicious {{attrs.location}} {{yield}}')); + owner.register('template:components/foo-bar', compile('yippie! {{attrs.location}} {{yield}}')); + owner.register('template:components/baz-qux', compile('yummy {{attrs.location}} {{yield}}')); + owner.register('template:components/corge-grault', compile('delicious {{attrs.location}} {{yield}}')); view = EmberView.create({ - container: container, + [OWNER]: owner, dynamicComponent1: 'foo-bar', dynamicComponent2: 'baz-qux', location: 'Caracas', @@ -225,10 +225,10 @@ QUnit.test('nested component helpers', function() { }); QUnit.test('component helper can be used with a quoted string (though you probably would not do this)', function() { - registry.register('template:components/foo-bar', compile('yippie! {{attrs.location}} {{yield}}')); + owner.register('template:components/foo-bar', compile('yippie! {{attrs.location}} {{yield}}')); view = EmberView.create({ - container: container, + [OWNER]: owner, location: 'Caracas', template: compile('{{#component "foo-bar" location=view.location}}arepas!{{/component}}') }); @@ -240,7 +240,7 @@ QUnit.test('component helper can be used with a quoted string (though you probab QUnit.test('component with unquoted param resolving to non-existent component', function() { view = EmberView.create({ - container: container, + [OWNER]: owner, dynamicComponent: 'does-not-exist', location: 'Caracas', template: compile('{{#component view.dynamicComponent location=view.location}}arepas!{{/component}}') @@ -252,9 +252,9 @@ QUnit.test('component with unquoted param resolving to non-existent component', }); QUnit.test('component with unquoted param resolving to a component, then non-existent component', function() { - registry.register('template:components/foo-bar', compile('yippie! {{attrs.location}} {{yield}}')); + owner.register('template:components/foo-bar', compile('yippie! {{attrs.location}} {{yield}}')); view = EmberView.create({ - container: container, + [OWNER]: owner, dynamicComponent: 'foo-bar', location: 'Caracas', template: compile('{{#component view.dynamicComponent location=view.location}}arepas!{{/component}}') @@ -273,7 +273,7 @@ QUnit.test('component with unquoted param resolving to a component, then non-exi QUnit.test('component with quoted param for non-existent component', function() { view = EmberView.create({ - container: container, + [OWNER]: owner, location: 'Caracas', template: compile('{{#component "does-not-exist" location=view.location}}arepas!{{/component}}') }); @@ -284,17 +284,17 @@ QUnit.test('component with quoted param for non-existent component', function() }); QUnit.test('component helper properly invalidates hash params inside an {{each}} invocation #11044', function() { - registry.register('component:foo-bar', Component.extend({ + owner.register('component:foo-bar', Component.extend({ willRender() { // store internally available name to ensure that the name available in `this.attrs.name` // matches the template lookup name set(this, 'internalName', this.attrs.name); } })); - registry.register('template:components/foo-bar', compile('{{internalName}} - {{attrs.name}}|')); + owner.register('template:components/foo-bar', compile('{{internalName}} - {{attrs.name}}|')); view = EmberView.create({ - container: container, + [OWNER]: owner, items: [ { name: 'Robert' }, { name: 'Jacquie' } @@ -317,11 +317,11 @@ QUnit.test('component helper properly invalidates hash params inside an {{each}} QUnit.test('dashless components should not be found', function() { expect(1); - registry.register('template:components/dashless', compile('Do not render me!')); + owner.register('template:components/dashless', compile('Do not render me!')); view = EmberView.extend({ - template: compile('{{component "dashless"}}'), - container: container + [OWNER]: owner, + template: compile('{{component "dashless"}}') }).create(); expectAssertion(function() { diff --git a/packages/ember-htmlbars/tests/helpers/concat-test.js b/packages/ember-htmlbars/tests/helpers/concat-test.js index 4a51597e801..98b88e228cd 100644 --- a/packages/ember-htmlbars/tests/helpers/concat-test.js +++ b/packages/ember-htmlbars/tests/helpers/concat-test.js @@ -1,30 +1,29 @@ import run from 'ember-metal/run_loop'; -import { Registry } from 'ember-runtime/system/container'; import Component from 'ember-views/components/component'; import compile from 'ember-template-compiler/system/compile'; import { helper as makeHelper } from 'ember-htmlbars/helper'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var component, registry, container; +var component, owner; QUnit.module('ember-htmlbars: {{concat}} helper', { setup() { - registry = new Registry(); - container = registry.container(); - registry.optionsForType('helper', { instantiate: false }); + owner = buildOwner(); + owner.registerOptionsForType('helper', { instantiate: false }); }, teardown() { - runDestroy(container); + runDestroy(owner); runDestroy(component); } }); QUnit.test('concats provided params', function() { component = Component.create({ - container, - + [OWNER]: owner, layout: compile(`{{concat "foo" " " "bar" " " "baz"}}`) }); @@ -35,11 +34,9 @@ QUnit.test('concats provided params', function() { QUnit.test('updates for bound params', function() { component = Component.create({ - container, - + [OWNER]: owner, firstParam: 'one', secondParam: 'two', - layout: compile(`{{concat firstParam secondParam}}`) }); @@ -64,11 +61,10 @@ QUnit.test('can be used as a sub-expression', function() { function eq([ actual, expected ]) { return actual === expected; } - registry.register('helper:x-eq', makeHelper(eq)); + owner.register('helper:x-eq', makeHelper(eq)); component = Component.create({ - container, - + [OWNER]: owner, firstParam: 'one', secondParam: 'two', diff --git a/packages/ember-htmlbars/tests/helpers/custom_helper_test.js b/packages/ember-htmlbars/tests/helpers/custom_helper_test.js index 3dd0d75c7c7..54f223809b7 100644 --- a/packages/ember-htmlbars/tests/helpers/custom_helper_test.js +++ b/packages/ember-htmlbars/tests/helpers/custom_helper_test.js @@ -2,24 +2,24 @@ import Component from 'ember-views/components/component'; import Helper, { helper as makeHelper } from 'ember-htmlbars/helper'; import compile from 'ember-template-compiler/system/compile'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; -import Registry from 'container/registry'; import run from 'ember-metal/run_loop'; import ComponentLookup from 'ember-views/component_lookup'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -let registry, container, component; +let owner, component; QUnit.module('ember-htmlbars: custom app helpers', { setup() { - registry = new Registry(); - registry.optionsForType('template', { instantiate: false }); - registry.optionsForType('helper', { singleton: false }); - container = registry.container(); + owner = buildOwner(); + owner.registerOptionsForType('template', { instantiate: false }); + owner.registerOptionsForType('helper', { singleton: false }); }, teardown() { runDestroy(component); - runDestroy(container); - registry = container = component = null; + runDestroy(owner); + owner = component = null; } }); @@ -27,9 +27,9 @@ QUnit.test('dashed shorthand helper is resolved from container', function() { var HelloWorld = makeHelper(function() { return 'hello world'; }); - registry.register('helper:hello-world', HelloWorld); + owner.register('helper:hello-world', HelloWorld); component = Component.extend({ - container, + [OWNER]: owner, layout: compile('{{hello-world}}') }).create(); @@ -43,9 +43,9 @@ QUnit.test('dashed helper is resolved from container', function() { return 'hello world'; } }); - registry.register('helper:hello-world', HelloWorld); + owner.register('helper:hello-world', HelloWorld); component = Component.extend({ - container, + [OWNER]: owner, layout: compile('{{hello-world}}') }).create(); @@ -70,9 +70,9 @@ QUnit.test('dashed helper can recompute a new value', function() { this._super(); } }); - registry.register('helper:hello-world', HelloWorld); + owner.register('helper:hello-world', HelloWorld); component = Component.extend({ - container, + [OWNER]: owner, layout: compile('{{hello-world}}') }).create(); @@ -102,9 +102,9 @@ QUnit.test('dashed helper with arg can recompute a new value', function() { this._super(); } }); - registry.register('helper:hello-world', HelloWorld); + owner.register('helper:hello-world', HelloWorld); component = Component.extend({ - container, + [OWNER]: owner, layout: compile('{{hello-world "whut"}}') }).create(); @@ -122,9 +122,9 @@ QUnit.test('dashed shorthand helper is called for param changes', function() { var HelloWorld = makeHelper(function() { return ++count; }); - registry.register('helper:hello-world', HelloWorld); + owner.register('helper:hello-world', HelloWorld); component = Component.extend({ - container, + [OWNER]: owner, name: 'bob', layout: compile('{{hello-world name}}') }).create(); @@ -151,9 +151,9 @@ QUnit.test('dashed helper compute is called for param changes', function() { return ++count; } }); - registry.register('helper:hello-world', HelloWorld); + owner.register('helper:hello-world', HelloWorld); component = Component.extend({ - container, + [OWNER]: owner, name: 'bob', layout: compile('{{hello-world name}}') }).create(); @@ -173,9 +173,9 @@ QUnit.test('dashed shorthand helper receives params, hash', function() { params = _params; hash = _hash; }); - registry.register('helper:hello-world', HelloWorld); + owner.register('helper:hello-world', HelloWorld); component = Component.extend({ - container, + [OWNER]: owner, name: 'bob', layout: compile('{{hello-world name "rich" last="sam"}}') }).create(); @@ -195,9 +195,9 @@ QUnit.test('dashed helper receives params, hash', function() { hash = _hash; } }); - registry.register('helper:hello-world', HelloWorld); + owner.register('helper:hello-world', HelloWorld); component = Component.extend({ - container, + [OWNER]: owner, name: 'bob', layout: compile('{{hello-world name "rich" last="sam"}}') }).create(); @@ -215,9 +215,9 @@ QUnit.test('dashed helper usable in subexpressions', function() { return params.join(' '); } }); - registry.register('helper:join-words', JoinWords); + owner.register('helper:join-words', JoinWords); component = Component.extend({ - container, + [OWNER]: owner, layout: compile( `{{join-words "Who" (join-words "overcomes" "by") @@ -234,9 +234,9 @@ QUnit.test('dashed helper usable in subexpressions', function() { QUnit.test('dashed helper not usable with a block', function() { var SomeHelper = makeHelper(function() {}); - registry.register('helper:some-helper', SomeHelper); + owner.register('helper:some-helper', SomeHelper); component = Component.extend({ - container, + [OWNER]: owner, layout: compile(`{{#some-helper}}{{/some-helper}}`) }).create(); @@ -247,9 +247,9 @@ QUnit.test('dashed helper not usable with a block', function() { QUnit.test('dashed helper not usable within element', function() { var SomeHelper = makeHelper(function() {}); - registry.register('helper:some-helper', SomeHelper); + owner.register('helper:some-helper', SomeHelper); component = Component.extend({ - container, + [OWNER]: owner, layout: compile(`
`) }).create(); @@ -269,9 +269,9 @@ QUnit.test('dashed helper is torn down', function() { return 'must define a compute'; } }); - registry.register('helper:some-helper', SomeHelper); + owner.register('helper:some-helper', SomeHelper); component = Component.extend({ - container, + [OWNER]: owner, layout: compile(`{{some-helper}}`) }).create(); @@ -298,10 +298,10 @@ QUnit.test('dashed helper used in subexpression can recompute', function() { return params.join(' '); } }); - registry.register('helper:dynamic-segment', DynamicSegment); - registry.register('helper:join-words', JoinWords); + owner.register('helper:dynamic-segment', DynamicSegment); + owner.register('helper:join-words', JoinWords); component = Component.extend({ - container, + [OWNER]: owner, layout: compile( `{{join-words "Who" (dynamic-segment) @@ -341,14 +341,14 @@ QUnit.test('dashed helper used in subexpression can recompute component', functi return params.join(' '); } }); - registry.register('component-lookup:main', ComponentLookup); - registry.register('component:some-component', Component.extend({ + owner.register('component-lookup:main', ComponentLookup); + owner.register('component:some-component', Component.extend({ layout: compile('{{first}} {{second}} {{third}} {{fourth}} {{fifth}}') })); - registry.register('helper:dynamic-segment', DynamicSegment); - registry.register('helper:join-words', JoinWords); + owner.register('helper:dynamic-segment', DynamicSegment); + owner.register('helper:join-words', JoinWords); component = Component.extend({ - container, + [OWNER]: owner, layout: compile( `{{some-component first="Who" second=(dynamic-segment) @@ -386,10 +386,10 @@ QUnit.test('dashed helper used in subexpression is destroyed', function() { var JoinWords = makeHelper(function(params) { return params.join(' '); }); - registry.register('helper:dynamic-segment', DynamicSegment); - registry.register('helper:join-words', JoinWords); + owner.register('helper:dynamic-segment', DynamicSegment); + owner.register('helper:join-words', JoinWords); component = Component.extend({ - container, + [OWNER]: owner, layout: compile( `{{join-words "Who" (dynamic-segment) diff --git a/packages/ember-htmlbars/tests/helpers/each_test.js b/packages/ember-htmlbars/tests/helpers/each_test.js index d1916356c16..17990ddc23b 100644 --- a/packages/ember-htmlbars/tests/helpers/each_test.js +++ b/packages/ember-htmlbars/tests/helpers/each_test.js @@ -5,7 +5,6 @@ import EmberView from 'ember-views/views/view'; import LegacyEachView from 'ember-views/views/legacy_each_view'; import { A as emberA } from 'ember-runtime/system/native_array'; import EmberController from 'ember-runtime/controllers/controller'; -import { Registry } from 'ember-runtime/system/container'; import { set } from 'ember-metal/property_set'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; @@ -18,7 +17,10 @@ import TransformEachIntoCollection from 'ember-template-compiler/plugins/transfo import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; -var people, view, registry, container; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; + +var people, view, owner; var template, templateMyView, MyView, MyEmptyView, templateMyEmptyView; var originalViewKeyword; @@ -36,35 +38,34 @@ QUnit.module('the #each helper', { template = compile('{{#each view.people as |person|}}{{person.name}}{{/each}}'); people = emberA([{ name: 'Steve Holt' }, { name: 'Annabelle' }]); - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); - registry.register('view:toplevel', EmberView.extend()); - registry.register('view:-legacy-each', LegacyEachView); + owner.register('view:toplevel', EmberView.extend()); + owner.register('view:-legacy-each', LegacyEachView); view = EmberView.create({ - container: container, + [OWNER]: owner, template: template, people: people }); templateMyView = compile('{{name}}'); lookup.MyView = MyView = EmberView.extend({ template: templateMyView }); - registry.register('view:my-view', MyView); + owner.register('view:my-view', MyView); templateMyEmptyView = compile('I\'m empty'); lookup.MyEmptyView = MyEmptyView = EmberView.extend({ template: templateMyEmptyView }); - registry.register('view:my-empty-view', MyEmptyView); + owner.register('view:my-empty-view', MyEmptyView); runAppend(view); }, teardown() { - runDestroy(container); + runDestroy(owner); runDestroy(view); - registry = container = view = null; + owner = view = null; Ember.lookup = originalLookup; @@ -189,16 +190,14 @@ QUnit.test('View should not use keyword incorrectly - Issue #1315', function() { runDestroy(view); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{#each view.content as |value|}}{{value}}-{{#each view.options as |option|}}{{option.value}}:{{option.label}} {{/each}}{{/each}}'), - content: emberA(['X', 'Y']), options: emberA([ { label: 'One', value: 1 }, { label: 'Two', value: 2 } ]) }); - runAppend(view); equal(view.$().text(), 'X-1:One 2:Two Y-1:One 2:Two '); @@ -256,13 +255,13 @@ QUnit.test('it supports {{itemView=}}', function() { expectDeprecation(() => { view = EmberView.create({ + [OWNER]: owner, template: compile('{{each view.people itemView="anItemView"}}'), - people: people, - container: container + people: people }); }, /Using 'itemView' with '{{each}}'/); - registry.register('view:anItemView', itemView); + owner.register('view:anItemView', itemView); runAppend(view); @@ -277,23 +276,23 @@ QUnit.test('it defers all normalization of itemView names to the resolver', func expectDeprecation(() => { view = EmberView.create({ + [OWNER]: owner, template: compile('{{each view.people itemView="an-item-view"}}'), - people: people, - container: container + people: people }); }, /Using 'itemView' with '{{each}}'/); - registry.register('view:an-item-view', itemView); + owner.register('view:an-item-view', itemView); runAppend(view); assertText(view, 'itemView:Steve HoltitemView:Annabelle'); }); -QUnit.test('it supports {{itemViewClass=}} via container', function() { +QUnit.test('it supports {{itemViewClass=}} via owner', function() { runDestroy(view); expectDeprecation(() => { view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{each view.people itemViewClass="my-view"}}'), people: people }); @@ -308,9 +307,9 @@ QUnit.test('it supports {{itemViewClass=}} with each view tagName (DEPRECATED)', runDestroy(view); expectDeprecation(() => { view = EmberView.create({ + [OWNER]: owner, template: compile('{{each view.people itemViewClass="my-view" tagName="ul"}}'), - people: people, - container: container + people: people }); }, /Using 'itemViewClass' with '{{each}}'/); @@ -322,15 +321,15 @@ QUnit.test('it supports {{itemViewClass=}} with each view tagName (DEPRECATED)', QUnit.test('it supports {{itemViewClass=}} with tagName in itemViewClass (DEPRECATED)', function() { runDestroy(view); - registry.register('view:li-view', EmberView.extend({ + owner.register('view:li-view', EmberView.extend({ tagName: 'li' })); expectDeprecation(() => { view = EmberView.create({ + [OWNER]: owner, template: compile(''), - people: people, - container: container + people: people }); }, /Using 'itemViewClass' with '{{each}}'/); @@ -345,14 +344,14 @@ QUnit.test('it supports {{itemViewClass=}} with {{else}} block (DEPRECATED)', fu runDestroy(view); expectDeprecation(() => { view = EmberView.create({ + [OWNER]: owner, template: compile(` {{~#each view.people itemViewClass="my-view" as |item|~}} {{item.name}} {{~else~}} No records! {{~/each}}`), - people: emberA(), - container: container + people: emberA() }); }, /Using 'itemViewClass' with '{{each}}'/); @@ -369,13 +368,13 @@ QUnit.test('it supports {{emptyView=}}', function() { expectDeprecation(() => { view = EmberView.create({ + [OWNER]: owner, template: compile('{{each view.people emptyView="anEmptyView"}}'), - people: emberA(), - container: container + people: emberA() }); }, /Using 'emptyView' with '{{each}}'/); - registry.register('view:anEmptyView', emptyView); + owner.register('view:anEmptyView', emptyView); runAppend(view); @@ -390,24 +389,24 @@ QUnit.test('it defers all normalization of emptyView names to the resolver', fun expectDeprecation(() => { view = EmberView.create({ + [OWNER]: owner, template: compile('{{each view.people emptyView="an-empty-view"}}'), - people: emberA(), - container: container + people: emberA() }); }, /Using 'emptyView' with '{{each}}'/); - registry.register('view:an-empty-view', emptyView); + owner.register('view:an-empty-view', emptyView); runAppend(view); assertText(view, 'emptyView:sad panda'); }); -QUnit.test('it supports {{emptyViewClass=}} via container', function() { +QUnit.test('it supports {{emptyViewClass=}} via owner', function() { runDestroy(view); expectDeprecation(() => { view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{each view.people emptyViewClass="my-empty-view"}}'), people: emberA() }); @@ -422,9 +421,9 @@ QUnit.test('it supports {{emptyViewClass=}} with tagName (DEPRECATED)', function runDestroy(view); expectDeprecation(() => { view = EmberView.create({ + [OWNER]: owner, template: compile('{{each view.people emptyViewClass="my-empty-view" tagName="b"}}'), - people: emberA(), - container: container + people: emberA() }); }, /Using 'emptyViewClass' with '{{each}}'/); @@ -438,7 +437,7 @@ QUnit.test('it supports {{emptyViewClass=}} with in format', function() { runDestroy(view); expectDeprecation(() => { view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{each person in view.people emptyViewClass="my-empty-view"}}'), people: emberA() }); @@ -452,6 +451,7 @@ QUnit.test('it supports {{emptyViewClass=}} with in format', function() { QUnit.test('it uses {{else}} when replacing model with an empty array', function() { runDestroy(view); view = EmberView.create({ + [OWNER]: owner, template: compile('{{#each view.items as |item|}}{{item}}{{else}}Nothing{{/each}}'), items: emberA(['one', 'two']) }); @@ -523,16 +523,14 @@ QUnit.test('it can move to and from {{else}} properly when the backing array gai QUnit.module('{{each bar as |foo|}}', { setup() { - registry = new Registry(); - container = registry.container(); - - registry.register('view:toplevel', EmberView.extend()); - registry.register('view:-legacy-each', LegacyEachView); + owner = buildOwner(); + owner.register('view:toplevel', EmberView.extend()); + owner.register('view:-legacy-each', LegacyEachView); }, teardown() { - runDestroy(container); + runDestroy(owner); runDestroy(view); - container = view = null; + owner = view = null; } }); diff --git a/packages/ember-htmlbars/tests/helpers/get_test.js b/packages/ember-htmlbars/tests/helpers/get_test.js index 53e87b31565..b6634c17bd8 100644 --- a/packages/ember-htmlbars/tests/helpers/get_test.js +++ b/packages/ember-htmlbars/tests/helpers/get_test.js @@ -1,31 +1,30 @@ import Ember from 'ember-metal/core'; import EmberObject from 'ember-runtime/system/object'; import run from 'ember-metal/run_loop'; -import { Registry } from 'ember-runtime/system/container'; import compile from 'ember-template-compiler/system/compile'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import EmberView from 'ember-views/views/view'; import ComponentLookup from 'ember-views/component_lookup'; import TextField from 'ember-views/views/text_field'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var view, registry, container; +var view, owner; QUnit.module('ember-htmlbars: {{get}} helper', { setup() { - registry = new Registry(); - registry.register('component:-text-field', TextField); - registry.register('component-lookup:main', ComponentLookup); - - container = registry.container(); - registry.optionsForType('template', { instantiate: false }); + owner = buildOwner(); + owner.register('component:-text-field', TextField); + owner.register('component-lookup:main', ComponentLookup); + owner.registerOptionsForType('template', { instantiate: false }); }, teardown() { run(function() { Ember.TEMPLATES = {}; }); runDestroy(view); - runDestroy(container); - registry = container = view = null; + runDestroy(owner); + owner = view = null; } }); @@ -403,8 +402,8 @@ QUnit.test('get helper value should be updatable using {{input}} and (mut) - dyn }; view = EmberView.create({ + [OWNER]: owner, context: context, - container: container, template: compile(`{{input type='text' value=(mut (get source key)) id='get-input'}}`) }); @@ -438,8 +437,8 @@ QUnit.test('get helper value should be updatable using {{input}} and (mut) - dyn }; view = EmberView.create({ + [OWNER]: owner, context: context, - container: container, template: compile(`{{input type='text' value=(mut (get source key)) id='get-input'}}`) }); @@ -471,8 +470,8 @@ QUnit.test('get helper value should be updatable using {{input}} and (mut) - sta }; view = EmberView.create({ + [OWNER]: owner, context: context, - container: container, template: compile(`{{input type='text' value=(mut (get source 'banana')) id='get-input'}}`) }); diff --git a/packages/ember-htmlbars/tests/helpers/if_unless_test.js b/packages/ember-htmlbars/tests/helpers/if_unless_test.js index ed3012f39eb..e1cf70daedd 100644 --- a/packages/ember-htmlbars/tests/helpers/if_unless_test.js +++ b/packages/ember-htmlbars/tests/helpers/if_unless_test.js @@ -1,7 +1,6 @@ import Ember from 'ember-metal/core'; import run from 'ember-metal/run_loop'; import Namespace from 'ember-runtime/system/namespace'; -import { Registry } from 'ember-runtime/system/container'; import EmberView from 'ember-views/views/view'; import Component from 'ember-views/components/component'; import ObjectProxy from 'ember-runtime/system/object_proxy'; @@ -19,9 +18,12 @@ import viewKeyword from 'ember-htmlbars/keywords/view'; import ComponentLookup from 'ember-views/component_lookup'; import jQuery from 'ember-views/system/jquery'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; + var originalLookup = Ember.lookup; -var view, lookup, registry, container, TemplateTests, originalViewKeyword; +var view, lookup, owner, TemplateTests, originalViewKeyword; QUnit.module('ember-htmlbars: {{#if}} and {{#unless}} helpers', { setup() { @@ -29,19 +31,18 @@ QUnit.module('ember-htmlbars: {{#if}} and {{#unless}} helpers', { Ember.lookup = lookup = {}; lookup.TemplateTests = TemplateTests = Namespace.create(); - registry = new Registry(); - container = registry.container(); - registry.optionsForType('template', { instantiate: false }); - registry.optionsForType('view', { singleton: false }); - registry.optionsForType('component', { singleton: false }); - registry.register('view:toplevel', EmberView.extend()); - registry.register('component-lookup:main', ComponentLookup); + owner = buildOwner(); + owner.registerOptionsForType('template', { instantiate: false }); + owner.registerOptionsForType('view', { singleton: false }); + owner.registerOptionsForType('component', { singleton: false }); + owner.register('view:toplevel', EmberView.extend()); + owner.register('component-lookup:main', ComponentLookup); }, teardown() { - runDestroy(container); + runDestroy(owner); runDestroy(view); - registry = container = view = null; + owner = view = null; Ember.lookup = lookup = originalLookup; TemplateTests = null; @@ -263,12 +264,11 @@ QUnit.test('should not rerender if truthiness does not change', function() { }); QUnit.test('should update the block when object passed to #unless helper changes', function() { - registry.register('template:advice', compile('

{{#unless view.onDrugs}}{{view.doWellInSchool}}{{/unless}}

')); + owner.register('template:advice', compile('

{{#unless view.onDrugs}}{{view.doWellInSchool}}{{/unless}}

')); view = EmberView.create({ - container: container, + [OWNER]: owner, templateName: 'advice', - onDrugs: true, doWellInSchool: 'Eat your vegetables' }); @@ -317,12 +317,11 @@ QUnit.test('properties within an if statement should not fail on re-render', fun }); QUnit.test('should update the block when object passed to #if helper changes', function() { - registry.register('template:menu', compile('

{{#if view.inception}}{{view.INCEPTION}}{{/if}}

')); + owner.register('template:menu', compile('

{{#if view.inception}}{{view.INCEPTION}}{{/if}}

')); view = EmberView.create({ - container: container, + [OWNER]: owner, templateName: 'menu', - INCEPTION: 'BOOOOOOOONG doodoodoodoodooodoodoodoo', inception: 'OOOOoooooOOOOOOooooooo' }); @@ -349,12 +348,11 @@ QUnit.test('should update the block when object passed to #if helper changes', f }); QUnit.test('should update the block when object passed to #if helper changes and an inverse is supplied', function() { - registry.register('template:menu', compile('

{{#if view.inception}}{{view.INCEPTION}}{{else}}{{view.SAD}}{{/if}}

')); + owner.register('template:menu', compile('

{{#if view.inception}}{{view.INCEPTION}}{{else}}{{view.SAD}}{{/if}}

')); view = EmberView.create({ - container: container, + [OWNER]: owner, templateName: 'menu', - INCEPTION: 'BOOOOOOOONG doodoodoodoodooodoodoodoo', inception: false, SAD: 'BOONG?' @@ -428,12 +426,11 @@ QUnit.test('the {{this}} helper should not fail on removal', function() { }); QUnit.test('should update the block when object passed to #unless helper changes', function() { - registry.register('template:advice', compile('

{{#unless view.onDrugs}}{{view.doWellInSchool}}{{/unless}}

')); + owner.register('template:advice', compile('

{{#unless view.onDrugs}}{{view.doWellInSchool}}{{/unless}}

')); view = EmberView.create({ - container: container, + [OWNER]: owner, templateName: 'advice', - onDrugs: true, doWellInSchool: 'Eat your vegetables' }); @@ -483,12 +480,11 @@ QUnit.test('properties within an if statement should not fail on re-render', fun }); QUnit.test('should update the block when object passed to #if helper changes', function() { - registry.register('template:menu', compile('

{{#if view.inception}}{{view.INCEPTION}}{{/if}}

')); + owner.register('template:menu', compile('

{{#if view.inception}}{{view.INCEPTION}}{{/if}}

')); view = EmberView.create({ - container: container, + [OWNER]: owner, templateName: 'menu', - INCEPTION: 'BOOOOOOOONG doodoodoodoodooodoodoodoo', inception: 'OOOOoooooOOOOOOooooooo' }); @@ -515,12 +511,11 @@ QUnit.test('should update the block when object passed to #if helper changes', f }); QUnit.test('should update the block when object passed to #if helper changes and an inverse is supplied', function() { - registry.register('template:menu', compile('

{{#if view.inception}}{{view.INCEPTION}}{{else}}{{view.SAD}}{{/if}}

')); + owner.register('template:menu', compile('

{{#if view.inception}}{{view.INCEPTION}}{{else}}{{view.SAD}}{{/if}}

')); view = EmberView.create({ - container: container, + [OWNER]: owner, templateName: 'menu', - INCEPTION: 'BOOOOOOOONG doodoodoodoodooodoodoodoo', inception: false, SAD: 'BOONG?' @@ -908,18 +903,17 @@ QUnit.test('`if` helper with inline form: updates when given a falsey second arg QUnit.test('using `if` with an `{{each}}` destroys components when transitioning to and from inverse (GH #12267)', function() { let destroyedChildrenCount = 0; - registry.register('component:foo-bar', Component.extend({ + owner.register('component:foo-bar', Component.extend({ willDestroy() { destroyedChildrenCount++; } })); - registry.register('template:components/foo-bar', compile('{{number}}')); + owner.register('template:components/foo-bar', compile('{{number}}')); view = EmberView.create({ - container, + [OWNER]: owner, test: true, list: emberA([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), - template: compile(` {{~#if view.test~}} {{~#each view.list as |number|~}} diff --git a/packages/ember-htmlbars/tests/helpers/input_test.js b/packages/ember-htmlbars/tests/helpers/input_test.js index 8fc1e14de73..1613176d48e 100644 --- a/packages/ember-htmlbars/tests/helpers/input_test.js +++ b/packages/ember-htmlbars/tests/helpers/input_test.js @@ -3,24 +3,24 @@ import { set } from 'ember-metal/property_set'; import View from 'ember-views/views/view'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import compile from 'ember-template-compiler/system/compile'; -import Registry from 'container/registry'; import ComponentLookup from 'ember-views/component_lookup'; import TextField from 'ember-views/views/text_field'; import Checkbox from 'ember-views/views/checkbox'; import EventDispatcher from 'ember-views/system/event_dispatcher'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; var view; -var controller, registry, container; +var controller, owner; function commonSetup() { - registry = new Registry(); - registry.register('component:-text-field', TextField); - registry.register('component:-checkbox', Checkbox); - registry.register('component-lookup:main', ComponentLookup); - registry.register('event_dispatcher:main', EventDispatcher); - container = registry.container(); - - var dispatcher = container.lookup('event_dispatcher:main'); + owner = buildOwner(); + owner.register('component:-text-field', TextField); + owner.register('component:-checkbox', Checkbox); + owner.register('component-lookup:main', ComponentLookup); + owner.register('event_dispatcher:main', EventDispatcher); + + var dispatcher = owner.lookup('event_dispatcher:main'); dispatcher.setup({}, '#qunit-fixture'); } @@ -38,8 +38,8 @@ QUnit.module('{{input type=\'text\'}}', { }; view = View.extend({ - container: container, - controller: controller, + [OWNER]: owner, + controller, template: compile('{{input type="text" disabled=disabled value=val placeholder=place name=name maxlength=max size=size tabindex=tab}}') }).create(); @@ -48,7 +48,7 @@ QUnit.module('{{input type=\'text\'}}', { teardown() { runDestroy(view); - runDestroy(container); + runDestroy(owner); } }); @@ -156,7 +156,7 @@ QUnit.module('{{input type=\'text\'}} - static values', { controller = {}; view = View.extend({ - container: container, + [OWNER]: owner, controller: controller, template: compile('{{input type="text" disabled=true value="hello" placeholder="Enter some text" name="some-name" maxlength=30 size=30 tabindex=5}}') }).create(); @@ -166,7 +166,7 @@ QUnit.module('{{input type=\'text\'}} - static values', { teardown() { runDestroy(view); - runDestroy(container); + runDestroy(owner); } }); @@ -214,9 +214,8 @@ QUnit.test('specifying `on="someevent" action="foo"` triggers the action', funct }; view = View.create({ - container, + [OWNER]: owner, controller, - template: compile('{{input type="text" on="focus-in" action="doFoo"}}', { moduleName: 'foo.hbs' }) }); @@ -237,8 +236,8 @@ QUnit.module('{{input type=\'text\'}} - dynamic type', { }; view = View.extend({ - container: container, - controller: controller, + [OWNER]: owner, + controller, template: compile('{{input type=someProperty}}') }).create(); @@ -247,7 +246,7 @@ QUnit.module('{{input type=\'text\'}} - dynamic type', { teardown() { runDestroy(view); - runDestroy(container); + runDestroy(owner); } }); @@ -272,8 +271,8 @@ QUnit.module('{{input}} - default type', { controller = {}; view = View.extend({ - container: container, - controller: controller, + [OWNER]: owner, + controller, template: compile('{{input}}') }).create(); @@ -282,7 +281,7 @@ QUnit.module('{{input}} - default type', { teardown() { runDestroy(view); - runDestroy(container); + runDestroy(owner); } }); @@ -301,8 +300,8 @@ QUnit.module('{{input type=\'checkbox\'}}', { }; view = View.extend({ - container: container, - controller: controller, + [OWNER]: owner, + controller, template: compile('{{input type="checkbox" disabled=disabled tabindex=tab name=name checked=val}}') }).create(); @@ -311,7 +310,7 @@ QUnit.module('{{input type=\'checkbox\'}}', { teardown() { runDestroy(view); - runDestroy(container); + runDestroy(owner); } }); @@ -348,15 +347,15 @@ QUnit.module('{{input type=\'checkbox\'}} - prevent value= usage', { commonSetup(); view = View.extend({ - container: container, - controller: controller, + [OWNER]: owner, + controller, template: compile('{{input type="checkbox" disabled=disabled tabindex=tab name=name value=val}}') }).create(); }, teardown() { runDestroy(view); - runDestroy(container); + runDestroy(owner); } }); @@ -376,8 +375,8 @@ QUnit.module('{{input type=boundType}}', { }; view = View.extend({ - container: container, - controller: controller, + [OWNER]: owner, + controller, template: compile('{{input type=inputType checked=isChecked}}') }).create(); @@ -386,7 +385,7 @@ QUnit.module('{{input type=boundType}}', { teardown() { runDestroy(view); - runDestroy(container); + runDestroy(owner); } }); @@ -411,8 +410,8 @@ QUnit.module('{{input type=\'checkbox\'}} - static values', { }; view = View.extend({ - container: container, - controller: controller, + [OWNER]: owner, + controller, template: compile('{{input type="checkbox" disabled=true tabindex=6 name="hello" checked=false}}') }).create(); @@ -421,7 +420,7 @@ QUnit.module('{{input type=\'checkbox\'}} - static values', { teardown() { runDestroy(view); - runDestroy(container); + runDestroy(owner); } }); @@ -448,13 +447,13 @@ QUnit.module('{{input type=\'text\'}} - null/undefined values', { teardown() { runDestroy(view); - runDestroy(container); + runDestroy(owner); } }); QUnit.test('placeholder attribute bound to undefined is not present', function() { view = View.extend({ - container: container, + [OWNER]: owner, controller: {}, template: compile('{{input placeholder=someThingNotThere}}') }).create(); @@ -470,7 +469,7 @@ QUnit.test('placeholder attribute bound to undefined is not present', function() QUnit.test('placeholder attribute bound to null is not present', function() { view = View.extend({ - container: container, + [OWNER]: owner, controller: { someNullProperty: null }, diff --git a/packages/ember-htmlbars/tests/helpers/partial_test.js b/packages/ember-htmlbars/tests/helpers/partial_test.js index 150ca7963df..ae2891a3c5e 100644 --- a/packages/ember-htmlbars/tests/helpers/partial_test.js +++ b/packages/ember-htmlbars/tests/helpers/partial_test.js @@ -4,32 +4,34 @@ import run from 'ember-metal/run_loop'; import EmberView from 'ember-views/views/view'; import jQuery from 'ember-views/system/jquery'; var trim = jQuery.trim; -import { Registry } from 'ember-runtime/system/container'; import compile from 'ember-template-compiler/system/compile'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var MyApp, lookup, view, registry, container; +var MyApp, lookup, view, owner; var originalLookup = Ember.lookup; QUnit.module('Support for {{partial}} helper', { setup() { Ember.lookup = lookup = { Ember: Ember }; MyApp = lookup.MyApp = EmberObject.create({}); - registry = new Registry(); - container = registry.container(); - registry.optionsForType('template', { instantiate: false }); + owner = buildOwner(); + owner.registerOptionsForType('template', { instantiate: false }); }, teardown() { runDestroy(view); + runDestroy(owner); Ember.lookup = originalLookup; + view = owner = null; } }); QUnit.test('should render other templates registered with the container', function() { - registry.register('template:_subTemplateFromContainer', compile('sub-template')); + owner.register('template:_subTemplateFromContainer', compile('sub-template')); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('This {{partial "subTemplateFromContainer"}} is pretty great.') }); @@ -39,10 +41,10 @@ QUnit.test('should render other templates registered with the container', functi }); QUnit.test('should render other slash-separated templates registered with the container', function() { - registry.register('template:child/_subTemplateFromContainer', compile('sub-template')); + owner.register('template:child/_subTemplateFromContainer', compile('sub-template')); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('This {{partial "child/subTemplateFromContainer"}} is pretty great.') }); @@ -52,12 +54,13 @@ QUnit.test('should render other slash-separated templates registered with the co }); QUnit.test('should use the current view\'s context', function() { - registry.register('template:_person_name', compile('{{firstName}} {{lastName}}')); + owner.register('template:_person_name', compile('{{firstName}} {{lastName}}')); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('Who is {{partial "person_name"}}?') }); + view.set('controller', EmberObject.create({ firstName: 'Kris', lastName: 'Selden' @@ -69,11 +72,11 @@ QUnit.test('should use the current view\'s context', function() { }); QUnit.test('Quoteless parameters passed to {{template}} perform a bound property lookup of the partial name', function() { - registry.register('template:_subTemplate', compile('sub-template')); - registry.register('template:_otherTemplate', compile('other-template')); + owner.register('template:_subTemplate', compile('sub-template')); + owner.register('template:_otherTemplate', compile('other-template')); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('This {{partial view.partialName}} is pretty {{partial nonexistent}}great.'), partialName: 'subTemplate' }); diff --git a/packages/ember-htmlbars/tests/helpers/text_area_test.js b/packages/ember-htmlbars/tests/helpers/text_area_test.js index 37d3b764421..3dfe9842ec7 100644 --- a/packages/ember-htmlbars/tests/helpers/text_area_test.js +++ b/packages/ember-htmlbars/tests/helpers/text_area_test.js @@ -4,10 +4,11 @@ import compile from 'ember-template-compiler/system/compile'; import { set as o_set } from 'ember-metal/property_set'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import TextArea from 'ember-views/views/text_area'; -import Registry from 'container/registry'; import ComponentLookup from 'ember-views/component_lookup'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var textArea, controller; +var textArea, controller, owner; function set(object, key, value) { run(function() { o_set(object, key, value); }); @@ -19,12 +20,12 @@ QUnit.module('{{textarea}}', { val: 'Lorem ipsum dolor' }; - var registry = new Registry(); - registry.register('component:-text-area', TextArea); - registry.register('component-lookup:main', ComponentLookup); + owner = buildOwner(); + owner.register('component:-text-area', TextArea); + owner.register('component-lookup:main', ComponentLookup); textArea = View.extend({ - container: registry.container(), + [OWNER]: owner, controller: controller, template: compile('{{textarea disabled=disabled value=val}}') }).create(); diff --git a/packages/ember-htmlbars/tests/helpers/unbound_test.js b/packages/ember-htmlbars/tests/helpers/unbound_test.js index 75459472ac7..a71c4e9637b 100644 --- a/packages/ember-htmlbars/tests/helpers/unbound_test.js +++ b/packages/ember-htmlbars/tests/helpers/unbound_test.js @@ -10,20 +10,20 @@ import run from 'ember-metal/run_loop'; import compile from 'ember-template-compiler/system/compile'; import Helper, { helper } from 'ember-htmlbars/helper'; -import { Registry } from 'ember-runtime/system/container'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; -var view, lookup, registry, container; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; + +var view, lookup, owner; var originalLookup = Ember.lookup; QUnit.module('ember-htmlbars: {{#unbound}} helper', { setup() { Ember.lookup = lookup = { Ember: Ember }; - registry = new Registry(); - container = registry.container(); view = EmberView.create({ - container, + [OWNER]: owner, template: compile('{{unbound foo}} {{unbound bar}}'), context: EmberObject.create({ foo: 'BORK', @@ -36,8 +36,8 @@ QUnit.module('ember-htmlbars: {{#unbound}} helper', { teardown() { runDestroy(view); - runDestroy(container); - registry = container = view = null; + runDestroy(owner); + owner = view = null; Ember.lookup = originalLookup; } }); @@ -124,11 +124,10 @@ QUnit.test('should render on attributes', function(assert) { QUnit.module('ember-htmlbars: {{#unbound}} helper with container present', { setup() { Ember.lookup = lookup = { Ember: Ember }; - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); view = EmberView.create({ - container, + [OWNER]: owner, template: compile('{{unbound foo}}'), context: EmberObject.create({ foo: 'bleep' @@ -138,8 +137,8 @@ QUnit.module('ember-htmlbars: {{#unbound}} helper with container present', { teardown() { runDestroy(view); - runDestroy(container); - container = registry = view = null; + runDestroy(owner); + owner = view = null; Ember.lookup = originalLookup; } }); @@ -152,15 +151,14 @@ QUnit.test('it should render the current value of a property path on the context QUnit.module('ember-htmlbars: {{#unbound}} subexpression', { setup() { Ember.lookup = lookup = { Ember: Ember }; - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); - registry.register('helper:-capitalize', helper(function(params) { + owner.register('helper:-capitalize', helper(function(params) { return params[0].toUpperCase(); })); view = EmberView.create({ - container, + [OWNER]: owner, template: compile('{{-capitalize (unbound foo)}}'), context: EmberObject.create({ foo: 'bork' @@ -172,8 +170,8 @@ QUnit.module('ember-htmlbars: {{#unbound}} subexpression', { teardown() { runDestroy(view); - runDestroy(container); - registry = container = view = null; + runDestroy(owner); + owner = view = null; Ember.lookup = originalLookup; } }); @@ -200,19 +198,18 @@ QUnit.test('it should not re-render if the parent view rerenders', function() { QUnit.module('ember-htmlbars: {{#unbound}} subexpression - helper form', { setup() { Ember.lookup = lookup = { Ember: Ember }; - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); - registry.register('helper:-capitalize', helper(function(params) { + owner.register('helper:-capitalize', helper(function(params) { return params[0].toUpperCase(); })); - registry.register('helper:-doublize', helper(function(params) { + owner.register('helper:-doublize', helper(function(params) { return `${params[0]} ${params[0]}`; })); view = EmberView.create({ - container, + [OWNER]: owner, template: compile('{{-capitalize (unbound (-doublize foo))}}'), context: EmberObject.create({ foo: 'bork' @@ -224,8 +221,8 @@ QUnit.module('ember-htmlbars: {{#unbound}} subexpression - helper form', { teardown() { runDestroy(view); - runDestroy(container); - registry = container = view = null; + runDestroy(owner); + owner = view = null; Ember.lookup = originalLookup; } }); @@ -252,18 +249,17 @@ QUnit.test('it should re-render if the parent view rerenders', function() { QUnit.module('ember-htmlbars: {{#unbound boundHelper arg1 arg2... argN}} form: render unbound helper invocations', { setup() { Ember.lookup = lookup = { Ember: Ember }; - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); - registry.register('helper:-surround', helper(function([prefix, value, suffix]) { + owner.register('helper:-surround', helper(function([prefix, value, suffix]) { return prefix + '-' + value + '-' + suffix; })); - registry.register('helper:-capitalize', helper(function([value]) { + owner.register('helper:-capitalize', helper(function([value]) { return value.toUpperCase(); })); - registry.register('helper:-capitalizeName', Helper.extend({ + owner.register('helper:-capitalizeName', Helper.extend({ destroy() { this.removeObserver('value.firstName'); this._super(...arguments); @@ -278,11 +274,11 @@ QUnit.module('ember-htmlbars: {{#unbound boundHelper arg1 arg2... argN}} form: r } })); - registry.register('helper:-fauxconcat', helper(function(params) { + owner.register('helper:-fauxconcat', helper(function(params) { return params.join(''); })); - registry.register('helper:-concatNames', Helper.extend({ + owner.register('helper:-concatNames', Helper.extend({ destroy() { this.teardown(); this._super(...arguments); @@ -305,14 +301,14 @@ QUnit.module('ember-htmlbars: {{#unbound boundHelper arg1 arg2... argN}} form: r teardown() { runDestroy(view); - runDestroy(container); - registry = container = view = null; + runDestroy(owner); + owner = view = null; Ember.lookup = originalLookup; } }); QUnit.test('should be able to render an unbound helper invocation', function() { - registry.register('helper:-repeat', helper(function([value], { count }) { + owner.register('helper:-repeat', helper(function([value], { count }) { var a = []; while (a.length < count) { a.push(value); @@ -321,7 +317,7 @@ QUnit.test('should be able to render an unbound helper invocation', function() { })); view = EmberView.create({ - container, + [OWNER]: owner, template: compile('{{unbound (-repeat foo count=bar)}} {{-repeat foo count=bar}} {{unbound (-repeat foo count=2)}} {{-repeat foo count=4}}'), context: EmberObject.create({ foo: 'X', @@ -329,6 +325,7 @@ QUnit.test('should be able to render an unbound helper invocation', function() { bar: 5 }) }); + runAppend(view); equal(view.$().text(), 'XXXXX XXXXX XX XXXX', 'first render is correct'); @@ -342,7 +339,7 @@ QUnit.test('should be able to render an unbound helper invocation', function() { QUnit.test('should be able to render an bound helper invocation mixed with static values', function() { view = EmberView.create({ - container, + [OWNER]: owner, template: compile('{{unbound (-surround prefix value "bar")}} {{-surround prefix value "bar"}} {{unbound (-surround "bar" value suffix)}} {{-surround "bar" value suffix}}'), context: EmberObject.create({ prefix: 'before', @@ -350,6 +347,7 @@ QUnit.test('should be able to render an bound helper invocation mixed with stati suffix: 'after' }) }); + runAppend(view); equal(view.$().text(), 'before-core-bar before-core-bar bar-core-after bar-core-after', 'first render is correct'); @@ -363,7 +361,7 @@ QUnit.test('should be able to render an bound helper invocation mixed with stati QUnit.test('should be able to render unbound forms of multi-arg helpers', function() { view = EmberView.create({ - container, + [OWNER]: owner, template: compile('{{-fauxconcat foo bar bing}} {{unbound (-fauxconcat foo bar bing)}}'), context: EmberObject.create({ foo: 'a', @@ -371,6 +369,7 @@ QUnit.test('should be able to render unbound forms of multi-arg helpers', functi bing: 'c' }) }); + runAppend(view); equal(view.$().text(), 'abc abc', 'first render is correct'); @@ -384,7 +383,7 @@ QUnit.test('should be able to render unbound forms of multi-arg helpers', functi QUnit.test('should be able to render an unbound helper invocation for helpers with dependent keys', function() { view = EmberView.create({ - container, + [OWNER]: owner, template: compile('{{-capitalizeName person}} {{unbound (-capitalizeName person)}} {{-concatNames person}} {{unbound (-concatNames person)}}'), context: EmberObject.create({ person: EmberObject.create({ @@ -393,6 +392,7 @@ QUnit.test('should be able to render an unbound helper invocation for helpers wi }) }) }); + runAppend(view); equal(view.$().text(), 'SHOOBY SHOOBY shoobytaylor shoobytaylor', 'first render is correct'); @@ -406,7 +406,7 @@ QUnit.test('should be able to render an unbound helper invocation for helpers wi QUnit.test('should be able to render an unbound helper invocation in #each helper', function() { view = EmberView.create({ - container, + [OWNER]: owner, template: compile( ['{{#each people as |person|}}', '{{-capitalize person.firstName}} {{unbound (-capitalize person.firstName)}}', @@ -424,18 +424,19 @@ QUnit.test('should be able to render an unbound helper invocation in #each helpe ]) } }); + runAppend(view); equal(view.$().text(), 'SHOOBY SHOOBYCINDY CINDY', 'unbound rendered correctly'); }); QUnit.test('should be able to render an unbound helper invocation with bound hash options', function() { - registry.register('helper:-repeat', helper(function([value]) { + owner.register('helper:-repeat', helper(function([value]) { return [].slice.call(arguments, 0, -1).join(''); })); view = EmberView.create({ - container, + [OWNER]: owner, template: compile('{{-capitalizeName person}} {{unbound (-capitalizeName person)}} {{-concatNames person}} {{unbound (-concatNames person)}}'), context: EmberObject.create({ person: EmberObject.create({ @@ -444,6 +445,7 @@ QUnit.test('should be able to render an unbound helper invocation with bound has }) }) }); + runAppend(view); equal(view.$().text(), 'SHOOBY SHOOBY shoobytaylor shoobytaylor', 'first render is correct'); @@ -486,26 +488,25 @@ QUnit.test('should be able to render bound form of a helper inside unbound form QUnit.module('ember-htmlbars: {{#unbound}} helper -- Container Lookup', { setup() { Ember.lookup = lookup = { Ember: Ember }; - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); }, teardown() { runDestroy(view); - runDestroy(container); - registry = container = view = null; + runDestroy(owner); + owner = view = null; Ember.lookup = originalLookup; } }); QUnit.test('should lookup helpers in the container', function() { - registry.register('helper:up-case', helper(function([value]) { + owner.register('helper:up-case', helper(function([value]) { return value.toUpperCase(); })); view = EmberView.create({ + [OWNER]: owner, template: compile('{{unbound (up-case displayText)}}'), - container, context: { displayText: 'such awesome' } @@ -530,7 +531,7 @@ QUnit.test('should be able to output a property without binding', function() { }; view = EmberView.create({ - context: context, + context, template: compile('
{{unbound content.anUnboundString}}
') }); diff --git a/packages/ember-htmlbars/tests/helpers/view_test.js b/packages/ember-htmlbars/tests/helpers/view_test.js index d13caba7a5c..25d8c85a643 100644 --- a/packages/ember-htmlbars/tests/helpers/view_test.js +++ b/packages/ember-htmlbars/tests/helpers/view_test.js @@ -3,7 +3,6 @@ import Ember from 'ember-metal/core'; import { getDebugFunction, setDebugFunction } from 'ember-metal/debug'; import EmberView from 'ember-views/views/view'; import EmberComponent from 'ember-views/components/component'; -import Registry from 'container/registry'; import ComponentLookup from 'ember-views/component_lookup'; import run from 'ember-metal/run_loop'; import jQuery from 'ember-views/system/jquery'; @@ -26,7 +25,10 @@ import { computed } from 'ember-metal/computed'; import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; -var view, originalLookup, registry, container, lookup, originalViewKeyword; +import { OWNER } from 'container/owner'; +import buildOwner from 'container/tests/test-helpers/build-owner'; + +var view, originalLookup, owner, lookup, originalViewKeyword; var trim = jQuery.trim; @@ -39,7 +41,6 @@ function nthChild(view, nth) { } function viewClass(options) { - options.container = options.container || container; return EmberView.extend(options); } @@ -52,17 +53,16 @@ QUnit.module('ember-htmlbars: {{#view}} helper', { originalLookup = Ember.lookup; Ember.lookup = lookup = {}; - registry = new Registry(); - container = registry.container(); - registry.optionsForType('template', { instantiate: false }); - registry.register('view:toplevel', EmberView.extend()); - registry.register('component-lookup:main', ComponentLookup); + owner = buildOwner(); + owner.registerOptionsForType('template', { instantiate: false }); + owner.register('view:toplevel', EmberView.extend()); + owner.register('component-lookup:main', ComponentLookup); }, teardown() { - runDestroy(container); + runDestroy(owner); runDestroy(view); - registry = container = view = null; + owner = view = null; Ember.lookup = lookup = originalLookup; @@ -101,18 +101,16 @@ QUnit.test('should not enter an infinite loop when binding an attribute in Handl }); QUnit.test('By default view:toplevel is used', function() { - var registry = new Registry(); - var DefaultView = viewClass({ elementId: 'toplevel-view', template: compile('hello world') }); - registry.register('view:toplevel', DefaultView); + owner.register('view:toplevel', DefaultView); view = EmberView.extend({ - template: compile('{{view}}'), - container: registry.container() + [OWNER]: owner, + template: compile('{{view}}') }).create(); runAppend(view); @@ -120,7 +118,7 @@ QUnit.test('By default view:toplevel is used', function() { equal(jQuery('#toplevel-view').text(), 'hello world'); }); -QUnit.test('By default, without a container, EmberView is used', function() { +QUnit.test('By default, without an owner, EmberView is used', function() { view = EmberView.extend({ template: compile('{{view tagName="span"}}') }).create(); @@ -136,11 +134,11 @@ QUnit.test('View lookup - \'fu\'', function() { template: compile('bro') }); - registry.register('view:fu', FuView); + owner.register('view:fu', FuView); view = EmberView.extend({ - template: compile('{{view \'fu\'}}'), - container: container + [OWNER]: owner, + template: compile('{{view \'fu\'}}') }).create(); runAppend(view); @@ -154,12 +152,12 @@ QUnit.test('View lookup - \'fu\' when fu is a property and a view name', functio template: compile('bro') }); - registry.register('view:fu', FuView); + owner.register('view:fu', FuView); view = EmberView.extend({ + [OWNER]: owner, template: compile('{{view \'fu\'}}'), - context: { fu: 'boom!' }, - container: container + context: { fu: 'boom!' } }).create(); runAppend(view); @@ -173,11 +171,11 @@ QUnit.test('View lookup - view.computed', function() { template: compile('bro') }); - registry.register('view:fu', FuView); + owner.register('view:fu', FuView); view = EmberView.extend({ + [OWNER]: owner, template: compile('{{view view.computed}}'), - container: container, computed: 'fu' }).create(); @@ -337,13 +335,11 @@ QUnit.test('Non-"Binding"-suffixed bindings are runloop-synchronized', function( QUnit.test('allows you to pass attributes that will be assigned to the class instance, like class="foo"', function() { expect(4); - registry = new Registry(); - container = registry.container(); - registry.register('view:toplevel', EmberView.extend()); + owner.register('view:toplevel', EmberView.extend()); view = EmberView.extend({ - template: compile('{{view id="foo" tagName="h1" class="foo"}}{{#view id="bar" class="bar"}}Bar{{/view}}'), - container: container + [OWNER]: owner, + template: compile('{{view id="foo" tagName="h1" class="foo"}}{{#view id="bar" class="bar"}}Bar{{/view}}') }).create(); runAppend(view); @@ -392,12 +388,12 @@ QUnit.test('Should apply classes when bound property specified', function() { }); QUnit.test('Should apply a class from a sub expression', function() { - registry.register('helper:string-concat', makeHelper(function(params) { + owner.register('helper:string-concat', makeHelper(function(params) { return params.join(''); })); view = EmberView.create({ - container: container, + [OWNER]: owner, controller: { type: 'btn', size: 'large' @@ -474,11 +470,11 @@ QUnit.test('bound properties should be available in the view', function() { template: compile('{{view.attrs.foo}}') }); - registry.register('view:fu', FuView); + owner.register('view:fu', FuView); view = EmberView.extend({ + [OWNER]: owner, template: compile('{{view \'fu\' foo=view.someProp}}'), - container: container, someProp: 'initial value' }).create(); @@ -598,10 +594,10 @@ QUnit.test('should update bound values after the view is removed and then re-app }); QUnit.test('views set the template of their children to a passed block', function() { - registry.register('template:parent', compile('

{{#view}}It worked!{{/view}}

')); + owner.register('template:parent', compile('

{{#view}}It worked!{{/view}}

')); view = EmberView.create({ - container: container, + [OWNER]: owner, templateName: 'parent' }); @@ -611,22 +607,18 @@ QUnit.test('views set the template of their children to a passed block', functio QUnit.test('{{view}} should not override class bindings defined on a child view', function() { var LabelView = EmberView.extend({ - container: container, classNameBindings: ['something'], something: 'visible' }); - registry.register('controller:label', Controller, { instantiate: true }); - registry.register('view:label', LabelView); - registry.register('template:label', compile('
')); - registry.register('template:nester', compile('{{render "label"}}')); + owner.register('controller:label', Controller, { instantiate: true }); + owner.register('view:label', LabelView); + owner.register('template:label', compile('
')); + owner.register('template:nester', compile('{{render "label"}}')); view = EmberView.create({ - container: container, - templateName: 'nester', - controller: Controller.create({ - container: container - }) + [OWNER]: owner, + templateName: 'nester' }); runAppend(view); @@ -635,22 +627,21 @@ QUnit.test('{{view}} should not override class bindings defined on a child view' }); QUnit.test('child views can be inserted using the {{view}} helper', function() { - registry.register('template:nester', compile('

Hello {{world}}

{{view view.labelView}}')); - registry.register('template:nested', compile('
Goodbye {{cruel}} {{world}}
')); + owner.register('template:nester', compile('

Hello {{world}}

{{view view.labelView}}')); + owner.register('template:nested', compile('
Goodbye {{cruel}} {{world}}
')); var context = { world: 'world!' }; var LabelView = EmberView.extend({ - container: container, tagName: 'aside', templateName: 'nested' }); view = EmberView.create({ + [OWNER]: owner, labelView: LabelView, - container: container, templateName: 'nester', context: context }); @@ -685,16 +676,15 @@ QUnit.test('should be able to explicitly set a view\'s context', function() { }); QUnit.test('Template views add an elementId to child views created using the view helper', function() { - registry.register('template:parent', compile('
{{view view.childView}}
')); - registry.register('template:child', compile('I can\'t believe it\'s not butter.')); + owner.register('template:parent', compile('
{{view view.childView}}
')); + owner.register('template:child', compile('I can\'t believe it\'s not butter.')); var ChildView = EmberView.extend({ - container: container, templateName: 'child' }); view = EmberView.create({ - container: container, + [OWNER]: owner, childView: ChildView, templateName: 'parent' }); @@ -753,13 +743,13 @@ QUnit.test('Child views created using the view helper and that have a viewName s }); QUnit.test('{{view}} id attribute should set id on layer', function() { - registry.register('template:foo', compile('{{#view view.idView id="bar"}}baz{{/view}}')); + owner.register('template:foo', compile('{{#view view.idView id="bar"}}baz{{/view}}')); var IdView = EmberView; view = EmberView.create({ + [OWNER]: owner, idView: IdView, - container: container, templateName: 'foo' }); @@ -770,13 +760,13 @@ QUnit.test('{{view}} id attribute should set id on layer', function() { }); QUnit.test('{{view}} tag attribute should set tagName of the view', function() { - registry.register('template:foo', compile('{{#view view.tagView tag="span"}}baz{{/view}}')); + owner.register('template:foo', compile('{{#view view.tagView tag="span"}}baz{{/view}}')); var TagView = EmberView; view = EmberView.create({ + [OWNER]: owner, tagView: TagView, - container: container, templateName: 'foo' }); @@ -787,13 +777,13 @@ QUnit.test('{{view}} tag attribute should set tagName of the view', function() { }); QUnit.test('{{view}} class attribute should set class on layer', function() { - registry.register('template:foo', compile('{{#view view.idView class="bar"}}baz{{/view}}')); + owner.register('template:foo', compile('{{#view view.idView class="bar"}}baz{{/view}}')); var IdView = EmberView; view = EmberView.create({ + [OWNER]: owner, idView: IdView, - container: container, templateName: 'foo' }); @@ -868,13 +858,13 @@ QUnit.test('{{view}} should evaluate other attributes bindings set in the curren }); QUnit.test('{{view}} should be able to bind class names to truthy properties', function() { - registry.register('template:template', compile('{{#view view.classBindingView classBinding="view.number:is-truthy"}}foo{{/view}}')); + owner.register('template:template', compile('{{#view view.classBindingView classBinding="view.number:is-truthy"}}foo{{/view}}')); var ClassBindingView = EmberView.extend(); view = EmberView.create({ + [OWNER]: owner, classBindingView: ClassBindingView, - container: container, number: 5, templateName: 'template' }); @@ -891,13 +881,13 @@ QUnit.test('{{view}} should be able to bind class names to truthy properties', f }); QUnit.test('{{view}} should be able to bind class names to truthy or falsy properties', function() { - registry.register('template:template', compile('{{#view view.classBindingView classBinding="view.number:is-truthy:is-falsy"}}foo{{/view}}')); + owner.register('template:template', compile('{{#view view.classBindingView classBinding="view.number:is-truthy:is-falsy"}}foo{{/view}}')); var ClassBindingView = EmberView.extend(); view = EmberView.create({ + [OWNER]: owner, classBindingView: ClassBindingView, - container: container, number: 5, templateName: 'template' }); @@ -944,7 +934,7 @@ QUnit.test('a view helper\'s bindings are to the parent context', function() { QUnit.test('should expose a controller keyword when present on the view', function() { var templateString = '{{controller.foo}}{{#view}}{{controller.baz}}{{/view}}'; view = EmberView.create({ - container: container, + [OWNER]: owner, controller: EmberObject.create({ foo: 'bar', baz: 'bang' @@ -981,7 +971,8 @@ QUnit.test('should expose a controller keyword when present on the view', functi QUnit.test('should expose a controller keyword that can be used in conditionals', function() { var templateString = '{{#view}}{{#if controller}}{{controller.foo}}{{/if}}{{/view}}'; view = EmberView.create({ - container: container, + [OWNER]: owner, + controller: EmberObject.create({ foo: 'bar' }), @@ -1007,7 +998,7 @@ QUnit.test('should expose a controller that can be used in the view instance', f }; var childThingController; view = EmberView.create({ - container, + [OWNER]: owner, controller, childThing: EmberView.extend({ @@ -1027,8 +1018,8 @@ QUnit.test('should expose a controller that can be used in the view instance', f QUnit.test('should expose a controller keyword that persists through Ember.ContainerView', function() { var templateString = '{{view view.containerView}}'; view = EmberView.create({ + [OWNER]: owner, containerView: ContainerView, - container: container, controller: EmberObject.create({ foo: 'bar' }), @@ -1240,12 +1231,12 @@ QUnit.test('{{view}} asserts that a view subclass instance is present off contro }); QUnit.test('Specifying `id` to {{view}} is set on the view.', function() { - registry.register('view:derp', EmberView.extend({ + owner.register('view:derp', EmberView.extend({ template: compile('
{{view.id}}
{{view.elementId}}
') })); view = EmberView.create({ - container: container, + [OWNER]: owner, foo: 'bar', template: compile('{{view "derp" id=view.foo}}') }); @@ -1258,12 +1249,12 @@ QUnit.test('Specifying `id` to {{view}} is set on the view.', function() { }); QUnit.test('Specifying `id` to {{view}} does not allow bound id changes.', function() { - registry.register('view:derp', EmberView.extend({ + owner.register('view:derp', EmberView.extend({ template: compile('
{{view.id}}
{{view.elementId}}
') })); view = EmberView.create({ - container: container, + [OWNER]: owner, foo: 'bar', template: compile('{{view "derp" id=view.foo}}') }); @@ -1278,16 +1269,16 @@ QUnit.test('Specifying `id` to {{view}} does not allow bound id changes.', funct }); QUnit.test('using a bound view name does not change on view name property changes', function() { - registry.register('view:foo', viewClass({ + owner.register('view:foo', viewClass({ elementId: 'foo' })); - registry.register('view:bar', viewClass({ + owner.register('view:bar', viewClass({ elementId: 'bar' })); view = EmberView.extend({ - container, + [OWNER]: owner, elementId: 'parent', viewName: 'foo', template: compile('{{view view.viewName}}') @@ -1306,8 +1297,7 @@ QUnit.test('using a bound view name does not change on view name property change }); QUnit.test('should have the correct action target', function() { - registry.register('component:x-outer', EmberComponent.extend({ - container, + owner.register('component:x-outer', EmberComponent.extend({ layout: compile('{{#x-middle}}{{view innerView dismiss="dismiss"}}{{/x-middle}}'), actions: { dismiss: function() { @@ -1315,13 +1305,11 @@ QUnit.test('should have the correct action target', function() { } }, innerView: EmberComponent.extend({ - container, elementId: 'x-inner' }) })); - registry.register('component:x-middle', EmberComponent.extend({ - container, + owner.register('component:x-middle', EmberComponent.extend({ actions: { dismiss: function() { throw new Error('action was not supposed to go here'); @@ -1330,7 +1318,7 @@ QUnit.test('should have the correct action target', function() { })); view = EmberView.extend({ - container, + [OWNER]: owner, template: compile('{{x-outer}}') }).create(); diff --git a/packages/ember-htmlbars/tests/helpers/yield_test.js b/packages/ember-htmlbars/tests/helpers/yield_test.js index df92cd00148..47900455a84 100644 --- a/packages/ember-htmlbars/tests/helpers/yield_test.js +++ b/packages/ember-htmlbars/tests/helpers/yield_test.js @@ -2,7 +2,6 @@ import Ember from 'ember-metal/core'; import run from 'ember-metal/run_loop'; import EmberView from 'ember-views/views/view'; import { computed } from 'ember-metal/computed'; -import { Registry } from 'ember-runtime/system/container'; import { A as emberA } from 'ember-runtime/system/native_array'; import Component from 'ember-views/components/component'; import helpers from 'ember-htmlbars/helpers'; @@ -14,23 +13,25 @@ import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; -var view, registry, container, originalViewKeyword; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -function setupContainer() { - registry = new Registry(); - container = registry.container(); - registry.optionsForType('template', { instantiate: false }); - registry.register('component-lookup:main', ComponentLookup); +var view, owner, originalViewKeyword; + +function commonSetup() { + owner = buildOwner(); + owner.registerOptionsForType('template', { instantiate: false }); + owner.register('component-lookup:main', ComponentLookup); } -function teardownContainer() { - runDestroy(container); - registry = container = view = null; +function commonTeardown() { + runDestroy(owner); + owner = view = null; } QUnit.module('ember-htmlbars: Support for {{yield}} helper', { setup() { - setupContainer(); + commonSetup(); originalViewKeyword = registerKeyword('view', viewKeyword); }, teardown() { @@ -38,7 +39,7 @@ QUnit.module('ember-htmlbars: Support for {{yield}} helper', { Ember.TEMPLATES = {}; }); runDestroy(view); - teardownContainer(); + commonTeardown(); resetKeyword('view', originalViewKeyword); } }); @@ -59,16 +60,15 @@ QUnit.test('a view with a layout set renders its template where the {{yield}} he }); QUnit.test('block should work properly even when templates are not hard-coded', function() { - registry.register('template:nester', compile('

{{attrs.title}}

{{yield}}
')); - registry.register('template:nested', compile('{{#view "with-layout" title="My Fancy Page"}}
Show something interesting here
{{/view}}')); + owner.register('template:nester', compile('

{{attrs.title}}

{{yield}}
')); + owner.register('template:nested', compile('{{#view "with-layout" title="My Fancy Page"}}
Show something interesting here
{{/view}}')); - registry.register('view:with-layout', EmberView.extend({ - container: container, + owner.register('view:with-layout', EmberView.extend({ layoutName: 'nester' })); view = EmberView.create({ - container: container, + [OWNER]: owner, templateName: 'nested' }); @@ -268,7 +268,7 @@ QUnit.test('nested simple bindings inside of a yielded template should work prop QUnit.module('ember-htmlbars: Component {{yield}}', { setup() { - setupContainer(); + commonSetup(); originalViewKeyword = registerKeyword('view', viewKeyword); }, teardown() { @@ -284,17 +284,16 @@ QUnit.test('yield with nested components (#3220)', function() { layout: compile('{{yield}}') }); - registry.register('component:inner-component', InnerComponent); + owner.register('component:inner-component', InnerComponent); var OuterComponent = Component.extend({ layout: compile('{{#inner-component}}{{yield}}{{/inner-component}}') }); - registry.register('component:outer-component', OuterComponent); + owner.register('component:outer-component', OuterComponent); view = EmberView.extend({ - container, - + [OWNER]: owner, template: compile( '{{#outer-component}}Hello world{{/outer-component}}' ) diff --git a/packages/ember-htmlbars/tests/hooks/component_test.js b/packages/ember-htmlbars/tests/hooks/component_test.js index 4fe05a214c4..18d525343a8 100644 --- a/packages/ember-htmlbars/tests/hooks/component_test.js +++ b/packages/ember-htmlbars/tests/hooks/component_test.js @@ -1,34 +1,34 @@ import isEnabled from 'ember-metal/features'; import ComponentLookup from 'ember-views/component_lookup'; -import Registry from 'container/registry'; import EmberView from 'ember-views/views/view'; import compile from 'ember-template-compiler/system/compile'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; +import { OWNER } from 'container/owner'; +import buildOwner from 'container/tests/test-helpers/build-owner'; -var view, registry, container; +var view, owner; if (isEnabled('ember-htmlbars-component-generation')) { QUnit.module('ember-htmlbars: dasherized components that are not in the container ("web components")', { setup() { - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); - registry.optionsForType('template', { instantiate: false }); - registry.register('component-lookup:main', ComponentLookup); + owner.registerOptionsForType('template', { instantiate: false }); + owner.register('component-lookup:main', ComponentLookup); }, teardown() { runDestroy(view); - runDestroy(container); - registry = container = view = null; + runDestroy(owner); + owner = view = null; } }); QUnit.test('non-component dasherized elements can be used as top-level elements', function() { - registry.register('template:components/foo-bar', compile('yippie!')); + owner.register('template:components/foo-bar', compile('yippie!')); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('') }); @@ -39,7 +39,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { QUnit.test('falls back to web component when invoked with angles', function() { view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('') }); diff --git a/packages/ember-htmlbars/tests/integration/attrs_lookup_test.js b/packages/ember-htmlbars/tests/integration/attrs_lookup_test.js index cf2e56b9bce..65864a0c704 100644 --- a/packages/ember-htmlbars/tests/integration/attrs_lookup_test.js +++ b/packages/ember-htmlbars/tests/integration/attrs_lookup_test.js @@ -1,4 +1,3 @@ -import Registry from 'container/registry'; import compile from 'ember-template-compiler/system/compile'; import ComponentLookup from 'ember-views/component_lookup'; import Component from 'ember-views/components/component'; @@ -6,31 +5,33 @@ import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import EmberView from 'ember-views/views/view'; import run from 'ember-metal/run_loop'; -var registry, container, view; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; + +var owner, view; QUnit.module('component - attrs lookup', { setup() { - registry = new Registry(); - container = registry.container(); - registry.optionsForType('component', { singleton: false }); - registry.optionsForType('view', { singleton: false }); - registry.optionsForType('template', { instantiate: false }); - registry.register('component-lookup:main', ComponentLookup); + owner = buildOwner(); + owner.registerOptionsForType('component', { singleton: false }); + owner.registerOptionsForType('view', { singleton: false }); + owner.registerOptionsForType('template', { instantiate: false }); + owner.register('component-lookup:main', ComponentLookup); }, teardown() { - runDestroy(container); + runDestroy(owner); runDestroy(view); - registry = container = view = null; + owner = view = null; } }); QUnit.test('should be able to lookup attrs without `attrs.` - template access', function() { - registry.register('template:components/foo-bar', compile('{{first}}')); + owner.register('template:components/foo-bar', compile('{{first}}')); view = EmberView.extend({ - template: compile('{{foo-bar first="first attr"}}'), - container: container + [OWNER]: owner, + template: compile('{{foo-bar first="first attr"}}') }).create(); runAppend(view); @@ -41,7 +42,7 @@ QUnit.test('should be able to lookup attrs without `attrs.` - template access', QUnit.test('should be able to lookup attrs without `attrs.` - component access', function() { var component; - registry.register('component:foo-bar', Component.extend({ + owner.register('component:foo-bar', Component.extend({ init() { this._super(...arguments); component = this; @@ -49,8 +50,8 @@ QUnit.test('should be able to lookup attrs without `attrs.` - component access', })); view = EmberView.extend({ - template: compile('{{foo-bar first="first attr"}}'), - container: container + [OWNER]: owner, + template: compile('{{foo-bar first="first attr"}}') }).create(); runAppend(view); @@ -61,7 +62,7 @@ QUnit.test('should be able to lookup attrs without `attrs.` - component access', QUnit.test('should be able to modify a provided attr into local state #11571 / #11559', function() { var component; - registry.register('component:foo-bar', Component.extend({ + owner.register('component:foo-bar', Component.extend({ init() { this._super(...arguments); component = this; @@ -71,11 +72,11 @@ QUnit.test('should be able to modify a provided attr into local state #11571 / # this.set('first', this.getAttr('first').toUpperCase()); } })); - registry.register('template:components/foo-bar', compile('{{first}}')); + owner.register('template:components/foo-bar', compile('{{first}}')); view = EmberView.extend({ - template: compile('{{foo-bar first="first attr"}}'), - container: container + [OWNER]: owner, + template: compile('{{foo-bar first="first attr"}}') }).create(); runAppend(view); @@ -87,7 +88,7 @@ QUnit.test('should be able to modify a provided attr into local state #11571 / # QUnit.test('should be able to access unspecified attr #12035', function() { var component; - registry.register('component:foo-bar', Component.extend({ + owner.register('component:foo-bar', Component.extend({ init() { this._super(...arguments); component = this; @@ -97,11 +98,11 @@ QUnit.test('should be able to access unspecified attr #12035', function() { equal(this.get('woot'), 'yes', 'found attr in didReceiveAttrs'); } })); - // registry.register('template:components/foo-bar', compile('{{first}}')); + // owner.register('template:components/foo-bar', compile('{{first}}')); view = EmberView.extend({ - template: compile('{{foo-bar woot="yes"}}'), - container: container + [OWNER]: owner, + template: compile('{{foo-bar woot="yes"}}') }).create(); runAppend(view); @@ -115,7 +116,7 @@ QUnit.test('should not need to call _super in `didReceiveAttrs` (GH #11992)', fu var firstValue = 'first'; var secondValue = 'second'; - registry.register('component:foo-bar', Component.extend({ + owner.register('component:foo-bar', Component.extend({ didReceiveAttrs() { let rootFirst = this.get('first'); let rootSecond = this.get('second'); @@ -131,10 +132,10 @@ QUnit.test('should not need to call _super in `didReceiveAttrs` (GH #11992)', fu })); view = EmberView.extend({ + [OWNER]: owner, first: firstValue, second: secondValue, - template: compile('{{foo-bar first=view.first second=view.second}}'), - container: container + template: compile('{{foo-bar first=view.first second=view.second}}') }).create(); runAppend(view); diff --git a/packages/ember-htmlbars/tests/integration/block_params_test.js b/packages/ember-htmlbars/tests/integration/block_params_test.js index 1339f21c22a..7ec3eb378a8 100644 --- a/packages/ember-htmlbars/tests/integration/block_params_test.js +++ b/packages/ember-htmlbars/tests/integration/block_params_test.js @@ -1,4 +1,3 @@ -import Registry from 'container/registry'; import run from 'ember-metal/run_loop'; import ComponentLookup from 'ember-views/component_lookup'; import View from 'ember-views/views/view'; @@ -6,28 +5,29 @@ import Component from 'ember-views/components/component'; import compile from 'ember-template-compiler/system/compile'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; -var registry, container, view; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; + +var owner, view; QUnit.module('ember-htmlbars: block params', { setup() { - registry = new Registry(); - container = registry.container(); - registry.optionsForType('component', { singleton: false }); - registry.optionsForType('view', { singleton: false }); - registry.optionsForType('template', { instantiate: false }); - registry.register('component-lookup:main', ComponentLookup); + owner = buildOwner(); + owner.registerOptionsForType('component', { singleton: false }); + owner.registerOptionsForType('view', { singleton: false }); + owner.registerOptionsForType('template', { instantiate: false }); + owner.register('component-lookup:main', ComponentLookup); }, teardown() { runDestroy(view); - runDestroy(container); - registry = container = view = null; + runDestroy(owner); + owner = view = null; } }); QUnit.test('should raise error if helper not available', function() { view = View.create({ - container: container, template: compile('{{#shouldfail}}{{/shouldfail}}') }); @@ -85,10 +85,10 @@ QUnit.test('nested block params shadow correctly', function() { }); QUnit.test('components can yield values', function() { - registry.register('template:components/x-alias', compile('{{yield attrs.param.name}}')); + owner.register('template:components/x-alias', compile('{{yield attrs.param.name}}')); view = View.create({ - container: container, + [OWNER]: owner, context: { name: 'ebryn' }, committer1: { name: 'trek' }, committer2: { name: 'machty' }, @@ -127,10 +127,10 @@ QUnit.test('components can yield values', function() { QUnit.test('#11519 - block param infinite loop', function(assert) { // To trigger this case, a component must 1) consume a KeyStream and then yield that KeyStream // into a parent light scope. - registry.register('template:components/block-with-yield', compile('{{danger}} {{yield danger}}')); + owner.register('template:components/block-with-yield', compile('{{danger}} {{yield danger}}')); var component; - registry.register('component:block-with-yield', Component.extend({ + owner.register('component:block-with-yield', Component.extend({ init() { component = this; return this._super(...arguments); @@ -140,7 +140,7 @@ QUnit.test('#11519 - block param infinite loop', function(assert) { })); view = View.create({ - container: container, + [OWNER]: owner, template: compile('{{#block-with-yield as |dangerBlockParam|}} {{/block-with-yield}}') }); diff --git a/packages/ember-htmlbars/tests/integration/component_element_id_test.js b/packages/ember-htmlbars/tests/integration/component_element_id_test.js index 25b9ae9cce1..70b1e830d5e 100644 --- a/packages/ember-htmlbars/tests/integration/component_element_id_test.js +++ b/packages/ember-htmlbars/tests/integration/component_element_id_test.js @@ -1,36 +1,36 @@ import EmberView from 'ember-views/views/view'; -import { Registry } from 'ember-runtime/system/container'; import compile from 'ember-template-compiler/system/compile'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import ComponentLookup from 'ember-views/component_lookup'; import Component from 'ember-views/components/component'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var registry, container, view; +var owner, view; QUnit.module('ember-htmlbars: component elementId', { setup() { - registry = new Registry(); - container = registry.container(); - registry.optionsForType('component', { singleton: false }); - registry.optionsForType('view', { singleton: false }); - registry.optionsForType('template', { instantiate: false }); - registry.register('component-lookup:main', ComponentLookup); + owner = buildOwner(); + owner.registerOptionsForType('component', { singleton: false }); + owner.registerOptionsForType('view', { singleton: false }); + owner.registerOptionsForType('template', { instantiate: false }); + owner.register('component-lookup:main', ComponentLookup); }, teardown() { - runDestroy(container); + runDestroy(owner); runDestroy(view); - registry = container = view = null; + owner = view = null; } }); QUnit.test('passing undefined elementId results in a default elementId', function() { - registry.register('component:x-foo', Component.extend({ + owner.register('component:x-foo', Component.extend({ tagName: 'h1' })); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{x-foo id=somethingUndefined}}') }); diff --git a/packages/ember-htmlbars/tests/integration/component_invocation_test.js b/packages/ember-htmlbars/tests/integration/component_invocation_test.js index b7ac84d93b1..b3eccb700c6 100644 --- a/packages/ember-htmlbars/tests/integration/component_invocation_test.js +++ b/packages/ember-htmlbars/tests/integration/component_invocation_test.js @@ -1,7 +1,6 @@ import Ember from 'ember-metal/core'; import isEnabled from 'ember-metal/features'; import EmberView from 'ember-views/views/view'; -import Registry from 'container/registry'; import jQuery from 'ember-views/system/jquery'; import compile from 'ember-template-compiler/system/compile'; import ComponentLookup from 'ember-views/component_lookup'; @@ -13,28 +12,29 @@ import { set } from 'ember-metal/property_set'; import alias from 'ember-metal/alias'; import run from 'ember-metal/run_loop'; import { A as emberA } from 'ember-runtime/system/native_array'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var registry, container, view; +var owner, view; function commonSetup() { - registry = new Registry(); - container = registry.container(); - registry.optionsForType('component', { singleton: false }); - registry.optionsForType('view', { singleton: false }); - registry.optionsForType('template', { instantiate: false }); - registry.register('component-lookup:main', ComponentLookup); + owner = buildOwner(); + owner.registerOptionsForType('component', { singleton: false }); + owner.registerOptionsForType('view', { singleton: false }); + owner.registerOptionsForType('template', { instantiate: false }); + owner.register('component-lookup:main', ComponentLookup); } function commonTeardown() { - runDestroy(container); + runDestroy(owner); runDestroy(view); - registry = container = view = null; + owner = view = null; } function appendViewFor(template, hash={}) { - let view = EmberView.extend({ - template: compile(template), - container: container + const view = EmberView.extend({ + [OWNER]: owner, + template: compile(template) }).create(hash); runAppend(view); @@ -55,11 +55,11 @@ QUnit.module('component - invocation', { QUnit.test('non-block without properties', function() { expect(1); - registry.register('template:components/non-block', compile('In layout')); + owner.register('template:components/non-block', compile('In layout')); view = EmberView.extend({ - template: compile('{{non-block}}'), - container: container + [OWNER]: owner, + template: compile('{{non-block}}') }).create(); runAppend(view); @@ -68,8 +68,8 @@ QUnit.test('non-block without properties', function() { }); QUnit.test('GlimmerComponent cannot be invoked with curly braces', function() { - registry.register('template:components/non-block', compile('In layout')); - registry.register('component:non-block', GlimmerComponent.extend()); + owner.register('template:components/non-block', compile('In layout')); + owner.register('component:non-block', GlimmerComponent.extend()); expectAssertion(function() { view = appendViewFor('{{non-block}}'); @@ -79,11 +79,11 @@ QUnit.test('GlimmerComponent cannot be invoked with curly braces', function() { QUnit.test('block without properties', function() { expect(1); - registry.register('template:components/with-block', compile('In layout - {{yield}}')); + owner.register('template:components/with-block', compile('In layout - {{yield}}')); view = EmberView.extend({ - template: compile('{{#with-block}}In template{{/with-block}}'), - container: container + [OWNER]: owner, + template: compile('{{#with-block}}In template{{/with-block}}') }).create(); runAppend(view); @@ -94,11 +94,11 @@ QUnit.test('block without properties', function() { QUnit.test('non-block with properties on attrs', function() { expect(1); - registry.register('template:components/non-block', compile('In layout - someProp: {{attrs.someProp}}')); + owner.register('template:components/non-block', compile('In layout - someProp: {{attrs.someProp}}')); view = EmberView.extend({ - template: compile('{{non-block someProp="something here"}}'), - container: container + [OWNER]: owner, + template: compile('{{non-block someProp="something here"}}') }).create(); runAppend(view); @@ -107,12 +107,12 @@ QUnit.test('non-block with properties on attrs', function() { }); QUnit.test('non-block with properties on attrs and component class', function() { - registry.register('component:non-block', Component.extend()); - registry.register('template:components/non-block', compile('In layout - someProp: {{attrs.someProp}}')); + owner.register('component:non-block', Component.extend()); + owner.register('template:components/non-block', compile('In layout - someProp: {{attrs.someProp}}')); view = EmberView.extend({ - template: compile('{{non-block someProp="something here"}}'), - container: container + [OWNER]: owner, + template: compile('{{non-block someProp="something here"}}') }).create(); runAppend(view); @@ -123,11 +123,11 @@ QUnit.test('non-block with properties on attrs and component class', function() QUnit.test('lookup of component takes priority over property', function() { expect(1); - registry.register('template:components/some-component', compile('some-component')); + owner.register('template:components/some-component', compile('some-component')); view = EmberView.extend({ + [OWNER]: owner, template: compile('{{some-prop}} {{some-component}}'), - container: container, context: { 'some-component': 'not-some-component', 'some-prop': 'some-prop' @@ -142,11 +142,11 @@ QUnit.test('lookup of component takes priority over property', function() { QUnit.test('component without dash is not looked up', function() { expect(1); - registry.register('template:components/somecomponent', compile('somecomponent')); + owner.register('template:components/somecomponent', compile('somecomponent')); view = EmberView.extend({ + [OWNER]: owner, template: compile('{{somecomponent}}'), - container: container, context: { 'somecomponent': 'notsomecomponent' } @@ -161,7 +161,7 @@ QUnit.test('rerendering component with attrs from parent', function() { var willUpdate = 0; var didReceiveAttrs = 0; - registry.register('component:non-block', Component.extend({ + owner.register('component:non-block', Component.extend({ didReceiveAttrs() { didReceiveAttrs++; }, @@ -170,11 +170,11 @@ QUnit.test('rerendering component with attrs from parent', function() { willUpdate++; } })); - registry.register('template:components/non-block', compile('In layout - someProp: {{attrs.someProp}}')); + owner.register('template:components/non-block', compile('In layout - someProp: {{attrs.someProp}}')); view = EmberView.extend({ + [OWNER]: owner, template: compile('{{non-block someProp=view.someProp}}'), - container: container, someProp: 'wycats' }).create(); @@ -204,11 +204,11 @@ QUnit.test('[DEPRECATED] non-block with properties on self', function() { // TODO: attrs // expectDeprecation("You accessed the `someProp` attribute directly. Please use `attrs.someProp` instead."); - registry.register('template:components/non-block', compile('In layout - someProp: {{someProp}}')); + owner.register('template:components/non-block', compile('In layout - someProp: {{someProp}}')); view = EmberView.extend({ - template: compile('{{non-block someProp="something here"}}'), - container: container + [OWNER]: owner, + template: compile('{{non-block someProp="something here"}}') }).create(); runAppend(view); @@ -219,11 +219,11 @@ QUnit.test('[DEPRECATED] non-block with properties on self', function() { QUnit.test('block with properties on attrs', function() { expect(1); - registry.register('template:components/with-block', compile('In layout - someProp: {{attrs.someProp}} - {{yield}}')); + owner.register('template:components/with-block', compile('In layout - someProp: {{attrs.someProp}} - {{yield}}')); view = EmberView.extend({ - template: compile('{{#with-block someProp="something here"}}In template{{/with-block}}'), - container: container + [OWNER]: owner, + template: compile('{{#with-block someProp="something here"}}In template{{/with-block}}') }).create(); runAppend(view); @@ -235,11 +235,11 @@ QUnit.test('[DEPRECATED] block with properties on self', function() { // TODO: attrs // expectDeprecation("You accessed the `someProp` attribute directly. Please use `attrs.someProp` instead."); - registry.register('template:components/with-block', compile('In layout - someProp: {{someProp}} - {{yield}}')); + owner.register('template:components/with-block', compile('In layout - someProp: {{someProp}} - {{yield}}')); view = EmberView.extend({ - template: compile('{{#with-block someProp="something here"}}In template{{/with-block}}'), - container: container + [OWNER]: owner, + template: compile('{{#with-block someProp="something here"}}In template{{/with-block}}') }).create(); runAppend(view); @@ -250,11 +250,11 @@ QUnit.test('[DEPRECATED] block with properties on self', function() { QUnit.test('with ariaRole specified', function() { expect(1); - registry.register('template:components/aria-test', compile('Here!')); + owner.register('template:components/aria-test', compile('Here!')); view = EmberView.extend({ - template: compile('{{aria-test id="aria-test" ariaRole="main"}}'), - container: container + [OWNER]: owner, + template: compile('{{aria-test id="aria-test" ariaRole="main"}}') }).create(); runAppend(view); @@ -265,14 +265,14 @@ QUnit.test('with ariaRole specified', function() { QUnit.test('`template` specified in a component is overridden by block', function() { expect(1); - registry.register('component:with-block', Component.extend({ + owner.register('component:with-block', Component.extend({ layout: compile('{{yield}}'), template: compile('Oh, noes!') })); view = EmberView.extend({ - template: compile('{{#with-block}}Whoop, whoop!{{/with-block}}'), - container: container + [OWNER]: owner, + template: compile('{{#with-block}}Whoop, whoop!{{/with-block}}') }).create(); runAppend(view); @@ -283,11 +283,11 @@ QUnit.test('`template` specified in a component is overridden by block', functio QUnit.test('hasBlock is true when block supplied', function() { expect(1); - registry.register('template:components/with-block', compile('{{#if hasBlock}}{{yield}}{{else}}No Block!{{/if}}')); + owner.register('template:components/with-block', compile('{{#if hasBlock}}{{yield}}{{else}}No Block!{{/if}}')); view = EmberView.extend({ - template: compile('{{#with-block}}In template{{/with-block}}'), - container: container + [OWNER]: owner, + template: compile('{{#with-block}}In template{{/with-block}}') }).create(); runAppend(view); @@ -298,11 +298,11 @@ QUnit.test('hasBlock is true when block supplied', function() { QUnit.test('hasBlock is false when no block supplied', function() { expect(1); - registry.register('template:components/with-block', compile('{{#if hasBlock}}{{yield}}{{else}}No Block!{{/if}}')); + owner.register('template:components/with-block', compile('{{#if hasBlock}}{{yield}}{{else}}No Block!{{/if}}')); view = EmberView.extend({ - template: compile('{{with-block}}'), - container: container + [OWNER]: owner, + template: compile('{{with-block}}') }).create(); runAppend(view); @@ -313,11 +313,11 @@ QUnit.test('hasBlock is false when no block supplied', function() { QUnit.test('hasBlockParams is true when block param supplied', function() { expect(1); - registry.register('template:components/with-block', compile('{{#if hasBlockParams}}{{yield this}} - In Component{{else}}{{yield}} No Block!{{/if}}')); + owner.register('template:components/with-block', compile('{{#if hasBlockParams}}{{yield this}} - In Component{{else}}{{yield}} No Block!{{/if}}')); view = EmberView.extend({ - template: compile('{{#with-block as |something|}}In template{{/with-block}}'), - container: container + [OWNER]: owner, + template: compile('{{#with-block as |something|}}In template{{/with-block}}') }).create(); runAppend(view); @@ -328,11 +328,11 @@ QUnit.test('hasBlockParams is true when block param supplied', function() { QUnit.test('hasBlockParams is false when no block param supplied', function() { expect(1); - registry.register('template:components/with-block', compile('{{#if hasBlockParams}}{{yield this}}{{else}}{{yield}} No Block Param!{{/if}}')); + owner.register('template:components/with-block', compile('{{#if hasBlockParams}}{{yield this}}{{else}}{{yield}} No Block Param!{{/if}}')); view = EmberView.extend({ - template: compile('{{#with-block}}In block{{/with-block}}'), - container: container + [OWNER]: owner, + template: compile('{{#with-block}}In block{{/with-block}}') }).create(); runAppend(view); @@ -345,12 +345,12 @@ QUnit.test('static named positional parameters', function() { SampleComponent.reopenClass({ positionalParams: ['name', 'age'] }); - registry.register('template:components/sample-component', compile('{{attrs.name}}{{attrs.age}}')); - registry.register('component:sample-component', SampleComponent); + owner.register('template:components/sample-component', compile('{{attrs.name}}{{attrs.age}}')); + owner.register('component:sample-component', SampleComponent); view = EmberView.extend({ - layout: compile('{{sample-component "Quint" 4}}'), - container: container + [OWNER]: owner, + layout: compile('{{sample-component "Quint" 4}}') }).create(); runAppend(view); @@ -364,12 +364,12 @@ QUnit.test('dynamic named positional parameters', function() { positionalParams: ['name', 'age'] }); - registry.register('template:components/sample-component', compile('{{attrs.name}}{{attrs.age}}')); - registry.register('component:sample-component', SampleComponent); + owner.register('template:components/sample-component', compile('{{attrs.name}}{{attrs.age}}')); + owner.register('component:sample-component', SampleComponent); view = EmberView.extend({ + [OWNER]: owner, layout: compile('{{sample-component myName myAge}}'), - container: container, context: { myName: 'Quint', myAge: 4 @@ -393,12 +393,12 @@ QUnit.test('if a value is passed as a non-positional parameter, it takes precede positionalParams: ['name'] }); - registry.register('template:components/sample-component', compile('{{attrs.name}}')); - registry.register('component:sample-component', SampleComponent); + owner.register('template:components/sample-component', compile('{{attrs.name}}')); + owner.register('component:sample-component', SampleComponent); view = EmberView.extend({ + [OWNER]: owner, layout: compile('{{sample-component notMyName name=myName}}'), - container: container, context: { myName: 'Quint', notMyName: 'Sergio' @@ -416,12 +416,12 @@ QUnit.test('static arbitrary number of positional parameters', function() { positionalParams: 'names' }); - registry.register('template:components/sample-component', compile('{{#each attrs.names as |name|}}{{name}}{{/each}}')); - registry.register('component:sample-component', SampleComponent); + owner.register('template:components/sample-component', compile('{{#each attrs.names as |name|}}{{name}}{{/each}}')); + owner.register('component:sample-component', SampleComponent); view = EmberView.extend({ - layout: compile('{{sample-component "Foo" 4 "Bar" id="args-3"}}{{sample-component "Foo" 4 "Bar" 5 "Baz" id="args-5"}}{{component "sample-component" "Foo" 4 "Bar" 5 "Baz" id="helper"}}'), - container: container + [OWNER]: owner, + layout: compile('{{sample-component "Foo" 4 "Bar" id="args-3"}}{{sample-component "Foo" 4 "Bar" 5 "Baz" id="args-5"}}{{component "sample-component" "Foo" 4 "Bar" 5 "Baz" id="helper"}}') }).create(); runAppend(view); @@ -437,12 +437,12 @@ QUnit.test('arbitrary positional parameter conflict with hash parameter is repor positionalParams: 'names' }); - registry.register('template:components/sample-component', compile('{{#each attrs.names as |name|}}{{name}}{{/each}}')); - registry.register('component:sample-component', SampleComponent); + owner.register('template:components/sample-component', compile('{{#each attrs.names as |name|}}{{name}}{{/each}}')); + owner.register('component:sample-component', SampleComponent); view = EmberView.extend({ + [OWNER]: owner, layout: compile('{{sample-component "Foo" 4 "Bar" names=numbers id="args-3"}}'), - container: container, context: { numbers: [1, 2, 3] } @@ -459,12 +459,12 @@ QUnit.test('can use hash parameter instead of arbitrary positional param [GH #12 positionalParams: 'names' }); - registry.register('template:components/sample-component', compile('{{#each attrs.names as |name|}}{{name}}{{/each}}')); - registry.register('component:sample-component', SampleComponent); + owner.register('template:components/sample-component', compile('{{#each attrs.names as |name|}}{{name}}{{/each}}')); + owner.register('component:sample-component', SampleComponent); view = EmberView.extend({ + [OWNER]: owner, layout: compile('{{sample-component names=things id="args-3"}}'), - container: container, context: { things: ['Foo', 4, 'Bar'] } @@ -481,17 +481,17 @@ QUnit.test('can use hash parameter instead of positional param', function() { positionalParams: ['first', 'second'] }); - registry.register('template:components/sample-component', compile('{{attrs.first}} - {{attrs.second}}')); - registry.register('component:sample-component', SampleComponent); + owner.register('template:components/sample-component', compile('{{attrs.first}} - {{attrs.second}}')); + owner.register('component:sample-component', SampleComponent); view = EmberView.extend({ + [OWNER]: owner, layout: compile(` {{sample-component "one" "two" id="two-positional"}} {{sample-component "one" second="two" id="one-positional"}} {{sample-component first="one" second="two" id="no-positional"}} `), - container: container, context: { things: ['Foo', 4, 'Bar'] } @@ -509,12 +509,12 @@ QUnit.test('dynamic arbitrary number of positional parameters', function() { SampleComponent.reopenClass({ positionalParams: 'n' }); - registry.register('template:components/sample-component', compile('{{#each attrs.n as |name|}}{{name}}{{/each}}')); - registry.register('component:sample-component', SampleComponent); + owner.register('template:components/sample-component', compile('{{#each attrs.n as |name|}}{{name}}{{/each}}')); + owner.register('component:sample-component', SampleComponent); view = EmberView.extend({ + [OWNER]: owner, layout: compile('{{sample-component user1 user2 id="direct"}}{{component "sample-component" user1 user2 id="helper"}}'), - container: container, context: { user1: 'Foo', user2: 4 @@ -548,16 +548,16 @@ QUnit.test('moduleName is available on _renderNode when a layout is present', fu var sampleComponentLayout = compile('Sample Component - {{yield}}', { moduleName: layoutModuleName }); - registry.register('template:components/sample-component', sampleComponentLayout); - registry.register('component:sample-component', Component.extend({ + owner.register('template:components/sample-component', sampleComponentLayout); + owner.register('component:sample-component', Component.extend({ didInsertElement: function() { equal(this._renderNode.lastResult.template.meta.moduleName, layoutModuleName); } })); view = EmberView.extend({ - layout: compile('{{sample-component}}'), - container + [OWNER]: owner, + layout: compile('{{sample-component}}') }).create(); runAppend(view); @@ -567,17 +567,17 @@ QUnit.test('moduleName is available on _renderNode when no layout is present', f expect(1); var templateModuleName = 'my-app-name/templates/application'; - registry.register('component:sample-component', Component.extend({ + owner.register('component:sample-component', Component.extend({ didInsertElement: function() { equal(this._renderNode.lastResult.template.meta.moduleName, templateModuleName); } })); view = EmberView.extend({ + [OWNER]: owner, layout: compile('{{#sample-component}}Derp{{/sample-component}}', { moduleName: templateModuleName - }), - container + }) }).create(); runAppend(view); @@ -589,12 +589,12 @@ QUnit.test('{{component}} helper works with positional params', function() { positionalParams: ['name', 'age'] }); - registry.register('template:components/sample-component', compile('{{attrs.name}}{{attrs.age}}')); - registry.register('component:sample-component', SampleComponent); + owner.register('template:components/sample-component', compile('{{attrs.name}}{{attrs.age}}')); + owner.register('component:sample-component', SampleComponent); view = EmberView.extend({ + [OWNER]: owner, layout: compile('{{component "sample-component" myName myAge}}'), - container: container, context: { myName: 'Quint', myAge: 4 @@ -612,11 +612,11 @@ QUnit.test('{{component}} helper works with positional params', function() { }); QUnit.test('yield to inverse', function() { - registry.register('template:components/my-if', compile('{{#if predicate}}Yes:{{yield someValue}}{{else}}No:{{yield to="inverse"}}{{/if}}')); + owner.register('template:components/my-if', compile('{{#if predicate}}Yes:{{yield someValue}}{{else}}No:{{yield to="inverse"}}{{/if}}')); view = EmberView.extend({ + [OWNER]: owner, layout: compile('{{#my-if predicate=activated someValue=42 as |result|}}Hello{{result}}{{else}}Goodbye{{/my-if}}'), - container: container, context: { activated: true } @@ -632,11 +632,11 @@ QUnit.test('yield to inverse', function() { }); QUnit.test('parameterized hasBlock inverse', function() { - registry.register('template:components/check-inverse', compile('{{#if (hasBlock "inverse")}}Yes{{else}}No{{/if}}')); + owner.register('template:components/check-inverse', compile('{{#if (hasBlock "inverse")}}Yes{{else}}No{{/if}}')); view = EmberView.extend({ - layout: compile('{{#check-inverse id="expect-no"}}{{/check-inverse}} {{#check-inverse id="expect-yes"}}{{else}}{{/check-inverse}}'), - container: container + [OWNER]: owner, + layout: compile('{{#check-inverse id="expect-no"}}{{/check-inverse}} {{#check-inverse id="expect-yes"}}{{else}}{{/check-inverse}}') }).create(); runAppend(view); @@ -645,11 +645,11 @@ QUnit.test('parameterized hasBlock inverse', function() { }); QUnit.test('parameterized hasBlock default', function() { - registry.register('template:components/check-block', compile('{{#if (hasBlock)}}Yes{{else}}No{{/if}}')); + owner.register('template:components/check-block', compile('{{#if (hasBlock)}}Yes{{else}}No{{/if}}')); view = EmberView.extend({ - layout: compile('{{check-block id="expect-no"}} {{#check-block id="expect-yes"}}{{/check-block}}'), - container: container + [OWNER]: owner, + layout: compile('{{check-block id="expect-no"}} {{#check-block id="expect-yes"}}{{/check-block}}') }).create(); runAppend(view); @@ -658,11 +658,11 @@ QUnit.test('parameterized hasBlock default', function() { }); QUnit.test('non-expression hasBlock ', function() { - registry.register('template:components/check-block', compile('{{#if hasBlock}}Yes{{else}}No{{/if}}')); + owner.register('template:components/check-block', compile('{{#if hasBlock}}Yes{{else}}No{{/if}}')); view = EmberView.extend({ - layout: compile('{{check-block id="expect-no"}} {{#check-block id="expect-yes"}}{{/check-block}}'), - container: container + [OWNER]: owner, + layout: compile('{{check-block id="expect-no"}} {{#check-block id="expect-yes"}}{{/check-block}}') }).create(); runAppend(view); @@ -671,11 +671,11 @@ QUnit.test('non-expression hasBlock ', function() { }); QUnit.test('parameterized hasBlockParams', function() { - registry.register('template:components/check-params', compile('{{#if (hasBlockParams)}}Yes{{else}}No{{/if}}')); + owner.register('template:components/check-params', compile('{{#if (hasBlockParams)}}Yes{{else}}No{{/if}}')); view = EmberView.extend({ - layout: compile('{{#check-params id="expect-no"}}{{/check-params}} {{#check-params id="expect-yes" as |foo|}}{{/check-params}}'), - container: container + [OWNER]: owner, + layout: compile('{{#check-params id="expect-no"}}{{/check-params}} {{#check-params id="expect-yes" as |foo|}}{{/check-params}}') }).create(); runAppend(view); @@ -684,11 +684,11 @@ QUnit.test('parameterized hasBlockParams', function() { }); QUnit.test('non-expression hasBlockParams', function() { - registry.register('template:components/check-params', compile('{{#if hasBlockParams}}Yes{{else}}No{{/if}}')); + owner.register('template:components/check-params', compile('{{#if hasBlockParams}}Yes{{else}}No{{/if}}')); view = EmberView.extend({ - layout: compile('{{#check-params id="expect-no"}}{{/check-params}} {{#check-params id="expect-yes" as |foo|}}{{/check-params}}'), - container: container + [OWNER]: owner, + layout: compile('{{#check-params id="expect-no"}}{{/check-params}} {{#check-params id="expect-yes" as |foo|}}{{/check-params}}') }).create(); runAppend(view); @@ -699,32 +699,32 @@ QUnit.test('non-expression hasBlockParams', function() { QUnit.test('components in template of a yielding component should have the proper parentView', function() { var outer, innerTemplate, innerLayout; - registry.register('component:x-outer', Component.extend({ + owner.register('component:x-outer', Component.extend({ init() { this._super(...arguments); outer = this; } })); - registry.register('component:x-inner-in-template', Component.extend({ + owner.register('component:x-inner-in-template', Component.extend({ init() { this._super(...arguments); innerTemplate = this; } })); - registry.register('component:x-inner-in-layout', Component.extend({ + owner.register('component:x-inner-in-layout', Component.extend({ init() { this._super(...arguments); innerLayout = this; } })); - registry.register('template:components/x-outer', compile('{{x-inner-in-layout}}{{yield}}')); + owner.register('template:components/x-outer', compile('{{x-inner-in-layout}}{{yield}}')); view = EmberView.extend({ - template: compile('{{#x-outer}}{{x-inner-in-template}}{{/x-outer}}'), - container: container + [OWNER]: owner, + template: compile('{{#x-outer}}{{x-inner-in-template}}{{/x-outer}}') }).create(); runAppend(view); @@ -737,14 +737,14 @@ QUnit.test('components in template of a yielding component should have the prope QUnit.test('newly-added sub-components get correct parentView', function() { var outer, inner; - registry.register('component:x-outer', Component.extend({ + owner.register('component:x-outer', Component.extend({ init() { this._super(...arguments); outer = this; } })); - registry.register('component:x-inner', Component.extend({ + owner.register('component:x-inner', Component.extend({ init() { this._super(...arguments); inner = this; @@ -752,8 +752,8 @@ QUnit.test('newly-added sub-components get correct parentView', function() { })); view = EmberView.extend({ + [OWNER]: owner, template: compile('{{#x-outer}}{{#if view.showInner}}{{x-inner}}{{/if}}{{/x-outer}}'), - container: container, showInner: false }).create(); @@ -770,33 +770,33 @@ QUnit.test('components should receive the viewRegistry from the parent view', fu var viewRegistry = {}; - registry.register('component:x-outer', Component.extend({ + owner.register('component:x-outer', Component.extend({ init() { this._super(...arguments); outer = this; } })); - registry.register('component:x-inner-in-template', Component.extend({ + owner.register('component:x-inner-in-template', Component.extend({ init() { this._super(...arguments); innerTemplate = this; } })); - registry.register('component:x-inner-in-layout', Component.extend({ + owner.register('component:x-inner-in-layout', Component.extend({ init() { this._super(...arguments); innerLayout = this; } })); - registry.register('template:components/x-outer', compile('{{x-inner-in-layout}}{{yield}}')); + owner.register('template:components/x-outer', compile('{{x-inner-in-layout}}{{yield}}')); view = EmberView.extend({ + [OWNER]: owner, _viewRegistry: viewRegistry, - template: compile('{{#x-outer}}{{x-inner-in-template}}{{/x-outer}}'), - container: container + template: compile('{{#x-outer}}{{x-inner-in-template}}{{/x-outer}}') }).create(); runAppend(view); @@ -811,35 +811,35 @@ QUnit.test('comopnent should rerender when a property is changed during children var outer, middle; - registry.register('component:x-outer', Component.extend({ + owner.register('component:x-outer', Component.extend({ value: 1, grabReference: Ember.on('init', function() { outer = this; }) })); - registry.register('component:x-middle', Component.extend({ + owner.register('component:x-middle', Component.extend({ value: null, grabReference: Ember.on('init', function() { middle = this; }) })); - registry.register('component:x-inner', Component.extend({ + owner.register('component:x-inner', Component.extend({ value: null, pushDataUp: Ember.observer('value', function() { middle.set('value', this.get('value')); }) })); - registry.register('template:components/x-outer', compile('{{#x-middle}}{{x-inner value=value}}{{/x-middle}}')); - registry.register('template:components/x-middle', compile('
{{value}}
{{yield}}')); - registry.register('template:components/x-inner', compile('
{{value}}
')); + owner.register('template:components/x-outer', compile('{{#x-middle}}{{x-inner value=value}}{{/x-middle}}')); + owner.register('template:components/x-middle', compile('
{{value}}
{{yield}}')); + owner.register('template:components/x-inner', compile('
{{value}}
')); view = EmberView.extend({ - template: compile('{{x-outer}}'), - container: container + [OWNER]: owner, + template: compile('{{x-outer}}') }).create(); runAppend(view); @@ -861,14 +861,14 @@ QUnit.test('comopnent should rerender when a property is changed during children QUnit.test('non-block with each rendering child components', function() { expect(2); - registry.register('template:components/non-block', compile('In layout. {{#each attrs.items as |item|}}[{{child-non-block item=item}}]{{/each}}')); - registry.register('template:components/child-non-block', compile('Child: {{attrs.item}}.')); + owner.register('template:components/non-block', compile('In layout. {{#each attrs.items as |item|}}[{{child-non-block item=item}}]{{/each}}')); + owner.register('template:components/child-non-block', compile('Child: {{attrs.item}}.')); var items = emberA(['Tom', 'Dick', 'Harry']); view = EmberView.extend({ + [OWNER]: owner, template: compile('{{non-block items=view.items}}'), - container: container, items: items }).create(); @@ -887,7 +887,7 @@ QUnit.test('specifying classNames results in correct class', function(assert) { expect(3); let clickyThing; - registry.register('component:some-clicky-thing', Component.extend({ + owner.register('component:some-clicky-thing', Component.extend({ tagName: 'button', classNames: ['foo', 'bar'], init() { @@ -897,8 +897,8 @@ QUnit.test('specifying classNames results in correct class', function(assert) { })); view = EmberView.extend({ - template: compile('{{#some-clicky-thing classNames="baz"}}Click Me{{/some-clicky-thing}}'), - container: container + [OWNER]: owner, + template: compile('{{#some-clicky-thing classNames="baz"}}Click Me{{/some-clicky-thing}}') }).create(); runAppend(view); @@ -917,7 +917,7 @@ QUnit.test('specifying custom concatenatedProperties avoids clobbering', functio expect(1); let clickyThing; - registry.register('component:some-clicky-thing', Component.extend({ + owner.register('component:some-clicky-thing', Component.extend({ concatenatedProperties: ['blahzz'], blahzz: ['blark', 'pory'], init() { @@ -927,8 +927,8 @@ QUnit.test('specifying custom concatenatedProperties avoids clobbering', functio })); view = EmberView.extend({ - template: compile('{{#some-clicky-thing blahzz="baz"}}Click Me{{/some-clicky-thing}}'), - container: container + [OWNER]: owner, + template: compile('{{#some-clicky-thing blahzz="baz"}}Click Me{{/some-clicky-thing}}') }).create(); runAppend(view); @@ -949,8 +949,8 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test('legacy components cannot be invoked with angle brackets', function() { - registry.register('template:components/non-block', compile('In layout')); - registry.register('component:non-block', Component.extend()); + owner.register('template:components/non-block', compile('In layout')); + owner.register('component:non-block', Component.extend()); expectAssertion(function() { view = appendViewFor(''); @@ -958,7 +958,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test('using a text-fragment in a GlimmerComponent layout gives an error', function() { - registry.register('template:components/non-block', compile('In layout')); + owner.register('template:components/non-block', compile('In layout')); expectAssertion(() => { view = appendViewFor(''); @@ -966,7 +966,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test('having multiple top-level elements in a GlimmerComponent layout gives an error', function() { - registry.register('template:components/non-block', compile('
This is a
fragment
')); + owner.register('template:components/non-block', compile('
This is a
fragment
')); expectAssertion(() => { view = appendViewFor(''); @@ -974,7 +974,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test('using a modifier in a GlimmerComponent layout gives an error', function() { - registry.register('template:components/non-block', compile('
')); + owner.register('template:components/non-block', compile('
')); expectAssertion(() => { view = appendViewFor(''); @@ -982,7 +982,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test('using triple-curlies in a GlimmerComponent layout gives an error', function() { - registry.register('template:components/non-block', compile('
This is a
')); + owner.register('template:components/non-block', compile('
This is a
')); expectAssertion(() => { view = appendViewFor(''); @@ -1004,7 +1004,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { QUnit.test(`non-block without attributes replaced with ${style.name}`, function() { // The whitespace is added intentionally to verify that the heuristic is not "a single node" but // rather "a single non-whitespace, non-comment node" - registry.register('template:components/non-block', compile(` <${style.tagName}>In layout `)); + owner.register('template:components/non-block', compile(` <${style.tagName}>In layout `)); view = appendViewFor(''); @@ -1018,7 +1018,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test(`non-block with attributes replaced with ${style.name}`, function() { - registry.register('template:components/non-block', compile(` <${style.tagName} such="{{attrs.stability}}">In layout `)); + owner.register('template:components/non-block', compile(` <${style.tagName} such="{{attrs.stability}}">In layout `)); view = appendViewFor('', { stability: 'stability' @@ -1034,7 +1034,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test(`non-block replaced with ${style.name} (regression with single element in the root element)`, function() { - registry.register('template:components/non-block', compile(` <${style.tagName} such="{{attrs.stability}}">

In layout

`)); + owner.register('template:components/non-block', compile(` <${style.tagName} such="{{attrs.stability}}">

In layout

`)); view = appendViewFor('', { stability: 'stability' @@ -1050,7 +1050,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test(`non-block with class replaced with ${style.name} merges classes`, function() { - registry.register('template:components/non-block', compile(`<${style.tagName} class="inner-class" />`)); + owner.register('template:components/non-block', compile(`<${style.tagName} class="inner-class" />`)); view = appendViewFor('', { outer: 'outer' @@ -1064,7 +1064,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test(`non-block with outer attributes replaced with ${style.name} shadows inner attributes`, function() { - registry.register('template:components/non-block', compile(`<${style.tagName} data-static="static" data-dynamic="{{internal}}" />`)); + owner.register('template:components/non-block', compile(`<${style.tagName} data-static="static" data-dynamic="{{internal}}" />`)); view = appendViewFor(''); @@ -1081,8 +1081,8 @@ if (isEnabled('ember-htmlbars-component-generation')) { // TODO: When un-skipping, fix this so it handles all styles QUnit.skip('non-block recursive invocations with outer attributes replaced with a div shadows inner attributes', function() { - registry.register('template:components/non-block-wrapper', compile('')); - registry.register('template:components/non-block', compile('
')); + owner.register('template:components/non-block-wrapper', compile('')); + owner.register('template:components/non-block', compile('
')); view = appendViewFor(''); @@ -1098,9 +1098,9 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test(`non-block replaced with ${style.name} should have correct scope`, function() { - registry.register('template:components/non-block', compile(`<${style.tagName}>{{internal}}`)); + owner.register('template:components/non-block', compile(`<${style.tagName}>{{internal}}`)); - registry.register('component:non-block', GlimmerComponent.extend({ + owner.register('component:non-block', GlimmerComponent.extend({ init() { this._super(...arguments); this.set('internal', 'stuff'); @@ -1113,11 +1113,11 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test(`non-block replaced with ${style.name} should have correct 'element'`, function() { - registry.register('template:components/non-block', compile(`<${style.tagName} />`)); + owner.register('template:components/non-block', compile(`<${style.tagName} />`)); let component; - registry.register('component:non-block', GlimmerComponent.extend({ + owner.register('component:non-block', GlimmerComponent.extend({ init() { this._super(...arguments); component = this; @@ -1130,9 +1130,9 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test(`non-block replaced with ${style.name} should have inner attributes`, function() { - registry.register('template:components/non-block', compile(`<${style.tagName} data-static="static" data-dynamic="{{internal}}" />`)); + owner.register('template:components/non-block', compile(`<${style.tagName} data-static="static" data-dynamic="{{internal}}" />`)); - registry.register('component:non-block', GlimmerComponent.extend({ + owner.register('component:non-block', GlimmerComponent.extend({ init() { this._super(...arguments); this.set('internal', 'stuff'); @@ -1146,7 +1146,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test(`only text attributes are reflected on the underlying DOM element (${style.name})`, function() { - registry.register('template:components/non-block', compile(`<${style.tagName}>In layout`)); + owner.register('template:components/non-block', compile(`<${style.tagName}>In layout`)); view = appendViewFor('', { dynamic: 'dynamic' @@ -1161,8 +1161,8 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.skip(`partials templates should not be treated like a component layout for ${style.name}`, function() { - registry.register('template:_zomg', compile(`

In partial

`)); - registry.register('template:components/non-block', compile(`<${style.tagName}>{{partial "zomg"}}`)); + owner.register('template:_zomg', compile(`

In partial

`)); + owner.register('template:components/non-block', compile(`<${style.tagName}>{{partial "zomg"}}`)); view = appendViewFor(''); @@ -1175,7 +1175,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.skip('[FRAGMENT] non-block rendering a fragment', function() { - registry.register('template:components/non-block', compile('

{{attrs.first}}

{{attrs.second}}

')); + owner.register('template:components/non-block', compile('

{{attrs.first}}

{{attrs.second}}

')); view = appendViewFor('', { first: 'first1', @@ -1193,7 +1193,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test('block without properties', function() { - registry.register('template:components/with-block', compile('In layout - {{yield}}')); + owner.register('template:components/with-block', compile('In layout - {{yield}}')); view = appendViewFor('In template'); @@ -1203,8 +1203,8 @@ if (isEnabled('ember-htmlbars-component-generation')) { QUnit.test('attributes are not installed on the top level', function() { let component; - registry.register('template:components/non-block', compile('In layout - {{attrs.text}} -- {{text}}')); - registry.register('component:non-block', GlimmerComponent.extend({ + owner.register('template:components/non-block', compile('In layout - {{attrs.text}} -- {{text}}')); + owner.register('component:non-block', GlimmerComponent.extend({ // This is specifically attempting to trigger a 1.x-era heuristic that only copied // attrs that were present as defined properties on the component. text: null, @@ -1239,8 +1239,8 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test('non-block with properties on attrs and component class', function() { - registry.register('component:non-block', GlimmerComponent.extend()); - registry.register('template:components/non-block', compile('In layout - someProp: {{attrs.someProp}}')); + owner.register('component:non-block', GlimmerComponent.extend()); + owner.register('template:components/non-block', compile('In layout - someProp: {{attrs.someProp}}')); view = appendViewFor(''); @@ -1251,7 +1251,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { var willUpdate = 0; var didReceiveAttrs = 0; - registry.register('component:non-block', GlimmerComponent.extend({ + owner.register('component:non-block', GlimmerComponent.extend({ didReceiveAttrs() { didReceiveAttrs++; }, @@ -1261,7 +1261,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { } })); - registry.register('template:components/non-block', compile('In layout - someProp: {{attrs.someProp}}')); + owner.register('template:components/non-block', compile('In layout - someProp: {{attrs.someProp}}')); view = appendViewFor('', { someProp: 'wycats' @@ -1287,7 +1287,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test('block with properties on attrs', function() { - registry.register('template:components/with-block', compile('In layout - someProp: {{attrs.someProp}} - {{yield}}')); + owner.register('template:components/with-block', compile('In layout - someProp: {{attrs.someProp}} - {{yield}}')); view = appendViewFor('In template'); @@ -1301,16 +1301,16 @@ if (isEnabled('ember-htmlbars-component-generation')) { var sampleComponentLayout = compile('Sample Component - {{yield}}', { moduleName: layoutModuleName }); - registry.register('template:components/sample-component', sampleComponentLayout); - registry.register('component:sample-component', GlimmerComponent.extend({ + owner.register('template:components/sample-component', sampleComponentLayout); + owner.register('component:sample-component', GlimmerComponent.extend({ didInsertElement: function() { equal(this._renderNode.lastResult.template.meta.moduleName, layoutModuleName); } })); view = EmberView.extend({ - layout: compile(''), - container + [OWNER]: owner, + layout: compile('') }).create(); runAppend(view); @@ -1320,26 +1320,26 @@ if (isEnabled('ember-htmlbars-component-generation')) { expect(1); var templateModuleName = 'my-app-name/templates/application'; - registry.register('component:sample-component', Component.extend({ + owner.register('component:sample-component', Component.extend({ didInsertElement: function() { equal(this._renderNode.lastResult.template.meta.moduleName, templateModuleName); } })); view = EmberView.extend({ + [OWNER]: owner, layout: compile('{{#sample-component}}Derp{{/sample-component}}', { moduleName: templateModuleName - }), - container + }) }).create(); runAppend(view); }); QUnit.test('computed property alias on attrs', function() { - registry.register('template:components/computed-alias', compile('{{otherProp}}')); + owner.register('template:components/computed-alias', compile('{{otherProp}}')); - registry.register('component:computed-alias', GlimmerComponent.extend({ + owner.register('component:computed-alias', GlimmerComponent.extend({ otherProp: alias('attrs.someProp') })); @@ -1349,7 +1349,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test('parameterized hasBlock default', function() { - registry.register('template:components/check-block', compile('{{#if (hasBlock)}}Yes{{else}}No{{/if}}')); + owner.register('template:components/check-block', compile('{{#if (hasBlock)}}Yes{{else}}No{{/if}}')); view = appendViewFor(' '); @@ -1358,7 +1358,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test('non-expression hasBlock ', function() { - registry.register('template:components/check-block', compile('{{#if hasBlock}}Yes{{else}}No{{/if}}')); + owner.register('template:components/check-block', compile('{{#if hasBlock}}Yes{{else}}No{{/if}}')); view = appendViewFor(' '); @@ -1367,7 +1367,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test('parameterized hasBlockParams', function() { - registry.register('template:components/check-params', compile('{{#if (hasBlockParams)}}Yes{{else}}No{{/if}}')); + owner.register('template:components/check-params', compile('{{#if (hasBlockParams)}}Yes{{else}}No{{/if}}')); view = appendViewFor(' '); @@ -1376,7 +1376,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { }); QUnit.test('non-expression hasBlockParams', function() { - registry.register('template:components/check-params', compile('{{#if hasBlockParams}}Yes{{else}}No{{/if}}')); + owner.register('template:components/check-params', compile('{{#if hasBlockParams}}Yes{{else}}No{{/if}}')); view = appendViewFor(' '); diff --git a/packages/ember-htmlbars/tests/integration/component_lifecycle_test.js b/packages/ember-htmlbars/tests/integration/component_lifecycle_test.js index 322a32e7064..733ab437384 100644 --- a/packages/ember-htmlbars/tests/integration/component_lifecycle_test.js +++ b/packages/ember-htmlbars/tests/integration/component_lifecycle_test.js @@ -1,4 +1,3 @@ -import Registry from 'container/registry'; import jQuery from 'ember-views/system/jquery'; import compile from 'ember-template-compiler/system/compile'; import ComponentLookup from 'ember-views/component_lookup'; @@ -8,8 +7,10 @@ import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import run from 'ember-metal/run_loop'; import EmberView from 'ember-views/views/view'; import isEnabled from 'ember-metal/features'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var registry, container, view; +var owner, view; var hooks; let styles = [{ @@ -53,20 +54,19 @@ styles.forEach(style => { QUnit.module(`component - lifecycle hooks (${style.name})`, { setup() { - registry = new Registry(); - container = registry.container(); - registry.optionsForType('component', { singleton: false }); - registry.optionsForType('view', { singleton: false }); - registry.optionsForType('template', { instantiate: false }); - registry.register('component-lookup:main', ComponentLookup); + owner = buildOwner(); + owner.registerOptionsForType('component', { singleton: false }); + owner.registerOptionsForType('view', { singleton: false }); + owner.registerOptionsForType('template', { instantiate: false }); + owner.register('component-lookup:main', ComponentLookup); hooks = []; }, teardown() { - runDestroy(container); + runDestroy(owner); runDestroy(view); - registry = container = view = null; + owner = view = null; } }); @@ -124,18 +124,18 @@ styles.forEach(style => { }); } - registry.register('component:the-top', component('top')); - registry.register('component:the-middle', component('middle')); - registry.register('component:the-bottom', component('bottom')); + owner.register('component:the-top', component('top')); + owner.register('component:the-middle', component('middle')); + owner.register('component:the-bottom', component('bottom')); - registry.register('template:components/the-top', compile(`
Twitter: {{attrs.twitter}} ${invoke('the-middle', { name: string('Tom Dale') })}
`)); - registry.register('template:components/the-middle', compile(`
Name: {{attrs.name}} ${invoke('the-bottom', { website: string('tomdale.net') })}
`)); - registry.register('template:components/the-bottom', compile('
Website: {{attrs.website}}
')); + owner.register('template:components/the-top', compile(`
Twitter: {{attrs.twitter}} ${invoke('the-middle', { name: string('Tom Dale') })}
`)); + owner.register('template:components/the-middle', compile(`
Name: {{attrs.name}} ${invoke('the-bottom', { website: string('tomdale.net') })}
`)); + owner.register('template:components/the-bottom', compile('
Website: {{attrs.website}}
')); view = EmberView.extend({ + [OWNER]: owner, template: compile(invoke('the-top', { twitter: 'view.twitter' })), - twitter: '@tomdale', - container: container + twitter: '@tomdale' }).create(); runAppend(view); @@ -276,18 +276,18 @@ styles.forEach(style => { }); } - registry.register('component:the-top', component('top')); - registry.register('component:the-middle', component('middle')); - registry.register('component:the-bottom', component('bottom')); + owner.register('component:the-top', component('top')); + owner.register('component:the-middle', component('middle')); + owner.register('component:the-bottom', component('bottom')); - registry.register('template:components/the-top', compile(`
Top: ${invoke('the-middle', { twitterTop: 'attrs.twitter' })}
`)); - registry.register('template:components/the-middle', compile(`
Middle: ${invoke('the-bottom', { twitterMiddle: 'attrs.twitterTop' })}
`)); - registry.register('template:components/the-bottom', compile('
Bottom: {{attrs.twitterMiddle}}
')); + owner.register('template:components/the-top', compile(`
Top: ${invoke('the-middle', { twitterTop: 'attrs.twitter' })}
`)); + owner.register('template:components/the-middle', compile(`
Middle: ${invoke('the-bottom', { twitterMiddle: 'attrs.twitterTop' })}
`)); + owner.register('template:components/the-bottom', compile('
Bottom: {{attrs.twitterMiddle}}
')); view = EmberView.extend({ + [OWNER]: owner, template: compile(invoke('the-top', { twitter: 'view.twitter' })), - twitter: '@tomdale', - container: container + twitter: '@tomdale' }).create(); runAppend(view); @@ -367,9 +367,9 @@ styles.forEach(style => { QUnit.test('changing a component\'s displayed properties inside didInsertElement() is deprecated', function(assert) { let component = style.class.extend({ + [OWNER]: owner, layout: compile('
{{handle}}
'), handle: '@wycats', - container: container, didInsertElement() { this.set('handle', '@tomdale'); @@ -390,7 +390,7 @@ styles.forEach(style => { QUnit.test('properties set during `init` are availabe in `didReceiveAttrs`', function(assert) { assert.expect(1); - registry.register('component:the-thing', style.class.extend({ + owner.register('component:the-thing', style.class.extend({ init() { this._super(...arguments); this.propertySetInInit = 'init fired!'; @@ -404,8 +404,8 @@ styles.forEach(style => { })); view = EmberView.extend({ - template: compile(invoke('the-thing')), - container: container + [OWNER]: owner, + template: compile(invoke('the-thing')) }).create(); runAppend(view); diff --git a/packages/ember-htmlbars/tests/integration/helper-lookup-test.js b/packages/ember-htmlbars/tests/integration/helper-lookup-test.js index c7a608af634..e9f3e00ec37 100644 --- a/packages/ember-htmlbars/tests/integration/helper-lookup-test.js +++ b/packages/ember-htmlbars/tests/integration/helper-lookup-test.js @@ -1,40 +1,40 @@ -import Registry from 'container/registry'; import compile from 'ember-template-compiler/system/compile'; import ComponentLookup from 'ember-views/component_lookup'; import Component from 'ember-views/components/component'; import { helper } from 'ember-htmlbars/helper'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var registry, container, component; +var owner, component; QUnit.module('component - invocation', { setup() { - registry = new Registry(); - container = registry.container(); - registry.optionsForType('component', { singleton: false }); - registry.optionsForType('view', { singleton: false }); - registry.optionsForType('template', { instantiate: false }); - registry.optionsForType('helper', { instantiate: false }); - registry.register('component-lookup:main', ComponentLookup); + owner = buildOwner(); + owner.registerOptionsForType('component', { singleton: false }); + owner.registerOptionsForType('view', { singleton: false }); + owner.registerOptionsForType('template', { instantiate: false }); + owner.registerOptionsForType('helper', { instantiate: false }); + owner.register('component-lookup:main', ComponentLookup); }, teardown() { - runDestroy(container); + runDestroy(owner); runDestroy(component); - registry = container = component = null; + owner = component = null; } }); QUnit.test('non-dashed helpers are found', function() { expect(1); - registry.register('helper:fullname', helper(function( [first, last]) { + owner.register('helper:fullname', helper(function( [first, last]) { return `${first} ${last}`; })); component = Component.extend({ - layout: compile('{{fullname "Robert" "Jackson"}}'), - container: container + [OWNER]: owner, + layout: compile('{{fullname "Robert" "Jackson"}}') }).create(); runAppend(component); diff --git a/packages/ember-htmlbars/tests/integration/mutable_binding_test.js b/packages/ember-htmlbars/tests/integration/mutable_binding_test.js index 3f770d1aef7..e52ceb88a37 100644 --- a/packages/ember-htmlbars/tests/integration/mutable_binding_test.js +++ b/packages/ember-htmlbars/tests/integration/mutable_binding_test.js @@ -1,6 +1,5 @@ import isEnabled from 'ember-metal/features'; import EmberView from 'ember-views/views/view'; -import Registry from 'container/registry'; //import jQuery from "ember-views/system/jquery"; import compile from 'ember-template-compiler/system/compile'; import ComponentLookup from 'ember-views/component_lookup'; @@ -9,23 +8,24 @@ import GlimmerComponent from 'ember-htmlbars/glimmer-component'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import run from 'ember-metal/run_loop'; import { computed } from 'ember-metal/computed'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var registry, container, view; +var owner, view; QUnit.module('component - mutable bindings', { setup() { - registry = new Registry(); - container = registry.container(); - registry.optionsForType('component', { singleton: false }); - registry.optionsForType('view', { singleton: false }); - registry.optionsForType('template', { instantiate: false }); - registry.register('component-lookup:main', ComponentLookup); + owner = buildOwner(); + owner.registerOptionsForType('component', { singleton: false }); + owner.registerOptionsForType('view', { singleton: false }); + owner.registerOptionsForType('template', { instantiate: false }); + owner.register('component-lookup:main', ComponentLookup); }, teardown() { - runDestroy(container); + runDestroy(owner); runDestroy(view); - registry = container = view = null; + owner = view = null; } }); @@ -35,18 +35,18 @@ QUnit.test('a simple mutable binding propagates properly [DEPRECATED]', function var bottom; - registry.register('component:middle-mut', Component.extend({ + owner.register('component:middle-mut', Component.extend({ layout: compile('{{bottom-mut setMe=value}}') })); - registry.register('component:bottom-mut', Component.extend({ + owner.register('component:bottom-mut', Component.extend({ didInsertElement() { bottom = this; } })); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{middle-mut value=view.val}}'), val: 12 }); @@ -64,18 +64,18 @@ QUnit.test('a simple mutable binding propagates properly [DEPRECATED]', function QUnit.test('a simple mutable binding using `mut` propagates properly', function(assert) { var bottom; - registry.register('component:middle-mut', Component.extend({ + owner.register('component:middle-mut', Component.extend({ layout: compile('{{bottom-mut setMe=(mut attrs.value)}}') })); - registry.register('component:bottom-mut', Component.extend({ + owner.register('component:bottom-mut', Component.extend({ didInsertElement() { bottom = this; } })); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{middle-mut value=(mut view.val)}}'), val: 12 }); @@ -93,11 +93,11 @@ QUnit.test('a simple mutable binding using `mut` propagates properly', function( QUnit.test('using a string value through middle tier does not trigger assertion', function(assert) { var bottom; - registry.register('component:middle-mut', Component.extend({ + owner.register('component:middle-mut', Component.extend({ layout: compile('{{bottom-mut stuff=attrs.value}}') })); - registry.register('component:bottom-mut', Component.extend({ + owner.register('component:bottom-mut', Component.extend({ layout: compile('

{{attrs.stuff}}

'), didInsertElement() { bottom = this; @@ -105,7 +105,7 @@ QUnit.test('using a string value through middle tier does not trigger assertion' })); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{middle-mut value="foo"}}'), val: 12 }); @@ -119,11 +119,11 @@ QUnit.test('using a string value through middle tier does not trigger assertion' QUnit.test('a simple mutable binding using `mut` inserts into the DOM', function(assert) { var bottom; - registry.register('component:middle-mut', Component.extend({ + owner.register('component:middle-mut', Component.extend({ layout: compile('{{bottom-mut setMe=(mut attrs.value)}}') })); - registry.register('component:bottom-mut', Component.extend({ + owner.register('component:bottom-mut', Component.extend({ layout: compile('

{{attrs.setMe}}

'), didInsertElement() { bottom = this; @@ -131,7 +131,7 @@ QUnit.test('a simple mutable binding using `mut` inserts into the DOM', function })); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{middle-mut value=(mut view.val)}}'), val: 12 }); @@ -150,7 +150,7 @@ QUnit.test('a simple mutable binding using `mut` inserts into the DOM', function QUnit.test('a simple mutable binding using `mut` can be converted into an immutable binding', function(assert) { var middle, bottom; - registry.register('component:middle-mut', Component.extend({ + owner.register('component:middle-mut', Component.extend({ // no longer mutable layout: compile('{{bottom-mut setMe=(readonly attrs.value)}}'), @@ -159,7 +159,7 @@ QUnit.test('a simple mutable binding using `mut` can be converted into an immuta } })); - registry.register('component:bottom-mut', Component.extend({ + owner.register('component:bottom-mut', Component.extend({ layout: compile('

{{attrs.setMe}}

'), didInsertElement() { @@ -168,7 +168,7 @@ QUnit.test('a simple mutable binding using `mut` can be converted into an immuta })); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{middle-mut value=(mut view.val)}}'), val: 12 }); @@ -186,16 +186,16 @@ QUnit.test('a simple mutable binding using `mut` can be converted into an immuta }); QUnit.test('mutable bindings work inside of yielded content', function(assert) { - registry.register('component:middle-mut', Component.extend({ + owner.register('component:middle-mut', Component.extend({ layout: compile('{{#bottom-mut}}{{attrs.model.name}}{{/bottom-mut}}') })); - registry.register('component:bottom-mut', Component.extend({ + owner.register('component:bottom-mut', Component.extend({ layout: compile('

{{yield}}

') })); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{middle-mut model=(mut view.model)}}'), model: { name: 'Matthew Beale' } }); @@ -210,11 +210,11 @@ QUnit.test('a simple mutable binding using `mut` is available in hooks', functio var willRender = []; var didInsert = []; - registry.register('component:middle-mut', Component.extend({ + owner.register('component:middle-mut', Component.extend({ layout: compile('{{bottom-mut setMe=(mut attrs.value)}}') })); - registry.register('component:bottom-mut', Component.extend({ + owner.register('component:bottom-mut', Component.extend({ willRender() { willRender.push(this.attrs.setMe.value); }, @@ -225,7 +225,7 @@ QUnit.test('a simple mutable binding using `mut` is available in hooks', functio })); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{middle-mut value=(mut view.val)}}'), val: 12 }); @@ -246,7 +246,7 @@ QUnit.test('a simple mutable binding using `mut` is available in hooks', functio QUnit.test('a mutable binding with a backing computed property and attribute present in the root of the component is updated when the upstream property invalidates #11023', function(assert) { var bottom; - registry.register('component:bottom-mut', Component.extend({ + owner.register('component:bottom-mut', Component.extend({ thingy: null, didInsertElement() { @@ -255,7 +255,7 @@ QUnit.test('a mutable binding with a backing computed property and attribute pre })); view = EmberView.extend({ - container: container, + [OWNER]: owner, template: compile('{{bottom-mut thingy=(mut view.val)}}'), baseValue: 12, val: computed('baseValue', function() { @@ -275,11 +275,11 @@ QUnit.test('a mutable binding with a backing computed property and attribute pre }); QUnit.test('automatic mutable bindings tolerate undefined non-stream inputs', function(assert) { - registry.register('template:components/x-outer', compile('{{x-inner model=attrs.nonexistent}}')); - registry.register('template:components/x-inner', compile('hello')); + owner.register('template:components/x-outer', compile('{{x-inner model=attrs.nonexistent}}')); + owner.register('template:components/x-inner', compile('hello')); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{x-outer}}') }); @@ -288,11 +288,11 @@ QUnit.test('automatic mutable bindings tolerate undefined non-stream inputs', fu }); QUnit.test('automatic mutable bindings tolerate constant non-stream inputs', function(assert) { - registry.register('template:components/x-outer', compile('{{x-inner model="foo"}}')); - registry.register('template:components/x-inner', compile('hello{{attrs.model}}')); + owner.register('template:components/x-outer', compile('{{x-inner model="foo"}}')); + owner.register('template:components/x-inner', compile('hello{{attrs.model}}')); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{x-outer}}') }); @@ -303,15 +303,15 @@ QUnit.test('automatic mutable bindings tolerate constant non-stream inputs', fun QUnit.test('automatic mutable bindings to undefined non-streams tolerate attempts to set them', function(assert) { var inner; - registry.register('template:components/x-outer', compile('{{x-inner model=attrs.nonexistent}}')); - registry.register('component:x-inner', Component.extend({ + owner.register('template:components/x-outer', compile('{{x-inner model=attrs.nonexistent}}')); + owner.register('component:x-inner', Component.extend({ didInsertElement() { inner = this; } })); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{x-outer}}') }); @@ -323,15 +323,15 @@ QUnit.test('automatic mutable bindings to undefined non-streams tolerate attempt QUnit.test('automatic mutable bindings to constant non-streams tolerate attempts to set them', function(assert) { var inner; - registry.register('template:components/x-outer', compile('{{x-inner model=attrs.x}}')); - registry.register('component:x-inner', Component.extend({ + owner.register('template:components/x-outer', compile('{{x-inner model=attrs.x}}')); + owner.register('component:x-inner', Component.extend({ didInsertElement() { inner = this; } })); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{x-outer x="foo"}}') }); @@ -346,7 +346,7 @@ if (isEnabled('ember-htmlbars-component-generation')) { QUnit.test('mutable bindings work as angle-bracket component attributes', function(assert) { var middle; - registry.register('component:middle-mut', GlimmerComponent.extend({ + owner.register('component:middle-mut', GlimmerComponent.extend({ // no longer mutable layout: compile(''), @@ -355,12 +355,12 @@ QUnit.test('mutable bindings work as angle-bracket component attributes', functi } })); - registry.register('component:bottom-mut', GlimmerComponent.extend({ + owner.register('component:bottom-mut', GlimmerComponent.extend({ layout: compile('

{{attrs.setMe}}

') })); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile(''), val: 12 }); @@ -379,7 +379,7 @@ QUnit.test('mutable bindings work as angle-bracket component attributes', functi QUnit.test('a simple mutable binding using `mut` can be converted into an immutable binding with angle-bracket components', function(assert) { var middle, bottom; - registry.register('component:middle-mut', GlimmerComponent.extend({ + owner.register('component:middle-mut', GlimmerComponent.extend({ // no longer mutable layout: compile(''), @@ -388,7 +388,7 @@ QUnit.test('a simple mutable binding using `mut` can be converted into an immuta } })); - registry.register('component:bottom-mut', GlimmerComponent.extend({ + owner.register('component:bottom-mut', GlimmerComponent.extend({ layout: compile('

{{attrs.setMe}}

'), didInsertElement() { @@ -397,7 +397,7 @@ QUnit.test('a simple mutable binding using `mut` can be converted into an immuta })); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile(''), val: 12 }); diff --git a/packages/ember-htmlbars/tests/integration/void-element-component-test.js b/packages/ember-htmlbars/tests/integration/void-element-component-test.js index 284058b17b6..141052bbf20 100644 --- a/packages/ember-htmlbars/tests/integration/void-element-component-test.js +++ b/packages/ember-htmlbars/tests/integration/void-element-component-test.js @@ -1,32 +1,32 @@ import EmberView from 'ember-views/views/view'; -import { Registry } from 'ember-runtime/system/container'; import compile from 'ember-template-compiler/system/compile'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import ComponentLookup from 'ember-views/component_lookup'; import Component from 'ember-views/components/component'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var registry, container, view; +var owner, view; QUnit.module('ember-htmlbars: components for void elements', { setup() { - registry = new Registry(); - container = registry.container(); - registry.optionsForType('component', { singleton: false }); - registry.optionsForType('view', { singleton: false }); - registry.optionsForType('template', { instantiate: false }); - registry.register('component-lookup:main', ComponentLookup); + owner = buildOwner(); + owner.registerOptionsForType('component', { singleton: false }); + owner.registerOptionsForType('view', { singleton: false }); + owner.registerOptionsForType('template', { instantiate: false }); + owner.register('component-lookup:main', ComponentLookup); }, teardown() { - runDestroy(container); + runDestroy(owner); runDestroy(view); - registry = container = view = null; + owner = view = null; } }); QUnit.test('a void element does not have childNodes', function() { var component; - registry.register('component:x-foo', Component.extend({ + owner.register('component:x-foo', Component.extend({ tagName: 'input', init() { @@ -36,7 +36,7 @@ QUnit.test('a void element does not have childNodes', function() { })); view = EmberView.create({ - container: container, + [OWNER]: owner, template: compile('{{x-foo}}') }); diff --git a/packages/ember-htmlbars/tests/integration/with_view_test.js b/packages/ember-htmlbars/tests/integration/with_view_test.js index 97d8779cc8d..05eea9b6922 100644 --- a/packages/ember-htmlbars/tests/integration/with_view_test.js +++ b/packages/ember-htmlbars/tests/integration/with_view_test.js @@ -1,5 +1,4 @@ import EmberView from 'ember-views/views/view'; -import { Registry } from 'ember-runtime/system/container'; import EmberObject from 'ember-runtime/system/object'; import compile from 'ember-template-compiler/system/compile'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; @@ -9,48 +8,48 @@ import { set } from 'ember-metal/property_set'; import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; -var view, registry, container, originalViewKeyword; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; + +var view, owner, originalViewKeyword; QUnit.module('ember-htmlbars: {{#with}} and {{#view}} integration', { setup() { originalViewKeyword = registerKeyword('view', viewKeyword); - registry = new Registry(); - container = registry.container(); - registry.optionsForType('template', { instantiate: false }); - registry.register('view:toplevel', EmberView.extend()); + owner = buildOwner(); + owner.registerOptionsForType('template', { instantiate: false }); + owner.register('view:toplevel', EmberView.extend()); }, teardown() { - runDestroy(container); + runDestroy(owner); runDestroy(view); resetKeyword('view', originalViewKeyword); - registry = container = view = null; + owner = view = null; } }); QUnit.test('child views can be inserted inside a bind block', function() { - registry.register('template:nester', compile('

Hello {{world}}

{{view view.bqView}}')); - registry.register('template:nested', compile('
Goodbye {{#with content as |thing|}}{{thing.blah}} {{view view.otherView}}{{/with}} {{world}}
')); - registry.register('template:other', compile('cruel')); + owner.register('template:nester', compile('

Hello {{world}}

{{view view.bqView}}')); + owner.register('template:nested', compile('
Goodbye {{#with content as |thing|}}{{thing.blah}} {{view view.otherView}}{{/with}} {{world}}
')); + owner.register('template:other', compile('cruel')); var context = { world: 'world!' }; var OtherView = EmberView.extend({ - container: container, templateName: 'other' }); var BQView = EmberView.extend({ - container: container, otherView: OtherView, tagName: 'blockquote', templateName: 'nested' }); view = EmberView.create({ - container: container, + [OWNER]: owner, bqView: BQView, context: context, templateName: 'nester' @@ -69,7 +68,7 @@ QUnit.test('child views can be inserted inside a bind block', function() { }); QUnit.test('views render their template in the context of the parent view\'s context', function() { - registry.register('template:parent', compile('

{{#with content as |person|}}{{#view}}{{person.firstName}} {{person.lastName}}{{/view}}{{/with}}

')); + owner.register('template:parent', compile('

{{#with content as |person|}}{{#view}}{{person.firstName}} {{person.lastName}}{{/view}}{{/with}}

')); var context = { content: { @@ -79,7 +78,7 @@ QUnit.test('views render their template in the context of the parent view\'s con }; view = EmberView.create({ - container: container, + [OWNER]: owner, templateName: 'parent', context: context }); @@ -89,10 +88,10 @@ QUnit.test('views render their template in the context of the parent view\'s con }); QUnit.test('views make a view keyword available that allows template to reference view context', function() { - registry.register('template:parent', compile('

{{#with view.content as |person|}}{{#view person.subview}}{{view.firstName}} {{person.lastName}}{{/view}}{{/with}}

')); + owner.register('template:parent', compile('

{{#with view.content as |person|}}{{#view person.subview}}{{view.firstName}} {{person.lastName}}{{/view}}{{/with}}

')); view = EmberView.create({ - container: container, + [OWNER]: owner, templateName: 'parent', content: { diff --git a/packages/ember-htmlbars/tests/system/lookup-helper_test.js b/packages/ember-htmlbars/tests/system/lookup-helper_test.js index b432ac5ad0a..fa2c791e7a9 100644 --- a/packages/ember-htmlbars/tests/system/lookup-helper_test.js +++ b/packages/ember-htmlbars/tests/system/lookup-helper_test.js @@ -1,24 +1,24 @@ import lookupHelper, { findHelper } from 'ember-htmlbars/system/lookup-helper'; import ComponentLookup from 'ember-views/component_lookup'; -import Registry from 'container/registry'; import Helper, { helper as makeHelper } from 'ember-htmlbars/helper'; +import { OWNER } from 'container/owner'; +import buildOwner from 'container/tests/test-helpers/build-owner'; -function generateEnv(helpers, container) { +function generateEnv(helpers, owner) { return { - container: container, + owner: owner, helpers: (helpers ? helpers : {}), hooks: { keywords: {} }, knownHelpers: {} }; } -function generateContainer() { - var registry = new Registry(); - var container = registry.container(); +function generateOwner() { + const owner = buildOwner(); - registry.register('component-lookup:main', ComponentLookup); + owner.register('component-lookup:main', ComponentLookup); - return container; + return owner; } QUnit.module('ember-htmlbars: lookupHelper hook'); @@ -58,14 +58,14 @@ QUnit.test('does not lookup in the container if the name does not contain a dash }); QUnit.test('does a lookup in the container if the name contains a dash (and helper is not found in env)', function() { - var container = generateContainer(); - var env = generateEnv(null, container); + const owner = generateOwner(); + var env = generateEnv(null, owner); var view = { - container: container + [OWNER]: owner }; var someName = Helper.extend(); - view.container.registry.register('helper:some-name', someName); + owner.register('helper:some-name', someName); var actual = lookupHelper('some-name', view, env); @@ -73,15 +73,15 @@ QUnit.test('does a lookup in the container if the name contains a dash (and help }); QUnit.test('does a lookup in the container if the name is found in knownHelpers', function() { - var container = generateContainer(); - var env = generateEnv(null, container); + const owner = generateOwner(); + var env = generateEnv(null, owner); var view = { - container: container + [OWNER]: owner }; env.knownHelpers['t'] = true; var t = Helper.extend(); - view.container.registry.register('helper:t', t); + owner.register('helper:t', t); var actual = lookupHelper('t', view, env); @@ -90,17 +90,17 @@ QUnit.test('does a lookup in the container if the name is found in knownHelpers' QUnit.test('looks up a shorthand helper in the container', function() { expect(2); - var container = generateContainer(); - var env = generateEnv(null, container); + const owner = generateOwner(); + var env = generateEnv(null, owner); var view = { - container: container + [OWNER]: owner }; var called; function someName() { called = true; } - view.container.registry.register('helper:some-name', makeHelper(someName)); + owner.register('helper:some-name', makeHelper(someName)); var actual = lookupHelper('some-name', view, env); @@ -113,14 +113,14 @@ QUnit.test('looks up a shorthand helper in the container', function() { QUnit.test('fails with a useful error when resolving a function', function() { expect(1); - var container = generateContainer(); - var env = generateEnv(null, container); + const owner = generateOwner(); + var env = generateEnv(null, owner); var view = { - container: container + [OWNER]: owner }; function someName() {} - view.container.registry.register('helper:some-name', someName); + owner.register('helper:some-name', someName); var actual; expectAssertion(function() { diff --git a/packages/ember-htmlbars/tests/system/render_env_test.js b/packages/ember-htmlbars/tests/system/render_env_test.js index f3fd0b922d0..824c32d5058 100644 --- a/packages/ember-htmlbars/tests/system/render_env_test.js +++ b/packages/ember-htmlbars/tests/system/render_env_test.js @@ -1,34 +1,34 @@ import EmberView from 'ember-views/views/view'; -import Registry from 'container/registry'; import compile from 'ember-template-compiler/system/compile'; import ComponentLookup from 'ember-views/component_lookup'; import Component from 'ember-views/components/component'; import RenderEnv from 'ember-htmlbars/system/render-env'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import run from 'ember-metal/run_loop'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var registry, container, view, components; +var owner, view, components; function commonSetup() { - registry = new Registry(); - container = registry.container(); - registry.optionsForType('component', { singleton: false }); - registry.optionsForType('view', { singleton: false }); - registry.optionsForType('template', { instantiate: false }); - registry.optionsForType('helper', { instantiate: false }); - registry.register('component-lookup:main', ComponentLookup); + owner = buildOwner(); + owner.registerOptionsForType('component', { singleton: false }); + owner.registerOptionsForType('view', { singleton: false }); + owner.registerOptionsForType('template', { instantiate: false }); + owner.registerOptionsForType('helper', { instantiate: false }); + owner.register('component-lookup:main', ComponentLookup); } function commonTeardown() { - runDestroy(container); + runDestroy(owner); runDestroy(view); - registry = container = view = null; + owner = view = null; } function appendViewFor(template, hash={}) { let view = EmberView.extend({ - template: compile(template), - container: container + [OWNER]: owner, + template: compile(template) }).create(hash); runAppend(view); @@ -63,8 +63,8 @@ QUnit.module('ember-htmlbars: RenderEnv', { QUnit.test('non-block component test', function() { components = {}; - registry.register('component:non-block', constructComponent('nonblock')); - registry.register('template:components/non-block', compile('In layout')); + owner.register('component:non-block', constructComponent('nonblock')); + owner.register('template:components/non-block', compile('In layout')); view = appendViewFor('{{non-block}}'); @@ -80,8 +80,8 @@ QUnit.test('non-block component test', function() { QUnit.test('block component test', function() { components = {}; - registry.register('component:block-component', constructComponent('block')); - registry.register('template:components/block-component', compile('In layout {{yield}}')); + owner.register('component:block-component', constructComponent('block')); + owner.register('template:components/block-component', compile('In layout {{yield}}')); view = appendViewFor('{{#block-component}}content{{/block-component}}'); @@ -97,11 +97,11 @@ QUnit.test('block component test', function() { QUnit.test('block component with child component test', function() { components = {}; - registry.register('component:block-component', constructComponent('block')); - registry.register('component:child-component', constructComponent('child')); + owner.register('component:block-component', constructComponent('block')); + owner.register('component:child-component', constructComponent('child')); - registry.register('template:components/block-component', compile('In layout {{yield}}')); - registry.register('template:components/child-component', compile('Child Component')); + owner.register('template:components/block-component', compile('In layout {{yield}}')); + owner.register('template:components/child-component', compile('Child Component')); view = appendViewFor('{{#block-component}}{{child-component}}{{/block-component}}'); diff --git a/packages/ember-metal/lib/injected_property.js b/packages/ember-metal/lib/injected_property.js index d77a7e3e72a..6c91b56c2eb 100644 --- a/packages/ember-metal/lib/injected_property.js +++ b/packages/ember-metal/lib/injected_property.js @@ -2,6 +2,7 @@ import { assert } from 'ember-metal/debug'; import { ComputedProperty } from 'ember-metal/computed'; import { AliasedProperty } from 'ember-metal/alias'; import { Descriptor } from 'ember-metal/properties'; +import { getOwner } from 'container/owner'; /** Read-only property that returns the result of a container lookup. @@ -24,11 +25,12 @@ function InjectedProperty(type, name) { function injectedPropertyGet(keyName) { var desc = this[keyName]; + const owner = getOwner(this); assert(`InjectedProperties should be defined with the Ember.inject computed property macros.`, desc && desc.isDescriptor && desc.type); - assert(`Attempting to lookup an injected property on an object without a container, ensure that the object was instantiated via a container.`, this.container); + assert(`Attempting to lookup an injected property on an object without a container, ensure that the object was instantiated via a container.`, owner); - return this.container.lookup(desc.type + ':' + (desc.name || keyName)); + return owner.lookup(desc.type + ':' + (desc.name || keyName)); } InjectedProperty.prototype = Object.create(Descriptor.prototype); diff --git a/packages/ember-metal/tests/injected_property_test.js b/packages/ember-metal/tests/injected_property_test.js index c94acbd8eb1..11fe2a184f0 100644 --- a/packages/ember-metal/tests/injected_property_test.js +++ b/packages/ember-metal/tests/injected_property_test.js @@ -5,6 +5,7 @@ import { import { get } from 'ember-metal/property_get'; import { set } from 'ember-metal/property_set'; import InjectedProperty from 'ember-metal/injected_property'; +import { setOwner } from 'container/owner'; QUnit.module('InjectedProperty'); @@ -33,27 +34,29 @@ QUnit.test('getting on an object without a container should fail assertion', fun QUnit.test('getting should return a lookup on the container', function() { expect(2); - var obj = { - container: { - lookup(key) { - ok(true, 'should call container.lookup'); - return key; - } + var obj = {}; + + setOwner(obj, { + lookup(key) { + ok(true, 'should call container.lookup'); + return key; } - }; + }); + defineProperty(obj, 'foo', new InjectedProperty('type', 'name')); equal(get(obj, 'foo'), 'type:name', 'should return the value of container.lookup'); }); QUnit.test('omitting the lookup name should default to the property name', function() { - var obj = { - container: { - lookup(key) { - return key; - } + var obj = {}; + + setOwner(obj, { + lookup(key) { + return key; } - }; + }); + defineProperty(obj, 'foo', new InjectedProperty('type')); equal(get(obj, 'foo'), 'type:foo', 'should lookup the type using the property name'); diff --git a/packages/ember-routing-htmlbars/lib/keywords/render.js b/packages/ember-routing-htmlbars/lib/keywords/render.js index 60677825a8d..310f6764659 100644 --- a/packages/ember-routing-htmlbars/lib/keywords/render.js +++ b/packages/ember-routing-htmlbars/lib/keywords/render.js @@ -121,14 +121,14 @@ export default { var name = params[0]; var context = params[1]; - var container = env.container; + var owner = env.owner; // The render keyword presumes it can work without a router. This is really // only to satisfy the test: // // {{view}} should not override class bindings defined on a child view" // - var router = container.lookup('router:main'); + var router = owner.lookup('router:main'); assert( 'The second argument of {{render}} must be a path, e.g. {{render "post" post}}.', @@ -150,16 +150,16 @@ export default { assert( 'You used `{{render \'' + name + '\'}}`, but \'' + name + '\' can not be ' + 'found as either a template or a view.', - container.registry.has('view:' + name) || container.registry.has(templateName) || !!template + owner.hasRegistration('view:' + name) || owner.hasRegistration(templateName) || !!template ); - var view = container.lookup('view:' + name); + var view = owner.lookup('view:' + name); if (!view) { - view = container.lookup('view:default'); + view = owner.lookup('view:default'); } var viewHasTemplateSpecified = view && !!get(view, 'template'); if (!template && !viewHasTemplateSpecified) { - template = container.lookup(templateName); + template = owner.lookup(templateName); } if (view) { @@ -178,7 +178,7 @@ export default { assert( 'The controller name you supplied \'' + controllerName + '\' ' + 'did not resolve to a controller.', - container.registry.has(controllerFullName) + owner.hasRegistration(controllerFullName) ); } else { controllerName = name; @@ -190,8 +190,8 @@ export default { // choose name if (params.length > 1) { - var factory = container.lookupFactory(controllerFullName) || - generateControllerFactory(container, controllerName); + var factory = owner._lookupFactory(controllerFullName) || + generateControllerFactory(owner, controllerName); controller = factory.create({ model: read(context), @@ -201,8 +201,8 @@ export default { node.addDestruction(controller); } else { - controller = container.lookup(controllerFullName) || - generateController(container, controllerName); + controller = owner.lookup(controllerFullName) || + generateController(owner, controllerName); controller.setProperties({ target: parentController, diff --git a/packages/ember-routing-htmlbars/tests/helpers/element_action_test.js b/packages/ember-routing-htmlbars/tests/helpers/element_action_test.js index b67eee2c315..dd1b58f1c63 100644 --- a/packages/ember-routing-htmlbars/tests/helpers/element_action_test.js +++ b/packages/ember-routing-htmlbars/tests/helpers/element_action_test.js @@ -17,15 +17,16 @@ import { ActionHelper } from 'ember-routing-htmlbars/keywords/element-action'; import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; -import Registry from 'container/registry'; import ComponentLookup from 'ember-views/component_lookup'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; -var dispatcher, view, originalViewKeyword, registry, container; +var dispatcher, view, originalViewKeyword, owner; var originalRegisterAction = ActionHelper.registerAction; QUnit.module('ember-routing-htmlbars: action helper', { @@ -1003,15 +1004,13 @@ QUnit.test('should respect preventDefault=false option if provided', function() QUnit.module('ember-routing-htmlbars: action helper - action target without `controller`', { setup() { - registry = new Registry(); - registry.optionsForType('template', { instantiate: false }); - registry.optionsForType('component', { singleton: false }); - registry.register('component-lookup:main', ComponentLookup); - registry.register('event_dispatcher:main', EventDispatcher); + owner = buildOwner(); + owner.registerOptionsForType('template', { instantiate: false }); + owner.registerOptionsForType('component', { singleton: false }); + owner.register('component-lookup:main', ComponentLookup); + owner.register('event_dispatcher:main', EventDispatcher); - container = registry.container(); - - dispatcher = container.lookup('event_dispatcher:main'); + dispatcher = owner.lookup('event_dispatcher:main'); dispatcher.setup(); this.originalLegacyControllerSupport = Ember.ENV._ENABLE_LEGACY_CONTROLLER_SUPPORT; @@ -1024,7 +1023,7 @@ QUnit.module('ember-routing-htmlbars: action helper - action target without `con teardown() { runDestroy(view); runDestroy(dispatcher); - runDestroy(container); + runDestroy(owner); Ember.ENV._ENABLE_LEGACY_CONTROLLER_SUPPORT = this.originalLegacyControllerSupport; Ember.ENV._ENABLE_LEGACY_VIEW_SUPPORT = this.originalLegacyViewSupport; @@ -1034,26 +1033,26 @@ QUnit.module('ember-routing-htmlbars: action helper - action target without `con QUnit.test('should target the proper component when `action` is in yielded block [GH #12409]', function(assert) { assert.expect(2); - registry.register('template:components/x-outer', compile(` + owner.register('template:components/x-outer', compile(` {{#x-middle}} {{x-inner action="hey" }} {{/x-middle}} `)); - registry.register('template:components/x-middle', compile('{{yield}}')); - registry.register('template:components/x-inner', compile(` + owner.register('template:components/x-middle', compile('{{yield}}')); + owner.register('template:components/x-inner', compile(` {{yield}} `)); - registry.register('component:x-inner', EmberComponent.extend({ + owner.register('component:x-inner', EmberComponent.extend({ click() { assert.ok(true, 'click was triggered'); this.sendAction(); } })); - registry.register('component:x-outer', EmberComponent.extend({ + owner.register('component:x-outer', EmberComponent.extend({ actions: { hey: function() { assert.ok(true, 'action fired on proper target'); @@ -1062,7 +1061,7 @@ QUnit.test('should target the proper component when `action` is in yielded block })); view = EmberComponent.create({ - container, + [OWNER]: owner, layout: compile('{{x-outer}}') }); diff --git a/packages/ember-routing-htmlbars/tests/helpers/link-to_test.js b/packages/ember-routing-htmlbars/tests/helpers/link-to_test.js index ab05f31c3b6..5ad74578e14 100644 --- a/packages/ember-routing-htmlbars/tests/helpers/link-to_test.js +++ b/packages/ember-routing-htmlbars/tests/helpers/link-to_test.js @@ -4,40 +4,40 @@ import EmberView from 'ember-views/views/view'; import compile from 'ember-template-compiler/system/compile'; import { set } from 'ember-metal/property_set'; import Controller from 'ember-runtime/controllers/controller'; -import { Registry } from 'ember-runtime/system/container'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import EmberObject from 'ember-runtime/system/object'; import ComponentLookup from 'ember-views/component_lookup'; import LinkComponent from 'ember-routing-views/components/link-to'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var view; -var container; -var registry = new Registry(); - -// These tests don't rely on the routing service, but LinkComponent makes -// some assumptions that it will exist. This small stub service ensures -// that the LinkComponent can render without raising an exception. -// -// TODO: Add tests that test actual behavior. Currently, all behavior -// is tested integration-style in the `ember` package. -registry.register('service:-routing', EmberObject.extend({ - availableRoutes() { return ['index']; }, - hasRoute(name) { return name === 'index'; }, - isActiveForRoute() { return true; }, - generateURL() { return '/'; } -})); - -registry.register('component-lookup:main', ComponentLookup); -registry.register('component:link-to', LinkComponent); -registry.register('component:custom-link-to', LinkComponent.extend()); +var owner, view; QUnit.module('ember-routing-htmlbars: link-to helper', { setup() { - container = registry.container(); + owner = buildOwner(); + + // These tests don't rely on the routing service, but LinkComponent makes + // some assumptions that it will exist. This small stub service ensures + // that the LinkComponent can render without raising an exception. + // + // TODO: Add tests that test actual behavior. Currently, all behavior + // is tested integration-style in the `ember` package. + owner.register('service:-routing', EmberObject.extend({ + availableRoutes() { return ['index']; }, + hasRoute(name) { return name === 'index'; }, + isActiveForRoute() { return true; }, + generateURL() { return '/'; } + })); + + owner.register('component-lookup:main', ComponentLookup); + owner.register('component:link-to', LinkComponent); + owner.register('component:custom-link-to', LinkComponent.extend()); }, teardown() { runDestroy(view); + runDestroy(owner); } }); @@ -45,8 +45,8 @@ QUnit.module('ember-routing-htmlbars: link-to helper', { QUnit.test('should be able to be inserted in DOM when the router is not present', function() { var template = '{{#link-to \'index\'}}Go to Index{{/link-to}}'; view = EmberView.create({ - template: compile(template), - container: container + [OWNER]: owner, + template: compile(template) }); runAppend(view); @@ -57,12 +57,12 @@ QUnit.test('should be able to be inserted in DOM when the router is not present' QUnit.test('re-renders when title changes', function() { var template = '{{link-to title routeName}}'; view = EmberView.create({ + [OWNER]: owner, controller: { title: 'foo', routeName: 'index' }, - template: compile(template), - container: container + template: compile(template) }); runAppend(view); @@ -79,12 +79,12 @@ QUnit.test('re-renders when title changes', function() { QUnit.test('can read bound title', function() { var template = '{{link-to title routeName}}'; view = EmberView.create({ + [OWNER]: owner, controller: { title: 'foo', routeName: 'index' }, - template: compile(template), - container: container + template: compile(template) }); runAppend(view); @@ -94,9 +94,9 @@ QUnit.test('can read bound title', function() { QUnit.test('escaped inline form (double curlies) escapes link title', function() { view = EmberView.create({ + [OWNER]: owner, title: 'blah', - template: compile('{{link-to view.title}}'), - container: container + template: compile('{{link-to view.title}}') }); runAppend(view); @@ -106,9 +106,9 @@ QUnit.test('escaped inline form (double curlies) escapes link title', function() QUnit.test('escaped inline form with (-html-safe) does not escape link title', function() { view = EmberView.create({ + [OWNER]: owner, title: 'blah', - template: compile('{{link-to (-html-safe view.title)}}'), - container: container + template: compile('{{link-to (-html-safe view.title)}}') }); runAppend(view); @@ -118,9 +118,9 @@ QUnit.test('escaped inline form with (-html-safe) does not escape link title', f QUnit.test('unescaped inline form (triple curlies) does not escape link title', function() { view = EmberView.create({ + [OWNER]: owner, title: 'blah', - template: compile('{{{link-to view.title}}}'), - container: container + template: compile('{{{link-to view.title}}}') }); runAppend(view); @@ -132,12 +132,11 @@ QUnit.test('unwraps controllers', function() { var template = '{{#link-to \'index\' view.otherController}}Text{{/link-to}}'; view = EmberView.create({ + [OWNER]: owner, otherController: Controller.create({ model: 'foo' }), - - template: compile(template), - container: container + template: compile(template) }); expectDeprecation(function() { @@ -149,9 +148,9 @@ QUnit.test('unwraps controllers', function() { QUnit.test('able to safely extend the built-in component and use the normal path', function() { view = EmberView.create({ + [OWNER]: owner, title: 'my custom link-to component', - template: compile('{{custom-link-to view.title}}'), - container: container + template: compile('{{custom-link-to view.title}}') }); runAppend(view); diff --git a/packages/ember-routing-htmlbars/tests/helpers/outlet_test.js b/packages/ember-routing-htmlbars/tests/helpers/outlet_test.js index da62880af64..37c17c58ec6 100644 --- a/packages/ember-routing-htmlbars/tests/helpers/outlet_test.js +++ b/packages/ember-routing-htmlbars/tests/helpers/outlet_test.js @@ -1,32 +1,26 @@ import run from 'ember-metal/run_loop'; - -import Namespace from 'ember-runtime/system/namespace'; import Controller from 'ember-runtime/controllers/controller'; import EmberView from 'ember-views/views/view'; import jQuery from 'ember-views/system/jquery'; - import compile from 'ember-template-compiler/system/compile'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; -import { buildRegistry } from 'ember-routing-htmlbars/tests/utils'; +import { buildAppInstance } from 'ember-routing-htmlbars/tests/utils'; var trim = jQuery.trim; -var registry, container, top; +var appInstance, top; QUnit.module('ember-routing-htmlbars: {{outlet}} helper', { setup() { - var namespace = Namespace.create(); - registry = buildRegistry(namespace); - container = registry.container(); - - var CoreOutlet = container.lookupFactory('view:core-outlet'); + appInstance = buildAppInstance(); + var CoreOutlet = appInstance._lookupFactory('view:core-outlet'); top = CoreOutlet.create(); }, teardown() { - runDestroy(container); + runDestroy(appInstance); runDestroy(top); - registry = container = top = null; + appInstance = top = null; } }); @@ -48,7 +42,7 @@ QUnit.test('view should render the outlet when set after dom insertion', functio }); QUnit.test('a top-level outlet should always be a view', function() { - registry.register('view:toplevel', EmberView.extend({ + appInstance.register('view:toplevel', EmberView.extend({ elementId: 'top-level' })); var routerState = withTemplate('

HI

{{outlet}}'); diff --git a/packages/ember-routing-htmlbars/tests/helpers/render_test.js b/packages/ember-routing-htmlbars/tests/helpers/render_test.js index 51790b4d614..fbe70144172 100644 --- a/packages/ember-routing-htmlbars/tests/helpers/render_test.js +++ b/packages/ember-routing-htmlbars/tests/helpers/render_test.js @@ -3,8 +3,6 @@ import { set } from 'ember-metal/property_set'; import run from 'ember-metal/run_loop'; import { observer } from 'ember-metal/mixin'; -import Namespace from 'ember-runtime/system/namespace'; - import EmberController from 'ember-runtime/controllers/controller'; import compile from 'ember-template-compiler/system/compile'; @@ -13,8 +11,9 @@ import EmberView from 'ember-views/views/view'; import jQuery from 'ember-views/system/jquery'; import ActionManager from 'ember-views/system/action_manager'; -import { buildRegistry } from 'ember-routing-htmlbars/tests/utils'; +import { buildAppInstance } from 'ember-routing-htmlbars/tests/utils'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; +import { OWNER } from 'container/owner'; function runSet(object, key, value) { run(function() { @@ -22,17 +21,15 @@ function runSet(object, key, value) { }); } -var view, container; +var view, appInstance; QUnit.module('ember-routing-htmlbars: {{render}} helper', { setup() { - var namespace = Namespace.create(); - var registry = buildRegistry(namespace); - container = registry.container(); + appInstance = buildAppInstance(); }, teardown() { - runDestroy(container); + runDestroy(appInstance); runDestroy(view); Ember.TEMPLATES = {}; @@ -41,9 +38,10 @@ QUnit.module('ember-routing-htmlbars: {{render}} helper', { QUnit.test('{{render}} helper should render given template', function() { var template = '

HI

{{render \'home\'}}'; - var controller = EmberController.extend({ container: container }); + var controller = EmberController.extend(); + view = EmberView.create({ - container: container, + [OWNER]: appInstance, controller: controller.create(), template: compile(template) }); @@ -55,14 +53,15 @@ QUnit.test('{{render}} helper should render given template', function() { equal(view.$().text(), 'HIBYE'); // This is a poor assertion. What is really being tested is that // a second render with the same name will throw an assert. - ok(container.lookup('router:main')._lookupActiveComponentNode('home'), 'should register home as active view'); + ok(appInstance.lookup('router:main')._lookupActiveComponentNode('home'), 'should register home as active view'); }); QUnit.test('{{render}} helper should render nested helpers', function() { var template = '

HI

{{render \'foo\'}}'; - var controller = EmberController.extend({ container: container }); + var controller = EmberController.extend(); + view = EmberView.create({ - container: container, + [OWNER]: appInstance, controller: controller.create(), template: compile(template) }); @@ -78,9 +77,10 @@ QUnit.test('{{render}} helper should render nested helpers', function() { QUnit.test('{{render}} helper should have assertion if neither template nor view exists', function() { var template = '

HI

{{render \'oops\'}}'; - var controller = EmberController.extend({ container: container }); + var controller = EmberController.extend(); + view = EmberView.create({ - container: container, + [OWNER]: appInstance, controller: controller.create(), template: compile(template) }); @@ -92,10 +92,11 @@ QUnit.test('{{render}} helper should have assertion if neither template nor view QUnit.test('{{render}} helper should not have assertion if template is supplied in block-form', function() { var template = '

HI

{{#render \'good\'}} {{name}}{{/render}}'; - var controller = EmberController.extend({ container: container }); - container.registry.register('controller:good', EmberController.extend({ name: 'Rob' })); + var controller = EmberController.extend(); + appInstance.register('controller:good', EmberController.extend({ name: 'Rob' })); + view = EmberView.create({ - container: container, + [OWNER]: appInstance, controller: controller.create(), template: compile(template) }); @@ -107,14 +108,15 @@ QUnit.test('{{render}} helper should not have assertion if template is supplied QUnit.test('{{render}} helper should not have assertion if view exists without a template', function() { var template = '

HI

{{render \'oops\'}}'; - var controller = EmberController.extend({ container: container }); + var controller = EmberController.extend(); + view = EmberView.create({ - container: container, + [OWNER]: appInstance, controller: controller.create(), template: compile(template) }); - container.registry.register('view:oops', EmberView.extend()); + appInstance.register('view:oops', EmberView.extend()); runAppend(view); @@ -128,15 +130,15 @@ QUnit.test('{{render}} helper should render given template with a supplied model }; var Controller = EmberController.extend({ - container: container, post: post }); var controller = Controller.create({ + [OWNER]: appInstance }); view = EmberView.create({ - container: container, + [OWNER]: appInstance, controller: controller, template: compile(template) }); @@ -148,7 +150,7 @@ QUnit.test('{{render}} helper should render given template with a supplied model postController = this; } }); - container.registry.register('controller:post', PostController); + appInstance.register('controller:post', PostController); Ember.TEMPLATES['post'] = compile('

{{model.title}}

'); @@ -168,13 +170,14 @@ QUnit.test('{{render}} helper with a supplied model should not fire observers on var post = { title: 'Rails is omakase' }; + const controller = EmberController.create({ + [OWNER]: appInstance, + post: post + }); view = EmberView.create({ - container: container, - controller: EmberController.create({ - container: container, - post: post - }), + [OWNER]: appInstance, + controller, template: compile(template) }); @@ -184,7 +187,7 @@ QUnit.test('{{render}} helper with a supplied model should not fire observers on }) }); - container.registry.register('controller:post', PostController); + appInstance.register('controller:post', PostController); Ember.TEMPLATES['post'] = compile('

{{title}}

'); @@ -194,12 +197,17 @@ QUnit.test('{{render}} helper with a supplied model should not fire observers on }); QUnit.test('{{render}} helper should raise an error when a given controller name does not resolve to a controller', function() { - var template = '

HI

{{render "home" controller="postss"}}'; - var controller = EmberController.extend({ container: container }); - container.registry.register('controller:posts', EmberController.extend()); + const template = '

HI

{{render "home" controller="postss"}}'; + const Controller = EmberController.extend(); + const controller = Controller.create({ + [OWNER]: appInstance + }); + + appInstance.register('controller:posts', EmberController.extend()); + view = EmberView.create({ - container: container, - controller: controller.create(), + [OWNER]: appInstance, + controller, template: compile(template) }); @@ -212,17 +220,22 @@ QUnit.test('{{render}} helper should raise an error when a given controller name QUnit.test('{{render}} helper should render with given controller', function() { var template = '{{render "home" controller="posts"}}'; - var controller = EmberController.extend({ container: container }); + var Controller = EmberController.extend(); + const controller = Controller.create({ + [OWNER]: appInstance + }); var id = 0; - container.registry.register('controller:posts', EmberController.extend({ + + appInstance.register('controller:posts', EmberController.extend({ init() { this._super.apply(this, arguments); this.uniqueId = id++; } })); + view = EmberView.create({ - container: container, - controller: controller.create(), + [OWNER]: appInstance, + controller, template: compile(template) }); @@ -230,17 +243,21 @@ QUnit.test('{{render}} helper should render with given controller', function() { runAppend(view); - var uniqueId = container.lookup('controller:posts').get('uniqueId'); + var uniqueId = appInstance.lookup('controller:posts').get('uniqueId'); equal(uniqueId, 0, 'precond - first uniqueId is used for singleton'); equal(uniqueId, view.$().html(), 'rendered with singleton controller'); }); QUnit.test('{{render}} helper should render a template without a model only once', function() { var template = '

HI

{{render \'home\'}}
{{render \'home\'}}'; - var controller = EmberController.extend({ container: container }); + var Controller = EmberController.extend(); + const controller = Controller.create({ + [OWNER]: appInstance + }); + view = EmberView.create({ - container: container, - controller: controller.create(), + [OWNER]: appInstance, + controller, template: compile(template) }); @@ -261,15 +278,16 @@ QUnit.test('{{render}} helper should render templates with models multiple times }; var Controller = EmberController.extend({ - container: container, post1: post1, post2: post2 }); - var controller = Controller.create(); + var controller = Controller.create({ + [OWNER]: appInstance + }); view = EmberView.create({ - container: container, + [OWNER]: appInstance, controller: controller, template: compile(template) }); @@ -285,7 +303,7 @@ QUnit.test('{{render}} helper should render templates with models multiple times } } }); - container.registry.register('controller:post', PostController, { singleton: false }); + appInstance.register('controller:post', PostController, { singleton: false }); Ember.TEMPLATES['post'] = compile('

{{model.title}}

'); @@ -308,14 +326,15 @@ QUnit.test('{{render}} helper should not leak controllers', function() { }; var Controller = EmberController.extend({ - container: container, post1: post1 }); - var controller = Controller.create(); + var controller = Controller.create({ + [OWNER]: appInstance + }); view = EmberView.create({ - container: container, + [OWNER]: appInstance, controller: controller, template: compile(template) }); @@ -327,7 +346,7 @@ QUnit.test('{{render}} helper should not leak controllers', function() { postController = this; } }); - container.registry.register('controller:post', PostController); + appInstance.register('controller:post', PostController); Ember.TEMPLATES['post'] = compile('

{{title}}

'); @@ -341,12 +360,14 @@ QUnit.test('{{render}} helper should not leak controllers', function() { QUnit.test('{{render}} helper should not treat invocations with falsy contexts as context-less', function() { var template = '

HI

{{render \'post\' zero}} {{render \'post\' nonexistent}}'; + const controller = EmberController.create({ + [OWNER]: appInstance, + zero: false + }); + view = EmberView.create({ - container: container, - controller: EmberController.create({ - container: container, - zero: false - }), + [OWNER]: appInstance, + controller, template: compile(template) }); @@ -361,7 +382,7 @@ QUnit.test('{{render}} helper should not treat invocations with falsy contexts a } } }); - container.registry.register('controller:post', PostController, { singleton: false }); + appInstance.register('controller:post', PostController, { singleton: false }); Ember.TEMPLATES['post'] = compile('

{{#unless model}}NOTHING{{/unless}}

'); @@ -379,14 +400,15 @@ QUnit.test('{{render}} helper should render templates both with and without mode }; var Controller = EmberController.extend({ - container: container, post: post }); - var controller = Controller.create(); + var controller = Controller.create({ + [OWNER]: appInstance + }); view = EmberView.create({ - container: container, + [OWNER]: appInstance, controller: controller, template: compile(template) }); @@ -402,7 +424,7 @@ QUnit.test('{{render}} helper should render templates both with and without mode } } }); - container.registry.register('controller:post', PostController, { singleton: false }); + appInstance.register('controller:post', PostController, { singleton: false }); Ember.TEMPLATES['post'] = compile('

Title:{{model.title}}

'); @@ -419,11 +441,9 @@ QUnit.test('{{render}} helper should render templates both with and without mode }); QUnit.test('{{render}} helper should link child controllers to the parent controller', function() { - var parentTriggered = 0; - - var template = '

HI

{{render "posts"}}'; - var controller = EmberController.extend({ - container: container, + let parentTriggered = 0; + const template = '

HI

{{render "posts"}}'; + const Controller = EmberController.extend({ actions: { parentPlease() { parentTriggered++; @@ -431,12 +451,15 @@ QUnit.test('{{render}} helper should link child controllers to the parent contro }, role: 'Mom' }); + const controller = Controller.create({ + [OWNER]: appInstance + }); - container.registry.register('controller:posts', EmberController.extend()); + appInstance.register('controller:posts', EmberController.extend()); view = EmberView.create({ - container: container, - controller: controller.create(), + [OWNER]: appInstance, + controller, template: compile(template) }); @@ -457,10 +480,14 @@ QUnit.test('{{render}} helper should link child controllers to the parent contro }); QUnit.test('{{render}} helper should be able to render a template again when it was removed', function() { - var controller = EmberController.extend({ container: container }); - var CoreOutlet = container.lookupFactory('view:core-outlet'); + const CoreOutlet = appInstance._lookupFactory('view:core-outlet'); + const Controller = EmberController.extend(); + const controller = Controller.create({ + [OWNER]: appInstance + }); + view = CoreOutlet.create({ - container: container + [OWNER]: appInstance }); Ember.TEMPLATES['home'] = compile('

BYE

'); @@ -475,7 +502,7 @@ QUnit.test('{{render}} helper should be able to render a template again when it run(function() { liveRoutes.outlets.main = { render: { - controller: controller.create(), + controller, template: compile('
1{{render \'home\'}}
') } }; @@ -488,7 +515,7 @@ QUnit.test('{{render}} helper should be able to render a template again when it run(function() { liveRoutes.outlets.main = { render: { - controller: controller.create(), + controller, template: compile('
2{{render \'home\'}}
') } }; @@ -501,7 +528,10 @@ QUnit.test('{{render}} helper should be able to render a template again when it QUnit.test('{{render}} works with dot notation', function() { var template = '{{render "blog.post"}}'; - var ContextController = EmberController.extend({ container: container }); + var ContextController = EmberController.extend(); + var contextController = ContextController.create({ + [OWNER]: appInstance + }); var controller; var id = 0; @@ -512,11 +542,11 @@ QUnit.test('{{render}} works with dot notation', function() { this.uniqueId = id++; } }); - container.registry.register('controller:blog.post', BlogPostController); + appInstance.register('controller:blog.post', BlogPostController); view = EmberView.create({ - container: container, - controller: ContextController.create(), + [OWNER]: appInstance, + controller: contextController, template: compile(template) }); @@ -524,16 +554,19 @@ QUnit.test('{{render}} works with dot notation', function() { runAppend(view); - var singletonController = container.lookup('controller:blog.post'); + var singletonController = appInstance.lookup('controller:blog.post'); equal(singletonController.uniqueId, view.$().html(), 'rendered with correct singleton controller'); }); QUnit.test('throws an assertion if {{render}} is called with an unquoted template name', function() { var template = '

HI

{{render home}}'; - var controller = EmberController.extend({ container: container }); + var Controller = EmberController.extend(); + var controller = Controller.create({ + [OWNER]: appInstance + }); + view = EmberView.create({ - container: container, - controller: controller.create(), + controller, template: compile(template) }); @@ -546,10 +579,14 @@ QUnit.test('throws an assertion if {{render}} is called with an unquoted templat QUnit.test('throws an assertion if {{render}} is called with a literal for a model', function() { var template = '

HI

{{render "home" "model"}}'; - var controller = EmberController.extend({ container: container }); + var Controller = EmberController.extend(); + var controller = Controller.create({ + [OWNER]: appInstance + }); + view = EmberView.create({ - container: container, - controller: controller.create(), + [OWNER]: appInstance, + controller, template: compile(template) }); @@ -562,17 +599,21 @@ QUnit.test('throws an assertion if {{render}} is called with a literal for a mod QUnit.test('{{render}} helper should let view provide its own template', function() { var template = '{{render \'fish\'}}'; - var controller = EmberController.extend({ container: container }); + var Controller = EmberController.extend(); + var controller = Controller.create({ + [OWNER]: appInstance + }); + view = EmberView.create({ - container: container, - controller: controller.create(), + [OWNER]: appInstance, + controller, template: compile(template) }); - container.registry.register('template:fish', compile('Hello fish!')); - container.registry.register('template:other', compile('Hello other!')); + appInstance.register('template:fish', compile('Hello fish!')); + appInstance.register('template:other', compile('Hello other!')); - container.registry.register('view:fish', EmberView.extend({ + appInstance.register('view:fish', EmberView.extend({ templateName: 'other' })); @@ -583,16 +624,20 @@ QUnit.test('{{render}} helper should let view provide its own template', functio QUnit.test('{{render}} helper should not require view to provide its own template', function() { var template = '{{render \'fish\'}}'; - var controller = EmberController.extend({ container: container }); + var Controller = EmberController.extend(); + var controller = Controller.create({ + [OWNER]: appInstance + }); + view = EmberView.create({ - container: container, - controller: controller.create(), + [OWNER]: appInstance, + controller, template: compile(template) }); - container.registry.register('template:fish', compile('Hello fish!')); + appInstance.register('template:fish', compile('Hello fish!')); - container.registry.register('view:fish', EmberView.extend()); + appInstance.register('view:fish', EmberView.extend()); runAppend(view); diff --git a/packages/ember-routing-htmlbars/tests/utils.js b/packages/ember-routing-htmlbars/tests/utils.js index 11a78d69378..3262f2d3135 100644 --- a/packages/ember-routing-htmlbars/tests/utils.js +++ b/packages/ember-routing-htmlbars/tests/utils.js @@ -1,12 +1,10 @@ import Ember from 'ember-metal/core'; import { get } from 'ember-metal/property_get'; -import { set } from 'ember-metal/property_set'; import { classify, decamelize } from 'ember-runtime/system/string'; -import Registry from 'container/registry'; import Controller from 'ember-runtime/controllers/controller'; import EmberView from 'ember-views/views/view'; @@ -17,6 +15,10 @@ import { } from 'ember-routing-views/views/outlet'; import HashLocation from 'ember-routing/location/hash_location'; +import EmberObject from 'ember-runtime/system/object'; +import Registry from 'container/registry'; +import RegistryProxy from 'ember-runtime/mixins/registry_proxy'; +import ContainerProxy from 'ember-runtime/mixins/container_proxy'; function resolverFor(namespace) { return function(fullName) { @@ -38,14 +40,22 @@ function resolverFor(namespace) { }; } -function buildRegistry(namespace) { - var registry = new Registry(); +function buildAppInstance() { + let registry; + const App = EmberObject.extend(RegistryProxy, ContainerProxy, { + init() { + this._super(...arguments); + registry = this.__registry__ = new Registry(); + this.__container__ = registry.container({ owner: this }); + } + }); + const appInstance = App.create(); + + registry.resolver = resolverFor(App); - registry.set = set; - registry.resolver = resolverFor(namespace); registry.optionsForType('view', { singleton: false }); registry.optionsForType('template', { instantiate: false }); - registry.register('application:main', namespace, { instantiate: false }); + registry.register('application:main', App, { instantiate: false }); registry.injection('router:main', 'namespace', 'application:main'); registry.register('location:hash', HashLocation); @@ -59,10 +69,10 @@ function buildRegistry(namespace) { registry.typeInjection('route', 'router', 'router:main'); - return registry; + return appInstance; } export { resolverFor, - buildRegistry + buildAppInstance }; diff --git a/packages/ember-routing/lib/location/auto_location.js b/packages/ember-routing/lib/location/auto_location.js index 85a3d202945..daa426135a4 100644 --- a/packages/ember-routing/lib/location/auto_location.js +++ b/packages/ember-routing/lib/location/auto_location.js @@ -2,6 +2,7 @@ import { assert } from 'ember-metal/debug'; import { get } from 'ember-metal/property_get'; import { set } from 'ember-metal/property_set'; import { tryInvoke } from 'ember-metal/utils'; +import { getOwner } from 'container/owner'; import EmberObject from 'ember-runtime/system/object'; import environment from 'ember-metal/environment'; @@ -133,7 +134,7 @@ export default EmberObject.extend({ implementation = 'none'; } - var concrete = this.container.lookup(`location:${implementation}`); + var concrete = getOwner(this).lookup(`location:${implementation}`); set(concrete, 'rootURL', rootURL); assert(`Could not find location '${implementation}'.`, !!concrete); diff --git a/packages/ember-routing/lib/system/generate_controller.js b/packages/ember-routing/lib/system/generate_controller.js index 8bd4152f58a..39e9728d1d5 100644 --- a/packages/ember-routing/lib/system/generate_controller.js +++ b/packages/ember-routing/lib/system/generate_controller.js @@ -14,10 +14,10 @@ import { get } from 'ember-metal/property_get'; @private */ -export function generateControllerFactory(container, controllerName, context) { +export function generateControllerFactory(owner, controllerName, context) { var Factory, fullName; - Factory = container.lookupFactory('controller:basic').extend({ + Factory = owner._lookupFactory('controller:basic').extend({ isGenerated: true, toString() { return `(generated ${controllerName} controller)`; @@ -26,7 +26,7 @@ export function generateControllerFactory(container, controllerName, context) { fullName = `controller:${controllerName}`; - container.registry.register(fullName, Factory); + owner.register(fullName, Factory); return Factory; } @@ -44,11 +44,11 @@ export function generateControllerFactory(container, controllerName, context) { @private @since 1.3.0 */ -export default function generateController(container, controllerName, context) { - generateControllerFactory(container, controllerName, context); +export default function generateController(owner, controllerName, context) { + generateControllerFactory(owner, controllerName, context); var fullName = `controller:${controllerName}`; - var instance = container.lookup(fullName); + var instance = owner.lookup(fullName); if (get(instance, 'namespace.LOG_ACTIVE_GENERATION')) { info(`generated -> ${fullName}`, { fullName: fullName }); diff --git a/packages/ember-routing/lib/system/route.js b/packages/ember-routing/lib/system/route.js index 90cdef76a31..c8c020b11b6 100644 --- a/packages/ember-routing/lib/system/route.js +++ b/packages/ember-routing/lib/system/route.js @@ -29,6 +29,7 @@ import { normalizeControllerQueryParams, calculateCacheKey } from 'ember-routing/utils'; +import { getOwner } from 'container/owner'; var slice = Array.prototype.slice; @@ -117,7 +118,7 @@ var Route = EmberObject.extend(ActionHandler, Evented, { var controllerProto, combinedQueryParameterConfiguration; var controllerName = this.controllerName || this.routeName; - var definedControllerClass = this.container.lookupFactory(`controller:${controllerName}`); + var definedControllerClass = getOwner(this)._lookupFactory(`controller:${controllerName}`); var queryParameterConfiguraton = get(this, 'queryParams'); var hasRouterDefinedQueryParams = !!Object.keys(queryParameterConfiguraton).length; @@ -140,7 +141,7 @@ var Route = EmberObject.extend(ActionHandler, Evented, { } else if (hasRouterDefinedQueryParams) { // the developer has not defined a controller but *has* supplied route query params. // Generate a class for them so we can later insert default values - var generatedControllerClass = generateControllerFactory(this.container, controllerName); + var generatedControllerClass = generateControllerFactory(getOwner(this), controllerName); controllerProto = generatedControllerClass.proto(); combinedQueryParameterConfiguration = queryParameterConfiguraton; } @@ -321,7 +322,7 @@ var Route = EmberObject.extend(ActionHandler, Evented, { @public */ paramsFor(name) { - var route = this.container.lookup(`route:${name}`); + var route = getOwner(this).lookup(`route:${name}`); if (!route) { return {}; @@ -1528,13 +1529,13 @@ var Route = EmberObject.extend(ActionHandler, Evented, { @private */ store: computed(function() { - var container = this.container; + var owner = getOwner(this); var routeName = this.routeName; var namespace = get(this, 'router.namespace'); return { find(name, value) { - var modelClass = container.lookupFactory(`model:${name}`); + var modelClass = owner._lookupFactory(`model:${name}`); assert( `You used the dynamic segment ${name}_id in your route ${routeName}, but ${namespace}.${classify(name)} did not exist and you did not override your route's \`model\` hook.`, !!modelClass); @@ -1693,15 +1694,15 @@ var Route = EmberObject.extend(ActionHandler, Evented, { @public */ controllerFor(name, _skipAssert) { - var container = this.container; - var route = container.lookup(`route:${name}`); + var owner = getOwner(this); + var route = owner.lookup(`route:${name}`); var controller; if (route && route.controllerName) { name = route.controllerName; } - controller = container.lookup(`controller:${name}`); + controller = owner.lookup(`controller:${name}`); // NOTE: We're specifically checking that skipAssert is true, because according // to the old API the second parameter was model. We do not want people who @@ -1731,11 +1732,11 @@ var Route = EmberObject.extend(ActionHandler, Evented, { @private */ generateController(name, model) { - var container = this.container; + var owner = getOwner(this); model = model || this.modelFor(name); - return generateController(container, name, model); + return generateController(owner, name, model); }, /** @@ -1770,7 +1771,7 @@ var Route = EmberObject.extend(ActionHandler, Evented, { @public */ modelFor(name) { - var route = this.container.lookup(`route:${name}`); + var route = getOwner(this).lookup(`route:${name}`); var transition = this.router ? this.router.router.activeTransition : null; // If we are mid-transition, we want to try and look up @@ -2111,15 +2112,15 @@ function buildRenderOptions(route, namePassed, isDefaultRender, name, options) { if (!controller) { if (namePassed) { - controller = route.container.lookup(`controller:${name}`) || route.controllerName || route.routeName; + controller = getOwner(route).lookup(`controller:${name}`) || route.controllerName || route.routeName; } else { - controller = route.controllerName || route.container.lookup(`controller:${name}`); + controller = route.controllerName || getOwner(route).lookup(`controller:${name}`); } } if (typeof controller === 'string') { var controllerName = controller; - controller = route.container.lookup(`controller:${controllerName}`); + controller = getOwner(route).lookup(`controller:${controllerName}`); if (!controller) { throw new EmberError(`You passed \`controller: '${controllerName}'\` into the \`render\` method, but no such controller could be found.`); } @@ -2133,9 +2134,10 @@ function buildRenderOptions(route, namePassed, isDefaultRender, name, options) { controller.set('model', options.model); } + const owner = getOwner(route); viewName = options && options.view || namePassed && name || route.viewName || name; - ViewClass = route.container.lookupFactory(`view:${viewName}`); - template = route.container.lookup(`template:${templateName}`); + ViewClass = owner._lookupFactory(`view:${viewName}`); + template = owner.lookup(`template:${templateName}`); var parent; if (into && (parent = parentRoute(route)) && into === parentRoute(route).routeName) { @@ -2154,7 +2156,7 @@ function buildRenderOptions(route, namePassed, isDefaultRender, name, options) { let Component; if (isEnabled('ember-routing-routable-components')) { let componentName = options && options.component || namePassed && name || route.componentName || name; - let componentLookup = route.container.lookup('component-lookup:main'); + let componentLookup = owner.lookup('component-lookup:main'); Component = componentLookup.lookupFactory(componentName); let isGlimmerComponent = Component && Component.proto().isGlimmerComponent; if (!template && !ViewClass && Component && isGlimmerComponent) { diff --git a/packages/ember-routing/lib/system/router.js b/packages/ember-routing/lib/system/router.js index b6638cb7976..d9998349fa7 100644 --- a/packages/ember-routing/lib/system/router.js +++ b/packages/ember-routing/lib/system/router.js @@ -19,6 +19,7 @@ import { calculateCacheKey } from 'ember-routing/utils'; import RouterState from './router_state'; +import { getOwner } from 'container/owner'; /** @module ember @@ -246,9 +247,10 @@ var EmberRouter = EmberObject.extend(Evented, { defaultParentState = ownState; } if (!this._toplevelView) { - var OutletView = this.container.lookupFactory('view:-outlet'); + const owner = getOwner(this); + var OutletView = owner._lookupFactory('view:-outlet'); this._toplevelView = OutletView.create(); - var instance = this.container.lookup('-application-instance:main'); + var instance = owner.lookup('-application-instance:main'); instance.didCreateRootView(this._toplevelView); } this._toplevelView.setOutletState(liveRoutes); @@ -447,9 +449,10 @@ var EmberRouter = EmberObject.extend(Evented, { _setupLocation() { var location = get(this, 'location'); var rootURL = get(this, 'rootURL'); + const owner = getOwner(this); - if ('string' === typeof location && this.container) { - var resolvedLocation = this.container.lookup(`location:${location}`); + if ('string' === typeof location && owner) { + var resolvedLocation = owner.lookup(`location:${location}`); if ('undefined' !== typeof resolvedLocation) { location = set(this, 'location', resolvedLocation); @@ -485,12 +488,12 @@ var EmberRouter = EmberObject.extend(Evented, { _getHandlerFunction() { var seen = new EmptyObject(); - var container = this.container; - var DefaultRoute = container.lookupFactory('route:basic'); + const owner = getOwner(this); + var DefaultRoute = owner._lookupFactory('route:basic'); return (name) => { var routeName = 'route:' + name; - var handler = container.lookup(routeName); + var handler = owner.lookup(routeName); if (seen[name]) { return handler; @@ -499,8 +502,8 @@ var EmberRouter = EmberObject.extend(Evented, { seen[name] = true; if (!handler) { - container.registry.register(routeName, DefaultRoute.extend()); - handler = container.lookup(routeName); + owner.register(routeName, DefaultRoute.extend()); + handler = owner.lookup(routeName); if (get(this, 'namespace.LOG_ACTIVE_GENERATION')) { info(`generated -> ${routeName}`, { fullName: routeName }); @@ -841,9 +844,9 @@ function findChildRouteName(parentRoute, originatingChildRoute, name) { } function routeHasBeenDefined(router, name) { - var container = router.container; + const owner = getOwner(router); return router.hasRoute(name) && - (container.registry.has(`template:${name}`) || container.registry.has(`route:${name}`)); + (owner.hasRegistration(`template:${name}`) || owner.hasRegistration(`route:${name}`)); } function triggerEvent(handlerInfos, ignoreFailure, args) { @@ -904,7 +907,7 @@ function updatePaths(router) { set(router, 'currentPath', path); set(router, 'currentRouteName', currentRouteName); - let appController = router.container.lookup('controller:application'); + let appController = getOwner(router).lookup('controller:application'); if (!appController) { // appController might not exist when top-level loading/error diff --git a/packages/ember-routing/tests/location/auto_location_test.js b/packages/ember-routing/tests/location/auto_location_test.js index fd1ab094767..b25d9405a19 100644 --- a/packages/ember-routing/tests/location/auto_location_test.js +++ b/packages/ember-routing/tests/location/auto_location_test.js @@ -9,8 +9,8 @@ import { import HistoryLocation from 'ember-routing/location/history_location'; import HashLocation from 'ember-routing/location/hash_location'; import NoneLocation from 'ember-routing/location/none_location'; -import Registry from 'container/registry'; - +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; function mockBrowserLocation(overrides) { return assign({ @@ -36,18 +36,20 @@ function mockBrowserHistory(overrides) { } function createLocation(location, history) { - var registry = new Registry(); + const owner = buildOwner(); - registry.register('location:history', HistoryLocation); - registry.register('location:hash', HashLocation); - registry.register('location:none', NoneLocation); + owner.register('location:history', HistoryLocation); + owner.register('location:hash', HashLocation); + owner.register('location:none', NoneLocation); - return AutoLocation.create({ - container: registry.container(), + const autolocation = AutoLocation.create({ + [OWNER]: owner, location: location, history: history, global: {} }); + + return autolocation; } var location; diff --git a/packages/ember-routing/tests/system/controller_for_test.js b/packages/ember-routing/tests/system/controller_for_test.js index bdb2c2f7cae..36bbae28fb3 100644 --- a/packages/ember-routing/tests/system/controller_for_test.js +++ b/packages/ember-routing/tests/system/controller_for_test.js @@ -1,9 +1,6 @@ import Ember from 'ember-metal/core'; // A import { get } from 'ember-metal/property_get'; -import { set } from 'ember-metal/property_set'; import run from 'ember-metal/run_loop'; - -import Registry from 'container/registry'; import Namespace from 'ember-runtime/system/namespace'; import { classify } from 'ember-runtime/system/string'; import Controller from 'ember-runtime/controllers/controller'; @@ -12,20 +9,19 @@ import generateController from 'ember-routing/system/generate_controller'; import { generateControllerFactory } from 'ember-routing/system/generate_controller'; +import buildOwner from 'container/tests/test-helpers/build-owner'; -var buildContainer = function(namespace) { - var registry = new Registry(); - var container = registry.container(); +var buildInstance = function(namespace) { + const owner = buildOwner(); - registry.set = set; - registry.resolver = resolverFor(namespace); - registry.optionsForType('view', { singleton: false }); + owner.__registry__.resolver = resolverFor(namespace); + owner.registerOptionsForType('view', { singleton: false }); - registry.register('application:main', namespace, { instantiate: false }); + owner.register('application:main', namespace, { instantiate: false }); - registry.register('controller:basic', Controller, { instantiate: false }); + owner.register('controller:basic', Controller, { instantiate: false }); - return container; + return owner; }; function resolverFor(namespace) { @@ -44,25 +40,25 @@ function resolverFor(namespace) { }; } -var container, appController, namespace; +var appInstance, appController, namespace; QUnit.module('Ember.controllerFor', { setup() { namespace = Namespace.create(); - container = buildContainer(namespace); - container.registry.register('controller:app', Controller.extend()); - appController = container.lookup('controller:app'); + appInstance = buildInstance(namespace); + appInstance.register('controller:app', Controller.extend()); + appController = appInstance.lookup('controller:app'); }, teardown() { run(function () { - container.destroy(); + appInstance.destroy(); namespace.destroy(); }); } }); QUnit.test('controllerFor should lookup for registered controllers', function() { - var controller = controllerFor(container, 'app'); + var controller = controllerFor(appInstance, 'app'); equal(appController, controller, 'should find app controller'); }); @@ -70,11 +66,11 @@ QUnit.test('controllerFor should lookup for registered controllers', function() QUnit.module('Ember.generateController', { setup() { namespace = Namespace.create(); - container = buildContainer(namespace); + appInstance = buildInstance(namespace); }, teardown() { run(function () { - container.destroy(); + appInstance.destroy(); namespace.destroy(); }); } @@ -86,7 +82,7 @@ QUnit.test('generateController and generateControllerFactory are properties on t }); QUnit.test('generateController should create Ember.Controller', function() { - var controller = generateController(container, 'home'); + var controller = generateController(appInstance, 'home'); ok(controller instanceof Controller, 'should create controller'); }); @@ -96,7 +92,7 @@ QUnit.test('generateController should create App.Controller if provided', functi var controller; namespace.Controller = Controller.extend(); - controller = generateController(container, 'home'); + controller = generateController(appInstance, 'home'); ok(controller instanceof namespace.Controller, 'should create controller'); }); diff --git a/packages/ember-routing/tests/system/dsl_test.js b/packages/ember-routing/tests/system/dsl_test.js index cd282d83e7c..dff80487ad7 100644 --- a/packages/ember-routing/tests/system/dsl_test.js +++ b/packages/ember-routing/tests/system/dsl_test.js @@ -5,8 +5,6 @@ import { registerHandler as registerWarnHandler } from 'ember-debug/warn'; - - var Router, outerWarnHandler; QUnit.module('Ember Router DSL', { diff --git a/packages/ember-routing/tests/system/route_test.js b/packages/ember-routing/tests/system/route_test.js index 7735178dc55..621fa340222 100644 --- a/packages/ember-routing/tests/system/route_test.js +++ b/packages/ember-routing/tests/system/route_test.js @@ -1,9 +1,10 @@ import { runDestroy } from 'ember-runtime/tests/utils'; -import Registry from 'container/registry'; import Service from 'ember-runtime/system/service'; import EmberObject from 'ember-runtime/system/object'; import EmberRoute from 'ember-routing/system/route'; import inject from 'ember-runtime/inject'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { setOwner } from 'container/owner'; var route, routeOne, routeTwo, lookupHash; @@ -32,17 +33,17 @@ QUnit.test('default store utilizes the container to acquire the model factory', } }); - route.container = { - has() { + setOwner(route, buildOwner({ + hasRegistration() { return true; }, - lookupFactory(fullName) { + _lookupFactory(fullName) { equal(fullName, 'model:post', 'correct factory was looked up'); return Post; } - }; + })); route.set('_qp', null); @@ -54,8 +55,8 @@ QUnit.test('\'store\' can be injected by data persistence frameworks', function( expect(8); runDestroy(route); - var registry = new Registry(); - var container = registry.container(); + const owner = buildOwner(); + var post = { id: 1 }; @@ -69,12 +70,12 @@ QUnit.test('\'store\' can be injected by data persistence frameworks', function( } }); - registry.register('route:index', EmberRoute); - registry.register('store:main', Store); + owner.register('route:index', EmberRoute); + owner.register('store:main', Store); - registry.injection('route', 'store', 'store:main'); + owner.inject('route', 'store', 'store:main'); - route = container.lookup('route:index'); + route = owner.lookup('route:index'); equal(route.model({ post_id: 1 }), post, '#model returns the correct post'); equal(route.findModel('post', 1), post, '#findModel returns the correct post'); @@ -84,14 +85,13 @@ QUnit.test('assert if \'store.find\' method is not found', function() { expect(1); runDestroy(route); - var registry = new Registry(); - var container = registry.container(); + const owner = buildOwner(); var Post = EmberObject.extend(); - registry.register('route:index', EmberRoute); - registry.register('model:post', Post); + owner.register('route:index', EmberRoute); + owner.register('model:post', Post); - route = container.lookup('route:index'); + route = owner.lookup('route:index'); expectAssertion(function() { route.findModel('post', 1); @@ -102,11 +102,10 @@ QUnit.test('asserts if model class is not found', function() { expect(1); runDestroy(route); - var registry = new Registry(); - var container = registry.container(); - registry.register('route:index', EmberRoute); + const owner = buildOwner(); + owner.register('route:index', EmberRoute); - route = container.lookup('route:index'); + route = owner.lookup('route:index'); expectAssertion(function() { route.model({ post_id: 1 }); @@ -118,12 +117,11 @@ QUnit.test('\'store\' does not need to be injected', function() { runDestroy(route); - var registry = new Registry(); - var container = registry.container(); + const owner = buildOwner(); - registry.register('route:index', EmberRoute); + owner.register('route:index', EmberRoute); - route = container.lookup('route:index'); + route = owner.lookup('route:index'); ignoreAssertion(function() { route.model({ post_id: 1 }); @@ -133,23 +131,22 @@ QUnit.test('\'store\' does not need to be injected', function() { }); QUnit.test('modelFor doesn\'t require the router', function() { - var registry = new Registry(); - var container = registry.container(); - route.container = container; + expect(1); - var foo = { name: 'foo' }; + const owner = buildOwner(); + setOwner(route, owner); - var fooRoute = EmberRoute.extend({ - container: container, + const foo = { name: 'foo' }; + + const FooRoute = EmberRoute.extend({ currentModel: foo }); - registry.register('route:foo', fooRoute); + owner.register('route:foo', FooRoute); - equal(route.modelFor('foo'), foo); + strictEqual(route.modelFor('foo'), foo); }); - QUnit.test('.send just calls an action if the router is absent', function() { expect(7); var route = EmberRoute.extend({ @@ -275,14 +272,17 @@ QUnit.test('returns undefined if model is not set', function() { QUnit.module('Ember.Route interaction', { setup() { - var container = { + var owner = { lookup(fullName) { return lookupHash[fullName]; } }; - routeOne = EmberRoute.create({ container: container, routeName: 'one' }); - routeTwo = EmberRoute.create({ container: container, routeName: 'two' }); + routeOne = EmberRoute.create({ routeName: 'one' }); + routeTwo = EmberRoute.create({ routeName: 'two' }); + + setOwner(routeOne, owner); + setOwner(routeTwo, owner); lookupHash = { 'route:one': routeOne, @@ -308,17 +308,16 @@ QUnit.test('controllerFor uses route\'s controllerName if specified', function() QUnit.module('Route injected properties'); QUnit.test('services can be injected into routes', function() { - var registry = new Registry(); - var container = registry.container(); + const owner = buildOwner(); - registry.register('route:application', EmberRoute.extend({ + owner.register('route:application', EmberRoute.extend({ authService: inject.service('auth') })); - registry.register('service:auth', Service.extend()); + owner.register('service:auth', Service.extend()); - var appRoute = container.lookup('route:application'); - var authService = container.lookup('service:auth'); + var appRoute = owner.lookup('route:application'); + var authService = owner.lookup('service:auth'); equal(authService, appRoute.get('authService'), 'service.auth is injected'); }); diff --git a/packages/ember-routing/tests/system/router_test.js b/packages/ember-routing/tests/system/router_test.js index 552d9212b90..e0ca81bccd6 100644 --- a/packages/ember-routing/tests/system/router_test.js +++ b/packages/ember-routing/tests/system/router_test.js @@ -1,20 +1,25 @@ -import assign from 'ember-metal/assign'; -import Registry from 'container/registry'; import HashLocation from 'ember-routing/location/hash_location'; import HistoryLocation from 'ember-routing/location/history_location'; import AutoLocation from 'ember-routing/location/auto_location'; import NoneLocation from 'ember-routing/location/none_location'; import Router from 'ember-routing/system/router'; import { runDestroy } from 'ember-runtime/tests/utils'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { setOwner } from 'container/owner'; -var registry, container; +var owner; -function createRouter(overrides, disableSetup) { - var opts = assign({ container: container }, overrides); - var routerWithContainer = Router.extend(); - var router = routerWithContainer.create(opts); +function createRouter(settings, options) { + options = options || {}; - if (!disableSetup) { + var CustomRouter = Router.extend(); + var router = CustomRouter.create(settings); + + if (!options.skipOwner) { + setOwner(router, owner); + } + + if (!options.disableSetup) { router.setupRouter(); } @@ -23,35 +28,34 @@ function createRouter(overrides, disableSetup) { QUnit.module('Ember Router', { setup() { - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); //register the HashLocation (the default) - registry.register('location:hash', HashLocation); - registry.register('location:history', HistoryLocation); - registry.register('location:auto', AutoLocation); - registry.register('location:none', NoneLocation); + owner.register('location:hash', HashLocation); + owner.register('location:history', HistoryLocation); + owner.register('location:auto', AutoLocation); + owner.register('location:none', NoneLocation); }, teardown() { - runDestroy(container); - registry = container = null; + runDestroy(owner); + owner = null; } }); -QUnit.test('can create a router without a container', function() { - createRouter({ container: null }, true); +QUnit.test('can create a router without an owner', function() { + createRouter(null, { disableSetup: true, skipOwner: true }); ok(true, 'no errors were thrown when creating without a container'); }); QUnit.test('should not create a router.js instance upon init', function() { - var router = createRouter(null, true); + var router = createRouter(null, { disableSetup: true }); ok(!router.router); }); QUnit.test('should not reify location until setupRouter is called', function() { - var router = createRouter(null, true); + var router = createRouter(null, { disableSetup: true }); equal(typeof router.location, 'string', 'location is specified as a string'); router.setupRouter(); @@ -59,11 +63,11 @@ QUnit.test('should not reify location until setupRouter is called', function() { equal(typeof router.location, 'object', 'location is reified into an object'); }); -QUnit.test('should destroy its location upon destroying the routers container.', function() { +QUnit.test('should destroy its location upon destroying the routers owner.', function() { var router = createRouter(); var location = router.get('location'); - runDestroy(container); + runDestroy(owner); ok(location.isDestroyed, 'location should be destroyed'); }); @@ -80,7 +84,7 @@ QUnit.test('should instantiate its location with its `rootURL`', function() { QUnit.test('replacePath should be called with the right path', function() { expect(1); - var location = container.lookup('location:auto'); + var location = owner.lookup('location:auto'); var browserLocation = { href: 'http://test.com/rootdir/welcome', @@ -139,10 +143,9 @@ QUnit.test('Router should cancel routing setup when the Location class says so v create() { return this; } }; - registry.register('location:fake', FakeLocation); + owner.register('location:fake', FakeLocation); router = createRouter({ - container: container, location: 'fake', _setupRouter() { @@ -156,7 +159,7 @@ QUnit.test('Router should cancel routing setup when the Location class says so v QUnit.test('AutoLocation should replace the url when it\'s not in the preferred format', function() { expect(1); - var location = container.lookup('location:auto'); + var location = owner.lookup('location:auto'); location.location = { href: 'http://test.com/rootdir/welcome', @@ -183,8 +186,6 @@ QUnit.test('Router#handleURL should remove any #hashes before doing URL transiti expect(2); var router = createRouter({ - container: container, - _doURLTransition(routerJsMethod, url) { equal(routerJsMethod, 'handleURL'); equal(url, '/foo/bar?time=morphin'); diff --git a/packages/ember-runtime/lib/main.js b/packages/ember-runtime/lib/main.js index fe90033c31e..90b1e5e2d87 100644 --- a/packages/ember-runtime/lib/main.js +++ b/packages/ember-runtime/lib/main.js @@ -12,7 +12,7 @@ import inject from 'ember-runtime/inject'; import Namespace from 'ember-runtime/system/namespace'; import EmberObject from 'ember-runtime/system/object'; -import { Container, Registry } from 'ember-runtime/system/container'; +import { Container, Registry, getOwner, setOwner } from 'ember-runtime/system/container'; import ArrayProxy from 'ember-runtime/system/array_proxy'; import ObjectProxy from 'ember-runtime/system/object_proxy'; import CoreObject from 'ember-runtime/system/core_object'; @@ -67,6 +67,8 @@ import 'ember-runtime/ext/string'; // just for side effect of extending String import 'ember-runtime/ext/function'; // just for side effect of extending Function.prototype import { isArray, typeOf } from 'ember-runtime/utils'; + +import isEnabled from 'ember-metal/features'; // END IMPORTS // BEGIN EXPORTS @@ -117,6 +119,12 @@ Ember.String = EmberStringUtils; Ember.Object = EmberObject; Ember.Container = Container; Ember.Registry = Registry; + +if (isEnabled('ember-container-inject-owner')) { + Ember.getOwner = getOwner; + Ember.setOwner = setOwner; +} + Ember.Namespace = Namespace; Ember.Enumerable = Enumerable; Ember.ArrayProxy = ArrayProxy; diff --git a/packages/ember-runtime/lib/mixins/controller.js b/packages/ember-runtime/lib/mixins/controller.js index 0ab93efe933..6a2e8bfc981 100644 --- a/packages/ember-runtime/lib/mixins/controller.js +++ b/packages/ember-runtime/lib/mixins/controller.js @@ -34,8 +34,6 @@ export default Mixin.create(ActionHandler, ControllerContentModelAliasDeprecatio */ target: null, - container: null, - parentController: null, store: null, diff --git a/packages/ember-runtime/lib/system/container.js b/packages/ember-runtime/lib/system/container.js index ca969582880..d620d9fbe24 100644 --- a/packages/ember-runtime/lib/system/container.js +++ b/packages/ember-runtime/lib/system/container.js @@ -1,8 +1,9 @@ import { set } from 'ember-metal/property_set'; import Registry from 'container/registry'; import Container from 'container/container'; +import { getOwner, setOwner } from 'container/owner'; Registry.set = set; Container.set = set; -export { Registry, Container }; +export { Registry, Container, getOwner, setOwner }; diff --git a/packages/ember-runtime/tests/controllers/controller_test.js b/packages/ember-runtime/tests/controllers/controller_test.js index c81a7260b9d..6eb47164f37 100644 --- a/packages/ember-runtime/tests/controllers/controller_test.js +++ b/packages/ember-runtime/tests/controllers/controller_test.js @@ -4,9 +4,9 @@ import Controller from 'ember-runtime/controllers/controller'; import Service from 'ember-runtime/system/service'; import Mixin from 'ember-metal/mixin'; import Object from 'ember-runtime/system/object'; -import { Registry } from 'ember-runtime/system/container'; import inject from 'ember-runtime/inject'; import { get } from 'ember-metal/property_get'; +import buildOwner from 'container/tests/test-helpers/build-owner'; QUnit.module('Controller event handling'); @@ -35,7 +35,7 @@ QUnit.test('Action can be handled by a function on actions object', function() { } } }); - var controller = TestController.create({}); + var controller = TestController.create(); controller.send('poke'); }); @@ -155,49 +155,45 @@ QUnit.module('Controller injected properties'); if (!EmberDev.runningProdBuild) { QUnit.test('defining a controller on a non-controller should fail assertion', function() { expectAssertion(function() { - var registry = new Registry(); - var container = registry.container(); + const owner = buildOwner(); var AnObject = Object.extend({ - container: container, foo: inject.controller('bar') }); - registry.register('foo:main', AnObject); + owner.register('foo:main', AnObject); - container.lookupFactory('foo:main'); + owner._lookupFactory('foo:main'); }, /Defining an injected controller property on a non-controller is not allowed./); }); } QUnit.test('controllers can be injected into controllers', function() { - var registry = new Registry(); - var container = registry.container(); + const owner = buildOwner(); - registry.register('controller:post', Controller.extend({ + owner.register('controller:post', Controller.extend({ postsController: inject.controller('posts') })); - registry.register('controller:posts', Controller.extend()); + owner.register('controller:posts', Controller.extend()); - var postController = container.lookup('controller:post'); - var postsController = container.lookup('controller:posts'); + var postController = owner.lookup('controller:post'); + var postsController = owner.lookup('controller:posts'); equal(postsController, postController.get('postsController'), 'controller.posts is injected'); }); QUnit.test('services can be injected into controllers', function() { - var registry = new Registry(); - var container = registry.container(); + const owner = buildOwner(); - registry.register('controller:application', Controller.extend({ + owner.register('controller:application', Controller.extend({ authService: inject.service('auth') })); - registry.register('service:auth', Service.extend()); + owner.register('service:auth', Service.extend()); - var appController = container.lookup('controller:application'); - var authService = container.lookup('service:auth'); + var appController = owner.lookup('controller:application'); + var authService = owner.lookup('service:auth'); equal(authService, appController.get('authService'), 'service.auth is injected'); }); diff --git a/packages/ember-runtime/tests/inject_test.js b/packages/ember-runtime/tests/inject_test.js index 4e8917f23a0..7a28c430c3a 100644 --- a/packages/ember-runtime/tests/inject_test.js +++ b/packages/ember-runtime/tests/inject_test.js @@ -5,8 +5,8 @@ import inject from 'ember-runtime/inject'; import { createInjectionHelper } from 'ember-runtime/inject'; -import { Registry } from 'ember-runtime/system/container'; import Object from 'ember-runtime/system/object'; +import buildOwner from 'container/tests/test-helpers/build-owner'; QUnit.module('inject'); @@ -26,32 +26,28 @@ if (!EmberDev.runningProdBuild) { ok(true, 'should call validation method'); }); - var registry = new Registry(); - var container = registry.container(); + const owner = buildOwner(); var AnObject = Object.extend({ - container: container, bar: inject.foo(), baz: inject.foo() }); - registry.register('foo:main', AnObject); - container.lookupFactory('foo:main'); + owner.register('foo:main', AnObject); + owner._lookupFactory('foo:main'); }); } QUnit.test('attempting to inject a nonexistent container key should error', function() { - var registry = new Registry(); - var container = registry.container(); + const owner = buildOwner(); var AnObject = Object.extend({ - container: container, foo: new InjectedProperty('bar', 'baz') }); - registry.register('foo:main', AnObject); + owner.register('foo:main', AnObject); throws(function() { - container.lookup('foo:main'); + owner.lookup('foo:main'); }, /Attempting to inject an unknown injection: `bar:baz`/); }); diff --git a/packages/ember-views/lib/component_lookup.js b/packages/ember-views/lib/component_lookup.js index 43c2f95530e..43400afc46c 100644 --- a/packages/ember-views/lib/component_lookup.js +++ b/packages/ember-views/lib/component_lookup.js @@ -2,6 +2,7 @@ import Ember from 'ember-metal/core'; import { assert } from 'ember-metal/debug'; import EmberObject from 'ember-runtime/system/object'; import { CONTAINS_DASH_CACHE } from 'ember-htmlbars/system/lookup-helper'; +import { getOwner } from 'container/owner'; export default EmberObject.extend({ invalidName(name) { @@ -11,45 +12,45 @@ export default EmberObject.extend({ } }, - lookupFactory(name, container) { - container = container || this.container; + lookupFactory(name, owner) { + owner = owner || getOwner(this); var fullName = 'component:' + name; var templateFullName = 'template:components/' + name; - var templateRegistered = container && container.registry.has(templateFullName); + var templateRegistered = owner && owner.hasRegistration(templateFullName); if (templateRegistered) { - container.registry.injection(fullName, 'layout', templateFullName); + owner.inject(fullName, 'layout', templateFullName); } - var Component = container.lookupFactory(fullName); + var Component = owner._lookupFactory(fullName); // Only treat as a component if either the component // or a template has been registered. if (templateRegistered || Component) { if (!Component) { - container.registry.register(fullName, Ember.Component); - Component = container.lookupFactory(fullName); + owner.register(fullName, Ember.Component); + Component = owner._lookupFactory(fullName); } return Component; } }, - componentFor(name, container) { + componentFor(name, owner) { if (this.invalidName(name)) { return; } var fullName = 'component:' + name; - return container.lookupFactory(fullName); + return owner._lookupFactory(fullName); }, - layoutFor(name, container) { + layoutFor(name, owner) { if (this.invalidName(name)) { return; } var templateFullName = 'template:components/' + name; - return container.lookup(templateFullName); + return owner.lookup(templateFullName); } }); diff --git a/packages/ember-views/lib/components/component.js b/packages/ember-views/lib/components/component.js index 0da49c3baea..3796fe0b925 100644 --- a/packages/ember-views/lib/components/component.js +++ b/packages/ember-views/lib/components/component.js @@ -12,6 +12,8 @@ import { computed } from 'ember-metal/computed'; import { MUTABLE_CELL } from 'ember-views/compat/attrs-proxy'; +import { getOwner } from 'container/owner'; + function validateAction(component, actionName) { if (actionName && actionName[MUTABLE_CELL]) { actionName = actionName.value; @@ -136,7 +138,7 @@ var Component = View.extend(TargetActionSupport, { set(this, 'controller', this); set(this, 'context', this); - if (!this.layout && this.layoutName && this.container) { + if (!this.layout && this.layoutName && getOwner(this)) { let layoutName = get(this, 'layoutName'); this.layout = this.templateForName(layoutName); diff --git a/packages/ember-views/lib/mixins/legacy_child_views_support.js b/packages/ember-views/lib/mixins/legacy_child_views_support.js index c4fc6fe4501..e8d9844ad64 100644 --- a/packages/ember-views/lib/mixins/legacy_child_views_support.js +++ b/packages/ember-views/lib/mixins/legacy_child_views_support.js @@ -1,10 +1,11 @@ import { Mixin } from 'ember-metal/mixin'; import { get } from 'ember-metal/property_get'; import { set } from 'ember-metal/property_set'; +import { getOwner, setOwner } from 'container/owner'; export default Mixin.create({ linkChild(instance) { - instance.container = this.container; + setOwner(instance, getOwner(this)); if (get(instance, 'parentView') !== this) { // linkChild should be idempotent set(instance, 'parentView', this); diff --git a/packages/ember-views/lib/mixins/view_child_views_support.js b/packages/ember-views/lib/mixins/view_child_views_support.js index 1b4cbfeac21..1ab265d02ab 100644 --- a/packages/ember-views/lib/mixins/view_child_views_support.js +++ b/packages/ember-views/lib/mixins/view_child_views_support.js @@ -8,6 +8,7 @@ import { get } from 'ember-metal/property_get'; import { set } from 'ember-metal/property_set'; import setProperties from 'ember-metal/set_properties'; import { A as emberA } from 'ember-runtime/system/native_array'; +import { getOwner, setOwner } from 'container/owner'; var EMPTY_ARRAY = []; @@ -85,7 +86,9 @@ export default Mixin.create({ throw new TypeError('createChildViews first argument must exist'); } - if (maybeViewClass.isView && maybeViewClass.parentView === this && maybeViewClass.container === this.container) { + const owner = getOwner(this); + + if (maybeViewClass.isView && maybeViewClass.parentView === this && getOwner(maybeViewClass) === owner) { return maybeViewClass; } @@ -97,7 +100,7 @@ export default Mixin.create({ attrs._viewRegistry = this._viewRegistry; if (maybeViewClass.isViewFactory) { - attrs.container = this.container; + setOwner(attrs, owner); view = maybeViewClass.create(attrs); @@ -106,7 +109,7 @@ export default Mixin.create({ } } else if ('string' === typeof maybeViewClass) { var fullName = 'view:' + maybeViewClass; - var ViewKlass = this.container.lookupFactory(fullName); + var ViewKlass = owner._lookupFactory(fullName); assert('Could not find view: \'' + fullName + '\'', !!ViewKlass); @@ -115,7 +118,7 @@ export default Mixin.create({ view = maybeViewClass; assert('You must pass instance or subclass of View', view.isView); - attrs.container = this.container; + setOwner(attrs, owner); setProperties(view, attrs); } @@ -125,7 +128,7 @@ export default Mixin.create({ }, linkChild(instance) { - instance.container = this.container; + setOwner(instance, getOwner(this)); instance.parentView = this; instance.ownerView = this.ownerView; }, diff --git a/packages/ember-views/lib/mixins/view_support.js b/packages/ember-views/lib/mixins/view_support.js index f3fdedc1152..b75cd161663 100644 --- a/packages/ember-views/lib/mixins/view_support.js +++ b/packages/ember-views/lib/mixins/view_support.js @@ -9,6 +9,7 @@ import { Mixin } from 'ember-metal/mixin'; import { POST_INIT } from 'ember-runtime/system/core_object'; import isEnabled from 'ember-metal/features'; import { symbol } from 'ember-metal/utils'; +import { getOwner } from 'container/owner'; const INIT_WAS_CALLED = symbol('INIT_WAS_CALLED'); @@ -117,13 +118,15 @@ export default Mixin.create({ if (!name) { return; } assert('templateNames are not allowed to contain periods: ' + name, name.indexOf('.') === -1); - if (!this.container) { + const owner = getOwner(this); + + if (!owner) { throw new EmberError('Container was not found when looking up a views template. ' + 'This is most likely due to manually instantiating an Ember.View. ' + 'See: http://git.io/EKPpnA'); } - return this.container.lookup('template:' + name); + return owner.lookup('template:' + name); }, /** diff --git a/packages/ember-views/lib/streams/utils.js b/packages/ember-views/lib/streams/utils.js index 6de4280857b..5ab3e569121 100644 --- a/packages/ember-views/lib/streams/utils.js +++ b/packages/ember-views/lib/streams/utils.js @@ -3,13 +3,13 @@ import { get } from 'ember-metal/property_get'; import { read, isStream } from 'ember-metal/streams/utils'; import ControllerMixin from 'ember-runtime/mixins/controller'; -export function readViewFactory(object, container) { +export function readViewFactory(object, owner) { var value = read(object); var viewClass; if (typeof value === 'string') { - assert('View requires a container to resolve views not passed in through the context', !!container); - viewClass = container.lookupFactory('view:' + value); + assert('View requires an owner to resolve views not passed in through the context', !!owner); + viewClass = owner._lookupFactory('view:' + value); } else { viewClass = value; } @@ -21,16 +21,16 @@ export function readViewFactory(object, container) { return viewClass; } -export function readComponentFactory(nameOrStream, container) { +export function readComponentFactory(nameOrStream, owner) { var name = read(nameOrStream); - var componentLookup = container.lookup('component-lookup:main'); + var componentLookup = owner.lookup('component-lookup:main'); assert( 'Could not find \'component-lookup:main\' on the provided container, ' + 'which is necessary for performing component lookups', componentLookup ); - return componentLookup.lookupFactory(name, container); + return componentLookup.lookupFactory(name, owner); } export function readUnwrappedModel(object) { diff --git a/packages/ember-views/lib/system/event_dispatcher.js b/packages/ember-views/lib/system/event_dispatcher.js index bb7352d078b..2503a59817d 100644 --- a/packages/ember-views/lib/system/event_dispatcher.js +++ b/packages/ember-views/lib/system/event_dispatcher.js @@ -13,6 +13,7 @@ import jQuery from 'ember-views/system/jquery'; import ActionManager from 'ember-views/system/action_manager'; import View from 'ember-views/views/view'; import assign from 'ember-metal/assign'; +import { getOwner } from 'container/owner'; let ROOT_ELEMENT_CLASS = 'ember-application'; let ROOT_ELEMENT_SELECTOR = '.' + ROOT_ELEMENT_CLASS; @@ -188,7 +189,9 @@ export default EmberObject.extend({ */ setupHandler(rootElement, event, eventName) { var self = this; - var viewRegistry = this.container && this.container.lookup('-view-registry:main') || View.views; + + const owner = getOwner(this); + const viewRegistry = owner && owner.lookup('-view-registry:main') || View.views; if (eventName === null) { return; diff --git a/packages/ember-views/lib/system/lookup_partial.js b/packages/ember-views/lib/system/lookup_partial.js index a1518dc9d41..abadf21a9e7 100644 --- a/packages/ember-views/lib/system/lookup_partial.js +++ b/packages/ember-views/lib/system/lookup_partial.js @@ -24,11 +24,11 @@ function templateFor(env, underscored, name) { if (!name) { return; } assert('templateNames are not allowed to contain periods: ' + name, name.indexOf('.') === -1); - if (!env.container) { + if (!env.owner) { throw new EmberError('Container was not found when looking up a views template. ' + 'This is most likely due to manually instantiating an Ember.View. ' + 'See: http://git.io/EKPpnA'); } - return env.container.lookup('template:' + underscored) || env.container.lookup('template:' + name); + return env.owner.lookup('template:' + underscored) || env.owner.lookup('template:' + name); } diff --git a/packages/ember-views/lib/views/collection_view.js b/packages/ember-views/lib/views/collection_view.js index d507a1b19c7..25a9ed15298 100644 --- a/packages/ember-views/lib/views/collection_view.js +++ b/packages/ember-views/lib/views/collection_view.js @@ -14,6 +14,7 @@ import { computed } from 'ember-metal/computed'; import { observer } from 'ember-metal/mixin'; import { readViewFactory } from 'ember-views/streams/utils'; import EmptyViewSupport from 'ember-views/mixins/empty_view_support'; +import { getOwner } from 'container/owner'; /** `Ember.CollectionView` is an `Ember.View` descendent responsible for managing @@ -311,7 +312,7 @@ var CollectionView = ContainerView.extend(EmptyViewSupport, { itemViewProps = this._itemViewProps || {}; itemViewClass = this.getAttr('itemViewClass') || get(this, 'itemViewClass'); - itemViewClass = readViewFactory(itemViewClass, this.container); + itemViewClass = readViewFactory(itemViewClass, getOwner(this)); for (idx = start; idx < start + added; idx++) { item = content.objectAt(idx); diff --git a/packages/ember-views/tests/compat/attrs_proxy_test.js b/packages/ember-views/tests/compat/attrs_proxy_test.js index 01127f58447..acf68a49850 100644 --- a/packages/ember-views/tests/compat/attrs_proxy_test.js +++ b/packages/ember-views/tests/compat/attrs_proxy_test.js @@ -1,40 +1,40 @@ import View from 'ember-views/views/view'; import { runAppend, runDestroy } from 'ember-runtime/tests/utils'; import compile from 'ember-template-compiler/system/compile'; -import Registry from 'container/registry'; import run from 'ember-metal/run_loop'; import { set } from 'ember-metal/property_set'; import { get } from 'ember-metal/property_get'; import { observer } from 'ember-metal/mixin'; import { on } from 'ember-metal/events'; - import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var view, registry, container, originalViewKeyword; +var view, owner, originalViewKeyword; QUnit.module('ember-views: attrs-proxy', { setup() { originalViewKeyword = registerKeyword('view', viewKeyword); - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); }, teardown() { runDestroy(view); + runDestroy(owner); resetKeyword('view', originalViewKeyword); } }); QUnit.test('works with properties setup in root of view', function() { - registry.register('view:foo', View.extend({ + owner.register('view:foo', View.extend({ bar: 'qux', template: compile('{{view.bar}}') })); view = View.extend({ - container: registry.container(), + [OWNER]: owner, template: compile('{{view "foo" bar="baz"}}') }).create(); @@ -48,7 +48,7 @@ QUnit.test('works with undefined attributes', function() { // expectDeprecation(); var childView; - registry.register('view:foo', View.extend({ + owner.register('view:foo', View.extend({ init: function() { this._super(...arguments); @@ -59,8 +59,7 @@ QUnit.test('works with undefined attributes', function() { })); view = View.extend({ - container: registry.container(), - + [OWNER]: owner, template: compile('{{view "foo" bar=undefined}}') }).create(); @@ -78,7 +77,7 @@ QUnit.test('works with undefined attributes', function() { QUnit.test('an observer on an attribute in the root of the component is fired when attrs are set', function() { expect(2); - registry.register('view:foo', View.extend({ + owner.register('view:foo', View.extend({ observerFiredCount: 0, barObserver: on('init', observer('bar', function() { @@ -90,7 +89,7 @@ QUnit.test('an observer on an attribute in the root of the component is fired wh })); view = View.extend({ - container: registry.container(), + [OWNER]: owner, baz: 'baz', template: compile('{{view "foo" bar=view.baz}}') }).create(); diff --git a/packages/ember-views/tests/views/collection_test.js b/packages/ember-views/tests/views/collection_test.js index 9a540d68db1..f5cc0f0d348 100644 --- a/packages/ember-views/tests/views/collection_test.js +++ b/packages/ember-views/tests/views/collection_test.js @@ -1,20 +1,22 @@ import Ember from 'ember-metal/core'; // Ember.A import { set } from 'ember-metal/property_set'; import run from 'ember-metal/run_loop'; +import { runDestroy } from 'ember-runtime/tests/utils'; import { Mixin } from 'ember-metal/mixin'; import jQuery from 'ember-views/system/jquery'; import CollectionView, { DeprecatedCollectionView } from 'ember-views/views/collection_view'; import View from 'ember-views/views/view'; -import Registry from 'container/registry'; import compile from 'ember-template-compiler/system/compile'; import getElementStyle from 'ember-views/tests/test-helpers/get-element-style'; import { A as emberA } from 'ember-runtime/system/native_array'; import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; var trim = jQuery.trim; -var registry; +var owner; var view; var originalLookup, originalViewKeyword; @@ -24,13 +26,12 @@ QUnit.module('CollectionView', { CollectionView.CONTAINER_MAP.del = 'em'; originalViewKeyword = registerKeyword('view', viewKeyword); originalLookup = Ember.lookup; - registry = new Registry(); + owner = buildOwner(); }, teardown() { delete CollectionView.CONTAINER_MAP.del; - run(function() { - if (view) { view.destroy(); } - }); + runDestroy(view); + runDestroy(owner); Ember.lookup = originalLookup; resetKeyword('view', originalViewKeyword); @@ -467,14 +468,15 @@ QUnit.test('should allow items to access to the CollectionView\'s current index }); QUnit.test('should allow declaration of itemViewClass as a string', function() { - registry.register('view:simple-view', View.extend()); + owner.register('view:simple-view', View.extend()); view = CollectionView.create({ - container: registry.container(), - content: emberA([1, 2, 3]), + [OWNER]: owner, itemViewClass: 'simple-view' }); + view.set('content', emberA([1, 2, 3])); + run(function() { view.appendTo('#qunit-fixture'); }); @@ -530,7 +532,6 @@ QUnit.test('when a collection view is emptied, deeply nested views elements are itemViewClass: ChildView }); - run(function() { view.append(); }); @@ -549,16 +550,15 @@ QUnit.test('when a collection view is emptied, deeply nested views elements are }); QUnit.test('should render the emptyView if content array is empty and emptyView is given as string', function() { - registry.register('view:custom-empty', View.extend({ + owner.register('view:custom-empty', View.extend({ tagName: 'kbd', template: compile('THIS IS AN EMPTY VIEW') })); view = CollectionView.create({ + [OWNER]: owner, tagName: 'del', content: emberA(), - container: registry.container(), - emptyView: 'custom-empty' }); @@ -574,14 +574,15 @@ QUnit.test('should lookup against the container if itemViewClass is given as a s template: compile('{{view.content}}') }); - registry.register('view:item', ItemView); + owner.register('view:item', ItemView); view = CollectionView.create({ - container: registry.container(), - content: emberA([1, 2, 3, 4]), + [OWNER]: owner, itemViewClass: 'item' }); + view.set('content', emberA([1, 2, 3, 4])); + run(function() { view.appendTo('#qunit-fixture'); }); @@ -594,14 +595,15 @@ QUnit.test('should lookup only global path against the container if itemViewClas template: compile('{{view.content}}') }); - registry.register('view:top', ItemView); + owner.register('view:top', ItemView); view = CollectionView.create({ - container: registry.container(), - content: emberA(['hi']), + [OWNER]: owner, itemViewClass: 'top' }); + view.set('content', emberA(['hi'])); + run(function() { view.appendTo('#qunit-fixture'); }); @@ -615,10 +617,10 @@ QUnit.test('should lookup against the container and render the emptyView if empt template: compile('THIS IS AN EMPTY VIEW') }); - registry.register('view:empty', EmptyView); + owner.register('view:empty', EmptyView); view = CollectionView.create({ - container: registry.container(), + [OWNER]: owner, tagName: 'del', content: emberA(), emptyView: 'empty' @@ -636,10 +638,10 @@ QUnit.test('should lookup from only global path against the container if emptyVi template: compile('EMPTY') }); - registry.register('view:top', EmptyView); + owner.register('view:top', EmptyView); view = CollectionView.create({ - container: registry.container(), + [OWNER]: owner, content: emberA(), emptyView: 'top' }); diff --git a/packages/ember-views/tests/views/component_test.js b/packages/ember-views/tests/views/component_test.js index 53e96518197..7afb298d532 100644 --- a/packages/ember-views/tests/views/component_test.js +++ b/packages/ember-views/tests/views/component_test.js @@ -2,7 +2,6 @@ import { set } from 'ember-metal/property_set'; import run from 'ember-metal/run_loop'; import EmberObject from 'ember-runtime/system/object'; import Service from 'ember-runtime/system/service'; -import { Registry } from 'ember-runtime/system/container'; import inject from 'ember-runtime/inject'; import { get } from 'ember-metal/property_get'; import Application from 'ember-application/system/application'; @@ -13,6 +12,7 @@ import EmberView from 'ember-views/views/view'; import Component from 'ember-views/components/component'; import { MUTABLE_CELL } from 'ember-views/compat/attrs-proxy'; +import buildOwner from 'container/tests/test-helpers/build-owner'; var a_slice = Array.prototype.slice; @@ -231,17 +231,16 @@ QUnit.test('Calling sendAction on a component with multiple parameters', functio QUnit.module('Ember.Component - injected properties'); QUnit.test('services can be injected into components', function() { - var registry = new Registry(); - var container = registry.container(); + const owner = buildOwner(); - registry.register('component:application', Component.extend({ + owner.register('component:application', Component.extend({ profilerService: inject.service('profiler') })); - registry.register('service:profiler', Service.extend()); + owner.register('service:profiler', Service.extend()); - var appComponent = container.lookup('component:application'); - var profilerService = container.lookup('service:profiler'); + var appComponent = owner.lookup('component:application'); + var profilerService = owner.lookup('service:profiler'); equal(profilerService, appComponent.get('profilerService'), 'service.profiler is injected'); }); diff --git a/packages/ember-views/tests/views/container_view_test.js b/packages/ember-views/tests/views/container_view_test.js index 877ff010026..a3eaa7263b6 100644 --- a/packages/ember-views/tests/views/container_view_test.js +++ b/packages/ember-views/tests/views/container_view_test.js @@ -6,20 +6,20 @@ import Controller from 'ember-runtime/controllers/controller'; import jQuery from 'ember-views/system/jquery'; import View from 'ember-views/views/view'; import ContainerView, { DeprecatedContainerView } from 'ember-views/views/container_view'; -import Registry from 'container/registry'; import compile from 'ember-template-compiler/system/compile'; import getElementStyle from 'ember-views/tests/test-helpers/get-element-style'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { getOwner, OWNER } from 'container/owner'; import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; var trim = jQuery.trim; -var container, registry, view, otherContainer, originalViewKeyword; +var container, view, otherContainer, originalViewKeyword; QUnit.module('Ember.ContainerView', { setup() { originalViewKeyword = registerKeyword('view', viewKeyword); - registry = new Registry(); }, teardown() { run(function() { @@ -32,10 +32,12 @@ QUnit.module('Ember.ContainerView', { }); QUnit.test('should be able to insert views after the DOM representation is created', function() { + const owner = buildOwner(); + container = ContainerView.create({ + [OWNER]: owner, classNameBindings: ['name'], - name: 'foo', - container: registry.container() + name: 'foo' }); run(function() { @@ -50,7 +52,7 @@ QUnit.test('should be able to insert views after the DOM representation is creat container.pushObject(view); }); - equal(view.container, container.container, 'view gains its containerViews container'); + equal(getOwner(view), owner, 'view gains its containerView\'s owner'); equal(view.parentView, container, 'view\'s parentView is the container'); equal(trim(container.$().text()), 'This is my moment'); @@ -84,15 +86,15 @@ QUnit.test('should be able to observe properties that contain child views', func equal(container.get('displayIsDisplayed'), false, 'can bind to child view'); }); -QUnit.test('childViews inherit their parents iocContainer, and retain the original container even when moved', function() { - var iocContainer = registry.container(); +QUnit.test('childViews inherit their parents owner, and retain the original container even when moved', function() { + const owner = buildOwner(); container = ContainerView.create({ - container: iocContainer + [OWNER]: owner }); otherContainer = ContainerView.create({ - container: iocContainer + [OWNER]: owner }); view = View.create(); @@ -100,16 +102,16 @@ QUnit.test('childViews inherit their parents iocContainer, and retain the origin container.pushObject(view); strictEqual(view.get('parentView'), container, 'sets the parent view after the childView is appended'); - strictEqual(get(view, 'container'), container.container, 'inherits its parentViews iocContainer'); + strictEqual(getOwner(view), owner, 'inherits its parentViews owner'); container.removeObject(view); - strictEqual(get(view, 'container'), container.container, 'leaves existing iocContainer alone'); + strictEqual(getOwner(view), owner, 'leaves existing owner alone'); otherContainer.pushObject(view); strictEqual(view.get('parentView'), otherContainer, 'sets the new parent view after the childView is appended'); - strictEqual(get(view, 'container'), container.container, 'still inherits its original parentViews iocContainer'); + strictEqual(getOwner(view), owner, 'still inherits its original parentViews owner'); }); QUnit.test('should set the parentView property on views that are added to the child views array', function() { @@ -460,7 +462,6 @@ var child, count; QUnit.module('Ember.ContainerView - modify childViews', { setup() { originalViewKeyword = registerKeyword('view', viewKeyword); - registry = new Registry(); container = ContainerView.create({ _viewRegistry: { } }); @@ -620,7 +621,6 @@ QUnit.test('should be able to modify childViews then rerender again the Containe QUnit.module('Ember.ContainerView', { setup() { originalViewKeyword = registerKeyword('view', viewKeyword); - registry = new Registry(); }, teardown() { run(function() { diff --git a/packages/ember-views/tests/views/view/child_views_test.js b/packages/ember-views/tests/views/view/child_views_test.js index dc2fcf42f2e..abd068517a0 100644 --- a/packages/ember-views/tests/views/view/child_views_test.js +++ b/packages/ember-views/tests/views/view/child_views_test.js @@ -6,6 +6,7 @@ import { A as emberA } from 'ember-runtime/system/native_array'; import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; +import { setOwner } from 'container/owner'; var originalViewKeyword; var parentView, childView; @@ -80,19 +81,6 @@ QUnit.test('should remove childViews inside {{if}} on destroy', function() { var outerView = EmberView.extend({ component: 'my-thing', value: false, - container: { - lookup() { - return { - componentFor() { - return Component.extend(); - }, - - layoutFor() { - return null; - } - }; - } - }, template: compile(` {{#if view.value}} {{component view.component value=view.value}} @@ -100,6 +88,20 @@ QUnit.test('should remove childViews inside {{if}} on destroy', function() { `) }).create(); + setOwner(outerView, { + lookup() { + return { + componentFor() { + return Component.extend(); + }, + + layoutFor() { + return null; + } + }; + } + }); + run(outerView, 'append'); run(outerView, 'set', 'value', true); @@ -121,19 +123,6 @@ QUnit.test('should remove childViews inside {{each}} on destroy', function() { this._super(...arguments); this.value = false; }, - container: { - lookup() { - return { - componentFor() { - return Component.extend(); - }, - - layoutFor() { - return null; - } - }; - } - }, template: compile(` {{#if view.value}} {{#each view.data as |item|}} @@ -143,6 +132,20 @@ QUnit.test('should remove childViews inside {{each}} on destroy', function() { `) }).create(); + setOwner(outerView, { + lookup() { + return { + componentFor() { + return Component.extend(); + }, + + layoutFor() { + return null; + } + }; + } + }); + run(outerView, 'append'); equal(outerView.get('childViews.length'), 0); diff --git a/packages/ember-views/tests/views/view/create_child_view_test.js b/packages/ember-views/tests/views/view/create_child_view_test.js index b541490befa..1abf84a3a8c 100644 --- a/packages/ember-views/tests/views/view/create_child_view_test.js +++ b/packages/ember-views/tests/views/view/create_child_view_test.js @@ -6,16 +6,16 @@ import { observer } from 'ember-metal/mixin'; import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; +import { getOwner, OWNER } from 'container/owner'; -var view, myViewClass, newView, container, originalViewKeyword; +var view, myViewClass, newView, owner, originalViewKeyword; QUnit.module('EmberView#createChildView', { setup() { originalViewKeyword = registerKeyword('view', viewKeyword); - container = { }; - + owner = {}; view = EmberView.create({ - container: container + [OWNER]: owner }); myViewClass = EmberView.extend({ isMyView: true, foo: 'bar' }); @@ -37,7 +37,7 @@ QUnit.test('should create view from class with any passed attributes', function( newView = view.createChildView(myViewClass, attrs); - equal(newView.container, container, 'expects to share container with parent'); + equal(getOwner(newView), owner, 'expects to share container with parent'); ok(get(newView, 'isMyView'), 'newView is instance of myView'); equal(get(newView, 'foo'), 'baz', 'view did get custom attributes'); }); @@ -67,7 +67,7 @@ QUnit.test('creating a childView, (via createChildView) should make parentView i QUnit.test('should set newView.parentView to receiver', function() { newView = view.createChildView(myViewClass); - equal(newView.container, container, 'expects to share container with parent'); + equal(getOwner(newView), owner, 'expects to share container with parent'); equal(get(newView, 'parentView'), view, 'newView.parentView == view'); }); @@ -77,7 +77,7 @@ QUnit.test('should create property on parentView to a childView instance if prov }; newView = view.createChildView(myViewClass, attrs); - equal(newView.container, container, 'expects to share container with parent'); + equal(getOwner(newView), owner, 'expects to share container with parent'); equal(get(view, 'someChildView'), newView); }); @@ -90,7 +90,7 @@ QUnit.test('should update a view instances attributes, including the parentView var myView = myViewClass.create(); newView = view.createChildView(myView, attrs); - equal(newView.container, container, 'expects to share container with parent'); + equal(getOwner(newView), owner, 'expects to share container with parent'); equal(newView.parentView, view, 'expects to have the correct parent'); equal(get(newView, 'foo'), 'baz', 'view did get custom attributes'); @@ -101,25 +101,22 @@ QUnit.test('should create from string via container lookup', function() { var ChildViewClass = EmberView.extend(); var fullName = 'view:bro'; - view.container.lookupFactory = function(viewName) { + owner._lookupFactory = function(viewName) { equal(fullName, viewName); - return ChildViewClass.extend({ - container: container - }); + return ChildViewClass.extend(); }; newView = view.createChildView('bro'); - equal(newView.container, container, 'expects to share container with parent'); + equal(getOwner(newView), owner, 'expects to share container with parent'); equal(newView.parentView, view, 'expects to have the correct parent'); }); QUnit.test('should assert when trying to create childView from string, but no such view is registered', function() { - view.container.lookupFactory = function() {}; + owner._lookupFactory = function() {}; expectAssertion(function() { view.createChildView('bro'); }); }); - diff --git a/packages/ember-views/tests/views/view/inject_test.js b/packages/ember-views/tests/views/view/inject_test.js index 7825fbfe984..1f7b87bccaa 100644 --- a/packages/ember-views/tests/views/view/inject_test.js +++ b/packages/ember-views/tests/views/view/inject_test.js @@ -1,22 +1,21 @@ import Service from 'ember-runtime/system/service'; -import { Registry } from 'ember-runtime/system/container'; import inject from 'ember-runtime/inject'; import View from 'ember-views/views/view'; +import buildOwner from 'container/tests/test-helpers/build-owner'; QUnit.module('EmberView - injected properties'); QUnit.test('services can be injected into views', function() { - var registry = new Registry(); - var container = registry.container(); + const owner = buildOwner(); - registry.register('view:application', View.extend({ + owner.register('view:application', View.extend({ profilerService: inject.service('profiler') })); - registry.register('service:profiler', Service.extend()); + owner.register('service:profiler', Service.extend()); - var appView = container.lookup('view:application'); - var profilerService = container.lookup('service:profiler'); + var appView = owner.lookup('view:application'); + var profilerService = owner.lookup('service:profiler'); equal(profilerService, appView.get('profilerService'), 'service.profiler is injected'); }); diff --git a/packages/ember-views/tests/views/view/layout_test.js b/packages/ember-views/tests/views/view/layout_test.js index 30c2f8fea02..4ef1ef46f4d 100644 --- a/packages/ember-views/tests/views/view/layout_test.js +++ b/packages/ember-views/tests/views/view/layout_test.js @@ -1,32 +1,34 @@ -import Registry from 'container/registry'; import { get } from 'ember-metal/property_get'; import run from 'ember-metal/run_loop'; import EmberView from 'ember-views/views/view'; import { compile } from 'ember-template-compiler'; import { registerHelper } from 'ember-htmlbars/helpers'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var registry, container, view; +var owner, view; QUnit.module('EmberView - Layout Functionality', { setup() { - registry = new Registry(); - container = registry.container(); - registry.optionsForType('template', { instantiate: false }); + owner = buildOwner(); + owner.registerOptionsForType('template', { instantiate: false }); }, teardown() { run(function() { view.destroy(); - container.destroy(); + owner.destroy(); }); - registry = container = view = null; + owner = view = null; } }); QUnit.test('Layout views return throw if their layout cannot be found', function() { view = EmberView.create({ - layoutName: 'cantBeFound', - container: { lookup() { } } + [OWNER]: { + lookup() { } + }, + layoutName: 'cantBeFound' }); expectAssertion(function() { @@ -46,11 +48,11 @@ QUnit.test('should use the template of the associated layout', function() { layoutCalled++; }); - registry.register('template:template', compile('{{call-template}}')); - registry.register('template:layout', compile('{{call-layout}}')); + owner.register('template:template', compile('{{call-template}}')); + owner.register('template:layout', compile('{{call-layout}}')); view = EmberView.create({ - container: container, + [OWNER]: owner, layoutName: 'layout', templateName: 'template' }); @@ -64,14 +66,13 @@ QUnit.test('should use the template of the associated layout', function() { }); QUnit.test('should use the associated template with itself as the context', function() { - registry.register('template:testTemplate', compile( + owner.register('template:testTemplate', compile( '

template was called for {{personName}}

' )); view = EmberView.create({ - container: container, + [OWNER]: owner, layoutName: 'testTemplate', - context: { personName: 'Tom DAAAALE' } diff --git a/packages/ember-views/tests/views/view/nested_view_ordering_test.js b/packages/ember-views/tests/views/view/nested_view_ordering_test.js index 54c1b6d5d98..a5fba1b1fea 100644 --- a/packages/ember-views/tests/views/view/nested_view_ordering_test.js +++ b/packages/ember-views/tests/views/view/nested_view_ordering_test.js @@ -1,28 +1,26 @@ -import Registry from 'container/registry'; import run from 'ember-metal/run_loop'; - import EmberView from 'ember-views/views/view'; import compile from 'ember-template-compiler/system/compile'; - import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var registry, container, view; +var owner, view; var originalViewKeyword; QUnit.module('EmberView - Nested View Ordering', { setup() { originalViewKeyword = registerKeyword('view', viewKeyword); - registry = new Registry(); - container = registry.container(); + owner = buildOwner(); }, teardown() { run(function() { if (view) { view.destroy(); } - container.destroy(); + owner.destroy(); }); resetKeyword('view', originalViewKeyword); - registry = container = view = null; + owner = view = null; } }); @@ -30,14 +28,14 @@ QUnit.test('should call didInsertElement on child views before parent', function var insertedLast; view = EmberView.create({ + [OWNER]: owner, didInsertElement() { insertedLast = 'outer'; }, - container: container, template: compile('{{view "inner"}}') }); - registry.register('view:inner', EmberView.extend({ + owner.register('view:inner', EmberView.extend({ didInsertElement() { insertedLast = 'inner'; } diff --git a/packages/ember-views/tests/views/view/template_test.js b/packages/ember-views/tests/views/view/template_test.js index 0cd997b85fa..a6420c01e71 100644 --- a/packages/ember-views/tests/views/view/template_test.js +++ b/packages/ember-views/tests/views/view/template_test.js @@ -1,30 +1,32 @@ -import Registry from 'container/registry'; import { get } from 'ember-metal/property_get'; import run from 'ember-metal/run_loop'; import EmberView from 'ember-views/views/view'; import { compile } from 'ember-template-compiler'; +import buildOwner from 'container/tests/test-helpers/build-owner'; +import { OWNER } from 'container/owner'; -var registry, container, view; +var owner, view; QUnit.module('EmberView - Template Functionality', { setup() { - registry = new Registry(); - container = registry.container(); - registry.optionsForType('template', { instantiate: false }); + owner = buildOwner(); + owner.registerOptionsForType('template', { instantiate: false }); }, teardown() { run(function() { if (view) { view.destroy(); } - container.destroy(); - registry = container = view = null; + owner.destroy(); + owner = view = null; }); } }); QUnit.test('Template views return throw if their template cannot be found', function() { view = EmberView.create({ - templateName: 'cantBeFound', - container: { lookup() { } } + [OWNER]: { + lookup() {} + }, + templateName: 'cantBeFound' }); expectAssertion(function() { @@ -33,12 +35,12 @@ QUnit.test('Template views return throw if their template cannot be found', func }); QUnit.test('should call the function of the associated template', function() { - registry.register('template:testTemplate', compile( + owner.register('template:testTemplate', compile( '

template was called

' )); view = EmberView.create({ - container: container, + [OWNER]: owner, templateName: 'testTemplate' }); @@ -50,14 +52,13 @@ QUnit.test('should call the function of the associated template', function() { }); QUnit.test('should call the function of the associated template with itself as the context', function() { - registry.register('template:testTemplate', compile( + owner.register('template:testTemplate', compile( '

template was called for {{personName}}

' )); view = EmberView.create({ - container: container, + [OWNER]: owner, templateName: 'testTemplate', - context: { personName: 'Tom DAAAALE' } @@ -111,17 +112,19 @@ QUnit.test('should not use defaultTemplate if template is provided', function() }); QUnit.test('should not use defaultTemplate if template is provided', function() { - registry.register('template:foobar', compile('foo')); + owner.register('template:foobar', compile('foo')); var View = EmberView.extend({ - container: container, templateName: 'foobar', defaultTemplate: compile( '

template was called for {{personName}}

' ) }); - view = View.create(); + view = View.create({ + [OWNER]: owner + }); + run(function() { view.createElement(); }); diff --git a/packages/ember/tests/application_lifecycle_test.js b/packages/ember/tests/application_lifecycle_test.js index 6474c8b55d7..24131f5360c 100644 --- a/packages/ember/tests/application_lifecycle_test.js +++ b/packages/ember/tests/application_lifecycle_test.js @@ -7,7 +7,7 @@ import jQuery from 'ember-views/system/jquery'; var compile = Ember.HTMLBars.compile; -var App, container, router; +var App, appInstance, router; function setupApp(klass) { run(function() { @@ -21,7 +21,7 @@ function setupApp(klass) { App.deferReadiness(); - container = App.__container__; + appInstance = App.__deprecatedInstance__; }); } @@ -38,7 +38,7 @@ QUnit.module('Application Lifecycle', { }); function handleURL(path) { - router = container.lookup('router:main'); + router = appInstance.lookup('router:main'); return run(function() { return router.handleURL(path).then(function(value) { ok(true, 'url: `' + path + '` was handled'); @@ -50,7 +50,6 @@ function handleURL(path) { }); } - QUnit.test('Resetting the application allows controller properties to be set when a route deactivates', function() { App.Router.map(function() { this.route('home', { path: '/' }); @@ -73,22 +72,22 @@ QUnit.test('Resetting the application allows controller properties to be set whe } }); - container.lookup('router:main'); + appInstance.lookup('router:main'); run(App, 'advanceReadiness'); handleURL('/'); - equal(Ember.controllerFor(container, 'home').get('selectedMenuItem'), 'home'); - equal(Ember.controllerFor(container, 'application').get('selectedMenuItem'), 'home'); + equal(Ember.controllerFor(appInstance, 'home').get('selectedMenuItem'), 'home'); + equal(Ember.controllerFor(appInstance, 'application').get('selectedMenuItem'), 'home'); App.reset(); - equal(Ember.controllerFor(container, 'home').get('selectedMenuItem'), null); - equal(Ember.controllerFor(container, 'application').get('selectedMenuItem'), null); + equal(Ember.controllerFor(appInstance, 'home').get('selectedMenuItem'), null); + equal(Ember.controllerFor(appInstance, 'application').get('selectedMenuItem'), null); }); -QUnit.test('Destroying the application resets the router before the container is destroyed', function() { +QUnit.test('Destroying the application resets the router before the appInstance is destroyed', function() { App.Router.map(function() { this.route('home', { path: '/' }); }); @@ -110,19 +109,19 @@ QUnit.test('Destroying the application resets the router before the container is } }); - container.lookup('router:main'); + appInstance.lookup('router:main'); run(App, 'advanceReadiness'); handleURL('/'); - equal(Ember.controllerFor(container, 'home').get('selectedMenuItem'), 'home'); - equal(Ember.controllerFor(container, 'application').get('selectedMenuItem'), 'home'); + equal(Ember.controllerFor(appInstance, 'home').get('selectedMenuItem'), 'home'); + equal(Ember.controllerFor(appInstance, 'application').get('selectedMenuItem'), 'home'); run(App, 'destroy'); - equal(Ember.controllerFor(container, 'home').get('selectedMenuItem'), null); - equal(Ember.controllerFor(container, 'application').get('selectedMenuItem'), null); + equal(Ember.controllerFor(appInstance, 'home').get('selectedMenuItem'), null); + equal(Ember.controllerFor(appInstance, 'application').get('selectedMenuItem'), null); }); QUnit.test('initializers can augment an applications customEvents hash', function(assert) { diff --git a/packages/ember/tests/component_registration_test.js b/packages/ember/tests/component_registration_test.js index 3e24dcf9893..5ffcf97c335 100644 --- a/packages/ember/tests/component_registration_test.js +++ b/packages/ember/tests/component_registration_test.js @@ -10,7 +10,7 @@ import Component from 'ember-views/components/component'; import jQuery from 'ember-views/system/jquery'; import { A as emberA } from 'ember-runtime/system/native_array'; -var App, registry, container; +var App, appInstance; var originalHelpers; const keys = Object.keys; @@ -27,7 +27,7 @@ function cleanup() { if (App) { App.destroy(); } - App = null; + App = appInstance = null; Ember.TEMPLATES = {}; cleanupHelpers(); @@ -62,13 +62,12 @@ function boot(callback, startURL='/') { location: 'none' }); - registry = App.__registry__; - container = App.__container__; + appInstance = App.__deprecatedInstance__; if (callback) { callback(); } }); - var router = container.lookup('router:main'); + var router = appInstance.lookup('router:main'); run(App, 'advanceReadiness'); run(function() { @@ -83,7 +82,7 @@ QUnit.test('The helper becomes the body of the component', function() { QUnit.test('If a component is registered, it is used', function() { boot(function() { - registry.register('component:expand-it', Component.extend({ + appInstance.register('component:expand-it', Component.extend({ classNames: 'testing123' })); }); @@ -96,7 +95,7 @@ QUnit.test('Late-registered components can be rendered with custom `layout` prop Ember.TEMPLATES.application = compile('
there goes {{my-hero}}
'); boot(function() { - registry.register('component:my-hero', Component.extend({ + appInstance.register('component:my-hero', Component.extend({ classNames: 'testing123', layout: compile('watch him as he GOES') })); @@ -110,8 +109,8 @@ QUnit.test('Late-registered components can be rendered with template registered Ember.TEMPLATES.application = compile('
hello world {{sally-rutherford}}-{{#sally-rutherford}}!!!{{/sally-rutherford}}
'); boot(function() { - registry.register('template:components/sally-rutherford', compile('funkytowny{{yield}}')); - registry.register('component:sally-rutherford', Component); + appInstance.register('template:components/sally-rutherford', compile('funkytowny{{yield}}')); + appInstance.register('component:sally-rutherford', Component); }); equal(jQuery('#wrapper').text(), 'hello world funkytowny-funkytowny!!!', 'The component is composed correctly'); @@ -122,7 +121,7 @@ QUnit.test('Late-registered components can be rendered with ONLY the template re Ember.TEMPLATES.application = compile('
hello world {{borf-snorlax}}-{{#borf-snorlax}}!!!{{/borf-snorlax}}
'); boot(function() { - registry.register('template:components/borf-snorlax', compile('goodfreakingTIMES{{yield}}')); + appInstance.register('template:components/borf-snorlax', compile('goodfreakingTIMES{{yield}}')); }); equal(jQuery('#wrapper').text(), 'hello world goodfreakingTIMES-goodfreakingTIMES!!!', 'The component is composed correctly'); @@ -133,7 +132,7 @@ QUnit.test('Component-like invocations are treated as bound paths if neither tem Ember.TEMPLATES.application = compile('
{{user-name}} hello {{api-key}} world
'); boot(function() { - registry.register('controller:application', Controller.extend({ + appInstance.register('controller:application', Controller.extend({ 'user-name': 'machty' })); }); @@ -148,11 +147,11 @@ QUnit.test('Assigning layoutName to a component should setup the template as a l Ember.TEMPLATES['foo-bar-baz'] = compile('{{text}}-{{yield}}'); boot(function() { - registry.register('controller:application', Controller.extend({ + appInstance.register('controller:application', Controller.extend({ 'text': 'outer' })); - registry.register('component:my-component', Component.extend({ + appInstance.register('component:my-component', Component.extend({ text: 'inner', layoutName: 'foo-bar-baz' })); @@ -168,11 +167,11 @@ QUnit.test('Assigning layoutName and layout to a component should use the `layou Ember.TEMPLATES['foo-bar-baz'] = compile('No way!'); boot(function() { - registry.register('controller:application', Controller.extend({ + appInstance.register('controller:application', Controller.extend({ 'text': 'outer' })); - registry.register('component:my-component', Component.extend({ + appInstance.register('component:my-component', Component.extend({ text: 'inner', layoutName: 'foo-bar-baz', layout: compile('{{text}}-{{yield}}') @@ -189,11 +188,11 @@ QUnit.test('Assigning defaultLayout to a component should set it up as a layout expectDeprecation(function() { boot(function() { - registry.register('controller:application', Controller.extend({ + appInstance.register('controller:application', Controller.extend({ 'text': 'outer' })); - registry.register('component:my-component', Component.extend({ + appInstance.register('component:my-component', Component.extend({ text: 'inner', defaultLayout: compile('{{text}}-{{yield}}') })); @@ -211,11 +210,11 @@ QUnit.test('Assigning defaultLayout to a component should set it up as a layout expectDeprecation(function() { boot(function() { - registry.register('controller:application', Controller.extend({ + appInstance.register('controller:application', Controller.extend({ 'text': 'outer' })); - registry.register('component:my-component', Component.extend({ + appInstance.register('component:my-component', Component.extend({ text: 'inner', defaultLayout: compile('should not see this!') })); @@ -243,11 +242,11 @@ QUnit.test('Components with a block should have the proper content when a templa Ember.TEMPLATES['components/my-component'] = compile('{{text}}-{{yield}}'); boot(function() { - registry.register('controller:application', Controller.extend({ + appInstance.register('controller:application', Controller.extend({ 'text': 'outer' })); - registry.register('component:my-component', Component.extend({ + appInstance.register('component:my-component', Component.extend({ text: 'inner' })); }); @@ -259,11 +258,11 @@ QUnit.test('Components with a block should yield the proper content without a te Ember.TEMPLATES.application = compile('
{{#my-component}}{{text}}{{/my-component}}
'); boot(function() { - registry.register('controller:application', Controller.extend({ + appInstance.register('controller:application', Controller.extend({ 'text': 'outer' })); - registry.register('component:my-component', Component.extend({ + appInstance.register('component:my-component', Component.extend({ text: 'inner' })); }); @@ -276,11 +275,11 @@ QUnit.test('Components without a block should have the proper content when a tem Ember.TEMPLATES['components/my-component'] = compile('{{text}}'); boot(function() { - registry.register('controller:application', Controller.extend({ + appInstance.register('controller:application', Controller.extend({ 'text': 'outer' })); - registry.register('component:my-component', Component.extend({ + appInstance.register('component:my-component', Component.extend({ text: 'inner' })); }); @@ -292,11 +291,11 @@ QUnit.test('Components without a block should have the proper content', function Ember.TEMPLATES.application = compile('
{{my-component}}
'); boot(function() { - registry.register('controller:application', Controller.extend({ + appInstance.register('controller:application', Controller.extend({ 'text': 'outer' })); - registry.register('component:my-component', Component.extend({ + appInstance.register('component:my-component', Component.extend({ didInsertElement() { this.$().html('Some text inserted by jQuery'); } @@ -311,12 +310,12 @@ QUnit.test('properties of a component without a template should not collide with Ember.TEMPLATES.application = compile('
{{my-component data=foo}}
'); boot(function() { - registry.register('controller:application', Controller.extend({ + appInstance.register('controller:application', Controller.extend({ 'text': 'outer', 'foo': 'Some text inserted by jQuery' })); - registry.register('component:my-component', Component.extend({ + appInstance.register('component:my-component', Component.extend({ didInsertElement() { this.$().html(this.get('data')); } @@ -330,12 +329,12 @@ QUnit.test('attrs property of a component without a template should not collide Ember.TEMPLATES.application = compile('
{{my-component attrs=foo}}
'); boot(function() { - registry.register('controller:application', Controller.extend({ + appInstance.register('controller:application', Controller.extend({ 'text': 'outer', 'foo': 'Some text inserted by jQuery' })); - registry.register('component:my-component', Component.extend({ + appInstance.register('component:my-component', Component.extend({ didInsertElement() { // FIXME: I'm unsure if this is even the right way to access attrs this.$().html(this.get('attrs.attrs.value')); @@ -350,7 +349,7 @@ QUnit.test('Components trigger actions in the parents context when called from w Ember.TEMPLATES.application = compile('
{{#my-component}}Fizzbuzz{{/my-component}}
'); boot(function() { - registry.register('controller:application', Controller.extend({ + appInstance.register('controller:application', Controller.extend({ actions: { fizzbuzz() { ok(true, 'action triggered on parent'); @@ -358,7 +357,7 @@ QUnit.test('Components trigger actions in the parents context when called from w } })); - registry.register('component:my-component', Component.extend()); + appInstance.register('component:my-component', Component.extend()); }); run(function() { @@ -371,7 +370,7 @@ QUnit.test('Components trigger actions in the components context when called fro Ember.TEMPLATES['components/my-component'] = compile('Fizzbuzz'); boot(function() { - registry.register('controller:application', Controller.extend({ + appInstance.register('controller:application', Controller.extend({ actions: { fizzbuzz() { ok(false, 'action triggered on the wrong context'); @@ -379,7 +378,7 @@ QUnit.test('Components trigger actions in the components context when called fro } })); - registry.register('component:my-component', Component.extend({ + appInstance.register('component:my-component', Component.extend({ actions: { fizzbuzz() { ok(true, 'action triggered on component'); @@ -399,7 +398,7 @@ QUnit.test('Components receive the top-level view as their ownerView', function( let component; boot(function() { - registry.register('component:my-component', Component.extend({ + appInstance.register('component:my-component', Component.extend({ init() { this._super(); component = this; diff --git a/packages/ember/tests/helpers/helper_registration_test.js b/packages/ember/tests/helpers/helper_registration_test.js index 6e6770a7397..9233c40fab0 100644 --- a/packages/ember/tests/helpers/helper_registration_test.js +++ b/packages/ember/tests/helpers/helper_registration_test.js @@ -11,7 +11,7 @@ import inject from 'ember-runtime/inject'; import { registerKeyword, resetKeyword } from 'ember-htmlbars/tests/utils'; import viewKeyword from 'ember-htmlbars/keywords/view'; -var App, registry, container, originalViewKeyword; +var App, appInstance, originalViewKeyword; QUnit.module('Application Lifecycle - Helper Registration', { setup() { @@ -23,7 +23,7 @@ QUnit.module('Application Lifecycle - Helper Registration', { App.destroy(); } - App = null; + App = appInstance = null; Ember.TEMPLATES = {}; }); delete helpers['foo-bar-baz-widget']; @@ -44,13 +44,12 @@ var boot = function(callback) { location: 'none' }); - registry = App.__registry__; - container = App.__container__; + appInstance = App.__deprecatedInstance__; if (callback) { callback(); } }); - var router = container.lookup('router:main'); + var router = appInstance.lookup('router:main'); run(App, 'advanceReadiness'); run(function() { @@ -65,7 +64,7 @@ QUnit.test('Unbound dashed helpers registered on the container can be late-invok }); boot(() => { - registry.register('helper:x-borf', myHelper); + App.register('helper:x-borf', myHelper); }); equal(jQuery('#wrapper').text(), 'BORF YES', 'The helper was invoked from the container'); @@ -76,11 +75,11 @@ QUnit.test('Bound helpers registered on the container can be late-invoked', func Ember.TEMPLATES.application = compile('
{{x-reverse}} {{x-reverse foo}}
'); boot(function() { - registry.register('controller:application', Controller.extend({ + appInstance.register('controller:application', Controller.extend({ foo: 'alex' })); - registry.register('helper:x-reverse', helper(function([ value ]) { + appInstance.register('helper:x-reverse', helper(function([ value ]) { return value ? value.split('').reverse().join('') : '--'; })); }); @@ -93,11 +92,11 @@ QUnit.test('Undashed helpers registered on the container can be invoked', functi Ember.TEMPLATES.application = compile('
{{omg}}|{{yorp \'boo\'}}|{{yorp \'ya\'}}
'); boot(function() { - registry.register('helper:omg', helper(function() { + appInstance.register('helper:omg', helper(function() { return 'OMG'; })); - registry.register('helper:yorp', helper(function([ value ]) { + appInstance.register('helper:yorp', helper(function([ value ]) { return value; })); }); @@ -110,12 +109,12 @@ QUnit.test('Helpers can receive injections', function() { var serviceCalled = false; boot(function() { - registry.register('service:name-builder', Ember.Service.extend({ + appInstance.register('service:name-builder', Ember.Service.extend({ build() { serviceCalled = true; } })); - registry.register('helper:full-name', Helper.extend({ + appInstance.register('helper:full-name', Helper.extend({ nameBuilder: inject.service('name-builder'), compute() { this.get('nameBuilder').build(); diff --git a/packages/ember/tests/helpers/link_to_test.js b/packages/ember/tests/helpers/link_to_test.js index 986c64bfeda..2ecd98a709e 100644 --- a/packages/ember/tests/helpers/link_to_test.js +++ b/packages/ember/tests/helpers/link_to_test.js @@ -14,14 +14,15 @@ import EmberObject from 'ember-runtime/system/object'; import inject from 'ember-runtime/inject'; import { A as emberA } from 'ember-runtime/system/native_array'; import NoneLocation from 'ember-routing/location/none_location'; +import { OWNER } from 'container/owner'; import { compile } from 'ember-template-compiler'; import EmberView from 'ember-views/views/view'; -var Router, App, AppView, router, registry, container; +var Router, App, AppView, router, appInstance; function bootApplication() { - router = container.lookup('router:main'); + router = appInstance.lookup('router:main'); run(App, 'advanceReadiness'); } @@ -69,8 +70,7 @@ function sharedSetup() { }); Router = App.Router; - registry = App.__registry__; - container = App.__container__; + appInstance = App.__deprecatedInstance__; } function sharedTeardown() { @@ -92,10 +92,10 @@ QUnit.module('The {{link-to}} helper', { templateName: 'app' }); - registry.register('view:app', AppView); + appInstance.register('view:app', AppView); - registry.unregister('router:main'); - registry.register('router:main', Router); + appInstance.unregister('router:main'); + appInstance.register('router:main', Router); }); }, @@ -109,14 +109,14 @@ QUnit.test('Using {{link-to}} does not cause an exception if it is rendered befo this.route('about'); }); - registry.register('component-lookup:main', ComponentLookup); + appInstance.register('component-lookup:main', ComponentLookup); let component = Component.extend({ - layout: compile('{{#link-to "about"}}Go to About{{/link-to}}'), - container: container + [OWNER]: appInstance, + layout: compile('{{#link-to "about"}}Go to About{{/link-to}}') }).create(); - let router = container.lookup('router:main'); + let router = appInstance.lookup('router:main'); router.setupRouter(); run(function() { @@ -127,11 +127,11 @@ QUnit.test('Using {{link-to}} does not cause an exception if it is rendered befo }); QUnit.test('Using {{link-to}} does not cause an exception if it is rendered without a router.js instance', function(assert) { - registry.register('component-lookup:main', ComponentLookup); + appInstance.register('component-lookup:main', ComponentLookup); let component = Component.extend({ - layout: compile('{{#link-to "nonexistent"}}Does not work.{{/link-to}}'), - container: container + [OWNER]: appInstance, + layout: compile('{{#link-to "nonexistent"}}Does not work.{{/link-to}}') }).create(); run(function() { @@ -442,7 +442,7 @@ QUnit.test('The {{link-to}} helper supports \'classNameBindings\' with custom va equal(jQuery('#about-link.foo-is-false', '#qunit-fixture').length, 1, 'The about-link was rendered with the falsy class'); - var controller = container.lookup('controller:index'); + var controller = appInstance.lookup('controller:index'); run(function() { controller.set('foo', true); }); @@ -849,7 +849,7 @@ QUnit.test('The {{link-to}} helper should not transition if target is not equal jQuery('#about-link', '#qunit-fixture').click(); }); - notEqual(container.lookup('controller:application').get('currentRouteName'), 'about', 'link-to should not transition if target is not equal to _self or empty'); + notEqual(appInstance.lookup('controller:application').get('currentRouteName'), 'about', 'link-to should not transition if target is not equal to _self or empty'); }); QUnit.test('The {{link-to}} helper accepts string/numeric arguments', function() { @@ -988,7 +988,7 @@ QUnit.test('Quoteless route param performs property lookup', function() { assertEquality('/'); - var controller = container.lookup('controller:index'); + var controller = appInstance.lookup('controller:index'); var view = EmberView.views['index-view']; run(function() { controller.set('foo', 'about'); @@ -1041,7 +1041,7 @@ QUnit.test('link-to with null/undefined dynamic parameters are put in a loading var $contextLink = jQuery('#context-link', '#qunit-fixture'); var $staticLink = jQuery('#static-link', '#qunit-fixture'); - var controller = container.lookup('controller:index'); + var controller = appInstance.lookup('controller:index'); assertLinkStatus($contextLink); assertLinkStatus($staticLink); @@ -1098,7 +1098,7 @@ QUnit.test('The {{link-to}} helper refreshes href element when one of params cha Ember.TEMPLATES.index = compile('{{#link-to "post" post id="post"}}post{{/link-to}}'); App.IndexController = Controller.extend(); - var indexController = container.lookup('controller:index'); + var indexController = appInstance.lookup('controller:index'); run(function() { indexController.set('post', post); }); @@ -1174,7 +1174,7 @@ QUnit.test('The {{link-to}} helper works in an #each\'d array of string route na linksEqual(jQuery('a', '#qunit-fixture'), ['/foo', '/bar', '/rar', '/foo', '/bar', '/rar', '/bar', '/foo']); - var indexController = container.lookup('controller:index'); + var indexController = appInstance.lookup('controller:index'); run(indexController, 'set', 'route1', 'rar'); linksEqual(jQuery('a', '#qunit-fixture'), ['/foo', '/bar', '/rar', '/foo', '/bar', '/rar', '/rar', '/foo']); @@ -1222,7 +1222,7 @@ QUnit.test('The non-block form {{link-to}} helper updates the link text when it run(function() { router.handleURL('/'); }); - var controller = container.lookup('controller:index'); + var controller = appInstance.lookup('controller:index'); equal(jQuery('#contact-link:contains(Jane)', '#qunit-fixture').length, 1, 'The link title is correctly resolved'); @@ -1321,7 +1321,7 @@ QUnit.test('The non-block form {{link-to}} performs property lookup', function() assertEquality('/'); - var controller = container.lookup('controller:index'); + var controller = appInstance.lookup('controller:index'); var view = EmberView.views['index-view']; run(function() { controller.set('foo', 'about'); @@ -1342,7 +1342,7 @@ QUnit.test('The non-block form {{link-to}} protects against XSS', function() { run(router, 'handleURL', '/'); - var controller = container.lookup('controller:application'); + var controller = appInstance.lookup('controller:application'); equal(jQuery('#link', '#qunit-fixture').text(), 'blahzorz'); run(function() { diff --git a/packages/ember/tests/routing/basic_test.js b/packages/ember/tests/routing/basic_test.js index a616517d4f5..e6ff7f90723 100644 --- a/packages/ember/tests/routing/basic_test.js +++ b/packages/ember/tests/routing/basic_test.js @@ -18,6 +18,7 @@ import Application from 'ember-application/system/application'; import { A as emberA } from 'ember-runtime/system/native_array'; import NoneLocation from 'ember-routing/location/none_location'; import HistoryLocation from 'ember-routing/location/history_location'; +import { getOwner } from 'container/owner'; var trim = jQuery.trim; @@ -1785,7 +1786,7 @@ QUnit.test('A redirection hook is provided', function() { equal(chooseFollowed, 0, 'The choose route wasn\'t entered since a transition occurred'); equal(jQuery('h3:contains(Hours)', '#qunit-fixture').length, 1, 'The home template was rendered'); - equal(router.container.lookup('controller:application').get('currentPath'), 'home'); + equal(getOwner(router).lookup('controller:application').get('currentPath'), 'home'); }); QUnit.test('Redirecting from the middle of a route aborts the remainder of the routes', function() { @@ -1819,7 +1820,7 @@ QUnit.test('Redirecting from the middle of a route aborts the remainder of the r handleURLAborts('/foo/bar/baz'); - equal(router.container.lookup('controller:application').get('currentPath'), 'home'); + equal(getOwner(router).lookup('controller:application').get('currentPath'), 'home'); equal(router.get('location').getURL(), '/home'); }); @@ -1858,7 +1859,7 @@ QUnit.test('Redirecting to the current target in the middle of a route does not handleURL('/foo/bar/baz'); - equal(router.container.lookup('controller:application').get('currentPath'), 'foo.bar.baz'); + equal(getOwner(router).lookup('controller:application').get('currentPath'), 'foo.bar.baz'); equal(successCount, 1, 'transitionTo success handler was called once'); }); @@ -1902,7 +1903,7 @@ QUnit.test('Redirecting to the current target with a different context aborts th handleURLAborts('/foo/bar/1/baz'); - equal(router.container.lookup('controller:application').get('currentPath'), 'foo.bar.baz'); + equal(getOwner(router).lookup('controller:application').get('currentPath'), 'foo.bar.baz'); equal(router.get('location').getURL(), '/foo/bar/2/baz'); }); @@ -1926,7 +1927,7 @@ QUnit.test('Transitioning from a parent event does not prevent currentPath from bootApplication(); - var applicationController = router.container.lookup('controller:application'); + var applicationController = getOwner(router).lookup('controller:application'); handleURL('/foo/bar/baz'); @@ -3034,7 +3035,7 @@ QUnit.test('currentRouteName is a property installed on ApplicationController th bootApplication(); - var appController = router.container.lookup('controller:application'); + var appController = getOwner(router).lookup('controller:application'); function transitionAndCheck(path, expectedPath, expectedRouteName) { if (path) { run(router, 'transitionTo', path); }