Skip to content

Commit 1a3bb50

Browse files
committed
fix: [#1766] Fixes issue where the wrong scope was used when settings.errorCapture is not set to tryAndCatch and handleEvent is used for an event listener
1 parent bc3583b commit 1a3bb50

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

packages/happy-dom/src/event/EventTarget.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ export default class EventTarget {
282282
}
283283
} else {
284284
if ((<TEventListenerObject>listener).handleEvent) {
285-
(<TEventListenerObject>listener).handleEvent.call(this, event);
285+
(<TEventListenerObject>listener).handleEvent.call(listener, event);
286286
} else {
287287
(<TEventListenerFunction>listener).call(this, event);
288288
}

packages/happy-dom/test/event/EventTarget.test.ts

+17-3
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
import BrowserWindow from '../../src/window/BrowserWindow.js';
21
import Window from '../../src/window/Window.js';
32
import EventTarget from '../../src/event/EventTarget.js';
43
import Event from '../../src/event/Event.js';
54
import CustomEvent from '../../src/event/events/CustomEvent.js';
65
import * as PropertySymbol from '../../src/PropertySymbol.js';
76
import { beforeEach, describe, it, expect } from 'vitest';
7+
import BrowserErrorCaptureEnum from '../../src/browser/enums/BrowserErrorCaptureEnum.js';
88

99
const EVENT_TYPE = 'click';
1010

1111
describe('EventTarget', () => {
12-
let window: BrowserWindow;
12+
let window: Window;
1313
let eventTarget: EventTarget;
1414

1515
beforeEach(() => {
@@ -117,7 +117,21 @@ describe('EventTarget', () => {
117117
expect(scope).toBe(eventTarget);
118118
});
119119

120-
it('Event listener with handleEvent is called in the scope of the listener when calling dispatchEvent().', () => {
120+
it('Event listener with handleEvent is called in the scope of the listener when calling dispatchEvent() when browser settings error capture is set to "tryAndCatch".', () => {
121+
let scope = null;
122+
const listener = {
123+
handleEvent(): void {
124+
scope = this;
125+
}
126+
};
127+
const dispatchedEvent = new Event(EVENT_TYPE);
128+
eventTarget.addEventListener(EVENT_TYPE, listener);
129+
eventTarget.dispatchEvent(dispatchedEvent);
130+
expect(scope).toBe(listener);
131+
});
132+
133+
it('Event listener with handleEvent is called in the scope of the listener when calling dispatchEvent() when browser settings error capture is not set to "tryAndCatch".', () => {
134+
window.happyDOM.settings.errorCapture = BrowserErrorCaptureEnum.disabled;
121135
let scope = null;
122136
const listener = {
123137
handleEvent(): void {

0 commit comments

Comments
 (0)