From 3a537625ce5de0abaec63a06ef026241bededd1e Mon Sep 17 00:00:00 2001
From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com>
Date: Thu, 30 Oct 2025 10:37:20 -0400
Subject: [PATCH 1/3] Reproduce renderComponent error: 'attempted to close a
tracking frame, but one was not open'
---
.../components/render-component-test.ts | 31 +++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/render-component-test.ts b/packages/@ember/-internals/glimmer/tests/integration/components/render-component-test.ts
index 14649f1914d..510a97df403 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/components/render-component-test.ts
+++ b/packages/@ember/-internals/glimmer/tests/integration/components/render-component-test.ts
@@ -622,6 +622,37 @@ moduleFor(
this.renderComponent(Root, { expect: '' });
}, /but that value was not in scope: a-helper/);
}
+
+ '@test rendering multiple times to adjacent elements'(assert: Assert) {
+ this.owner.register('helper:a-helper', (str: string) => str.toUpperCase());
+ let Loose = defineComponent(null, `Hi: {{a-helper "there"}}`);
+ let get = (id) => this.element.querySelector(id);
+ function render(Comp: GlimmerishComponent, id: string, owner: Owner) {
+ renderComponent(Comp, {
+ into: get(`#${id}`),
+ owner,
+ });
+ }
+ let A = defComponent('a:', { scope: { Loose } });
+ let B = defComponent('b:', { scope: { Loose } });
+ let Root = defComponent(
+ [
+ `
`,
+ ``,
+ `{{render A 'a' owner}}`,
+ `{{render B 'b' owner}}`,
+ ].join('\n'),
+ { scope: { render, A, B, owner: this.owner } }
+ );
+
+ this.renderComponent(Root, {
+ expect: [`hi:a
`, `hi:b
`, ``, ``].join('\n'),
+ });
+
+ run(() => destroy(this));
+
+ assertHTML('');
+ }
}
);
From e676fff68d754f4937ddaed13ffd65c3436daed0 Mon Sep 17 00:00:00 2001
From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com>
Date: Thu, 30 Oct 2025 17:00:38 -0400
Subject: [PATCH 2/3] Update assertion
---
.../tests/integration/components/render-component-test.ts | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/render-component-test.ts b/packages/@ember/-internals/glimmer/tests/integration/components/render-component-test.ts
index 510a97df403..0d42dd9eed1 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/components/render-component-test.ts
+++ b/packages/@ember/-internals/glimmer/tests/integration/components/render-component-test.ts
@@ -646,7 +646,9 @@ moduleFor(
);
this.renderComponent(Root, {
- expect: [`hi:a
`, `hi:b
`, ``, ``].join('\n'),
+ expect: [`a:Hi: THERE
`, `b:Hi: THERE
`, ``, ``].join(
+ '\n'
+ ),
});
run(() => destroy(this));
From 06aba0fbb6b76c5df2fd2bdbae71d160b6406598 Mon Sep 17 00:00:00 2001
From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com>
Date: Thu, 30 Oct 2025 17:22:15 -0400
Subject: [PATCH 3/3] Error happens in a strict-only environment as well
---
.../components/render-component-test.ts | 33 +++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/render-component-test.ts b/packages/@ember/-internals/glimmer/tests/integration/components/render-component-test.ts
index 0d42dd9eed1..db699027dd6 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/components/render-component-test.ts
+++ b/packages/@ember/-internals/glimmer/tests/integration/components/render-component-test.ts
@@ -594,6 +594,39 @@ moduleFor(
expect: '3
3
',
});
}
+
+ '@test rendering multiple times to adjacent elements'() {
+ let aHelper = (str: string) => str.toUpperCase();
+ let Child = defComponent(`Hi: {{aHelper "there"}}`, { scope: { aHelper } });
+ let get = (id: string) => this.element.querySelector(id);
+ function render(Comp: GlimmerishComponent, id: string, owner: Owner) {
+ renderComponent(Comp, {
+ into: get(`#${id}`)!,
+ owner,
+ });
+ }
+ let A = defComponent('a:', { scope: { Child } });
+ let B = defComponent('b:', { scope: { Child } });
+ let Root = defComponent(
+ [
+ `
`,
+ ``,
+ `{{render A 'a' owner}}`,
+ `{{render B 'b' owner}}`,
+ ].join('\n'),
+ { scope: { render, A, B, owner: this.owner } }
+ );
+
+ this.renderComponent(Root, {
+ expect: [`a:Hi: THERE
`, `b:Hi: THERE
`, ``, ``].join(
+ '\n'
+ ),
+ });
+
+ run(() => destroy(this));
+
+ assertHTML('');
+ }
}
);