From 69185c4af156e66c2b69de1dbb7ff9faf10fd5aa Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 15 Aug 2024 19:45:00 -0400 Subject: [PATCH] Ensure parsers initiated from DOMParser always complete. (#33056) * Ensure parsers initiated from DOMParser always complete. Signed-off-by: Josh Matthews * Add test for parseFromString with async parser. Signed-off-by: Josh Matthews * Add expected failure. Signed-off-by: Josh Matthews --------- Signed-off-by: Josh Matthews --- components/script/dom/servoparser/mod.rs | 43 ++++--------------- .../xhr/responsexml-non-well-formed.htm.ini | 3 ++ tests/wpt/mozilla/meta/MANIFEST.json | 7 +++ .../DOMParser-parseFromString.html.ini | 2 + .../mozilla/DOMParser-parseFromString.html | 15 +++++++ 5 files changed, 36 insertions(+), 34 deletions(-) create mode 100644 tests/wpt/mozilla/meta/mozilla/DOMParser-parseFromString.html.ini create mode 100644 tests/wpt/mozilla/tests/mozilla/DOMParser-parseFromString.html diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs index 7169cba5e13..5323012e979 100644 --- a/components/script/dom/servoparser/mod.rs +++ b/components/script/dom/servoparser/mod.rs @@ -128,12 +128,6 @@ pub struct ServoParser { prefetch_input: DomRefCell, } -#[derive(PartialEq)] -enum LastChunkState { - Received, - NotReceived, -} - pub struct ElementAttribute { name: QualName, value: DOMString, @@ -161,7 +155,6 @@ impl ServoParser { ServoParser::new( document, Tokenizer::AsyncHtml(self::async_html::Tokenizer::new(document, url, None)), - LastChunkState::NotReceived, ParserKind::Normal, ) } else { @@ -173,14 +166,13 @@ impl ServoParser { None, ParsingAlgorithm::Normal, )), - LastChunkState::NotReceived, ParserKind::Normal, ) }; // Set as the document's current parser and initialize with `input`, if given. if let Some(input) = input { - parser.parse_string_chunk(String::from(input)); + parser.parse_complete_string_chunk(String::from(input)); } else { parser.document.set_current_parser(Some(&parser)); } @@ -239,10 +231,9 @@ impl ServoParser { Some(fragment_context), ParsingAlgorithm::Fragment, )), - LastChunkState::Received, ParserKind::Normal, ); - parser.parse_string_chunk(String::from(input)); + parser.parse_complete_string_chunk(String::from(input)); // Step 14. let root_element = document.GetDocumentElement().expect("no document element"); @@ -260,7 +251,6 @@ impl ServoParser { None, ParsingAlgorithm::Normal, )), - LastChunkState::NotReceived, ParserKind::ScriptCreated, ); *parser.bom_sniff.borrow_mut() = None; @@ -271,13 +261,12 @@ impl ServoParser { let parser = ServoParser::new( document, Tokenizer::Xml(self::xml::Tokenizer::new(document, url)), - LastChunkState::NotReceived, ParserKind::Normal, ); // Set as the document's current parser and initialize with `input`, if given. if let Some(input) = input { - parser.parse_string_chunk(String::from(input)); + parser.parse_complete_string_chunk(String::from(input)); } else { parser.document.set_current_parser(Some(&parser)); } @@ -421,12 +410,7 @@ impl ServoParser { } #[allow(crown::unrooted_must_root)] - fn new_inherited( - document: &Document, - tokenizer: Tokenizer, - last_chunk_state: LastChunkState, - kind: ParserKind, - ) -> Self { + fn new_inherited(document: &Document, tokenizer: Tokenizer, kind: ParserKind) -> Self { ServoParser { reflector: Reflector::new(), document: Dom::from_ref(document), @@ -435,7 +419,7 @@ impl ServoParser { network_input: DomRefCell::new(BufferQueue::default()), script_input: DomRefCell::new(BufferQueue::default()), tokenizer: DomRefCell::new(tokenizer), - last_chunk_received: Cell::new(last_chunk_state == LastChunkState::Received), + last_chunk_received: Cell::new(false), suspended: Default::default(), script_nesting_level: Default::default(), aborted: Default::default(), @@ -446,19 +430,9 @@ impl ServoParser { } #[allow(crown::unrooted_must_root)] - fn new( - document: &Document, - tokenizer: Tokenizer, - last_chunk_state: LastChunkState, - kind: ParserKind, - ) -> DomRoot { + fn new(document: &Document, tokenizer: Tokenizer, kind: ParserKind) -> DomRoot { reflect_dom_object( - Box::new(ServoParser::new_inherited( - document, - tokenizer, - last_chunk_state, - kind, - )), + Box::new(ServoParser::new_inherited(document, tokenizer, kind)), document.window(), ) } @@ -579,9 +553,10 @@ impl ServoParser { } } - fn parse_string_chunk(&self, input: String) { + fn parse_complete_string_chunk(&self, input: String) { self.document.set_current_parser(Some(self)); self.push_string_input_chunk(input); + self.last_chunk_received.set(true); if !self.suspended.get() { self.parse_sync(); } diff --git a/tests/wpt/meta/xhr/responsexml-non-well-formed.htm.ini b/tests/wpt/meta/xhr/responsexml-non-well-formed.htm.ini index 84933acc13e..61f550740e4 100644 --- a/tests/wpt/meta/xhr/responsexml-non-well-formed.htm.ini +++ b/tests/wpt/meta/xhr/responsexml-non-well-formed.htm.ini @@ -1,4 +1,7 @@ [responsexml-non-well-formed.htm] + [XMLHttpRequest: responseXML non well-formed tests] + expected: FAIL + [XMLHttpRequest: responseXML non well-formed tests 1] expected: FAIL diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index c286b5eddd3..fd72059ce36 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -12632,6 +12632,13 @@ } ] ], + "DOMParser-parseFromString.html": [ + "38715db5d923e4f153e2c4a2679f644fe1e6d14d", + [ + null, + {} + ] + ], "DOMParser.html": [ "f386a3e0191af2c70dcb05790ce7db15dd5ccbf1", [ diff --git a/tests/wpt/mozilla/meta/mozilla/DOMParser-parseFromString.html.ini b/tests/wpt/mozilla/meta/mozilla/DOMParser-parseFromString.html.ini new file mode 100644 index 00000000000..6fb710b0407 --- /dev/null +++ b/tests/wpt/mozilla/meta/mozilla/DOMParser-parseFromString.html.ini @@ -0,0 +1,2 @@ +[DOMParser-parseFromString.html] + prefs: ["dom.servoparser.async_html_tokenizer.enabled:true"] diff --git a/tests/wpt/mozilla/tests/mozilla/DOMParser-parseFromString.html b/tests/wpt/mozilla/tests/mozilla/DOMParser-parseFromString.html new file mode 100644 index 00000000000..38715db5d92 --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/DOMParser-parseFromString.html @@ -0,0 +1,15 @@ + + +Verify that parseFromString does not panic + + + +