diff options
author | Simon Wülker <simon.wuelker@arcor.de> | 2025-04-08 18:40:14 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-08 16:40:14 +0000 |
commit | 9af9507920abccfd45fb5d8c98e564daa3f45419 (patch) | |
tree | c1c36935e6bdc72e49b49e62398f1f46140dce76 /components | |
parent | ce4ca9ee98ecc30dd7d35034ec3cb6ec6becfc70 (diff) | |
download | servo-9af9507920abccfd45fb5d8c98e564daa3f45419.tar.gz servo-9af9507920abccfd45fb5d8c98e564daa3f45419.zip |
Unify the way html5ever and xml5ever block on script elements (#36284)
Companion PR for https://github.com/servo/html5ever/pull/591
Testing: Covered by WPT
Part of https://github.com/servo/servo/issues/6414,
https://github.com/servo/servo/issues/24898, preparation for
https://github.com/servo/html5ever/pull/590
---------
Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
Diffstat (limited to 'components')
-rw-r--r-- | components/script/Cargo.toml | 1 | ||||
-rw-r--r-- | components/script/dom/servoparser/async_html.rs | 10 | ||||
-rw-r--r-- | components/script/dom/servoparser/html.rs | 3 | ||||
-rw-r--r-- | components/script/dom/servoparser/mod.rs | 13 | ||||
-rw-r--r-- | components/script/dom/servoparser/prefetch.rs | 3 | ||||
-rw-r--r-- | components/script/dom/servoparser/xml.rs | 18 |
6 files changed, 23 insertions, 25 deletions
diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index 691afd3935e..37e80d0e748 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -84,6 +84,7 @@ libc = { workspace = true } log = { workspace = true } malloc_size_of = { workspace = true } malloc_size_of_derive = { workspace = true } +markup5ever = { workspace = true } media = { path = "../media" } metrics = { path = "../metrics" } mime = { workspace = true } diff --git a/components/script/dom/servoparser/async_html.rs b/components/script/dom/servoparser/async_html.rs index 3b3df28d4a9..7ddc425678e 100644 --- a/components/script/dom/servoparser/async_html.rs +++ b/components/script/dom/servoparser/async_html.rs @@ -14,14 +14,14 @@ use crossbeam_channel::{Receiver, Sender, unbounded}; use html5ever::buffer_queue::BufferQueue; use html5ever::tendril::fmt::UTF8; use html5ever::tendril::{SendTendril, StrTendril, Tendril}; -use html5ever::tokenizer::{Tokenizer as HtmlTokenizer, TokenizerOpts, TokenizerResult}; +use html5ever::tokenizer::{Tokenizer as HtmlTokenizer, TokenizerOpts}; use html5ever::tree_builder::{ - ElementFlags, NextParserState, NodeOrText as HtmlNodeOrText, QuirksMode, TreeBuilder, - TreeBuilderOpts, TreeSink, + ElementFlags, NodeOrText as HtmlNodeOrText, QuirksMode, TreeBuilder, TreeBuilderOpts, TreeSink, }; use html5ever::{ Attribute as HtmlAttribute, ExpandedName, QualName, local_name, namespace_url, ns, }; +use markup5ever::TokenizerResult; use servo_url::ServoUrl; use style::context::QuirksMode as ServoQuirksMode; @@ -901,10 +901,6 @@ impl TreeSink for Sink { self.send_op(ParseOperation::MarkScriptAlreadyStarted { node: node.id }); } - fn complete_script(&self, _: &Self::Handle) -> NextParserState { - panic!("complete_script should not be called here!"); - } - fn reparent_children(&self, parent: &Self::Handle, new_parent: &Self::Handle) { self.send_op(ParseOperation::ReparentChildren { parent: parent.id, diff --git a/components/script/dom/servoparser/html.rs b/components/script/dom/servoparser/html.rs index 14d75a355d4..3bd486b5cb7 100644 --- a/components/script/dom/servoparser/html.rs +++ b/components/script/dom/servoparser/html.rs @@ -10,9 +10,10 @@ use std::io; use html5ever::buffer_queue::BufferQueue; use html5ever::serialize::TraversalScope::IncludeNode; use html5ever::serialize::{AttrRef, Serialize, Serializer, TraversalScope}; -use html5ever::tokenizer::{Tokenizer as HtmlTokenizer, TokenizerOpts, TokenizerResult}; +use html5ever::tokenizer::{Tokenizer as HtmlTokenizer, TokenizerOpts}; use html5ever::tree_builder::{TreeBuilder, TreeBuilderOpts}; use html5ever::{QualName, local_name, namespace_url, ns}; +use markup5ever::TokenizerResult; use script_bindings::trace::CustomTraceable; use servo_url::ServoUrl; use xml5ever::LocalName; diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs index eb1e8d687bd..2652e44e02c 100644 --- a/components/script/dom/servoparser/mod.rs +++ b/components/script/dom/servoparser/mod.rs @@ -16,10 +16,10 @@ use encoding_rs::Encoding; use html5ever::buffer_queue::BufferQueue; use html5ever::tendril::fmt::UTF8; use html5ever::tendril::{ByteTendril, StrTendril, TendrilSink}; -use html5ever::tokenizer::TokenizerResult; -use html5ever::tree_builder::{ElementFlags, NextParserState, NodeOrText, QuirksMode, TreeSink}; +use html5ever::tree_builder::{ElementFlags, NodeOrText, QuirksMode, TreeSink}; use html5ever::{Attribute, ExpandedName, LocalName, QualName, local_name, namespace_url, ns}; use hyper_serde::Serde; +use markup5ever::TokenizerResult; use mime::{self, Mime}; use net_traits::request::RequestId; use net_traits::{ @@ -1356,15 +1356,6 @@ impl TreeSink for Sink { } } - fn complete_script(&self, node: &Dom<Node>) -> NextParserState { - if let Some(script) = node.downcast() { - self.script.set(Some(script)); - NextParserState::Suspend - } else { - NextParserState::Continue - } - } - fn reparent_children(&self, node: &Dom<Node>, new_parent: &Dom<Node>) { while let Some(ref child) = node.GetFirstChild() { new_parent.AppendChild(child, CanGc::note()).unwrap(); diff --git a/components/script/dom/servoparser/prefetch.rs b/components/script/dom/servoparser/prefetch.rs index 250b92f8c8b..8191363bf20 100644 --- a/components/script/dom/servoparser/prefetch.rs +++ b/components/script/dom/servoparser/prefetch.rs @@ -10,10 +10,11 @@ use content_security_policy::Destination; use html5ever::buffer_queue::BufferQueue; use html5ever::tokenizer::states::RawKind; use html5ever::tokenizer::{ - Tag, TagKind, Token, TokenSink, TokenSinkResult, Tokenizer as HtmlTokenizer, TokenizerResult, + Tag, TagKind, Token, TokenSink, TokenSinkResult, Tokenizer as HtmlTokenizer, }; use html5ever::{Attribute, LocalName, local_name}; use js::jsapi::JSTracer; +use markup5ever::TokenizerResult; use net_traits::request::{ CorsSettings, CredentialsMode, InsecureRequestsPolicy, ParserMetadata, Referrer, }; diff --git a/components/script/dom/servoparser/xml.rs b/components/script/dom/servoparser/xml.rs index 218fdfaece5..f132cbcb3fd 100644 --- a/components/script/dom/servoparser/xml.rs +++ b/components/script/dom/servoparser/xml.rs @@ -6,13 +6,14 @@ use std::cell::Cell; -use html5ever::tokenizer::TokenizerResult; +use markup5ever::TokenizerResult; use script_bindings::trace::CustomTraceable; use servo_url::ServoUrl; use xml5ever::buffer_queue::BufferQueue; use xml5ever::tokenizer::XmlTokenizer; use xml5ever::tree_builder::XmlTreeBuilder; +use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::document::Document; use crate::dom::htmlscriptelement::HTMLScriptElement; @@ -43,10 +44,17 @@ impl Tokenizer { } pub(crate) fn feed(&self, input: &BufferQueue) -> TokenizerResult<DomRoot<HTMLScriptElement>> { - self.inner.run(input); - match self.inner.sink.sink.script.take() { - Some(script) => TokenizerResult::Script(script), - None => TokenizerResult::Done, + loop { + match self.inner.run(input) { + TokenizerResult::Done => return TokenizerResult::Done, + TokenizerResult::Script(handle) => { + // Apparently the parser can sometimes create <script> elements without a namespace, resulting + // in them not being HTMLScriptElements. + if let Some(script) = handle.downcast::<HTMLScriptElement>() { + return TokenizerResult::Script(DomRoot::from_ref(script)); + } + }, + } } } |