fix!: allow mutating happy-dom/jsdom window object - #10373
Merged
sheremet-va merged 10 commits intoJun 4, 2026
Merged
sheremet-va merged 10 commits into
sheremet-va merged 10 commits into
Conversation
✅ Deploy Preview for vitest-dev ready!Built without sensitive environment variables
To edit notification comments on pull requests, go to your Netlify project configuration. |
Member
|
Cannot find many issues with this approach, to be honest |
hi-ogawa
commented
May 29, 2026
Comment on lines
+81
to
+89
| // propagate changes to underlying window implementation, | ||
| // which can affect other window API behavior internally, e.g. | ||
| // updating `innerWidth` affects `matchMedia("(max-width: *)")` on happy-dom. | ||
| try { | ||
| win[key] = v | ||
| } | ||
| catch { | ||
| // haven't found a case it throws but just in case | ||
| } |
Collaborator
Author
There was a problem hiding this comment.
Discussed that we can just remove try/catch to surface if there's any setter error.
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
hi-ogawa
commented
Jun 2, 2026
Comment on lines
+50
to
+66
| test('readonly window assignment throws', ({ task }) => { | ||
| // happy-dom's vmThreads setup returns Window as a Node VM context directly. | ||
| // Node contextification reports this getter-only assignment as successful, | ||
| // unlike the populateGlobal facade used by threads/forks. | ||
| if (task.file.pool === 'vmThreads') { | ||
| expect(() => { | ||
| Object.assign(window, { navigator: {} }) | ||
| }).not.toThrow() | ||
| return | ||
| } | ||
|
|
||
| expect(() => { | ||
| Object.assign(window, { navigator: {} }) | ||
| }).toThrowErrorMatchingInlineSnapshot( | ||
| `[TypeError: Cannot set property navigator of #<GlobalWindow> which has only a getter]`, | ||
| ) | ||
| }) |
Collaborator
Author
There was a problem hiding this comment.
There's vm annoyance. Jsdom seems to mitigate this as they provide dedicated API for vm use JSDOM.getInternalVMContext, but happy-dom doesn't have the same.
This minor difference sounds fine as just an edge case. Note that, window.innerWidth = 50 behavior still works fine.
sheremet-va
requested changes
Jun 2, 2026
sheremet-va
left a comment
Member
There was a problem hiding this comment.
I think this might also need a mention in the migration guide
Co-authored-by: Codex <noreply@openai.com>
…om-window-object' into fix-allow-mutating-happy-dom-jsdom-window-object
sheremet-va
approved these changes
Jun 4, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
window.innerWidthdoesn't actually setinnerWidthon happy-dom'swindowobject #10343Like in the issue above, dom implementation supports mutating some global window property, but they weren't propagated through jsdom/happy-dom global wrapper of Vitest. This changes so it writes out to the dom window object.
Please don't delete this checklist! Before submitting the PR, please make sure you do the following:
pnpm-lock.yamlunless you introduce a new test example.Tests
pnpm test:ci.Documentation
pnpm run docscommand.Changesets
feat:,fix:,perf:,docs:, orchore:.