mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-19 19:57:22 +08:00
fix(overlays): focus is not moved if active element is in overlay (#25481)
resolves #24127, resolves #24820 Co-authored-by: MarkChrisLevy <MarkChrisLevy@users.noreply.github.com>
This commit is contained in:
@ -430,7 +430,13 @@ export const present = async (
|
|||||||
focusPreviousElementOnDismiss(overlay.el);
|
focusPreviousElementOnDismiss(overlay.el);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (overlay.keyboardClose) {
|
/**
|
||||||
|
* If the focused element is already
|
||||||
|
* inside the overlay component then
|
||||||
|
* focus should not be moved from that
|
||||||
|
* to the overlay container.
|
||||||
|
*/
|
||||||
|
if (overlay.keyboardClose && (document.activeElement === null || !overlay.el.contains(document.activeElement))) {
|
||||||
overlay.el.focus();
|
overlay.el.focus();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
29
core/src/utils/test/overlays/overlays.e2e.ts
Normal file
29
core/src/utils/test/overlays/overlays.e2e.ts
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import { expect } from '@playwright/test';
|
||||||
|
import { test } from '@utils/test/playwright';
|
||||||
|
|
||||||
|
test.describe('overlays: focus', () => {
|
||||||
|
test('should not focus the overlay container if element inside of overlay is focused', async ({ page }, testInfo) => {
|
||||||
|
test.skip(testInfo.project.metadata.rtl === true, 'RTL tests are not needed as layout is not checked');
|
||||||
|
|
||||||
|
await page.setContent(`
|
||||||
|
<ion-button id="open-modal">Show Modal</ion-button>
|
||||||
|
<ion-modal trigger="open-modal">
|
||||||
|
<ion-content>
|
||||||
|
<ion-input autofocus="true"></ion-input>
|
||||||
|
</ion-content>
|
||||||
|
</ion-modal>
|
||||||
|
`);
|
||||||
|
|
||||||
|
const ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent');
|
||||||
|
const button = page.locator('ion-button');
|
||||||
|
const input = page.locator('ion-input');
|
||||||
|
|
||||||
|
await button.click();
|
||||||
|
await input.evaluate((el: HTMLIonInputElement) => el.setFocus());
|
||||||
|
|
||||||
|
await ionModalDidPresent.next();
|
||||||
|
await page.waitForChanges();
|
||||||
|
|
||||||
|
expect(page.locator('ion-input input')).toBeFocused();
|
||||||
|
});
|
||||||
|
});
|
Reference in New Issue
Block a user