Skip to content

Commit 5e83712

Browse files
committed
ShadowDOM support needs to be fixed.
- emberjs/ember.js#20641 - embroider-build/content-tag#66
1 parent 5f6f2a8 commit 5e83712

File tree

3 files changed

+55
-22
lines changed

3 files changed

+55
-22
lines changed

apps/repl/app/components/shadowed.gts

+27-21
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,52 @@
1+
import Component from '@glimmer/component';
2+
import { tracked } from '@glimmer/tracking';
3+
14
import { modifier } from 'ember-modifier';
2-
import { cell } from 'ember-resources';
35

4-
import type { TOC } from '@ember/component/template-only';
6+
const attachShadow = modifier((element: Element, [set]: [(shadowRoot: HTMLDivElement) => void]) => {
7+
let shadow = element.attachShadow({ mode: 'open' });
8+
let div = document.createElement('div');
59

6-
type SetShadow = ReturnType<typeof cell<ShadowRoot>>['set'];
10+
shadow.appendChild(div);
711

8-
const attachShadow = modifier((element: Element, [setShadow]: [SetShadow]) => {
9-
setShadow(element.attachShadow({ mode: 'open' }));
12+
set(div);
1013
});
1114

1215
// index.html has the production-fingerprinted references to these links
1316
// Ideally, we'd have some pre-processor scan everything for references to
1417
// assets in public, but idk how to set that up
1518
const getStyles = () => [...document.head.querySelectorAll('link')].map((link) => link.href);
1619

17-
const shadowRoot = () => cell<ShadowRoot>();
18-
19-
export const Shadowed: TOC<{
20+
export class Shadowed extends Component<{
2021
Element: HTMLDivElement;
2122
Args: {
2223
omitStyles?: boolean;
2324
};
2425
Blocks: { default: [] };
25-
}> = <template>
26-
{{#let (shadowRoot) as |shadow|}}
27-
{{! @glint-ignore }}
28-
<div data-shadow {{attachShadow shadow.set}} ...attributes></div>
26+
}> {
27+
@tracked shadow: HTMLDivElement | undefined;
28+
29+
setShadow = async (shadowRoot: HTMLDivElement) => {
30+
await Promise.resolve();
31+
32+
this.shadow = shadowRoot;
33+
}
34+
35+
<template>
36+
<div data-shadow {{attachShadow this.setShadow}} ...attributes></div>
2937

30-
{{#if shadow.current}}
31-
{{#in-element shadow.current}}
38+
{{#if this.shadow}}
39+
{{#in-element this.shadow}}
3240
{{#unless @omitStyles}}
33-
{{#let (getStyles) as |styles|}}
34-
{{#each styles as |styleHref|}}
35-
<link rel="stylesheet" href={{styleHref}} />
36-
{{/each}}
37-
{{/let}}
41+
{{#each (getStyles) as |styleHref|}}
42+
<link rel="stylesheet" href={{styleHref}} />
43+
{{/each}}
3844
{{/unless}}
3945

4046
{{yield}}
4147
{{/in-element}}
4248
{{/if}}
43-
{{/let}}
44-
</template>;
49+
</template>
50+
}
4551

4652
export default Shadowed;

apps/repl/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@
102102
"ember-qunit": "^8.0.2",
103103
"ember-resolver": "^11.0.1",
104104
"ember-route-template": "^1.0.3",
105-
"ember-source": "^5.6.0",
105+
"ember-source": "~5.5.0",
106106
"ember-template-imports": "^3.4.2",
107107
"ember-template-lint": "^5.13.0",
108108
"ember-template-lint-plugin-prettier": "^5.0.0",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { find, render } from '@ember/test-helpers';
2+
import { module, test } from 'qunit';
3+
import { setupRenderingTest } from 'ember-qunit';
4+
5+
import { Shadowed } from 'limber/components/shadowed';
6+
7+
module('Rendering | <Shadowed>', function (hooks) {
8+
setupRenderingTest(hooks);
9+
10+
test('it works', async function (assert) {
11+
await render(
12+
<template>
13+
out of shadow
14+
15+
<Shadowed>
16+
in shadow
17+
</Shadowed>
18+
</template>
19+
);
20+
21+
assert.dom().hasText('out of shadow');
22+
assert.dom().doesNotContainText('in shadow');
23+
// assort.dom forgot that ShadowDom is a thing
24+
// assert.dom(find('[data-shadow]')?.shadowRoot).hasText('in shadow');
25+
assert.ok(find('[data-shadow]')?.shadowRoot?.textContent?.includes('in shadow'));
26+
});
27+
});

0 commit comments

Comments
 (0)