From f76540b0c2eb0cd262dc55276da9b598f6536dc0 Mon Sep 17 00:00:00 2001 From: mehmet turac Date: Mon, 15 Jun 2026 16:52:23 +0300 Subject: [PATCH] fix: tolerate page errors without location --- .../src/server/firefox/protocol.d.ts | 4 ++-- packages/playwright-core/src/server/page.ts | 5 ++++- tests/library/browsercontext-events.spec.ts | 13 +++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/playwright-core/src/server/firefox/protocol.d.ts b/packages/playwright-core/src/server/firefox/protocol.d.ts index e55a72ce404b7..0f94baa80289d 100644 --- a/packages/playwright-core/src/server/firefox/protocol.d.ts +++ b/packages/playwright-core/src/server/firefox/protocol.d.ts @@ -402,7 +402,7 @@ export namespace Protocol { frameId: string; message: string; stack: string; - location: { + location?: { columnNumber: number; lineNumber: number; url: string; @@ -1205,4 +1205,4 @@ export namespace Protocol { "Network.fulfillInterceptedRequest": Network.fulfillInterceptedRequestReturnValue; "Network.getResponseBody": Network.getResponseBodyReturnValue; } -} \ No newline at end of file +} diff --git a/packages/playwright-core/src/server/page.ts b/packages/playwright-core/src/server/page.ts index c26d5d39ddb1a..2a136653a5cfa 100644 --- a/packages/playwright-core/src/server/page.ts +++ b/packages/playwright-core/src/server/page.ts @@ -163,6 +163,8 @@ export type PageError = { location: types.ConsoleMessageLocation, }; +const emptyConsoleMessageLocation: types.ConsoleMessageLocation = { url: '', lineNumber: 0, columnNumber: 0 }; + export class Page extends SdkObject { static Events = PageEvent; @@ -432,7 +434,8 @@ export class Page extends SdkObject { return marked === -1 ? this._consoleMessages : this._consoleMessages.slice(marked + 1); } - addPageError(error: Error, location: types.ConsoleMessageLocation) { + addPageError(error: Error, location: types.ConsoleMessageLocation | undefined) { + location ??= emptyConsoleMessageLocation; const pageError: PageError = { error, location }; this._pageErrors.push(pageError); ensureArrayLimit(this._pageErrors, 200); // Avoid unbounded memory growth. diff --git a/tests/library/browsercontext-events.spec.ts b/tests/library/browsercontext-events.spec.ts index 9afc08def24d2..7096965aa8b87 100644 --- a/tests/library/browsercontext-events.spec.ts +++ b/tests/library/browsercontext-events.spec.ts @@ -209,6 +209,19 @@ test('weberror event should include location', async ({ page, server }) => { expect(location.column).toBeGreaterThan(0); // column is not consistent across browsers }); +test('weberror event should tolerate missing location', async ({ page, toImpl }) => { + const [webError, pageError] = await Promise.all([ + page.context().waitForEvent('weberror'), + page.waitForEvent('pageerror'), + Promise.resolve().then(() => toImpl(page).addPageError(new Error('boom'), undefined)), + ]); + + expect(webError.page()).toBe(page); + expect(webError.error().message).toBe('boom'); + expect(webError.location()).toEqual({ url: '', line: 0, column: 0 }); + expect(pageError.message).toBe('boom'); +}); + test('pageload event should work @smoke', async ({ page, server }) => { const [eventPage] = await Promise.all([ page.context().waitForEvent('pageload'),