diff --git a/components/dropdown/dropdown-popover-mixin.js b/components/dropdown/dropdown-popover-mixin.js index ca71b6174fb..1fe3b68b524 100644 --- a/components/dropdown/dropdown-popover-mixin.js +++ b/components/dropdown/dropdown-popover-mixin.js @@ -186,9 +186,17 @@ export const DropdownPopoverMixin = superclass => class extends LocalizeCoreElem this._hasHeaderSlotContent = false; } + disconnectedCallback() { + super.disconnectedCallback(); + this.#resizeObserver.disconnect(); + } + firstUpdated(changedProperties) { super.firstUpdated(changedProperties); this.#contentElement = this.shadowRoot?.querySelector('.dropdown-content'); + if (this.#contentElement) { + this.#resizeObserver.observe(this.#contentElement); + } this.addEventListener('d2l-popover-open', this.#handlePopoverOpen); this.addEventListener('d2l-popover-close', this.#handlePopoverClose); this.addEventListener('d2l-popover-position', this.#handlePopoverPosition); @@ -291,6 +299,9 @@ export const DropdownPopoverMixin = superclass => class extends LocalizeCoreElem } #contentElement; + #resizeObserver = new ResizeObserver(() => { + this.#toggleScrollStyles(); + }); #adaptMobileTrayLocation(val) { switch (val) { diff --git a/components/dropdown/test/dropdown-content.vdiff.js b/components/dropdown/test/dropdown-content.vdiff.js index 05621c143ba..c0c74197188 100644 --- a/components/dropdown/test/dropdown-content.vdiff.js +++ b/components/dropdown/test/dropdown-content.vdiff.js @@ -54,6 +54,11 @@ const scrollContent = ` ${Array.from(Array(12).keys()).map((key) => `
Line ${key + 1}
`).join('')}
Bottom
`; +const noScrollContent = ` +
Top
+
Line 1
+
Bottom
+`; const scroll = html`${unsafeHTML(scrollContent)}`; describe('dropdown-content', () => { @@ -133,8 +138,8 @@ describe('dropdown-content', () => { { name: 'both', allColorModes: true, initialContent: scroll, scrollTo: 75 }, { name: 'bottom', allColorModes: true, initialContent: scroll }, { name: 'top', allColorModes: true, initialContent: scroll, scrollTo: 1000 }, - { name: 'async-content-added', initialContent: 'Initial Content', asyncContent: scrollContent }, - { name: 'async-content-removed', initialContent: scroll, asyncContent: 'Updated' } + { name: 'async-content-added', initialContent: unsafeHTML(noScrollContent), asyncContent: scrollContent }, + { name: 'async-content-removed', initialContent: scroll, asyncContent: noScrollContent } ].forEach(({ name, allColorModes, initialContent, scrollTo, asyncContent }) => { it(name, async() => { const elem = await fixture( diff --git a/components/dropdown/test/golden/dropdown-content/chromium/shadows-async-content-added.png b/components/dropdown/test/golden/dropdown-content/chromium/shadows-async-content-added.png index 8079785f6d8..e530b54056e 100644 Binary files a/components/dropdown/test/golden/dropdown-content/chromium/shadows-async-content-added.png and b/components/dropdown/test/golden/dropdown-content/chromium/shadows-async-content-added.png differ diff --git a/components/dropdown/test/golden/dropdown-content/chromium/shadows-async-content-removed.png b/components/dropdown/test/golden/dropdown-content/chromium/shadows-async-content-removed.png index 75e29289c76..f0eedb5e00d 100644 Binary files a/components/dropdown/test/golden/dropdown-content/chromium/shadows-async-content-removed.png and b/components/dropdown/test/golden/dropdown-content/chromium/shadows-async-content-removed.png differ