]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-dom): setting innerHTML when patching props should go through trusted...
authorEvan You <evan@vuejs.org>
Wed, 28 Aug 2024 09:37:39 +0000 (17:37 +0800)
committerEvan You <evan@vuejs.org>
Wed, 28 Aug 2024 09:37:39 +0000 (17:37 +0800)
packages/runtime-dom/src/modules/props.ts
packages/runtime-dom/src/nodeOps.ts

index 7b7b700e0487dff3233ea2e338f9acae85ebf6f3..4dfcee6aee668ed65f99547dd1c4be026344ab53 100644 (file)
@@ -1,9 +1,6 @@
-// __UNSAFE__
-// Reason: potentially setting innerHTML.
-// This can come from explicit usage of v-html or innerHTML as a prop in render
-
 import { DeprecationTypes, compatUtils, warn } from '@vue/runtime-core'
 import { includeBooleanAttr } from '@vue/shared'
+import { unsafeToTrustedHTML } from '../nodeOps'
 
 // functions. The user is responsible for using them with only trusted content.
 export function patchDOMProp(
@@ -12,11 +9,15 @@ export function patchDOMProp(
   value: any,
   parentComponent: any,
 ): void {
+  // __UNSAFE__
+  // Reason: potentially setting innerHTML.
+  // This can come from explicit usage of v-html or innerHTML as a prop in render
   if (key === 'innerHTML' || key === 'textContent') {
     // null value case is handled in renderer patchElement before patching
     // children
-    if (value == null) return
-    el[key] = value
+    if (value != null) {
+      el[key] = key === 'innerHTML' ? unsafeToTrustedHTML(value) : value
+    }
     return
   }
 
index 8ed70c7d330c1ebd8345b52d15a2772cea8554dc..d7422bf616465e3bb9d4248b971642b82376f283 100644 (file)
@@ -31,9 +31,8 @@ if (tt) {
 // This function merely perform a type-level trusted type conversion
 // for use in `innerHTML` assignment, etc.
 // Be careful of whatever value passed to this function.
-const unsafeToTrustedHTML: (value: string) => TrustedHTML | string = policy
-  ? val => policy.createHTML(val)
-  : val => val
+export const unsafeToTrustedHTML: (value: string) => TrustedHTML | string =
+  policy ? val => policy.createHTML(val) : val => val
 
 export const svgNS = 'http://www.w3.org/2000/svg'
 export const mathmlNS = 'http://www.w3.org/1998/Math/MathML'