Skip to content

fix(web): support Event subclasses with readonly toStringTag#35920

Merged
nathanwhit merged 1 commit into
denoland:mainfrom
nathanwhit:fix-event-readonly-tostringtag
Jul 9, 2026
Merged

fix(web): support Event subclasses with readonly toStringTag#35920
nathanwhit merged 1 commit into
denoland:mainfrom
nathanwhit:fix-event-readonly-tostringtag

Conversation

@nathanwhit

Copy link
Copy Markdown
Member

Summary

  • define Event.prototype[Symbol.toStringTag] with the standard read-only descriptor instead of assigning it on each instance
  • add regression coverage for subclasses that define their own read-only Symbol.toStringTag

Root cause

The Event constructor assigned this[Symbol.toStringTag] = "Event". When a subclass, such as Undici's MessageEvent, defines a read-only Symbol.toStringTag on its prototype, that assignment resolves to the inherited non-writable property and throws during super().

Moving the tag to Event.prototype matches Web IDL behavior and allows subclasses to provide their own class string.

Validation

  • cargo b --bin deno -p deno
  • ./target/debug/deno test -A --config tests/config/deno.json tests/unit/event_test.ts
  • constructed Undici 8.5.0's MessageEvent with the rebuilt binary
  • sent a message successfully with @earendil-works/pi-coding-agent running under the rebuilt Deno

@nathanwhit
nathanwhit marked this pull request as ready for review July 9, 2026 22:30
@nathanwhit
nathanwhit merged commit d279878 into denoland:main Jul 9, 2026
304 of 306 checks passed
bartlomieju pushed a commit that referenced this pull request Jul 15, 2026
## Summary

- define `Event.prototype[Symbol.toStringTag]` with the standard
read-only descriptor instead of assigning it on each instance
- add regression coverage for subclasses that define their own read-only
`Symbol.toStringTag`

## Root cause

The `Event` constructor assigned `this[Symbol.toStringTag] = "Event"`.
When a subclass, such as Undici's `MessageEvent`, defines a read-only
`Symbol.toStringTag` on its prototype, that assignment resolves to the
inherited non-writable property and throws during `super()`.

Moving the tag to `Event.prototype` matches Web IDL behavior and allows
subclasses to provide their own class string.

## Validation

- `cargo b --bin deno -p deno`
- `./target/debug/deno test -A --config tests/config/deno.json
tests/unit/event_test.ts`
- constructed Undici 8.5.0's `MessageEvent` with the rebuilt binary
- sent a message successfully with `@earendil-works/pi-coding-agent`
running under the rebuilt Deno
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant