Link-Klick ignoriert event.preventDefault() — Navigation trotz Cancel #29

Closed
opened 2026-06-17 16:29:11 +00:00 by Artur · 1 comment
Owner

Problem

Clicking an <a href="..."> link always triggers navigation via page.goto(), even if the click event was cancelled with event.preventDefault().

In a real browser, event.preventDefault() on a click event suppresses the default action (navigation). Our engine dispatches the events but never checks the return value of dispatchEvent().

Current Behavior

// Page JS:
link.addEventListener('click', (e) => {
  e.preventDefault();  // ← wird ignoriert
});

// Engine:
await page.locator('#link').click();
// → navigiert trotz preventDefault zur Ziel-URL

Expected Behavior

// Wenn preventDefault() aufgerufen wurde:
// → KEINE Navigation
// → Page bleibt auf aktueller URL

Location

  • src/pages/page.ts, method _dispatchClick() (line ~570)
  • After dispatching events, check if the click event's default was prevented
  • el.dispatchEvent(event) returns false if preventDefault() was called on a cancelable event

Proposed Fix

In _dispatchClick(), capture the return value of this.dispatcher.dispatchClick() and only call _navigateLink() if the event was not cancelled:

// In dispatch.ts, return whether default was prevented
dispatchClick(el, opts): boolean {
  // ... dispatch events ...
  const wasPrevented = !el.dispatchEvent(clickEvent);
  return !wasPrevented; // true = default action should proceed
}

// In page.ts:
const shouldNavigate = this.dispatcher.dispatchClick(el, { ... });
if (shouldNavigate && this._isLink(el)) {
  await this._navigateLink(el);
}

Test

Siehe tests/interaction/link-navigation.test.ts — Test 4 dokumentiert das aktuelle defekte Verhalten. Nach dem Fix muss dort umgedreht werden.

## Problem Clicking an `<a href="...">` link always triggers navigation via `page.goto()`, **even if the click event was cancelled** with `event.preventDefault()`. In a real browser, `event.preventDefault()` on a click event suppresses the default action (navigation). Our engine dispatches the events but never checks the return value of `dispatchEvent()`. ## Current Behavior ```typescript // Page JS: link.addEventListener('click', (e) => { e.preventDefault(); // ← wird ignoriert }); // Engine: await page.locator('#link').click(); // → navigiert trotz preventDefault zur Ziel-URL ``` ## Expected Behavior ```typescript // Wenn preventDefault() aufgerufen wurde: // → KEINE Navigation // → Page bleibt auf aktueller URL ``` ## Location - `src/pages/page.ts`, method `_dispatchClick()` (line ~570) - After dispatching events, check if the `click` event's default was prevented - `el.dispatchEvent(event)` returns `false` if `preventDefault()` was called on a cancelable event ## Proposed Fix In `_dispatchClick()`, capture the return value of `this.dispatcher.dispatchClick()` and only call `_navigateLink()` if the event was **not** cancelled: ```typescript // In dispatch.ts, return whether default was prevented dispatchClick(el, opts): boolean { // ... dispatch events ... const wasPrevented = !el.dispatchEvent(clickEvent); return !wasPrevented; // true = default action should proceed } // In page.ts: const shouldNavigate = this.dispatcher.dispatchClick(el, { ... }); if (shouldNavigate && this._isLink(el)) { await this._navigateLink(el); } ``` ## Test Siehe `tests/interaction/link-navigation.test.ts` — Test 4 dokumentiert das aktuelle defekte Verhalten. Nach dem Fix muss dort umgedreht werden.
Author
Owner

Link-Klick ignoriert event.preventDefault() — Navigation trotz Cancel. Gefixt in link-navigation.test.ts: EH4, EH18 testen preventDefault. Commit 50900eb.

Link-Klick ignoriert event.preventDefault() — Navigation trotz Cancel. ✅ Gefixt in link-navigation.test.ts: EH4, EH18 testen preventDefault. Commit 50900eb.
Artur closed this issue 2026-06-18 06:28:05 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
glow-all/true-headless-browser#29
No description provided.