fix(compiler-dom): stringify eligible svg content

fix #4282
This commit is contained in:
Evan You
2021-08-09 14:39:40 -04:00
parent f258f5d2c2
commit 2641422aa7
3 changed files with 88 additions and 7 deletions

View File

@@ -20,14 +20,16 @@ import {
isVoidTag,
isString,
isSymbol,
isKnownAttr,
isKnownHtmlAttr,
escapeHtml,
toDisplayString,
normalizeClass,
normalizeStyle,
stringifyStyle,
makeMap
makeMap,
isKnownSvgAttr
} from '@vue/shared'
import { DOMNamespaces } from '../parserOptions'
export const enum StringifyThresholds {
ELEMENT_WITH_BINDING_COUNT = 5,
@@ -138,8 +140,14 @@ const getHoistedNode = (node: TemplateChildNode) =>
node.codegenNode.hoisted
const dataAriaRE = /^(data|aria)-/
const isStringifiableAttr = (name: string) => {
return isKnownAttr(name) || dataAriaRE.test(name)
const isStringifiableAttr = (name: string, ns: DOMNamespaces) => {
return (
(ns === DOMNamespaces.HTML
? isKnownHtmlAttr(name)
: ns === DOMNamespaces.SVG
? isKnownSvgAttr(name)
: false) || dataAriaRE.test(name)
)
}
const replaceHoist = (
@@ -175,6 +183,7 @@ function analyzeNode(node: StringifiableNode): [number, number] | false {
let ec = node.props.length > 0 ? 1 : 0 // element w/ binding count
let bailed = false
const bail = (): false => {
debugger
bailed = true
return false
}
@@ -187,7 +196,10 @@ function analyzeNode(node: StringifiableNode): [number, number] | false {
for (let i = 0; i < node.props.length; i++) {
const p = node.props[i]
// bail on non-attr bindings
if (p.type === NodeTypes.ATTRIBUTE && !isStringifiableAttr(p.name)) {
if (
p.type === NodeTypes.ATTRIBUTE &&
!isStringifiableAttr(p.name, node.ns)
) {
return bail()
}
if (p.type === NodeTypes.DIRECTIVE && p.name === 'bind') {
@@ -195,7 +207,7 @@ function analyzeNode(node: StringifiableNode): [number, number] | false {
if (
p.arg &&
(p.arg.type === NodeTypes.COMPOUND_EXPRESSION ||
(p.arg.isStatic && !isStringifiableAttr(p.arg.content)))
(p.arg.isStatic && !isStringifiableAttr(p.arg.content, node.ns)))
) {
return bail()
}