From 11e49c17bc903ba42d07bfd5d4abab41c28a9ae8 Mon Sep 17 00:00:00 2001 From: egamma Date: Mon, 29 Jun 2026 18:06:24 +0200 Subject: [PATCH 1/2] fix #79631: [html] don't validate custom event handlers as JavaScript --- .../server/src/modes/embeddedSupport.ts | 105 +++++++++++++++++- .../server/src/test/embedded.test.ts | 2 + 2 files changed, 103 insertions(+), 4 deletions(-) diff --git a/extensions/html-language-features/server/src/modes/embeddedSupport.ts b/extensions/html-language-features/server/src/modes/embeddedSupport.ts index 247014b9f1c645..4af52f011cc21d 100644 --- a/extensions/html-language-features/server/src/modes/embeddedSupport.ts +++ b/extensions/html-language-features/server/src/modes/embeddedSupport.ts @@ -22,6 +22,104 @@ export const CSS_STYLE_RULE = '__'; interface EmbeddedRegion { languageId: string | undefined; start: number; end: number; attributeValue?: boolean } +const eventHandlerAttributes = new Set([ + 'onabort', + 'onanimationcancel', + 'onanimationend', + 'onanimationiteration', + 'onanimationstart', + 'onauxclick', + 'onbeforeinput', + 'onbeforematch', + 'onbeforetoggle', + 'onblur', + 'oncancel', + 'oncanplay', + 'oncanplaythrough', + 'onchange', + 'onclick', + 'onclose', + 'oncontextlost', + 'oncontextmenu', + 'oncontextrestored', + 'oncopy', + 'oncuechange', + 'oncut', + 'ondblclick', + 'ondrag', + 'ondragend', + 'ondragenter', + 'ondragleave', + 'ondragover', + 'ondragstart', + 'ondrop', + 'ondurationchange', + 'onemptied', + 'onended', + 'onerror', + 'onfocus', + 'onformdata', + 'ongotpointercapture', + 'oninput', + 'oninvalid', + 'onkeydown', + 'onkeypress', + 'onkeyup', + 'onlanguagechange', + 'onload', + 'onloadeddata', + 'onloadedmetadata', + 'onloadstart', + 'onlostpointercapture', + 'onmousedown', + 'onmouseenter', + 'onmouseleave', + 'onmousemove', + 'onmouseout', + 'onmouseover', + 'onmouseup', + 'onpaste', + 'onpause', + 'onplay', + 'onplaying', + 'onpointercancel', + 'onpointerdown', + 'onpointerenter', + 'onpointerleave', + 'onpointermove', + 'onpointerout', + 'onpointerover', + 'onpointerrawupdate', + 'onpointerup', + 'onprogress', + 'onratechange', + 'onreset', + 'onresize', + 'onscroll', + 'onscrollend', + 'onsecuritypolicyviolation', + 'onseeked', + 'onseeking', + 'onselect', + 'onslotchange', + 'onstalled', + 'onsubmit', + 'onsuspend', + 'ontimeupdate', + 'ontoggle', + 'ontouchcancel', + 'ontouchend', + 'ontouchmove', + 'ontouchstart', + 'ontransitioncancel', + 'ontransitionend', + 'ontransitionrun', + 'ontransitionstart', + 'onvolumechange', + 'onwaiting', + 'onwheel' +]); + export function getDocumentRegions(languageService: LanguageService, document: TextDocument): HTMLDocumentRegions { const regions: EmbeddedRegion[] = []; @@ -243,9 +341,8 @@ function append(result: string, str: string, n: number): string { } function getAttributeLanguage(attributeName: string): string | null { - const match = attributeName.match(/^(style)$|^(on\w+)$/i); - if (!match) { - return null; + if (attributeName.toLowerCase() === 'style') { + return 'css'; } - return match[1] ? 'css' : 'javascript'; + return eventHandlerAttributes.has(attributeName.toLowerCase()) ? 'javascript' : null; } diff --git a/extensions/html-language-features/server/src/test/embedded.test.ts b/extensions/html-language-features/server/src/test/embedded.test.ts index 1452d02b7c4900..38e32edcc5c62b 100644 --- a/extensions/html-language-features/server/src/test/embedded.test.ts +++ b/extensions/html-language-features/server/src/test/embedded.test.ts @@ -114,6 +114,8 @@ suite('HTML Embedded Support', () => { assertLanguageId('