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>
This commit is contained in:
Simon Wülker 2025-04-08 18:40:14 +02:00 committed by GitHub
parent ce4ca9ee98
commit 9af9507920
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 53 additions and 54 deletions

53
Cargo.lock generated
View file

@ -1065,7 +1065,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"windows-sys 0.59.0", "windows-sys 0.48.0",
] ]
[[package]] [[package]]
@ -2049,7 +2049,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
dependencies = [ dependencies = [
"libc", "libc",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -2575,7 +2575,7 @@ dependencies = [
"gobject-sys", "gobject-sys",
"libc", "libc",
"system-deps", "system-deps",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -3280,9 +3280,9 @@ dependencies = [
[[package]] [[package]]
name = "html5ever" name = "html5ever"
version = "0.30.0" version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5bf3413d61499f71fe4f627bbecfbec2977ce280525701df788f47370b0c507" checksum = "953cbbe631aae7fc0a112702ad5d3aaf09da38beaf45ea84610d6e1c358f569c"
dependencies = [ dependencies = [
"log", "log",
"mac", "mac",
@ -4037,7 +4037,7 @@ checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9"
dependencies = [ dependencies = [
"hermit-abi 0.5.0", "hermit-abi 0.5.0",
"libc", "libc",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -4331,7 +4331,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"windows-targets 0.52.6", "windows-targets 0.48.5",
] ]
[[package]] [[package]]
@ -4530,9 +4530,9 @@ dependencies = [
[[package]] [[package]]
name = "markup5ever" name = "markup5ever"
version = "0.15.0" version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03a7b81dfb91586d0677086d40a6d755070e0799b71bb897485bac408dfd5c69" checksum = "0ba2225413ed418d540a2c8247d794f4b0527a021da36f69c05344d716dc44c1"
dependencies = [ dependencies = [
"log", "log",
"phf", "phf",
@ -6210,7 +6210,7 @@ dependencies = [
"errno", "errno",
"libc", "libc",
"linux-raw-sys", "linux-raw-sys",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -6344,6 +6344,7 @@ dependencies = [
"libc", "libc",
"log", "log",
"malloc_size_of_derive", "malloc_size_of_derive",
"markup5ever",
"media", "media",
"metrics", "metrics",
"mime", "mime",
@ -6537,7 +6538,7 @@ dependencies = [
[[package]] [[package]]
name = "selectors" name = "selectors"
version = "0.27.0" version = "0.27.0"
source = "git+https://github.com/servo/stylo?branch=2025-03-15#53bd9b280e15d8b55636b93001083d914ee2cb6b" source = "git+https://github.com/servo/stylo?branch=2025-03-15#c756a21864709dae8f85c564125bf92440aeaab5"
dependencies = [ dependencies = [
"bitflags 2.9.0", "bitflags 2.9.0",
"cssparser", "cssparser",
@ -6822,7 +6823,7 @@ dependencies = [
[[package]] [[package]]
name = "servo_arc" name = "servo_arc"
version = "0.4.0" version = "0.4.0"
source = "git+https://github.com/servo/stylo?branch=2025-03-15#53bd9b280e15d8b55636b93001083d914ee2cb6b" source = "git+https://github.com/servo/stylo?branch=2025-03-15#c756a21864709dae8f85c564125bf92440aeaab5"
dependencies = [ dependencies = [
"serde", "serde",
"stable_deref_trait", "stable_deref_trait",
@ -7274,7 +7275,7 @@ dependencies = [
[[package]] [[package]]
name = "stylo" name = "stylo"
version = "0.2.1" version = "0.2.1"
source = "git+https://github.com/servo/stylo?branch=2025-03-15#53bd9b280e15d8b55636b93001083d914ee2cb6b" source = "git+https://github.com/servo/stylo?branch=2025-03-15#c756a21864709dae8f85c564125bf92440aeaab5"
dependencies = [ dependencies = [
"app_units", "app_units",
"arrayvec", "arrayvec",
@ -7332,7 +7333,7 @@ dependencies = [
[[package]] [[package]]
name = "stylo_atoms" name = "stylo_atoms"
version = "0.2.0" version = "0.2.0"
source = "git+https://github.com/servo/stylo?branch=2025-03-15#53bd9b280e15d8b55636b93001083d914ee2cb6b" source = "git+https://github.com/servo/stylo?branch=2025-03-15#c756a21864709dae8f85c564125bf92440aeaab5"
dependencies = [ dependencies = [
"string_cache", "string_cache",
"string_cache_codegen", "string_cache_codegen",
@ -7341,12 +7342,12 @@ dependencies = [
[[package]] [[package]]
name = "stylo_config" name = "stylo_config"
version = "0.2.0" version = "0.2.0"
source = "git+https://github.com/servo/stylo?branch=2025-03-15#53bd9b280e15d8b55636b93001083d914ee2cb6b" source = "git+https://github.com/servo/stylo?branch=2025-03-15#c756a21864709dae8f85c564125bf92440aeaab5"
[[package]] [[package]]
name = "stylo_derive" name = "stylo_derive"
version = "0.2.0" version = "0.2.0"
source = "git+https://github.com/servo/stylo?branch=2025-03-15#53bd9b280e15d8b55636b93001083d914ee2cb6b" source = "git+https://github.com/servo/stylo?branch=2025-03-15#c756a21864709dae8f85c564125bf92440aeaab5"
dependencies = [ dependencies = [
"darling", "darling",
"proc-macro2", "proc-macro2",
@ -7358,7 +7359,7 @@ dependencies = [
[[package]] [[package]]
name = "stylo_dom" name = "stylo_dom"
version = "0.2.0" version = "0.2.0"
source = "git+https://github.com/servo/stylo?branch=2025-03-15#53bd9b280e15d8b55636b93001083d914ee2cb6b" source = "git+https://github.com/servo/stylo?branch=2025-03-15#c756a21864709dae8f85c564125bf92440aeaab5"
dependencies = [ dependencies = [
"bitflags 2.9.0", "bitflags 2.9.0",
"stylo_malloc_size_of", "stylo_malloc_size_of",
@ -7367,7 +7368,7 @@ dependencies = [
[[package]] [[package]]
name = "stylo_malloc_size_of" name = "stylo_malloc_size_of"
version = "0.2.0" version = "0.2.0"
source = "git+https://github.com/servo/stylo?branch=2025-03-15#53bd9b280e15d8b55636b93001083d914ee2cb6b" source = "git+https://github.com/servo/stylo?branch=2025-03-15#c756a21864709dae8f85c564125bf92440aeaab5"
dependencies = [ dependencies = [
"app_units", "app_units",
"cssparser", "cssparser",
@ -7384,12 +7385,12 @@ dependencies = [
[[package]] [[package]]
name = "stylo_static_prefs" name = "stylo_static_prefs"
version = "0.2.0" version = "0.2.0"
source = "git+https://github.com/servo/stylo?branch=2025-03-15#53bd9b280e15d8b55636b93001083d914ee2cb6b" source = "git+https://github.com/servo/stylo?branch=2025-03-15#c756a21864709dae8f85c564125bf92440aeaab5"
[[package]] [[package]]
name = "stylo_traits" name = "stylo_traits"
version = "0.2.0" version = "0.2.0"
source = "git+https://github.com/servo/stylo?branch=2025-03-15#53bd9b280e15d8b55636b93001083d914ee2cb6b" source = "git+https://github.com/servo/stylo?branch=2025-03-15#c756a21864709dae8f85c564125bf92440aeaab5"
dependencies = [ dependencies = [
"app_units", "app_units",
"bitflags 2.9.0", "bitflags 2.9.0",
@ -7553,7 +7554,7 @@ dependencies = [
"getrandom", "getrandom",
"once_cell", "once_cell",
"rustix", "rustix",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -7772,7 +7773,7 @@ dependencies = [
[[package]] [[package]]
name = "to_shmem" name = "to_shmem"
version = "0.2.0" version = "0.2.0"
source = "git+https://github.com/servo/stylo?branch=2025-03-15#53bd9b280e15d8b55636b93001083d914ee2cb6b" source = "git+https://github.com/servo/stylo?branch=2025-03-15#c756a21864709dae8f85c564125bf92440aeaab5"
dependencies = [ dependencies = [
"cssparser", "cssparser",
"servo_arc", "servo_arc",
@ -7785,7 +7786,7 @@ dependencies = [
[[package]] [[package]]
name = "to_shmem_derive" name = "to_shmem_derive"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/servo/stylo?branch=2025-03-15#53bd9b280e15d8b55636b93001083d914ee2cb6b" source = "git+https://github.com/servo/stylo?branch=2025-03-15#c756a21864709dae8f85c564125bf92440aeaab5"
dependencies = [ dependencies = [
"darling", "darling",
"proc-macro2", "proc-macro2",
@ -8853,7 +8854,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [ dependencies = [
"windows-sys 0.59.0", "windows-sys 0.48.0",
] ]
[[package]] [[package]]
@ -9430,9 +9431,9 @@ checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4"
[[package]] [[package]]
name = "xml5ever" name = "xml5ever"
version = "0.21.0" version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9f61eba2105dcadbee9232cfcf75c96abea184bf3805a8bfe022cf7fe7fa11d" checksum = "0a91563ba5a5ab749488164063f1317e327ca1daa80f00e5bd1e670ad0d78154"
dependencies = [ dependencies = [
"log", "log",
"mac", "mac",

View file

@ -71,7 +71,7 @@ gstreamer-video = "0.23"
harfbuzz-sys = "0.6.1" harfbuzz-sys = "0.6.1"
headers = "0.4" headers = "0.4"
hitrace = "0.1.4" hitrace = "0.1.4"
html5ever = "0.30" html5ever = "0.31"
http = "1.3" http = "1.3"
http-body-util = "0.1" http-body-util = "0.1"
hyper = "1.6" hyper = "1.6"
@ -92,7 +92,7 @@ log = "0.4"
mach2 = "0.4" mach2 = "0.4"
malloc_size_of = { package = "servo_malloc_size_of", path = "components/malloc_size_of" } malloc_size_of = { package = "servo_malloc_size_of", path = "components/malloc_size_of" }
malloc_size_of_derive = "0.1" malloc_size_of_derive = "0.1"
markup5ever = "0.15" markup5ever = "0.16"
memmap2 = "0.9.5" memmap2 = "0.9.5"
mime = "0.3.13" mime = "0.3.13"
mime_guess = "2.0.5" mime_guess = "2.0.5"
@ -174,7 +174,7 @@ windows-sys = "0.59"
wio = "0.2" wio = "0.2"
wr_malloc_size_of = { git = "https://github.com/servo/webrender", branch = "0.66" } wr_malloc_size_of = { git = "https://github.com/servo/webrender", branch = "0.66" }
xi-unicode = "0.3.0" xi-unicode = "0.3.0"
xml5ever = "0.21" xml5ever = "0.22"
[profile.release] [profile.release]
opt-level = 3 opt-level = 3

View file

@ -84,6 +84,7 @@ libc = { workspace = true }
log = { workspace = true } log = { workspace = true }
malloc_size_of = { workspace = true } malloc_size_of = { workspace = true }
malloc_size_of_derive = { workspace = true } malloc_size_of_derive = { workspace = true }
markup5ever = { workspace = true }
media = { path = "../media" } media = { path = "../media" }
metrics = { path = "../metrics" } metrics = { path = "../metrics" }
mime = { workspace = true } mime = { workspace = true }

View file

@ -14,14 +14,14 @@ use crossbeam_channel::{Receiver, Sender, unbounded};
use html5ever::buffer_queue::BufferQueue; use html5ever::buffer_queue::BufferQueue;
use html5ever::tendril::fmt::UTF8; use html5ever::tendril::fmt::UTF8;
use html5ever::tendril::{SendTendril, StrTendril, Tendril}; 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::{ use html5ever::tree_builder::{
ElementFlags, NextParserState, NodeOrText as HtmlNodeOrText, QuirksMode, TreeBuilder, ElementFlags, NodeOrText as HtmlNodeOrText, QuirksMode, TreeBuilder, TreeBuilderOpts, TreeSink,
TreeBuilderOpts, TreeSink,
}; };
use html5ever::{ use html5ever::{
Attribute as HtmlAttribute, ExpandedName, QualName, local_name, namespace_url, ns, Attribute as HtmlAttribute, ExpandedName, QualName, local_name, namespace_url, ns,
}; };
use markup5ever::TokenizerResult;
use servo_url::ServoUrl; use servo_url::ServoUrl;
use style::context::QuirksMode as ServoQuirksMode; use style::context::QuirksMode as ServoQuirksMode;
@ -901,10 +901,6 @@ impl TreeSink for Sink {
self.send_op(ParseOperation::MarkScriptAlreadyStarted { node: node.id }); 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) { fn reparent_children(&self, parent: &Self::Handle, new_parent: &Self::Handle) {
self.send_op(ParseOperation::ReparentChildren { self.send_op(ParseOperation::ReparentChildren {
parent: parent.id, parent: parent.id,

View file

@ -10,9 +10,10 @@ use std::io;
use html5ever::buffer_queue::BufferQueue; use html5ever::buffer_queue::BufferQueue;
use html5ever::serialize::TraversalScope::IncludeNode; use html5ever::serialize::TraversalScope::IncludeNode;
use html5ever::serialize::{AttrRef, Serialize, Serializer, TraversalScope}; 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::tree_builder::{TreeBuilder, TreeBuilderOpts};
use html5ever::{QualName, local_name, namespace_url, ns}; use html5ever::{QualName, local_name, namespace_url, ns};
use markup5ever::TokenizerResult;
use script_bindings::trace::CustomTraceable; use script_bindings::trace::CustomTraceable;
use servo_url::ServoUrl; use servo_url::ServoUrl;
use xml5ever::LocalName; use xml5ever::LocalName;

View file

@ -16,10 +16,10 @@ use encoding_rs::Encoding;
use html5ever::buffer_queue::BufferQueue; use html5ever::buffer_queue::BufferQueue;
use html5ever::tendril::fmt::UTF8; use html5ever::tendril::fmt::UTF8;
use html5ever::tendril::{ByteTendril, StrTendril, TendrilSink}; use html5ever::tendril::{ByteTendril, StrTendril, TendrilSink};
use html5ever::tokenizer::TokenizerResult; use html5ever::tree_builder::{ElementFlags, NodeOrText, QuirksMode, TreeSink};
use html5ever::tree_builder::{ElementFlags, NextParserState, NodeOrText, QuirksMode, TreeSink};
use html5ever::{Attribute, ExpandedName, LocalName, QualName, local_name, namespace_url, ns}; use html5ever::{Attribute, ExpandedName, LocalName, QualName, local_name, namespace_url, ns};
use hyper_serde::Serde; use hyper_serde::Serde;
use markup5ever::TokenizerResult;
use mime::{self, Mime}; use mime::{self, Mime};
use net_traits::request::RequestId; use net_traits::request::RequestId;
use net_traits::{ 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>) { fn reparent_children(&self, node: &Dom<Node>, new_parent: &Dom<Node>) {
while let Some(ref child) = node.GetFirstChild() { while let Some(ref child) = node.GetFirstChild() {
new_parent.AppendChild(child, CanGc::note()).unwrap(); new_parent.AppendChild(child, CanGc::note()).unwrap();

View file

@ -10,10 +10,11 @@ use content_security_policy::Destination;
use html5ever::buffer_queue::BufferQueue; use html5ever::buffer_queue::BufferQueue;
use html5ever::tokenizer::states::RawKind; use html5ever::tokenizer::states::RawKind;
use html5ever::tokenizer::{ 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 html5ever::{Attribute, LocalName, local_name};
use js::jsapi::JSTracer; use js::jsapi::JSTracer;
use markup5ever::TokenizerResult;
use net_traits::request::{ use net_traits::request::{
CorsSettings, CredentialsMode, InsecureRequestsPolicy, ParserMetadata, Referrer, CorsSettings, CredentialsMode, InsecureRequestsPolicy, ParserMetadata, Referrer,
}; };

View file

@ -6,13 +6,14 @@
use std::cell::Cell; use std::cell::Cell;
use html5ever::tokenizer::TokenizerResult; use markup5ever::TokenizerResult;
use script_bindings::trace::CustomTraceable; use script_bindings::trace::CustomTraceable;
use servo_url::ServoUrl; use servo_url::ServoUrl;
use xml5ever::buffer_queue::BufferQueue; use xml5ever::buffer_queue::BufferQueue;
use xml5ever::tokenizer::XmlTokenizer; use xml5ever::tokenizer::XmlTokenizer;
use xml5ever::tree_builder::XmlTreeBuilder; use xml5ever::tree_builder::XmlTreeBuilder;
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::document::Document; use crate::dom::document::Document;
use crate::dom::htmlscriptelement::HTMLScriptElement; use crate::dom::htmlscriptelement::HTMLScriptElement;
@ -43,10 +44,17 @@ impl Tokenizer {
} }
pub(crate) fn feed(&self, input: &BufferQueue) -> TokenizerResult<DomRoot<HTMLScriptElement>> { pub(crate) fn feed(&self, input: &BufferQueue) -> TokenizerResult<DomRoot<HTMLScriptElement>> {
self.inner.run(input); loop {
match self.inner.sink.sink.script.take() { match self.inner.run(input) {
Some(script) => TokenizerResult::Script(script), TokenizerResult::Done => return TokenizerResult::Done,
None => 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));
}
},
}
} }
} }