From cce139b20ebcfbc255dc951071a350d52dc58368 Mon Sep 17 00:00:00 2001 From: David Ortner Date: Fri, 20 May 2022 16:25:33 +0200 Subject: [PATCH] #446@patch: Adds a check for only executing scripts for valid types in HTMLScriptElement. --- .../src/nodes/html-script-element/HTMLScriptElement.ts | 9 ++++++++- .../nodes/html-script-element/HTMLScriptElement.test.ts | 9 +++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElement.ts b/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElement.ts index 1b7de06b1..b3191dfe7 100644 --- a/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElement.ts +++ b/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElement.ts @@ -195,7 +195,14 @@ export default class HTMLScriptElement extends HTMLElement implements IHTMLScrip ScriptUtility.loadExternalScript(this); } else { const textContent = this.textContent; - if (textContent) { + const type = this.getAttributeNS(null, 'type'); + if ( + textContent && + (type === null || + type === 'application/x-ecmascript' || + type === 'application/x-javascript' || + type.startsWith('text/javascript')) + ) { this.ownerDocument.defaultView.eval(textContent); } } diff --git a/packages/happy-dom/test/nodes/html-script-element/HTMLScriptElement.test.ts b/packages/happy-dom/test/nodes/html-script-element/HTMLScriptElement.test.ts index 414a0c347..5a17fa1fd 100644 --- a/packages/happy-dom/test/nodes/html-script-element/HTMLScriptElement.test.ts +++ b/packages/happy-dom/test/nodes/html-script-element/HTMLScriptElement.test.ts @@ -139,6 +139,15 @@ describe('HTMLScriptElement', () => { expect(window['test']).toBe('test'); }); + it('Does not evaluate types that are not supported.', () => { + const div = document.createElement('div'); + const element = document.createElement('script'); + element.type = 'application/json'; + element.textContent = '{"key": "value"}'; + div.appendChild(element); + expect(element.textContent).toBe('{"key": "value"}'); + }); + it('Does not evaluate code when added as innerHTML.', () => { const div = document.createElement('div'); div.innerHTML = '';