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(''); + } } );