From 6292ce2cda5d8626f91cbfcb732e222a80852a01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 17 Oct 2026 13:54:34 +0200 Subject: [PATCH] Bump @playwright/test from 1.63.0 to 1.64.0 in the playwright group across 1 directory (#190) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Bump @playwright/test Bumps the playwright group with 1 update in the / directory: [@playwright/test](https://github.com/microsoft/playwright). Updates `@playwright/test` from 1.63.0 to 1.64.0 - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.63.0...v1.64.0) --- updated-dependencies: - dependency-name: "@playwright/test" dependency-version: 1.64.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: playwright ... Signed-off-by: dependabot[bot] * E2E: abort the stubbed reconnect navigation instead of answering 204 Chromium 156 (Playwright 1.64) reports a navigation that ends in a 204 as a finished request that commits nothing, where Chromium 155 reported it as failed (net::ERR_ABORTED). Playwright's click waits for the navigation it started to commit or fail, so with 1.64 the click never returned and the test timed out reading "" off a closing page. An abort is reported as a failure by every Chromium and keeps the document just the same. Co-Authored-By: Claude Opus 5.5 * E2E: touch beside the open drawer, after it has stopped sliding The drawer-open pull touched the middle of the rows (x~196) right after `inert` came off, at the start of the drawer's 200ms slide. Once the 256px drawer has arrived, that point is the drawer, not the backdrop, so the hit-test only passed while it beat the transition; slower CI runners lost that race on every branch from 2026-10-16. Wait for the drawer to rest, then touch the backdrop strip to its right, and pull at the same point once it is closed. Co-Authored-By: Claude Opus 5.5 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Paul Lützner Co-authored-by: Claude Opus 5.5 --- package-lock.json | 24 +++++++++--------- package.json | 2 +- tests/e2e/health-repair-feedback.spec.ts | 26 +++++++++++++++----- tests/e2e/pull-to-refresh.spec.ts | 31 +++++++++++++++++++++--- 4 files changed, 61 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 685e5ae7..f02d220c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "": { "name": "plmail-e2e", "devDependencies": { - "@playwright/test": "^1.63.0", + "@playwright/test": "^1.64.0", "@types/node": "^26.6.5", "typescript": "^7.0.2" }, @@ -15,13 +15,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.63.0.tgz", - "integrity": "sha512-oxMK4vllB9RK5NQ2l1pq1IfOf2AvnEuj/vYGDj0H2nMtmtZpKtCwt/l00GEO6xjGfpBNAvjovvYdCm50dRQkpQ==", + "version": "1.64.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.64.0.tgz", + "integrity": "sha512-oTN9FNYuN6bqQMwiho6jJKLCG2/QOYCixGXuCjRmzOq23eODeukuY2XiAVoVpAECbuezMt1MHQjAiQxK8F+Y+g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.63.0" + "playwright": "1.64.0" }, "bin": { "playwright": "cli.js" @@ -381,13 +381,13 @@ } }, "node_modules/playwright": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz", - "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==", + "version": "1.64.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.64.0.tgz", + "integrity": "sha512-kVzTnYFYEyQ9RGzBjNCd2+yEqWmVbxl3AHPynv3qQ6JTjv4a+kwRcnqQwIpuP3NnrnIrE/Q6wWAIAvMfIE2/Yg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.63.0" + "playwright-core": "1.64.0" }, "bin": { "playwright": "cli.js" @@ -397,9 +397,9 @@ } }, "node_modules/playwright-core": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz", - "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", + "version": "1.64.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.64.0.tgz", + "integrity": "sha512-T9r+MZkTECl2+oUcZ26YgZzTrYidTsIhYYkJix+6iDOymOb1FB2RLLSOxRGnZGv5DStt+aduIVbt+E8WygXYpg==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 5e00813f..2e536304 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "node": ">=18" }, "devDependencies": { - "@playwright/test": "^1.63.0", + "@playwright/test": "^1.64.0", "@types/node": "^26.6.5", "typescript": "^7.0.2" } diff --git a/tests/e2e/health-repair-feedback.spec.ts b/tests/e2e/health-repair-feedback.spec.ts index 4d427310..6bd6174c 100644 --- a/tests/e2e/health-repair-feedback.spec.ts +++ b/tests/e2e/health-repair-feedback.spec.ts @@ -236,13 +236,27 @@ test.describe("health repair feedback", () => { `WHERE email = '${ACCOUNT}' AND ${OWNED_BY_THIS_WORKER}"`, ); - // 204, so the browser keeps the current document and the pending state - // stays on screen to be looked at. Leaving the request hanging instead - // tears the document down mid-navigation, and every assertion below - // then reads an empty string off a page that no longer exists — which - // is what this looked like before, and looked like a broken controller. + // Aborted, so the browser keeps the current document and the pending + // state stays on screen to be looked at. The navigation has to END, + // though, one way or the other: `link.click()` does not return until + // Playwright has seen the navigation it started either commit or fail. + // + // This used to be `route.fulfill({ status: 204 })`, which keeps the + // document just as well and, up to Chromium 155, was reported as a + // failed request (net::ERR_ABORTED) — the "fail" Playwright waits for. + // Chromium 156 (Playwright 1.64) reports the same 204 as a FINISHED + // request that commits nothing, so neither ending ever arrives, the + // click sits in "waiting for scheduled navigations to finish" until the + // test timeout closes the page, and the assertion below reads "" off + // a page that is shutting down. That looked like the document being + // torn down mid-navigation, and like a broken controller; it was + // neither, the controller had done its job 30ms after the press. + // + // An abort is reported as a failure by every Chromium, so the click + // returns straight away. Leaving the request hanging instead is no + // better than the 204: the click waits on it for the same reason. await page.route("**/settings/health/reconnect/*", (route) => - route.fulfill({ status: 204 }), + route.abort("aborted"), ); await page.goto("/settings?section=health"); diff --git a/tests/e2e/pull-to-refresh.spec.ts b/tests/e2e/pull-to-refresh.spec.ts index 3a129f07..50c97932 100644 --- a/tests/e2e/pull-to-refresh.spec.ts +++ b/tests/e2e/pull-to-refresh.spec.ts @@ -159,7 +159,31 @@ test.describe("pull to refresh on a phone", () => { // list never sees the touch at all. That is what the browser does, and it // is recorded here: the open-surface check in the gesture module is covered // by its node-side spec, not by this one. - const start = await rowsStart(page); + // + // "Where the drawer is open" means beside the drawer, not under it. The + // drawer is w-64 (256px) of Pixel 5's 393, and the middle of the rows is + // x≈196 — inside the drawer once it has arrived. This used to touch that + // middle straight after `inert` came off, which is the START of a 200ms + // slide, so the hit-test found the backdrop only while the drawer was + // still mostly off-screen. A slower runner reached it later, found the + // drawer, and the test failed with "drawer" (on CI from 2026-10-16, on + // every branch). So: wait until the drawer has stopped moving, then + // touch the strip of backdrop to its right, which is the drawer-open + // touch that can actually reach the list's part of the screen. + const drawer = page.locator("#sidebar-drawer"); + + await expect.poll(() => drawer.evaluate((el) => el.getBoundingClientRect().left)).toBe(0); + + const drawerBox = (await drawer.boundingBox())!; + const rowsBox = (await page.locator(ROWS).boundingBox())!; + const besideDrawer = drawerBox.x + drawerBox.width; + const start = { + x: (besideDrawer + rowsBox.x + rowsBox.width) / 2, + y: (await rowsStart(page)).y, + }; + + expect(start.x, "the rows reach past the open drawer").toBeGreaterThan(besideDrawer); + const hit = await page.evaluate(({ x, y }) => { const element = document.elementFromPoint(x, y); @@ -180,8 +204,9 @@ test.describe("pull to refresh on a phone", () => { await page.keyboard.press("Escape"); await expect(page.locator("#sidebar-drawer")).toHaveAttribute("inert", ""); - const again = await rowsStart(page); - const second = await Finger.down(page, again.x, again.y); + // The same point as the first pull, so the only thing that changed + // between the two is the drawer. + const second = await Finger.down(page, start.x, start.y); await second.move(0, PULL_PAST); await second.up();