diff --git a/crates/swc_html_minifier/tests/fixture/attribute/textarea/output.min.html b/crates/swc_html_minifier/tests/fixture/attribute/textarea/output.min.html index b2bb77942c1..855f5a9fe96 100644 --- a/crates/swc_html_minifier/tests/fixture/attribute/textarea/output.min.html +++ b/crates/swc_html_minifier/tests/fixture/attribute/textarea/output.min.html @@ -3,5 +3,5 @@ -</body> -</html> + + diff --git a/crates/swc_html_parser/src/parser/mod.rs b/crates/swc_html_parser/src/parser/mod.rs index fb85aa9c0ff..65701066c44 100644 --- a/crates/swc_html_parser/src/parser/mod.rs +++ b/crates/swc_html_parser/src/parser/mod.rs @@ -3398,14 +3398,16 @@ where Token::StartTag { tag_name, .. } if tag_name == "textarea" => { self.insert_html_element(token_and_info)?; + // To prevent parsing more tokens in lexer we set state before taking + self.input.set_input_state(State::Rcdata); + match self.input.cur()? { Some(Token::Character { value, .. }) if *value == '\x0A' => { bump!(self); } _ => {} - } + }; - self.input.set_input_state(State::Rcdata); self.original_insertion_mode = self.insertion_mode.clone(); self.frameset_ok = false; self.insertion_mode = InsertionMode::Text; diff --git a/crates/swc_html_parser/tests/recovery/comment/inside-textarea/input.html b/crates/swc_html_parser/tests/recovery/comment/inside-textarea/input.html new file mode 100644 index 00000000000..3142cf7d700 --- /dev/null +++ b/crates/swc_html_parser/tests/recovery/comment/inside-textarea/input.html @@ -0,0 +1 @@ +--> \ No newline at end of file diff --git a/crates/swc_html_parser/tests/recovery/comment/inside-textarea/output.json b/crates/swc_html_parser/tests/recovery/comment/inside-textarea/output.json new file mode 100644 index 00000000000..8899ffb3d79 --- /dev/null +++ b/crates/swc_html_parser/tests/recovery/comment/inside-textarea/output.json @@ -0,0 +1,84 @@ +{ + "type": "Document", + "span": { + "start": 0, + "end": 39, + "ctxt": 0 + }, + "mode": "no-quirks", + "children": [ + { + "type": "Element", + "span": { + "start": 0, + "end": 28, + "ctxt": 0 + }, + "tagName": "html", + "namespace": "http://www.w3.org/1999/xhtml", + "attributes": [], + "children": [ + { + "type": "Element", + "span": { + "start": 0, + "end": 10, + "ctxt": 0 + }, + "tagName": "head", + "namespace": "http://www.w3.org/1999/xhtml", + "attributes": [], + "children": [], + "content": null + }, + { + "type": "Element", + "span": { + "start": 0, + "end": 28, + "ctxt": 0 + }, + "tagName": "body", + "namespace": "http://www.w3.org/1999/xhtml", + "attributes": [], + "children": [ + { + "type": "Element", + "span": { + "start": 0, + "end": 14, + "ctxt": 0 + }, + "tagName": "textarea", + "namespace": "http://www.w3.org/1999/xhtml", + "attributes": [], + "children": [ + { + "type": "Text", + "span": { + "start": 10, + "end": 14, + "ctxt": 0 + }, + "value": "" + } + ], + "content": null + } + ], + "content": null + } + ] +} diff --git a/crates/swc_html_parser/tests/recovery/comment/inside-textarea/output.stderr b/crates/swc_html_parser/tests/recovery/comment/inside-textarea/output.stderr new file mode 100644 index 00000000000..caed1fd7c45 --- /dev/null +++ b/crates/swc_html_parser/tests/recovery/comment/inside-textarea/output.stderr @@ -0,0 +1,6 @@ + + x Unexpected token + ,-[$DIR/tests/recovery/comment/inside-textarea/input.html:1:1] + 1 | --> + : ^^^^^^^^^^^ + `---- diff --git a/crates/swc_html_parser/tests/recovery/comment/inside-textarea/span.rust-debug b/crates/swc_html_parser/tests/recovery/comment/inside-textarea/span.rust-debug new file mode 100644 index 00000000000..6db8f565331 --- /dev/null +++ b/crates/swc_html_parser/tests/recovery/comment/inside-textarea/span.rust-debug @@ -0,0 +1,66 @@ + + x Document + ,-[$DIR/tests/recovery/comment/inside-textarea/input.html:1:1] + 1 | --> + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Child + ,-[$DIR/tests/recovery/comment/inside-textarea/input.html:1:1] + 1 | --> + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Element + ,-[$DIR/tests/recovery/comment/inside-textarea/input.html:1:1] + 1 | --> + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Child + ,-[$DIR/tests/recovery/comment/inside-textarea/input.html:1:1] + 1 | --> + : ^^^^^^^^^^ + `---- + + x Element + ,-[$DIR/tests/recovery/comment/inside-textarea/input.html:1:1] + 1 | --> + : ^^^^^^^^^^ + `---- + + x Child + ,-[$DIR/tests/recovery/comment/inside-textarea/input.html:1:1] + 1 | --> + : ^^^^^^^^^^^^^^ + `---- + + x Element + ,-[$DIR/tests/recovery/comment/inside-textarea/input.html:1:1] + 1 | --> + : ^^^^^^^^^^^^^^ + `---- + + x Child + ,-[$DIR/tests/recovery/comment/inside-textarea/input.html:1:1] + 1 | --> + : ^^^^ + `---- + + x Text + ,-[$DIR/tests/recovery/comment/inside-textarea/input.html:1:1] + 1 | --> + : ^^^^ + `---- + + x Child + ,-[$DIR/tests/recovery/comment/inside-textarea/input.html:1:1] + 1 | --> + : ^^^ + `---- + + x Text + ,-[$DIR/tests/recovery/comment/inside-textarea/input.html:1:1] + 1 | --> + : ^^^ + `---- diff --git a/crates/swc_html_parser/tests/recovery/element/textarea/output.json b/crates/swc_html_parser/tests/recovery/element/textarea/output.json index ecd9dd5d833..8899ffb3d79 100644 --- a/crates/swc_html_parser/tests/recovery/element/textarea/output.json +++ b/crates/swc_html_parser/tests/recovery/element/textarea/output.json @@ -11,7 +11,7 @@ "type": "Element", "span": { "start": 0, - "end": 10, + "end": 28, "ctxt": 0 }, "tagName": "html", @@ -35,7 +35,7 @@ "type": "Element", "span": { "start": 0, - "end": 10, + "end": 28, "ctxt": 0 }, "tagName": "body", @@ -46,14 +46,33 @@ "type": "Element", "span": { "start": 0, - "end": 10, + "end": 14, "ctxt": 0 }, "tagName": "textarea", "namespace": "http://www.w3.org/1999/xhtml", "attributes": [], - "children": [], + "children": [ + { + "type": "Text", + "span": { + "start": 10, + "end": 14, + "ctxt": 0 + }, + "value": "" } ], "content": null diff --git a/crates/swc_html_parser/tests/recovery/element/textarea/span.rust-debug b/crates/swc_html_parser/tests/recovery/element/textarea/span.rust-debug index 16d8294e593..bd727ff1ddb 100644 --- a/crates/swc_html_parser/tests/recovery/element/textarea/span.rust-debug +++ b/crates/swc_html_parser/tests/recovery/element/textarea/span.rust-debug @@ -5,6 +5,18 @@ : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `---- + x Child + ,-[$DIR/tests/recovery/element/textarea/input.html:1:1] + 1 | --> + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Element + ,-[$DIR/tests/recovery/element/textarea/input.html:1:1] + 1 | --> + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + x Child ,-[$DIR/tests/recovery/element/textarea/input.html:1:1] 1 | --> @@ -16,3 +28,39 @@ 1 | --> : ^^^^^^^^^^ `---- + + x Child + ,-[$DIR/tests/recovery/element/textarea/input.html:1:1] + 1 | --> + : ^^^^^^^^^^^^^^ + `---- + + x Element + ,-[$DIR/tests/recovery/element/textarea/input.html:1:1] + 1 | --> + : ^^^^^^^^^^^^^^ + `---- + + x Child + ,-[$DIR/tests/recovery/element/textarea/input.html:1:1] + 1 | --> + : ^^^^ + `---- + + x Text + ,-[$DIR/tests/recovery/element/textarea/input.html:1:1] + 1 | --> + : ^^^^ + `---- + + x Child + ,-[$DIR/tests/recovery/element/textarea/input.html:1:1] + 1 | --> + : ^^^ + `---- + + x Text + ,-[$DIR/tests/recovery/element/textarea/input.html:1:1] + 1 | --> + : ^^^ + `----