mirror of https://github.com/vuejs/core.git
fix(parser): should not treat uppercase components as special tags
close #10395
This commit is contained in:
parent
9a365fe00d
commit
e0e02535cd
|
@ -553,12 +553,11 @@ export default class Tokenizer {
|
||||||
// HTML mode
|
// HTML mode
|
||||||
// - <script>, <style> RAWTEXT
|
// - <script>, <style> RAWTEXT
|
||||||
// - <title>, <textarea> RCDATA
|
// - <title>, <textarea> RCDATA
|
||||||
const lower = c | 0x20
|
if (c === 116 /* t */) {
|
||||||
if (lower === 116 /* t */) {
|
|
||||||
this.state = State.BeforeSpecialT
|
this.state = State.BeforeSpecialT
|
||||||
} else {
|
} else {
|
||||||
this.state =
|
this.state =
|
||||||
lower === 115 /* s */ ? State.BeforeSpecialS : State.InTagName
|
c === 115 /* s */ ? State.BeforeSpecialS : State.InTagName
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.state = State.InTagName
|
this.state = State.InTagName
|
||||||
|
@ -862,10 +861,9 @@ export default class Tokenizer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private stateBeforeSpecialS(c: number): void {
|
private stateBeforeSpecialS(c: number): void {
|
||||||
const lower = c | 0x20
|
if (c === Sequences.ScriptEnd[3]) {
|
||||||
if (lower === Sequences.ScriptEnd[3]) {
|
|
||||||
this.startSpecial(Sequences.ScriptEnd, 4)
|
this.startSpecial(Sequences.ScriptEnd, 4)
|
||||||
} else if (lower === Sequences.StyleEnd[3]) {
|
} else if (c === Sequences.StyleEnd[3]) {
|
||||||
this.startSpecial(Sequences.StyleEnd, 4)
|
this.startSpecial(Sequences.StyleEnd, 4)
|
||||||
} else {
|
} else {
|
||||||
this.state = State.InTagName
|
this.state = State.InTagName
|
||||||
|
@ -873,10 +871,9 @@ export default class Tokenizer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private stateBeforeSpecialT(c: number): void {
|
private stateBeforeSpecialT(c: number): void {
|
||||||
const lower = c | 0x20
|
if (c === Sequences.TitleEnd[3]) {
|
||||||
if (lower === Sequences.TitleEnd[3]) {
|
|
||||||
this.startSpecial(Sequences.TitleEnd, 4)
|
this.startSpecial(Sequences.TitleEnd, 4)
|
||||||
} else if (lower === Sequences.TextareaEnd[3]) {
|
} else if (c === Sequences.TextareaEnd[3]) {
|
||||||
this.startSpecial(Sequences.TextareaEnd, 4)
|
this.startSpecial(Sequences.TextareaEnd, 4)
|
||||||
} else {
|
} else {
|
||||||
this.state = State.InTagName
|
this.state = State.InTagName
|
||||||
|
|
|
@ -20,7 +20,7 @@ describe('DOM parser', () => {
|
||||||
)
|
)
|
||||||
const element = ast.children[0] as ElementNode
|
const element = ast.children[0] as ElementNode
|
||||||
const text = element.children[0] as TextNode
|
const text = element.children[0] as TextNode
|
||||||
|
expect(element.children.length).toBe(1)
|
||||||
expect(text).toStrictEqual({
|
expect(text).toStrictEqual({
|
||||||
type: NodeTypes.TEXT,
|
type: NodeTypes.TEXT,
|
||||||
content: 'some<div>text</div>and<!--comment-->',
|
content: 'some<div>text</div>and<!--comment-->',
|
||||||
|
@ -32,6 +32,20 @@ describe('DOM parser', () => {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('should not treat Uppercase component as special tag', () => {
|
||||||
|
const ast = parse(
|
||||||
|
'<TextArea>some<div>text</div>and<!--comment--></TextArea>',
|
||||||
|
parserOptions,
|
||||||
|
)
|
||||||
|
const element = ast.children[0] as ElementNode
|
||||||
|
expect(element.children.map(n => n.type)).toMatchObject([
|
||||||
|
NodeTypes.TEXT,
|
||||||
|
NodeTypes.ELEMENT,
|
||||||
|
NodeTypes.TEXT,
|
||||||
|
NodeTypes.COMMENT,
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
test('textarea handles entities', () => {
|
test('textarea handles entities', () => {
|
||||||
const ast = parse('<textarea>&</textarea>', parserOptions)
|
const ast = parse('<textarea>&</textarea>', parserOptions)
|
||||||
const element = ast.children[0] as ElementNode
|
const element = ast.children[0] as ElementNode
|
||||||
|
|
Loading…
Reference in New Issue