diff --git a/test/browser/index.test.jsx b/test/browser/index.test.jsx index 494900b..931c3c2 100644 --- a/test/browser/index.test.jsx +++ b/test/browser/index.test.jsx @@ -280,11 +280,40 @@ describe('web components', () => { ); }); + it('supports controlling light DOM with other custom elements', () => { + function Parent({ children }) { + return ( + +

Light DOM Children

+
{children}
+
+ ); + } + + function Child() { + return

Child

; + } + + registerElement(Parent, 'light-dom-children-parent', []); + registerElement(Child, 'light-dom-children-child', []); + + const parent = document.createElement('light-dom-children-parent'); + const child = document.createElement('light-dom-children-child'); + + parent.appendChild(child); + root.appendChild(parent); + + assert.equal( + document.querySelector('light-dom-children-parent').innerHTML, + '

Light DOM Children

Child

' + ); + }); + it('supports controlling shadow DOM children', () => { function ShadowDomChildren({ children }) { return ( -

Light DOM Children

+

Shadow DOM Children

{children}
); @@ -298,8 +327,45 @@ describe('web components', () => { assert.equal( document.querySelector('shadow-dom-children').shadowRoot.innerHTML, - '

Light DOM Children

Child 1

Child 2

' + '

Shadow DOM Children

Child 1

Child 2

' + ); + }); + + it('supports controlling shadow DOM with other custom elements', () => { + function Parent({ children }) { + return ( + +

Shadow DOM Children

+
{children}
+
+ ); + } + + function Child() { + return

Child

; + } + + registerElement(Parent, 'shadow-dom-children-parent', [], { + shadow: true, + }); + registerElement(Child, 'shadow-dom-children-child', [], { + shadow: true, + }); + + const parent = document.createElement('shadow-dom-children-parent'); + const child = document.createElement('shadow-dom-children-child'); + + parent.appendChild(child); + root.appendChild(parent); + + const getShadowHTML = (selector) => + document.querySelector(selector).shadowRoot.innerHTML; + + assert.equal( + getShadowHTML('shadow-dom-children-parent'), + '

Shadow DOM Children

' ); + assert.equal(getShadowHTML('shadow-dom-children-child'), '

Child

'); }); }); @@ -344,5 +410,45 @@ describe('web components', () => { }); assert.equal(getShadowHTML(), '

Active theme: sunny

'); }); + + it.only('passes context over light DOM custom element boundaries', async () => { + const Theme = createContext('light'); + + function DisplayTheme() { + const theme = useContext(Theme); + return

Active theme: {theme}

; + } + + function Parent({ children, theme = 'dark' }) { + return ( + +
{children}
+
+ ); + } + + registerElement(Parent, 'x-light-dom-parent', ['theme']); + registerElement(DisplayTheme, 'x-light-dom-child', []); + + const el = document.createElement('x-light-dom-parent'); + + const noSlot = document.createElement('x-light-dom-child'); + el.appendChild(noSlot); + + root.appendChild(el); + assert.equal( + root.innerHTML, + '

Active theme: dark

' + ); + + // Trigger context update + act(() => { + el.setAttribute('theme', 'sunny'); + }); + assert.equal( + root.innerHTML, + '

Active theme: sunny

' + ); + }); }); });