fix(parser): should not treat uppercase components as special tags

close #10395
This commit is contained in:
Evan You 2024-02-25 23:04:26 +08:00
parent 9a365fe00d
commit e0e02535cd
2 changed files with 21 additions and 10 deletions

View File

@ -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

View File

@ -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>&amp;</textarea>', parserOptions) const ast = parse('<textarea>&amp;</textarea>', parserOptions)
const element = ast.children[0] as ElementNode const element = ast.children[0] as ElementNode