Skip to content

Commit 9588535

Browse files
author
Chris Garrett
authored
Merge pull request #19306 from emberjs/update/bump-vm-enable-strict-classic
[FEATURE strict-mode] Enable classic component usage in strict mode
2 parents 4dd8f0d + 8072096 commit 9588535

File tree

22 files changed

+281
-313
lines changed

22 files changed

+281
-313
lines changed

package.json

+12-12
Original file line numberDiff line numberDiff line change
@@ -74,19 +74,19 @@
7474
},
7575
"devDependencies": {
7676
"@babel/preset-env": "^7.9.5",
77-
"@glimmer/compiler": "0.69.3",
77+
"@glimmer/compiler": "0.70.0",
7878
"@glimmer/env": "^0.1.7",
79-
"@glimmer/global-context": "0.69.3",
80-
"@glimmer/interfaces": "0.69.3",
81-
"@glimmer/manager": "0.69.3",
82-
"@glimmer/destroyable": "0.69.3",
83-
"@glimmer/owner": "0.69.3",
84-
"@glimmer/node": "0.69.3",
85-
"@glimmer/opcode-compiler": "0.69.3",
86-
"@glimmer/program": "0.69.3",
87-
"@glimmer/reference": "0.69.3",
88-
"@glimmer/runtime": "0.69.3",
89-
"@glimmer/validator": "0.69.3",
79+
"@glimmer/global-context": "0.70.0",
80+
"@glimmer/interfaces": "0.70.0",
81+
"@glimmer/manager": "0.70.0",
82+
"@glimmer/destroyable": "0.70.0",
83+
"@glimmer/owner": "0.70.0",
84+
"@glimmer/node": "0.70.0",
85+
"@glimmer/opcode-compiler": "0.70.0",
86+
"@glimmer/program": "0.70.0",
87+
"@glimmer/reference": "0.70.0",
88+
"@glimmer/runtime": "0.70.0",
89+
"@glimmer/validator": "0.70.0",
9090
"@simple-dom/document": "^1.4.0",
9191
"@types/qunit": "^2.9.1",
9292
"@types/rsvp": "^4.0.3",

packages/@ember/-internals/glimmer/index.ts

+1-7
Original file line numberDiff line numberDiff line change
@@ -371,13 +371,7 @@ export { InputComponent as Input } from './lib/components/input';
371371
export { default as Component } from './lib/component';
372372
export { default as Helper, helper } from './lib/helper';
373373
export { SafeString, escapeExpression, htmlSafe, isHTMLSafe } from './lib/utils/string';
374-
export {
375-
Renderer,
376-
InertRenderer,
377-
InteractiveRenderer,
378-
_resetRenderers,
379-
renderSettled,
380-
} from './lib/renderer';
374+
export { Renderer, _resetRenderers, renderSettled } from './lib/renderer';
381375
export {
382376
getTemplate,
383377
setTemplate,

packages/@ember/-internals/glimmer/lib/component-managers/curly.ts

+20-16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Factory, getOwner } from '@ember/-internals/owner';
1+
import { Factory, getOwner, Owner, setOwner } from '@ember/-internals/owner';
22
import { enumerableSymbol, guidFor, symbol } from '@ember/-internals/utils';
33
import { addChildView, setElementView, setViewElement } from '@ember/-internals/views';
44
import { assert, debugFreeze } from '@ember/debug';
@@ -131,7 +131,7 @@ type ComponentFactory = Factory<
131131

132132
export default class CurlyComponentManager
133133
implements
134-
WithCreateInstance<ComponentStateBucket, Environment>,
134+
WithCreateInstance<ComponentStateBucket>,
135135
WithDynamicLayout<ComponentStateBucket, RuntimeResolver>,
136136
WithDynamicTagName<ComponentStateBucket> {
137137
protected templateFor(component: Component): CompilableProgram | null {
@@ -250,9 +250,10 @@ export default class CurlyComponentManager
250250
* etc.
251251
*/
252252
create(
253-
environment: Environment,
253+
owner: Owner,
254254
ComponentClass: ComponentFactory,
255255
args: VMArguments,
256+
{ isInteractive }: Environment,
256257
dynamicScope: DynamicScope,
257258
callerSelfRef: Reference,
258259
hasBlock: boolean
@@ -285,6 +286,8 @@ export default class CurlyComponentManager
285286
// `_target`, so bubbled actions are routed to the right place.
286287
props._target = valueForRef(callerSelfRef);
287288

289+
setOwner(props, owner);
290+
288291
// caller:
289292
// <FaIcon @name="bug" />
290293
//
@@ -314,26 +317,26 @@ export default class CurlyComponentManager
314317

315318
// We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components
316319
if (!hasWrappedElement) {
317-
if (environment.isInteractive) {
320+
if (isInteractive) {
318321
component.trigger('willRender');
319322
}
320323

321324
component._transitionTo('hasElement');
322325

323-
if (environment.isInteractive) {
326+
if (isInteractive) {
324327
component.trigger('willInsertElement');
325328
}
326329
}
327330

328331
// Track additional lifecycle metadata about this component in a state bucket.
329332
// Essentially we're saving off all the state we'll need in the future.
330333
let bucket = new ComponentStateBucket(
331-
environment,
332334
component,
333335
capturedArgs,
334336
argsTag,
335337
finalizer,
336-
hasWrappedElement
338+
hasWrappedElement,
339+
isInteractive
337340
);
338341

339342
if (args.named.has('class')) {
@@ -344,7 +347,7 @@ export default class CurlyComponentManager
344347
processComponentInitializationAssertions(component, props);
345348
}
346349

347-
if (environment.isInteractive && hasWrappedElement) {
350+
if (isInteractive && hasWrappedElement) {
348351
component.trigger('willRender');
349352
}
350353

@@ -368,7 +371,7 @@ export default class CurlyComponentManager
368371
}
369372

370373
didCreateElement(
371-
{ component, classRef, environment, rootRef }: ComponentStateBucket,
374+
{ component, classRef, isInteractive, rootRef }: ComponentStateBucket,
372375
element: SimpleElement,
373376
operations: ElementOperations
374377
): void {
@@ -411,7 +414,7 @@ export default class CurlyComponentManager
411414

412415
component._transitionTo('hasElement');
413416

414-
if (environment.isInteractive) {
417+
if (isInteractive) {
415418
beginUntrackFrame();
416419
component.trigger('willInsertElement');
417420
endUntrackFrame();
@@ -423,16 +426,16 @@ export default class CurlyComponentManager
423426
bucket.finalize();
424427
}
425428

426-
didCreate({ component, environment }: ComponentStateBucket): void {
427-
if (environment.isInteractive) {
429+
didCreate({ component, isInteractive }: ComponentStateBucket): void {
430+
if (isInteractive) {
428431
component._transitionTo('inDOM');
429432
component.trigger('didInsertElement');
430433
component.trigger('didRender');
431434
}
432435
}
433436

434437
update(bucket: ComponentStateBucket): void {
435-
let { component, args, argsTag, argsRevision, environment } = bucket;
438+
let { component, args, argsTag, argsRevision, isInteractive } = bucket;
436439

437440
bucket.finalizer = _instrumentStart('render.component', rerenderInstrumentDetails, component);
438441

@@ -453,7 +456,7 @@ export default class CurlyComponentManager
453456
component.trigger('didReceiveAttrs');
454457
}
455458

456-
if (environment.isInteractive) {
459+
if (isInteractive) {
457460
component.trigger('willUpdate');
458461
component.trigger('willRender');
459462
}
@@ -468,8 +471,8 @@ export default class CurlyComponentManager
468471
bucket.finalize();
469472
}
470473

471-
didUpdate({ component, environment }: ComponentStateBucket): void {
472-
if (environment.isInteractive) {
474+
didUpdate({ component, isInteractive }: ComponentStateBucket): void {
475+
if (isInteractive) {
473476
component.trigger('didUpdate');
474477
component.trigger('didRender');
475478
}
@@ -553,6 +556,7 @@ export const CURLY_CAPABILITIES: InternalComponentCapabilities = {
553556
createInstance: true,
554557
wrapped: true,
555558
willDestroy: true,
559+
hasSubOwner: false,
556560
};
557561

558562
export const CURLY_COMPONENT_MANAGER = new CurlyComponentManager();

packages/@ember/-internals/glimmer/lib/component-managers/internal.ts

+7-12
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const CAPABILITIES: InternalComponentCapabilities = {
2525
createInstance: true,
2626
wrapped: false,
2727
willDestroy: false,
28+
hasSubOwner: false,
2829
};
2930

3031
export interface InternalComponentState {
@@ -40,27 +41,21 @@ export default class InternalManager
4041
implements
4142
InternalComponentManager<InternalComponentState, EmberInternalComponentConstructor>,
4243
WithCreateInstance {
43-
static for(
44-
definition: EmberInternalComponentConstructor,
45-
name: string
46-
): (owner: Owner) => InternalManager {
47-
return (owner: Owner) => new InternalManager(owner, definition, name);
44+
static for(definition: EmberInternalComponentConstructor, name: string): () => InternalManager {
45+
return () => new InternalManager(definition, name);
4846
}
4947

50-
constructor(
51-
private owner: Owner,
52-
private ComponentClass: EmberInternalComponentConstructor,
53-
private name: string
54-
) {}
48+
constructor(private ComponentClass: EmberInternalComponentConstructor, private name: string) {}
5549

5650
getCapabilities(): InternalComponentCapabilities {
5751
return CAPABILITIES;
5852
}
5953

6054
create(
61-
env: Environment,
55+
owner: Owner,
6256
_definition: unknown,
6357
args: VMArguments,
58+
env: Environment,
6459
_dynamicScope: DynamicScope,
6560
caller: Reference
6661
): InternalComponentState {
@@ -71,7 +66,7 @@ export default class InternalManager
7166
args.positional.length === 0
7267
);
7368

74-
let { ComponentClass, owner } = this;
69+
let { ComponentClass } = this;
7570
let instance = new ComponentClass(owner, args.named.capture(), valueForRef(caller));
7671

7772
let state = { env, instance };

packages/@ember/-internals/glimmer/lib/component-managers/mount.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
WithCreateInstance,
1616
WithCustomDebugRenderTree,
1717
WithDynamicLayout,
18+
WithSubOwner,
1819
} from '@glimmer/interfaces';
1920
import { capabilityFlagsFrom } from '@glimmer/manager';
2021
import { createConstRef, Reference, valueForRef } from '@glimmer/reference';
@@ -45,13 +46,15 @@ const CAPABILITIES = {
4546
createInstance: true,
4647
wrapped: false,
4748
willDestroy: false,
49+
hasSubOwner: true,
4850
};
4951

5052
class MountManager
5153
implements
52-
WithCreateInstance<EngineState, Environment>,
54+
WithCreateInstance<EngineState>,
5355
WithDynamicLayout<EngineState, RuntimeResolver>,
54-
WithCustomDebugRenderTree<EngineState, EngineDefinitionState> {
56+
WithCustomDebugRenderTree<EngineState, EngineDefinitionState>,
57+
WithSubOwner<EngineState> {
5558
getDynamicLayout(state: EngineState) {
5659
let templateFactory = state.engine.lookup('template:application') as TemplateFactory;
5760
return unwrapTemplate(templateFactory(state.engine)).asLayout();
@@ -61,13 +64,17 @@ class MountManager
6164
return CAPABILITIES;
6265
}
6366

64-
create(env: Environment<Owner>, { name }: EngineDefinitionState, args: VMArguments) {
67+
getOwner(state: EngineState) {
68+
return state.engine;
69+
}
70+
71+
create(owner: Owner, { name }: EngineDefinitionState, args: VMArguments, env: Environment) {
6572
// TODO
6673
// mount is a runtime helper, this shouldn't use dynamic layout
6774
// we should resolve the engine app template in the helper
6875
// it also should use the owner that looked up the mount helper.
6976

70-
let engine = env.owner.buildChildEngineInstance(name);
77+
let engine = owner.buildChildEngineInstance(name);
7178

7279
engine.boot();
7380

packages/@ember/-internals/glimmer/lib/component-managers/outlet.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ENV } from '@ember/-internals/environment';
2+
import { Owner } from '@ember/-internals/owner';
23
import { guidFor } from '@ember/-internals/utils';
34
import { assert } from '@ember/debug';
45
import EngineInstance from '@ember/engine/instance';
@@ -64,16 +65,18 @@ const CAPABILITIES: InternalComponentCapabilities = {
6465
createInstance: true,
6566
wrapped: false,
6667
willDestroy: false,
68+
hasSubOwner: false,
6769
};
6870

6971
class OutletComponentManager
7072
implements
71-
WithCreateInstance<OutletInstanceState, Environment>,
73+
WithCreateInstance<OutletInstanceState>,
7274
WithCustomDebugRenderTree<OutletInstanceState, OutletDefinitionState> {
7375
create(
74-
env: Environment,
76+
_owner: Owner,
7577
definition: OutletDefinitionState,
7678
_args: VMArguments,
79+
env: Environment,
7780
dynamicScope: DynamicScope
7881
): OutletInstanceState {
7982
let parentStateRef = dynamicScope.get('outletState');

packages/@ember/-internals/glimmer/lib/component-managers/root.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
Environment,
77
InternalComponentCapabilities,
88
Option,
9+
Owner,
910
VMArguments,
1011
} from '@glimmer/interfaces';
1112
import { capabilityFlagsFrom } from '@glimmer/manager';
@@ -27,9 +28,10 @@ class RootComponentManager extends CurlyComponentManager {
2728
}
2829

2930
create(
30-
environment: Environment,
31+
_owner: Owner,
3132
_state: unknown,
3233
_args: Option<VMArguments>,
34+
{ isInteractive }: Environment,
3335
dynamicScope: DynamicScope
3436
) {
3537
let component = this.component;
@@ -42,13 +44,13 @@ class RootComponentManager extends CurlyComponentManager {
4244

4345
// We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components
4446
if (!hasWrappedElement) {
45-
if (environment.isInteractive) {
47+
if (isInteractive) {
4648
component.trigger('willRender');
4749
}
4850

4951
component._transitionTo('hasElement');
5052

51-
if (environment.isInteractive) {
53+
if (isInteractive) {
5254
component.trigger('willInsertElement');
5355
}
5456
}
@@ -58,12 +60,12 @@ class RootComponentManager extends CurlyComponentManager {
5860
}
5961

6062
let bucket = new ComponentStateBucket(
61-
environment,
6263
component,
6364
null,
6465
CONSTANT_TAG,
6566
finalizer,
66-
hasWrappedElement
67+
hasWrappedElement,
68+
isInteractive
6769
);
6870

6971
consumeTag(component[DIRTY_TAG]);
@@ -87,6 +89,7 @@ export const ROOT_CAPABILITIES: InternalComponentCapabilities = {
8789
createInstance: true,
8890
wrapped: true,
8991
willDestroy: false,
92+
hasSubOwner: false,
9093
};
9194

9295
export class RootComponentDefinition implements ComponentDefinition {

packages/@ember/-internals/glimmer/lib/component.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -724,7 +724,7 @@ const Component = CoreView.extend(
724724
this[DIRTY_TAG] = createTag();
725725
this[BOUNDS] = null;
726726

727-
if (DEBUG && this.renderer._destinedForDOM && this.tagName === '') {
727+
if (DEBUG && this.renderer._isInteractive && this.tagName === '') {
728728
let eventNames = [];
729729
let eventDispatcher = getOwner(this).lookup<any | undefined>('event_dispatcher:main');
730730
let events = (eventDispatcher && eventDispatcher._finalEvents) || {};

0 commit comments

Comments
 (0)