Skip to content

Commit a1a35cb

Browse files
authored
fix: [#1775] Anchor tag handles bubbling clicks (#1784)
1 parent 4b0c5ee commit a1a35cb

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

packages/happy-dom/src/nodes/html-anchor-element/HTMLAnchorElement.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ export default class HTMLAnchorElement extends HTMLElement implements IHTMLHyper
411411
!event[PropertySymbol.defaultPrevented] &&
412412
event.type === 'click' &&
413413
event instanceof MouseEvent &&
414-
event.eventPhase === EventPhaseEnum.none
414+
(event.eventPhase === EventPhaseEnum.none || event.eventPhase === EventPhaseEnum.bubbling)
415415
) {
416416
const href = this.href;
417417

packages/happy-dom/test/nodes/html-anchor-element/HTMLAnchorElement.test.ts

+33
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,39 @@ describe('HTMLAnchorElement', () => {
417417
expect(newWindow.closed).toBe(true);
418418
});
419419

420+
it('Navigates the browser when a "click" event bubbles up to an element.', async () => {
421+
const browser = new Browser();
422+
const page = browser.newPage();
423+
const window = page.mainFrame.window;
424+
425+
vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise<Response> {
426+
return Promise.resolve(<Response>{
427+
text: () => Promise.resolve('Test')
428+
});
429+
});
430+
431+
const divElement = window.document.createElement('div');
432+
const anchorElement = <HTMLAnchorElement>window.document.createElement('a');
433+
anchorElement.href = 'https://www.example.com';
434+
anchorElement.appendChild(divElement);
435+
window.document.body.appendChild(anchorElement);
436+
437+
divElement.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true }));
438+
439+
const newWindow = page.mainFrame.window;
440+
441+
expect(newWindow === window).toBe(false);
442+
expect(newWindow.location.href).toBe('https://www.example.com/');
443+
444+
await browser.waitUntilComplete();
445+
446+
expect(newWindow.document.body.innerHTML).toBe('Test');
447+
448+
newWindow.close();
449+
450+
expect(newWindow.closed).toBe(true);
451+
});
452+
420453
it('Navigates the browser when a "click" event is dispatched on an element with target "_blank".', async () => {
421454
const browser = new Browser();
422455
const page = browser.newPage();

0 commit comments

Comments
 (0)