From c9a26e60f507c593a4c22d87021889323b078e66 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Mon, 23 Sep 2024 14:30:40 -0700 Subject: [PATCH] fix(webkit): 204 response is not a failure (#32768) The login being changed was added in https://github.com/microsoft/playwright/pull/1260 and is supposed to only work for navigation requests. Reference: https://github.com/microsoft/playwright/issues/32752 --- .../playwright-core/src/server/webkit/wkPage.ts | 2 +- tests/page/page-event-request.spec.ts | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/playwright-core/src/server/webkit/wkPage.ts b/packages/playwright-core/src/server/webkit/wkPage.ts index 2f579b619b..f432f85459 100644 --- a/packages/playwright-core/src/server/webkit/wkPage.ts +++ b/packages/playwright-core/src/server/webkit/wkPage.ts @@ -1116,7 +1116,7 @@ export class WKPage implements PageDelegate { const response = request.createResponse(event.response); this._page._frameManager.requestReceivedResponse(response); - if (response.status() === 204) { + if (response.status() === 204 && request.request.isNavigationRequest()) { this._onLoadingFailed(session, { requestId: event.requestId, errorText: 'Aborted: 204 No Content', diff --git a/tests/page/page-event-request.spec.ts b/tests/page/page-event-request.spec.ts index cfc2f7a1e2..f32f224374 100644 --- a/tests/page/page-event-request.spec.ts +++ b/tests/page/page-event-request.spec.ts @@ -241,3 +241,20 @@ it('main resource xhr should have type xhr', async ({ page, server }) => { expect(request.isNavigationRequest()).toBe(false); expect(request.resourceType()).toBe('xhr'); }); + +it('should finish 204 request', { + annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/32752' } +}, async ({ page, server, browserName }) => { + it.fixme(browserName === 'chromium'); + server.setRoute('/204', (req, res) => { + res.writeHead(204, { 'Content-type': 'text/plain' }); + res.end(); + }); + await page.goto(server.EMPTY_PAGE); + const reqPromise = Promise.race([ + page.waitForEvent('requestfailed', r => r.url().endsWith('/204')).then(() => 'requestfailed'), + page.waitForEvent('requestfinished', r => r.url().endsWith('/204')).then(() => 'requestfinished'), + ]); + page.evaluate(async url => { await fetch(url); }, server.PREFIX + '/204').catch(() => {}); + expect(await reqPromise).toBe('requestfinished'); +});