From b3c31f5b13c0d07e8ecbf395158e398475fdca94 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Wed, 29 Jun 2022 13:53:13 +0200 Subject: [PATCH] fix: do not throw on removeListener without listener (#15224) Co-authored-by: Andrey Lushnikov --- packages/playwright-core/src/client/joiningEventEmitter.ts | 3 ++- tests/page/page-event-pageerror.spec.ts | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/playwright-core/src/client/joiningEventEmitter.ts b/packages/playwright-core/src/client/joiningEventEmitter.ts index ee916da8c5..8cc4d6346a 100644 --- a/packages/playwright-core/src/client/joiningEventEmitter.ts +++ b/packages/playwright-core/src/client/joiningEventEmitter.ts @@ -119,7 +119,8 @@ export class JoiningEventEmitter implements EventEmitter { } private _wrapper(listener: (...args: any[]) => void) { - return (listener as any)[wrapperListener]; + // Fallback to original listener if not wrapped to ensure backwards compatibility Node.js's event emitter + return (listener as any)[wrapperListener] ?? listener; } private _original(wrapper: Function): Function { diff --git a/tests/page/page-event-pageerror.spec.ts b/tests/page/page-event-pageerror.spec.ts index d50a3cb935..ea56f63f98 100644 --- a/tests/page/page-event-pageerror.spec.ts +++ b/tests/page/page-event-pageerror.spec.ts @@ -128,3 +128,7 @@ it('should handle window', async ({ page, browserName, isElectron }) => { ]); expect(error.message).toBe(browserName === 'chromium' ? 'Window' : '[object Window]'); }); + +it('should remove a listener of a non-existing event handler', async ({ page }) => { + page.removeListener('pageerror', () => {}); +});