From 98cc45b95e99a53e39576ecc43365f9c020d3409 Mon Sep 17 00:00:00 2001 From: Westbrook Johnson Date: Sun, 22 Nov 2020 12:52:25 -0500 Subject: [PATCH] fix(menu): prevent infinite loop when focus() --- packages/menu/src/Menu.ts | 5 ++++- packages/menu/test/menu.test.ts | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/menu/src/Menu.ts b/packages/menu/src/Menu.ts index 4e67c855db..193050553e 100644 --- a/packages/menu/src/Menu.ts +++ b/packages/menu/src/Menu.ts @@ -63,7 +63,10 @@ export class Menu extends SpectrumElement { } public focus(): void { - if (!this.menuItems.length) { + if ( + !this.menuItems.length || + this.menuItems.every((item) => item.disabled) + ) { return; } this.focusMenuItemByOffset(0); diff --git a/packages/menu/test/menu.test.ts b/packages/menu/test/menu.test.ts index 0aac6af78e..a9747a6d0b 100644 --- a/packages/menu/test/menu.test.ts +++ b/packages/menu/test/menu.test.ts @@ -59,6 +59,24 @@ describe('Menu', () => { .false; expect(document.activeElement === anchor, 'anchor').to.be.true; }); + it('renders w/ [disabled] menu items', async () => { + const el = await fixture( + html` + + Disabled item + + ` + ); + + await elementUpdated(el); + expect(document.activeElement === el, 'self not focused, 1').to.be + .false; + + el.focus(); + await elementUpdated(el); + expect(document.activeElement === el, 'self not focused, 2').to.be + .false; + }); it('renders w/ menu items', async () => { const el = await fixture( html`