diff --git a/package.json b/package.json index d166b52da72..f41e06be8fd 100644 --- a/package.json +++ b/package.json @@ -74,19 +74,19 @@ }, "devDependencies": { "@babel/preset-env": "^7.9.5", - "@glimmer/compiler": "0.69.3", + "@glimmer/compiler": "0.70.0", "@glimmer/env": "^0.1.7", - "@glimmer/global-context": "0.69.3", - "@glimmer/interfaces": "0.69.3", - "@glimmer/manager": "0.69.3", - "@glimmer/destroyable": "0.69.3", - "@glimmer/owner": "0.69.3", - "@glimmer/node": "0.69.3", - "@glimmer/opcode-compiler": "0.69.3", - "@glimmer/program": "0.69.3", - "@glimmer/reference": "0.69.3", - "@glimmer/runtime": "0.69.3", - "@glimmer/validator": "0.69.3", + "@glimmer/global-context": "0.70.0", + "@glimmer/interfaces": "0.70.0", + "@glimmer/manager": "0.70.0", + "@glimmer/destroyable": "0.70.0", + "@glimmer/owner": "0.70.0", + "@glimmer/node": "0.70.0", + "@glimmer/opcode-compiler": "0.70.0", + "@glimmer/program": "0.70.0", + "@glimmer/reference": "0.70.0", + "@glimmer/runtime": "0.70.0", + "@glimmer/validator": "0.70.0", "@simple-dom/document": "^1.4.0", "@types/qunit": "^2.9.1", "@types/rsvp": "^4.0.3", diff --git a/packages/@ember/-internals/glimmer/index.ts b/packages/@ember/-internals/glimmer/index.ts index 72e3fc4362d..e0dc4e836ae 100644 --- a/packages/@ember/-internals/glimmer/index.ts +++ b/packages/@ember/-internals/glimmer/index.ts @@ -371,13 +371,7 @@ export { InputComponent as Input } from './lib/components/input'; export { default as Component } from './lib/component'; export { default as Helper, helper } from './lib/helper'; export { SafeString, escapeExpression, htmlSafe, isHTMLSafe } from './lib/utils/string'; -export { - Renderer, - InertRenderer, - InteractiveRenderer, - _resetRenderers, - renderSettled, -} from './lib/renderer'; +export { Renderer, _resetRenderers, renderSettled } from './lib/renderer'; export { getTemplate, setTemplate, diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts b/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts index a78ed8c84c1..88ec920ca62 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/curly.ts @@ -1,4 +1,4 @@ -import { Factory, getOwner } from '@ember/-internals/owner'; +import { Factory, getOwner, Owner, setOwner } from '@ember/-internals/owner'; import { enumerableSymbol, guidFor, symbol } from '@ember/-internals/utils'; import { addChildView, setElementView, setViewElement } from '@ember/-internals/views'; import { assert, debugFreeze } from '@ember/debug'; @@ -131,7 +131,7 @@ type ComponentFactory = Factory< export default class CurlyComponentManager implements - WithCreateInstance, + WithCreateInstance, WithDynamicLayout, WithDynamicTagName { protected templateFor(component: Component): CompilableProgram | null { @@ -250,9 +250,10 @@ export default class CurlyComponentManager * etc. */ create( - environment: Environment, + owner: Owner, ComponentClass: ComponentFactory, args: VMArguments, + { isInteractive }: Environment, dynamicScope: DynamicScope, callerSelfRef: Reference, hasBlock: boolean @@ -285,6 +286,8 @@ export default class CurlyComponentManager // `_target`, so bubbled actions are routed to the right place. props._target = valueForRef(callerSelfRef); + setOwner(props, owner); + // caller: // // @@ -314,13 +317,13 @@ export default class CurlyComponentManager // We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components if (!hasWrappedElement) { - if (environment.isInteractive) { + if (isInteractive) { component.trigger('willRender'); } component._transitionTo('hasElement'); - if (environment.isInteractive) { + if (isInteractive) { component.trigger('willInsertElement'); } } @@ -328,12 +331,12 @@ export default class CurlyComponentManager // Track additional lifecycle metadata about this component in a state bucket. // Essentially we're saving off all the state we'll need in the future. let bucket = new ComponentStateBucket( - environment, component, capturedArgs, argsTag, finalizer, - hasWrappedElement + hasWrappedElement, + isInteractive ); if (args.named.has('class')) { @@ -344,7 +347,7 @@ export default class CurlyComponentManager processComponentInitializationAssertions(component, props); } - if (environment.isInteractive && hasWrappedElement) { + if (isInteractive && hasWrappedElement) { component.trigger('willRender'); } @@ -368,7 +371,7 @@ export default class CurlyComponentManager } didCreateElement( - { component, classRef, environment, rootRef }: ComponentStateBucket, + { component, classRef, isInteractive, rootRef }: ComponentStateBucket, element: SimpleElement, operations: ElementOperations ): void { @@ -411,7 +414,7 @@ export default class CurlyComponentManager component._transitionTo('hasElement'); - if (environment.isInteractive) { + if (isInteractive) { beginUntrackFrame(); component.trigger('willInsertElement'); endUntrackFrame(); @@ -423,8 +426,8 @@ export default class CurlyComponentManager bucket.finalize(); } - didCreate({ component, environment }: ComponentStateBucket): void { - if (environment.isInteractive) { + didCreate({ component, isInteractive }: ComponentStateBucket): void { + if (isInteractive) { component._transitionTo('inDOM'); component.trigger('didInsertElement'); component.trigger('didRender'); @@ -432,7 +435,7 @@ export default class CurlyComponentManager } update(bucket: ComponentStateBucket): void { - let { component, args, argsTag, argsRevision, environment } = bucket; + let { component, args, argsTag, argsRevision, isInteractive } = bucket; bucket.finalizer = _instrumentStart('render.component', rerenderInstrumentDetails, component); @@ -453,7 +456,7 @@ export default class CurlyComponentManager component.trigger('didReceiveAttrs'); } - if (environment.isInteractive) { + if (isInteractive) { component.trigger('willUpdate'); component.trigger('willRender'); } @@ -468,8 +471,8 @@ export default class CurlyComponentManager bucket.finalize(); } - didUpdate({ component, environment }: ComponentStateBucket): void { - if (environment.isInteractive) { + didUpdate({ component, isInteractive }: ComponentStateBucket): void { + if (isInteractive) { component.trigger('didUpdate'); component.trigger('didRender'); } @@ -553,6 +556,7 @@ export const CURLY_CAPABILITIES: InternalComponentCapabilities = { createInstance: true, wrapped: true, willDestroy: true, + hasSubOwner: false, }; export const CURLY_COMPONENT_MANAGER = new CurlyComponentManager(); diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/internal.ts b/packages/@ember/-internals/glimmer/lib/component-managers/internal.ts index c29ea9f99ef..ac2e9ddcc02 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/internal.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/internal.ts @@ -25,6 +25,7 @@ const CAPABILITIES: InternalComponentCapabilities = { createInstance: true, wrapped: false, willDestroy: false, + hasSubOwner: false, }; export interface InternalComponentState { @@ -40,27 +41,21 @@ export default class InternalManager implements InternalComponentManager, WithCreateInstance { - static for( - definition: EmberInternalComponentConstructor, - name: string - ): (owner: Owner) => InternalManager { - return (owner: Owner) => new InternalManager(owner, definition, name); + static for(definition: EmberInternalComponentConstructor, name: string): () => InternalManager { + return () => new InternalManager(definition, name); } - constructor( - private owner: Owner, - private ComponentClass: EmberInternalComponentConstructor, - private name: string - ) {} + constructor(private ComponentClass: EmberInternalComponentConstructor, private name: string) {} getCapabilities(): InternalComponentCapabilities { return CAPABILITIES; } create( - env: Environment, + owner: Owner, _definition: unknown, args: VMArguments, + env: Environment, _dynamicScope: DynamicScope, caller: Reference ): InternalComponentState { @@ -71,7 +66,7 @@ export default class InternalManager args.positional.length === 0 ); - let { ComponentClass, owner } = this; + let { ComponentClass } = this; let instance = new ComponentClass(owner, args.named.capture(), valueForRef(caller)); let state = { env, instance }; diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/mount.ts b/packages/@ember/-internals/glimmer/lib/component-managers/mount.ts index cf526e4ccd9..d712c739327 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/mount.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/mount.ts @@ -15,6 +15,7 @@ import { WithCreateInstance, WithCustomDebugRenderTree, WithDynamicLayout, + WithSubOwner, } from '@glimmer/interfaces'; import { capabilityFlagsFrom } from '@glimmer/manager'; import { createConstRef, Reference, valueForRef } from '@glimmer/reference'; @@ -45,13 +46,15 @@ const CAPABILITIES = { createInstance: true, wrapped: false, willDestroy: false, + hasSubOwner: true, }; class MountManager implements - WithCreateInstance, + WithCreateInstance, WithDynamicLayout, - WithCustomDebugRenderTree { + WithCustomDebugRenderTree, + WithSubOwner { getDynamicLayout(state: EngineState) { let templateFactory = state.engine.lookup('template:application') as TemplateFactory; return unwrapTemplate(templateFactory(state.engine)).asLayout(); @@ -61,13 +64,17 @@ class MountManager return CAPABILITIES; } - create(env: Environment, { name }: EngineDefinitionState, args: VMArguments) { + getOwner(state: EngineState) { + return state.engine; + } + + create(owner: Owner, { name }: EngineDefinitionState, args: VMArguments, env: Environment) { // TODO // mount is a runtime helper, this shouldn't use dynamic layout // we should resolve the engine app template in the helper // it also should use the owner that looked up the mount helper. - let engine = env.owner.buildChildEngineInstance(name); + let engine = owner.buildChildEngineInstance(name); engine.boot(); diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/outlet.ts b/packages/@ember/-internals/glimmer/lib/component-managers/outlet.ts index abdee7e3517..65a8cf17d17 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/outlet.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/outlet.ts @@ -1,4 +1,5 @@ import { ENV } from '@ember/-internals/environment'; +import { Owner } from '@ember/-internals/owner'; import { guidFor } from '@ember/-internals/utils'; import { assert } from '@ember/debug'; import EngineInstance from '@ember/engine/instance'; @@ -64,16 +65,18 @@ const CAPABILITIES: InternalComponentCapabilities = { createInstance: true, wrapped: false, willDestroy: false, + hasSubOwner: false, }; class OutletComponentManager implements - WithCreateInstance, + WithCreateInstance, WithCustomDebugRenderTree { create( - env: Environment, + _owner: Owner, definition: OutletDefinitionState, _args: VMArguments, + env: Environment, dynamicScope: DynamicScope ): OutletInstanceState { let parentStateRef = dynamicScope.get('outletState'); diff --git a/packages/@ember/-internals/glimmer/lib/component-managers/root.ts b/packages/@ember/-internals/glimmer/lib/component-managers/root.ts index bf829e89786..afbfe4c0ca8 100644 --- a/packages/@ember/-internals/glimmer/lib/component-managers/root.ts +++ b/packages/@ember/-internals/glimmer/lib/component-managers/root.ts @@ -6,6 +6,7 @@ import { Environment, InternalComponentCapabilities, Option, + Owner, VMArguments, } from '@glimmer/interfaces'; import { capabilityFlagsFrom } from '@glimmer/manager'; @@ -27,9 +28,10 @@ class RootComponentManager extends CurlyComponentManager { } create( - environment: Environment, + _owner: Owner, _state: unknown, _args: Option, + { isInteractive }: Environment, dynamicScope: DynamicScope ) { let component = this.component; @@ -42,13 +44,13 @@ class RootComponentManager extends CurlyComponentManager { // We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components if (!hasWrappedElement) { - if (environment.isInteractive) { + if (isInteractive) { component.trigger('willRender'); } component._transitionTo('hasElement'); - if (environment.isInteractive) { + if (isInteractive) { component.trigger('willInsertElement'); } } @@ -58,12 +60,12 @@ class RootComponentManager extends CurlyComponentManager { } let bucket = new ComponentStateBucket( - environment, component, null, CONSTANT_TAG, finalizer, - hasWrappedElement + hasWrappedElement, + isInteractive ); consumeTag(component[DIRTY_TAG]); @@ -87,6 +89,7 @@ export const ROOT_CAPABILITIES: InternalComponentCapabilities = { createInstance: true, wrapped: true, willDestroy: false, + hasSubOwner: false, }; export class RootComponentDefinition implements ComponentDefinition { diff --git a/packages/@ember/-internals/glimmer/lib/component.ts b/packages/@ember/-internals/glimmer/lib/component.ts index 49e2b50189e..81f97092df5 100644 --- a/packages/@ember/-internals/glimmer/lib/component.ts +++ b/packages/@ember/-internals/glimmer/lib/component.ts @@ -724,7 +724,7 @@ const Component = CoreView.extend( this[DIRTY_TAG] = createTag(); this[BOUNDS] = null; - if (DEBUG && this.renderer._destinedForDOM && this.tagName === '') { + if (DEBUG && this.renderer._isInteractive && this.tagName === '') { let eventNames = []; let eventDispatcher = getOwner(this).lookup('event_dispatcher:main'); let events = (eventDispatcher && eventDispatcher._finalEvents) || {}; diff --git a/packages/@ember/-internals/glimmer/lib/renderer.ts b/packages/@ember/-internals/glimmer/lib/renderer.ts index 672876cae14..67b65d84db3 100644 --- a/packages/@ember/-internals/glimmer/lib/renderer.ts +++ b/packages/@ember/-internals/glimmer/lib/renderer.ts @@ -116,6 +116,7 @@ class RootState { public root: Component | OutletView, public runtime: RuntimeContext, context: CompileTimeCompilationContext, + owner: Owner, template: Template, self: Reference, parentElement: SimpleElement, @@ -137,6 +138,7 @@ class RootState { let iterator = renderMain( runtime, context, + owner, self, builder(runtime.env, { element: parentElement, nextSibling: null }), layout, @@ -269,38 +271,50 @@ interface ViewRegistry { [viewId: string]: unknown; } -export abstract class Renderer { +export class Renderer { private _rootTemplate: Template; private _viewRegistry: ViewRegistry; - private _destinedForDOM: boolean; private _roots: RootState[]; private _removedRoots: RootState[]; private _builder: IBuilder; private _inRenderTransaction = false; + private _owner: Owner; private _context: CompileTimeCompilationContext; private _runtime: RuntimeContext; private _lastRevision = -1; private _destroyed = false; + private _isInteractive: boolean; readonly _runtimeResolver: ResolverImpl; + static create(props: { + document: SimpleDocument; + env: { isInteractive: boolean; hasDOM: boolean }; + rootTemplate: TemplateFactory; + _viewRegistry: any; + builder: any; + }): Renderer { + let { document, env, rootTemplate, _viewRegistry, builder } = props; + return new this(getOwner(props), document, env, rootTemplate, _viewRegistry, builder); + } + constructor( owner: Owner, document: SimpleDocument, env: { isInteractive: boolean; hasDOM: boolean }, rootTemplate: TemplateFactory, viewRegistry: ViewRegistry, - destinedForDOM = false, builder = clientBuilder ) { + this._owner = owner; this._rootTemplate = rootTemplate(owner); this._viewRegistry = viewRegistry; - this._destinedForDOM = destinedForDOM; this._roots = []; this._removedRoots = []; this._builder = builder; + this._isInteractive = env.isInteractive; // resolver is exposed for tests let resolver = (this._runtimeResolver = new ResolverImpl()); @@ -338,25 +352,26 @@ export abstract class Renderer { appendOutletView(view: OutletView, target: SimpleElement): void { let definition = createRootOutlet(view); - this._appendDefinition(view, curry(definition, null), target); + this._appendDefinition(view, curry(definition, view.owner, null), target); } appendTo(view: Component, target: SimpleElement): void { let definition = new RootComponentDefinition(view); - this._appendDefinition(view, curry(definition, null), target); + this._appendDefinition(view, curry(definition, this._owner, null), target); } _appendDefinition( root: OutletView | Component, definition: CurriedComponentDefinition, target: SimpleElement - ) { + ): void { let self = createConstRef(definition, 'this'); let dynamicScope = new DynamicScope(null, UNDEFINED_REFERENCE); let rootState = new RootState( root, this._runtime, this._context, + this._owner, this._rootTemplate, self, target, @@ -366,11 +381,11 @@ export abstract class Renderer { this._renderRoot(rootState); } - rerender() { + rerender(): void { this._scheduleRevalidate(); } - register(view: any) { + register(view: any): void { let id = getViewId(view); assert( 'Attempted to register a view with an id already in use: ' + id, @@ -379,21 +394,21 @@ export abstract class Renderer { this._viewRegistry[id] = view; } - unregister(view: any) { + unregister(view: any): void { delete this._viewRegistry[getViewId(view)]; } - remove(view: Component) { + remove(view: Component): void { view._transitionTo('destroying'); this.cleanupRootFor(view); - if (this._destinedForDOM) { + if (this._isInteractive) { view.trigger('didDestroyElement'); } } - cleanupRootFor(view: unknown) { + cleanupRootFor(view: unknown): void { // no need to cleanup roots if we have already been destroyed if (this._destroyed) { return; @@ -421,7 +436,15 @@ export abstract class Renderer { this._clearAllRoots(); } - abstract getElement(view: unknown): Option; + getElement(view: unknown): Option { + if (this._isInteractive) { + return getViewElement(view); + } else { + throw new Error( + 'Accessing `this.element` is not allowed in non-interactive environments (such as FastBoot).' + ); + } + } getBounds( view: object @@ -441,7 +464,7 @@ export abstract class Renderer { return this._runtime.env.getAppendOperations().createElement(tagName); } - _renderRoot(root: RootState) { + _renderRoot(root: RootState): void { let { _roots: roots } = this; roots.push(root); @@ -453,7 +476,7 @@ export abstract class Renderer { this._renderRootsTransaction(); } - _renderRoots() { + _renderRoots(): void { let { _roots: roots, _runtime: runtime, _removedRoots: removedRoots } = this; let initialRootsLength: number; @@ -501,7 +524,7 @@ export abstract class Renderer { } } - _renderRootsTransaction() { + _renderRootsTransaction(): void { if (this._inRenderTransaction) { // currently rendering roots, a new root was added and will // be processed by the existing _renderRoots invocation @@ -524,7 +547,7 @@ export abstract class Renderer { } } - _clearAllRoots() { + _clearAllRoots(): void { let roots = this._roots; for (let i = 0; i < roots.length; i++) { let root = roots[i]; @@ -541,56 +564,20 @@ export abstract class Renderer { } } - _scheduleRevalidate() { + _scheduleRevalidate(): void { backburner.scheduleOnce('render', this, this._revalidate); } - _isValid() { + _isValid(): boolean { return ( this._destroyed || this._roots.length === 0 || validateTag(CURRENT_TAG, this._lastRevision) ); } - _revalidate() { + _revalidate(): void { if (this._isValid()) { return; } this._renderRootsTransaction(); } } - -export class InertRenderer extends Renderer { - static create(props: { - document: SimpleDocument; - env: { isInteractive: boolean; hasDOM: boolean }; - rootTemplate: TemplateFactory; - _viewRegistry: any; - builder: any; - }) { - let { document, env, rootTemplate, _viewRegistry, builder } = props; - return new this(getOwner(props), document, env, rootTemplate, _viewRegistry, false, builder); - } - - getElement(_view: unknown): Option { - throw new Error( - 'Accessing `this.element` is not allowed in non-interactive environments (such as FastBoot).' - ); - } -} - -export class InteractiveRenderer extends Renderer { - static create(props: { - document: SimpleDocument; - env: { isInteractive: boolean; hasDOM: boolean }; - rootTemplate: TemplateFactory; - _viewRegistry: any; - builder: any; - }) { - let { document, env, rootTemplate, _viewRegistry, builder } = props; - return new this(getOwner(props), document, env, rootTemplate, _viewRegistry, true, builder); - } - - getElement(view: unknown): Option { - return getViewElement(view); - } -} diff --git a/packages/@ember/-internals/glimmer/lib/setup-registry.ts b/packages/@ember/-internals/glimmer/lib/setup-registry.ts index 58bf4ae8f27..fc11783ffda 100644 --- a/packages/@ember/-internals/glimmer/lib/setup-registry.ts +++ b/packages/@ember/-internals/glimmer/lib/setup-registry.ts @@ -8,7 +8,7 @@ import TextField from './components/text-field'; import TextArea from './components/textarea'; import { clientBuilder, rehydrationBuilder, serializeBuilder } from './dom'; import loc from './helpers/loc'; -import { InertRenderer, InteractiveRenderer } from './renderer'; +import { Renderer } from './renderer'; import OutletTemplate from './templates/outlet'; import RootTemplate from './templates/root'; import OutletView from './views/outlet'; @@ -39,9 +39,7 @@ export function setupApplicationRegistry(registry: Registry): void { registry.register(P`template:-root`, RootTemplate as any); registry.injection('renderer', 'rootTemplate', P`template:-root`); - registry.register('renderer:-dom', InteractiveRenderer); - registry.register('renderer:-inert', InertRenderer); - + registry.register('renderer:-dom', Renderer); registry.injection('renderer', 'document', 'service:-document'); } diff --git a/packages/@ember/-internals/glimmer/lib/syntax/mount.ts b/packages/@ember/-internals/glimmer/lib/syntax/mount.ts index 67ce039f346..fbb761295ce 100644 --- a/packages/@ember/-internals/glimmer/lib/syntax/mount.ts +++ b/packages/@ember/-internals/glimmer/lib/syntax/mount.ts @@ -4,7 +4,7 @@ import { Owner } from '@ember/-internals/owner'; import { assert } from '@ember/debug'; import { DEBUG } from '@glimmer/env'; -import { CapturedArguments, Environment, Option, VM, VMArguments } from '@glimmer/interfaces'; +import { CapturedArguments, Option, VM, VMArguments } from '@glimmer/interfaces'; import { createComputeRef, Reference, valueForRef } from '@glimmer/reference'; import { createCapturedArgs, @@ -57,7 +57,7 @@ import { internalHelper } from '../helpers/internal-helper'; */ export const mountHelper = internalHelper( (args: VMArguments, vm: VM): Reference => { - let env = vm.env as Environment; + let owner = vm.getOwner() as Owner; let nameRef = args.positional.at(0) as Reference>; let captured: Option = null; @@ -104,15 +104,11 @@ export const mountHelper = internalHelper( assert( `You used \`{{mount '${name}'}}\`, but the engine '${name}' can not be found.`, - env.owner.hasRegistration(`engine:${name}`) + owner.hasRegistration(`engine:${name}`) ); - if (!env.owner.hasRegistration(`engine:${name}`)) { - return null; - } - lastName = name; - lastDef = curry(new MountDefinition(name), captured); + lastDef = curry(new MountDefinition(name), owner, captured); return lastDef; } else { diff --git a/packages/@ember/-internals/glimmer/lib/syntax/outlet.ts b/packages/@ember/-internals/glimmer/lib/syntax/outlet.ts index f7a5c131bc5..3cc8d2c443f 100644 --- a/packages/@ember/-internals/glimmer/lib/syntax/outlet.ts +++ b/packages/@ember/-internals/glimmer/lib/syntax/outlet.ts @@ -89,7 +89,8 @@ export const outletHelper = internalHelper((args: VMArguments, vm: VM) => { let definition: Option = null; return createComputeRef(() => { - let state = stateFor(outletRef); + let outletState = valueForRef(outletRef); + let state = stateFor(outletRef, outletState); if (!validate(state, lastState)) { lastState = state; @@ -102,8 +103,10 @@ export const outletHelper = internalHelper((args: VMArguments, vm: VM) => { named.model = createDebugAliasRef!('@model', named.model); } + let owner = outletState?.render?.owner ?? vm.getOwner(); + let args = createCapturedArgs(named, EMPTY_POSITIONAL); - definition = curry(new OutletComponentDefinition(state), args); + definition = curry(new OutletComponentDefinition(state), owner, args); } else { definition = null; } @@ -113,8 +116,7 @@ export const outletHelper = internalHelper((args: VMArguments, vm: VM) => { }); }); -function stateFor(ref: Reference): OutletDefinitionState | null { - let outlet = valueForRef(ref); +function stateFor(ref: Reference, outlet: OutletState | undefined): OutletDefinitionState | null { if (outlet === undefined) return null; let render = outlet.render; if (render === undefined) return null; diff --git a/packages/@ember/-internals/glimmer/lib/utils/curly-component-state-bucket.ts b/packages/@ember/-internals/glimmer/lib/utils/curly-component-state-bucket.ts index 3e1e1aebef0..0801e30d83c 100644 --- a/packages/@ember/-internals/glimmer/lib/utils/curly-component-state-bucket.ts +++ b/packages/@ember/-internals/glimmer/lib/utils/curly-component-state-bucket.ts @@ -1,11 +1,6 @@ import { clearElementView, clearViewElement, getViewElement } from '@ember/-internals/views'; import { registerDestructor } from '@glimmer/destroyable'; -import { - CapturedNamedArguments, - Environment, - Template, - TemplateFactory, -} from '@glimmer/interfaces'; +import { CapturedNamedArguments, Template, TemplateFactory } from '@glimmer/interfaces'; import { createConstRef, Reference } from '@glimmer/reference'; import { beginUntrackFrame, endUntrackFrame, Revision, Tag, valueForTag } from '@glimmer/validator'; import { Renderer } from '../renderer'; @@ -48,12 +43,12 @@ export default class ComponentStateBucket { public argsRevision: Revision; constructor( - public environment: Environment, public component: Component, public args: CapturedNamedArguments | null, public argsTag: Tag, public finalizer: Finalizer, - public hasWrappedElement: boolean + public hasWrappedElement: boolean, + public isInteractive: boolean ) { this.classRef = null; this.argsRevision = args === null ? 0 : valueForTag(argsTag); @@ -64,9 +59,9 @@ export default class ComponentStateBucket { } willDestroy(): void { - let { component, environment } = this; + let { component, isInteractive } = this; - if (environment.isInteractive) { + if (isInteractive) { beginUntrackFrame(); component.trigger('willDestroyElement'); component.trigger('willClearRender'); diff --git a/packages/@ember/-internals/glimmer/lib/views/outlet.ts b/packages/@ember/-internals/glimmer/lib/views/outlet.ts index 7f762113471..4feb93abe9c 100644 --- a/packages/@ember/-internals/glimmer/lib/views/outlet.ts +++ b/packages/@ember/-internals/glimmer/lib/views/outlet.ts @@ -6,7 +6,6 @@ import { createComputeRef, Reference, updateRef } from '@glimmer/reference'; import { consumeTag, createTag, dirtyTag } from '@glimmer/validator'; import { SimpleElement } from '@simple-dom/interface'; import { OutletDefinitionState } from '../component-managers/outlet'; -import { Renderer } from '../renderer'; import { OutletState } from '../utils/outlet'; export interface BootEnvironment { @@ -19,7 +18,7 @@ const TOP_LEVEL_NAME = '-top-level'; const TOP_LEVEL_OUTLET = 'main'; export default class OutletView { - static extend(injections: any) { + static extend(injections: any): typeof OutletView { return class extends OutletView { static create(options: any) { if (options) { @@ -31,15 +30,15 @@ export default class OutletView { }; } - static reopenClass(injections: any) { + static reopenClass(injections: any): void { assign(this, injections); } - static create(options: any) { - let { _environment, renderer, template: templateFactory } = options; + static create(options: any): OutletView { + let { _environment, template: templateFactory } = options; let owner = getOwner(options); let template = templateFactory(owner); - return new OutletView(_environment, renderer, owner, template); + return new OutletView(_environment, owner, template); } private ref: Reference; @@ -47,7 +46,6 @@ export default class OutletView { constructor( private _environment: BootEnvironment, - public renderer: Renderer, public owner: Owner, public template: Template ) { @@ -86,7 +84,7 @@ export default class OutletView { }; } - appendTo(selector: string | SimpleElement) { + appendTo(selector: string | SimpleElement): void { let target; if (this._environment.hasDOM) { @@ -95,18 +93,20 @@ export default class OutletView { target = selector; } - schedule('render', this.renderer, 'appendOutletView', this, target); + let renderer = this.owner.lookup('renderer:-dom'); + + schedule('render', renderer, 'appendOutletView', this, target); } - rerender() { + rerender(): void { /**/ } - setOutletState(state: OutletState) { + setOutletState(state: OutletState): void { updateRef(this.ref, state); } - destroy() { + destroy(): void { /**/ } } diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/strict-mode-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/strict-mode-test.js index d6587280288..934b4496453 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/components/strict-mode-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/components/strict-mode-test.js @@ -111,7 +111,7 @@ if (EMBER_STRICT_MODE) { this.assertStableRerender(); } - '@skip Can use TextArea'() { + '@test Can use TextArea'() { let Foo = defineComponent({ TextArea }, '