diff --git a/src/material-experimental/mdc-menu/menu.e2e.spec.ts b/src/material-experimental/mdc-menu/menu.e2e.spec.ts index 4a79dddc37f3..5f7b99138052 100644 --- a/src/material-experimental/mdc-menu/menu.e2e.spec.ts +++ b/src/material-experimental/mdc-menu/menu.e2e.spec.ts @@ -57,7 +57,7 @@ describe('menu', () => { it('should run not run click handlers on disabled menu items', async () => { await page.trigger().click(); - await page.items(2).click(); + await browser.actions().mouseMove(page.items(2)).click(); expect(await page.getResultText()).toEqual(''); }); diff --git a/src/material-experimental/mdc-menu/menu.scss b/src/material-experimental/mdc-menu/menu.scss index f7f23179a3de..1c88c28c4d2a 100644 --- a/src/material-experimental/mdc-menu/menu.scss +++ b/src/material-experimental/mdc-menu/menu.scss @@ -40,6 +40,12 @@ text-decoration: none; &[disabled] { + // Usually every click inside the menu closes it, however some browsers will stop events + // when the user clicks on a disabled item, **except** when the user clicks on a non-disabled + // child node of the disabled button. This is inconsistent because some regions of a disabled + // button will still cause the menu to close and some won't (see #16694). We make the behavior + // more consistent by disabling pointer events and allowing the user to click through. + pointer-events: none; cursor: default; } diff --git a/src/material/menu/menu.e2e.spec.ts b/src/material/menu/menu.e2e.spec.ts index 96914679dda0..92386e02764b 100644 --- a/src/material/menu/menu.e2e.spec.ts +++ b/src/material/menu/menu.e2e.spec.ts @@ -57,7 +57,7 @@ describe('menu', () => { it('should run not run click handlers on disabled menu items', async () => { await page.trigger().click(); - await page.items(2).click(); + await browser.actions().mouseMove(page.items(2)).click(); expect(await page.getResultText()).toEqual(''); }); diff --git a/src/material/menu/menu.scss b/src/material/menu/menu.scss index 3e5251b3c515..cf477589ad7c 100644 --- a/src/material/menu/menu.scss +++ b/src/material/menu/menu.scss @@ -44,6 +44,15 @@ $mat-menu-submenu-indicator-size: 10px !default; @include mat-menu-item-base(); position: relative; + &[disabled] { + // Usually every click inside the menu closes it, however some browsers will stop events + // when the user clicks on a disabled item, **except** when the user clicks on a non-disabled + // child node of the disabled button. This is inconsistent because some regions of a disabled + // button will still cause the menu to close and some won't (see #16694). We make the behavior + // more consistent by disabling pointer events and allowing the user to click through. + pointer-events: none; + } + @include cdk-high-contrast { &.cdk-program-focused, &.cdk-keyboard-focused,