]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-core): support interpolation in RCDATA mode (e.g. textarea)
authorEvan You <yyx990803@gmail.com>
Mon, 23 Mar 2020 21:25:29 +0000 (17:25 -0400)
committerEvan You <yyx990803@gmail.com>
Mon, 23 Mar 2020 21:25:29 +0000 (17:25 -0400)
packages/compiler-core/src/parse.ts
packages/compiler-dom/__tests__/parse.spec.ts

index 648511c8353e3fe758ea18e53ef7f0506a754e32..a45a7f37b7982f658c63a321bd4e11b3d8b65c74 100644 (file)
@@ -111,11 +111,11 @@ function parseChildren(
     const s = context.source
     let node: TemplateChildNode | TemplateChildNode[] | undefined = undefined
 
-    if (mode === TextModes.DATA) {
+    if (mode === TextModes.DATA || mode === TextModes.RCDATA) {
       if (!context.inPre && startsWith(s, context.options.delimiters[0])) {
         // '{{'
         node = parseInterpolation(context, mode)
-      } else if (s[0] === '<') {
+      } else if (mode === TextModes.DATA && s[0] === '<') {
         // https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state
         if (s.length === 1) {
           emitError(context, ErrorCodes.EOF_BEFORE_TAG_NAME, 1)
index e10cf2555937e2bc0813207b036cc10369268f75..809d014fa65a8cd15fb06258bea6a18432f99046 100644 (file)
@@ -49,6 +49,22 @@ describe('DOM parser', () => {
       })
     })
 
+    test('textarea support interpolation', () => {
+      const ast = parse('<textarea><div>{{ foo }}</textarea>', parserOptions)
+      const element = ast.children[0] as ElementNode
+      expect(element.children).toMatchObject([
+        { type: NodeTypes.TEXT, content: `<div>` },
+        {
+          type: NodeTypes.INTERPOLATION,
+          content: {
+            type: NodeTypes.SIMPLE_EXPRESSION,
+            content: `foo`,
+            isStatic: false
+          }
+        }
+      ])
+    })
+
     test('style handles comments/elements as just a text', () => {
       const ast = parse(
         '<style>some<div>text</div>and<!--comment--></style>',