diff --git a/core/src/components/modal/gestures/swipe-to-close.ts b/core/src/components/modal/gestures/swipe-to-close.ts index 73f718efc1..c056c174a3 100644 --- a/core/src/components/modal/gestures/swipe-to-close.ts +++ b/core/src/components/modal/gestures/swipe-to-close.ts @@ -277,7 +277,7 @@ export const createSwipeToCloseGesture = (el: HTMLIonModalElement, animation: An const gesture = createGesture({ el, gestureName: 'modalSwipeToClose', - gesturePriority: 40, + gesturePriority: 39, direction: 'y', threshold: 10, canStart, diff --git a/core/src/components/modal/test/card-nav/index.html b/core/src/components/modal/test/card-nav/index.html new file mode 100644 index 0000000000..f48c5be8a5 --- /dev/null +++ b/core/src/components/modal/test/card-nav/index.html @@ -0,0 +1,88 @@ + + + + + Modal - Card + Nav + + + + + + + + + + + + +
+ + + Card + + + + + Open Modal + + + +
+
+ + + + diff --git a/core/src/components/modal/test/card-nav/modal.e2e.ts b/core/src/components/modal/test/card-nav/modal.e2e.ts new file mode 100644 index 0000000000..8918d34664 --- /dev/null +++ b/core/src/components/modal/test/card-nav/modal.e2e.ts @@ -0,0 +1,50 @@ +import { expect } from '@playwright/test'; +import { test, dragElementBy } from '@utils/test/playwright'; + +import { CardModalPage } from '../fixtures'; + +test.describe('card modal - nav', () => { + let cardModalPage: CardModalPage; + test.beforeEach(async ({ page, browserName }, testInfo) => { + test.skip(testInfo.project.metadata.mode !== 'ios', 'Card style modal is only available on iOS'); + test.skip( + testInfo.project.metadata.rtl === true, + 'This test only verifies that the gesture activates inside of a modal.' + ); + test.skip(browserName !== 'chromium', 'dragElementBy is flaky outside of Chrome browsers.'); + + cardModalPage = new CardModalPage(page); + await cardModalPage.navigate('/src/components/modal/test/card-nav?ionic:_testing=false'); + }); + test('it should swipe to go back', async ({ page }) => { + await cardModalPage.openModalByTrigger('#open-modal'); + + const nav = page.locator('ion-nav') as any; + const ionNavDidChange = await nav.spyOnEvent('ionNavDidChange'); + + await page.click('#go-page-two'); + + await ionNavDidChange.next(); + + const pageOne = page.locator('page-one'); + expect(pageOne).toHaveClass(/ion-page-hidden/); + + const content = page.locator('.page-two-content'); + + await dragElementBy(content, page, 1000, 0, 10); + + await ionNavDidChange.next(); + }); + test('should swipe to close', async ({ page }) => { + await cardModalPage.openModalByTrigger('#open-modal'); + + const nav = page.locator('ion-nav') as any; + const ionNavDidChange = await nav.spyOnEvent('ionNavDidChange'); + + await page.click('#go-page-two'); + + await ionNavDidChange.next(); + + await cardModalPage.swipeToCloseModal('ion-modal ion-content.page-two-content'); + }); +}); diff --git a/core/src/components/modal/test/card/modal.e2e.ts b/core/src/components/modal/test/card/modal.e2e.ts index 30338cb0c8..1a888e5281 100644 --- a/core/src/components/modal/test/card/modal.e2e.ts +++ b/core/src/components/modal/test/card/modal.e2e.ts @@ -1,38 +1,7 @@ import { expect } from '@playwright/test'; -import { dragElementBy, test, Viewports } from '@utils/test/playwright'; -import type { E2EPage, EventSpy } from '@utils/test/playwright'; +import { test, Viewports } from '@utils/test/playwright'; -class CardModalPage { - private ionModalDidPresent!: EventSpy; - private ionModalDidDismiss!: EventSpy; - private page: E2EPage; - - constructor(page: E2EPage) { - this.page = page; - } - async navigate() { - const { page } = this; - await page.goto('/src/components/modal/test/card'); - this.ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); - this.ionModalDidDismiss = await page.spyOnEvent('ionModalDidDismiss'); - } - async openModalByTrigger(selector: string) { - await this.page.click(selector); - await this.ionModalDidPresent.next(); - - return this.page.locator('ion-modal'); - } - - async swipeToCloseModal(selector: string, waitForDismiss = true, swipeY = 500) { - const { page } = this; - const elementRef = await page.locator(selector); - await dragElementBy(elementRef, page, 0, swipeY); - - if (waitForDismiss) { - await this.ionModalDidDismiss.next(); - } - } -} +import { CardModalPage } from '../fixtures'; test.describe('card modal', () => { let cardModalPage: CardModalPage; @@ -40,7 +9,7 @@ test.describe('card modal', () => { test.skip(testInfo.project.metadata.mode !== 'ios', 'Card style modal is only available on iOS'); cardModalPage = new CardModalPage(page); - await cardModalPage.navigate(); + await cardModalPage.navigate('/src/components/modal/test/card'); }); test.describe('card modal: rendering', () => { test('should not have visual regressions', async ({ page }) => { diff --git a/core/src/components/modal/test/fixtures.ts b/core/src/components/modal/test/fixtures.ts new file mode 100644 index 0000000000..a533b2ab1c --- /dev/null +++ b/core/src/components/modal/test/fixtures.ts @@ -0,0 +1,34 @@ +import { dragElementBy } from '@utils/test/playwright'; +import type { E2EPage, EventSpy } from '@utils/test/playwright'; + +export class CardModalPage { + private ionModalDidPresent!: EventSpy; + private ionModalDidDismiss!: EventSpy; + private page: E2EPage; + + constructor(page: E2EPage) { + this.page = page; + } + async navigate(url: string) { + const { page } = this; + await page.goto(url); + this.ionModalDidPresent = await page.spyOnEvent('ionModalDidPresent'); + this.ionModalDidDismiss = await page.spyOnEvent('ionModalDidDismiss'); + } + async openModalByTrigger(selector: string) { + await this.page.click(selector); + await this.ionModalDidPresent.next(); + + return this.page.locator('ion-modal'); + } + + async swipeToCloseModal(selector: string, waitForDismiss = true, swipeY = 500) { + const { page } = this; + const elementRef = await page.locator(selector); + await dragElementBy(elementRef, page, 0, swipeY); + + if (waitForDismiss) { + await this.ionModalDidDismiss.next(); + } + } +} diff --git a/core/src/utils/test/playwright/drag-element.ts b/core/src/utils/test/playwright/drag-element.ts index 8cfe6d36d7..b053cc17d8 100644 --- a/core/src/utils/test/playwright/drag-element.ts +++ b/core/src/utils/test/playwright/drag-element.ts @@ -6,7 +6,9 @@ export const dragElementBy = async ( el: Locator | ElementHandle, page: E2EPage, dragByX = 0, - dragByY = 0 + dragByY = 0, + startXCoord?: number, + startYCoord?: number ) => { const boundingBox = await el.boundingBox(); @@ -16,8 +18,8 @@ export const dragElementBy = async ( ); } - const startX = boundingBox.x + boundingBox.width / 2; - const startY = boundingBox.y + boundingBox.height / 2; + const startX = startXCoord === undefined ? boundingBox.x + boundingBox.width / 2 : startXCoord; + const startY = startYCoord === undefined ? boundingBox.y + boundingBox.height / 2 : startYCoord; const midX = startX + dragByX / 2; const midY = startY + dragByY / 2;