]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(cssVars): correctly escape double quotes in SSR (#11784)
authoredison <daiwei521@126.com>
Tue, 3 Sep 2024 09:39:07 +0000 (17:39 +0800)
committerGitHub <noreply@github.com>
Tue, 3 Sep 2024 09:39:07 +0000 (17:39 +0800)
close #11779

packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap
packages/compiler-sfc/__tests__/compileScript.spec.ts
packages/shared/src/escapeHtml.ts

index e175cc0a8744b482e1400243afdf0e5b690f4541..e092d83e74312a069e7e1d9a37ea46ca6569c863 100644 (file)
@@ -880,11 +880,13 @@ export default {
 
         const count = ref(0)
         const style = { color: 'red' }
+        const height = ref(0)
         
 return (_ctx, _push, _parent, _attrs) => {
   const _cssVars = { style: {
   "--xxxxxxxx-count": (count.value),
-  "--xxxxxxxx-style\\\\.color": (style.color)
+  "--xxxxxxxx-style\\\\.color": (style.color),
+  "--xxxxxxxx-height\\\\ \\\\+\\\\ \\\\\\"px\\\\\\"": (height.value + "px")
 }}
   _push(\`<!--[--><div\${
     _ssrRenderAttrs(_cssVars)
index efc5af522e75863f08f0657067e09cd695ced1e0..5e20b8a63e10a65db198574c47f8ece5d4347dee 100644 (file)
@@ -606,6 +606,7 @@ describe('SFC compile <script setup>', () => {
         import { ref } from 'vue'
         const count = ref(0)
         const style = { color: 'red' }
+        const height = ref(0)
         </script>
         <template>
           <div>{{ count }}</div>
@@ -614,6 +615,7 @@ describe('SFC compile <script setup>', () => {
         <style>
         div { color: v-bind(count) }
         span { color: v-bind(style.color) }
+        span { color: v-bind(height + "px") }
         </style>
         `,
         {
@@ -629,6 +631,9 @@ describe('SFC compile <script setup>', () => {
       expect(content).not.toMatch(`useCssVars`)
       expect(content).toMatch(`"--${mockId}-count": (count.value)`)
       expect(content).toMatch(`"--${mockId}-style\\\\.color": (style.color)`)
+      expect(content).toMatch(
+        `"--${mockId}-height\\\\ \\\\+\\\\ \\\\\\"px\\\\\\"": (height.value + "px")`,
+      )
       assertCode(content)
     })
 
index 94d07fd4120dd2434abe93b8afa5e1bf4676a4d0..e3af6c0c11f86f1355ab61f5767bdf9db019ad87 100644 (file)
@@ -59,6 +59,6 @@ export function getEscapedCssVarName(
   doubleEscape: boolean,
 ): string {
   return key.replace(cssVarNameEscapeSymbolsRE, s =>
-    doubleEscape ? `\\\\${s}` : `\\${s}`,
+    doubleEscape ? (s === '"' ? '\\\\\\"' : `\\\\${s}`) : `\\${s}`,
   )
 }