diff --git a/__tests__/html2/customElement/shadowRoot.interact.renderIntoNestedShadowRoot.html b/__tests__/html2/customElement/shadowRoot.interact.renderIntoNestedShadowRoot.html new file mode 100644 index 0000000000..560e32604e --- /dev/null +++ b/__tests__/html2/customElement/shadowRoot.interact.renderIntoNestedShadowRoot.html @@ -0,0 +1,111 @@ + + +
+ + + + + + + + + + + + + + + + + + + + diff --git a/__tests__/html2/customElement/shadowRoot.interact.renderIntoNestedShadowRoot.html.snap-1.png b/__tests__/html2/customElement/shadowRoot.interact.renderIntoNestedShadowRoot.html.snap-1.png new file mode 100644 index 0000000000..cc78eb605b Binary files /dev/null and b/__tests__/html2/customElement/shadowRoot.interact.renderIntoNestedShadowRoot.html.snap-1.png differ diff --git a/__tests__/html2/customElement/shadowRoot.interact.renderIntoNestedShadowRoot.html.snap-2.png b/__tests__/html2/customElement/shadowRoot.interact.renderIntoNestedShadowRoot.html.snap-2.png new file mode 100644 index 0000000000..fc74059d73 Binary files /dev/null and b/__tests__/html2/customElement/shadowRoot.interact.renderIntoNestedShadowRoot.html.snap-2.png differ diff --git a/packages/bundle/src/renderWebChat.spec.tsx b/packages/bundle/src/renderWebChat.spec.tsx index cac3e5975b..4177cbdc7d 100644 --- a/packages/bundle/src/renderWebChat.spec.tsx +++ b/packages/bundle/src/renderWebChat.spec.tsx @@ -114,6 +114,41 @@ describe('Element in a shadow root', () => { }); }); +describe('Shadow root nested in another shadow root', () => { + let innerShadowRoot: ShadowRoot; + + beforeEach(() => { + const innerHost = document.createElement('div'); + const outerHost = document.createElement('div'); + + outerHost.attachShadow({ mode: 'open' }).append(innerHost); + document.body.append(outerHost); + + innerShadowRoot = innerHost.attachShadow({ mode: 'open' }); + }); + + afterEach(() => document.body.replaceChildren()); + + test('passed as the inner shadow root itself on React 16 should be rendered by ReactDOM.render()', () => { + // `ShadowRoot.getRootNode()` returns the shadow root itself, however deep its host is nested. + expect(innerShadowRoot.getRootNode()).toBe(innerShadowRoot); + + renderWebChat(ReactWebChat, {}, innerShadowRoot); + + expect(render).toHaveBeenCalledTimes(1); + expect(render.mock.calls[0][1]).toBe(innerShadowRoot); + }); + + test('with an element inside the inner shadow root on React 16 should throw', () => { + const element = document.createElement('div'); + + innerShadowRoot.append(element); + + expect(() => renderWebChat(ReactWebChat, {}, element)).toThrow('on React 16 does not support'); + expect(render).not.toHaveBeenCalled(); + }); +}); + test('Element outside of a shadow root on React 16 should be rendered by ReactDOM.render()', () => { const element = document.createElement('div');