diff --git a/.changeset/silver-jokes-tease.md b/.changeset/silver-jokes-tease.md new file mode 100644 index 00000000..c9b39f4f --- /dev/null +++ b/.changeset/silver-jokes-tease.md @@ -0,0 +1,5 @@ +--- +'@remote-dom/polyfill': minor +--- + +Fix trying to write to readonly events diff --git a/packages/polyfill/source/Event.ts b/packages/polyfill/source/Event.ts index 0b2390d8..1dfe5508 100644 --- a/packages/polyfill/source/Event.ts +++ b/packages/polyfill/source/Event.ts @@ -117,9 +117,22 @@ export function fireEvent( if (!list) return; for (const listener of list) { - event.eventPhase = - event.target === currentTarget ? EventPhase.AT_TARGET : phase; - event.currentTarget = currentTarget; + // Safely set eventPhase property only if it's writable + try { + event.eventPhase = + event.target === currentTarget ? EventPhase.AT_TARGET : phase; + } catch { + // eventPhase property is read-only on native DOM Events + // Event will still function but may have different phase behavior + } + + // Safely set currentTarget property only if it's writable + try { + event.currentTarget = currentTarget; + } catch { + // currentTarget property is read-only on native DOM Events + // Event will still function but currentTarget may not update correctly during bubbling + } try { if (typeof listener === 'object') { diff --git a/packages/polyfill/source/EventTarget.ts b/packages/polyfill/source/EventTarget.ts index ea448660..08528fd8 100644 --- a/packages/polyfill/source/EventTarget.ts +++ b/packages/polyfill/source/EventTarget.ts @@ -109,8 +109,19 @@ export class EventTarget { // while (target instanceof Node && (target = target.parentNode)) { // path.push(target); // } - event.target = this; - event.srcElement = this; + // Safely set target property only if it's writable (native DOM Events have read-only target) + try { + event.target = this; + } catch { + // target property is read-only on native DOM Events + // Event will still function but may have different target than expected + } + + try { + event.srcElement = this; + } catch { + // srcElement property may also be read-only on some implementations + } event[PATH] = path; for (let i = path.length; i--; ) {