diff --git a/packages/@ember/-internals/glimmer/lib/modifiers/on.ts b/packages/@ember/-internals/glimmer/lib/modifiers/on.ts index 54cbc4f2f1e..d9cc810ba29 100644 --- a/packages/@ember/-internals/glimmer/lib/modifiers/on.ts +++ b/packages/@ember/-internals/glimmer/lib/modifiers/on.ts @@ -1,7 +1,7 @@ import { assert } from '@ember/debug'; import { DEBUG } from '@glimmer/env'; import { Opaque, Simple } from '@glimmer/interfaces'; -import { Tag } from '@glimmer/reference'; +import { Tag, CONSTANT_TAG } from '@glimmer/reference'; import { Arguments, CapturedArguments, ModifierManager } from '@glimmer/runtime'; import { Destroyable } from '@glimmer/util'; import buildUntouchableThis from '../utils/untouchable-this'; @@ -210,24 +210,37 @@ function addEventListener( } } -export default class OnModifierManager implements ModifierManager { +export default class OnModifierManager implements ModifierManager { public SUPPORTS_EVENT_OPTIONS: boolean = SUPPORTS_EVENT_OPTIONS; + public isInteractive: boolean; + + constructor(isInteractive: boolean) { + this.isInteractive = isInteractive; + } get counters() { return { adds, removes }; } create(element: Simple.Element | Element, _state: Opaque, args: Arguments) { + if (!this.isInteractive) { return null; } + const capturedArgs = args.capture(); return new OnModifierState(element, capturedArgs); } - getTag({ tag }: OnModifierState): Tag { - return tag; + getTag(state: OnModifierState | null): Tag { + if (state === null) { return CONSTANT_TAG; } + + return state.tag; } - install(state: OnModifierState) { + install(state: OnModifierState | null) { + if (state === null) { + return; + } + state.updateFromArgs(); let { element, eventName, callback, options } = state; @@ -237,7 +250,11 @@ export default class OnModifierManager implements ModifierManager { public isInteractive: boolean; public compiler: LazyCompiler; @@ -119,7 +112,7 @@ export default class RuntimeResolver implements IRuntimeResolver> = new Map(); @@ -136,6 +129,14 @@ export default class RuntimeResolver implements IRuntimeResolver(new CompileTimeLookup(this), this, macros); this.isInteractive = isInteractive; + + this.builtInModifiers = { + action: { manager: new ActionModifierManager(), state: null }, + }; + + if (EMBER_GLIMMER_ON_MODIFIER) { + this.builtInModifiers.on = { manager: new OnModifierManager(isInteractive), state: null }; + } } /*** IRuntimeResolver ***/