Skip to content

Commit fb1d177

Browse files
simonwuelkerTG199
authored andcommitted
Unify the way html5ever and xml5ever block on script elements (servo#36284)
Companion PR for servo/html5ever#591 Testing: Covered by WPT Part of servo#6414, servo#24898, preparation for servo/html5ever#590 --------- Signed-off-by: Simon Wülker <[email protected]>
1 parent 3f61533 commit fb1d177

File tree

8 files changed

+53
-54
lines changed

8 files changed

+53
-54
lines changed

Cargo.lock

Lines changed: 27 additions & 26 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ gstreamer-video = "0.23"
7171
harfbuzz-sys = "0.6.1"
7272
headers = "0.4"
7373
hitrace = "0.1.4"
74-
html5ever = "0.30"
74+
html5ever = "0.31"
7575
http = "1.3"
7676
http-body-util = "0.1"
7777
hyper = "1.6"
@@ -92,7 +92,7 @@ log = "0.4"
9292
mach2 = "0.4"
9393
malloc_size_of = { package = "servo_malloc_size_of", path = "components/malloc_size_of" }
9494
malloc_size_of_derive = "0.1"
95-
markup5ever = "0.15"
95+
markup5ever = "0.16"
9696
memmap2 = "0.9.5"
9797
mime = "0.3.13"
9898
mime_guess = "2.0.5"
@@ -174,7 +174,7 @@ windows-sys = "0.59"
174174
wio = "0.2"
175175
wr_malloc_size_of = { git = "https://github.com/servo/webrender", branch = "0.66" }
176176
xi-unicode = "0.3.0"
177-
xml5ever = "0.21"
177+
xml5ever = "0.22"
178178

179179
[profile.release]
180180
opt-level = 3

components/script/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ libc = { workspace = true }
8484
log = { workspace = true }
8585
malloc_size_of = { workspace = true }
8686
malloc_size_of_derive = { workspace = true }
87+
markup5ever = { workspace = true }
8788
media = { path = "../media" }
8889
metrics = { path = "../metrics" }
8990
mime = { workspace = true }

components/script/dom/servoparser/async_html.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ use crossbeam_channel::{Receiver, Sender, unbounded};
1414
use html5ever::buffer_queue::BufferQueue;
1515
use html5ever::tendril::fmt::UTF8;
1616
use html5ever::tendril::{SendTendril, StrTendril, Tendril};
17-
use html5ever::tokenizer::{Tokenizer as HtmlTokenizer, TokenizerOpts, TokenizerResult};
17+
use html5ever::tokenizer::{Tokenizer as HtmlTokenizer, TokenizerOpts};
1818
use html5ever::tree_builder::{
19-
ElementFlags, NextParserState, NodeOrText as HtmlNodeOrText, QuirksMode, TreeBuilder,
20-
TreeBuilderOpts, TreeSink,
19+
ElementFlags, NodeOrText as HtmlNodeOrText, QuirksMode, TreeBuilder, TreeBuilderOpts, TreeSink,
2120
};
2221
use html5ever::{
2322
Attribute as HtmlAttribute, ExpandedName, QualName, local_name, namespace_url, ns,
2423
};
24+
use markup5ever::TokenizerResult;
2525
use servo_url::ServoUrl;
2626
use style::context::QuirksMode as ServoQuirksMode;
2727

@@ -901,10 +901,6 @@ impl TreeSink for Sink {
901901
self.send_op(ParseOperation::MarkScriptAlreadyStarted { node: node.id });
902902
}
903903

904-
fn complete_script(&self, _: &Self::Handle) -> NextParserState {
905-
panic!("complete_script should not be called here!");
906-
}
907-
908904
fn reparent_children(&self, parent: &Self::Handle, new_parent: &Self::Handle) {
909905
self.send_op(ParseOperation::ReparentChildren {
910906
parent: parent.id,

components/script/dom/servoparser/html.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ use std::io;
1010
use html5ever::buffer_queue::BufferQueue;
1111
use html5ever::serialize::TraversalScope::IncludeNode;
1212
use html5ever::serialize::{AttrRef, Serialize, Serializer, TraversalScope};
13-
use html5ever::tokenizer::{Tokenizer as HtmlTokenizer, TokenizerOpts, TokenizerResult};
13+
use html5ever::tokenizer::{Tokenizer as HtmlTokenizer, TokenizerOpts};
1414
use html5ever::tree_builder::{TreeBuilder, TreeBuilderOpts};
1515
use html5ever::{QualName, local_name, namespace_url, ns};
16+
use markup5ever::TokenizerResult;
1617
use script_bindings::trace::CustomTraceable;
1718
use servo_url::ServoUrl;
1819
use xml5ever::LocalName;

components/script/dom/servoparser/mod.rs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ use encoding_rs::Encoding;
1616
use html5ever::buffer_queue::BufferQueue;
1717
use html5ever::tendril::fmt::UTF8;
1818
use html5ever::tendril::{ByteTendril, StrTendril, TendrilSink};
19-
use html5ever::tokenizer::TokenizerResult;
20-
use html5ever::tree_builder::{ElementFlags, NextParserState, NodeOrText, QuirksMode, TreeSink};
19+
use html5ever::tree_builder::{ElementFlags, NodeOrText, QuirksMode, TreeSink};
2120
use html5ever::{Attribute, ExpandedName, LocalName, QualName, local_name, namespace_url, ns};
2221
use hyper_serde::Serde;
22+
use markup5ever::TokenizerResult;
2323
use mime::{self, Mime};
2424
use net_traits::request::RequestId;
2525
use net_traits::{
@@ -1356,15 +1356,6 @@ impl TreeSink for Sink {
13561356
}
13571357
}
13581358

1359-
fn complete_script(&self, node: &Dom<Node>) -> NextParserState {
1360-
if let Some(script) = node.downcast() {
1361-
self.script.set(Some(script));
1362-
NextParserState::Suspend
1363-
} else {
1364-
NextParserState::Continue
1365-
}
1366-
}
1367-
13681359
fn reparent_children(&self, node: &Dom<Node>, new_parent: &Dom<Node>) {
13691360
while let Some(ref child) = node.GetFirstChild() {
13701361
new_parent.AppendChild(child, CanGc::note()).unwrap();

components/script/dom/servoparser/prefetch.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ use content_security_policy::Destination;
1010
use html5ever::buffer_queue::BufferQueue;
1111
use html5ever::tokenizer::states::RawKind;
1212
use html5ever::tokenizer::{
13-
Tag, TagKind, Token, TokenSink, TokenSinkResult, Tokenizer as HtmlTokenizer, TokenizerResult,
13+
Tag, TagKind, Token, TokenSink, TokenSinkResult, Tokenizer as HtmlTokenizer,
1414
};
1515
use html5ever::{Attribute, LocalName, local_name};
1616
use js::jsapi::JSTracer;
17+
use markup5ever::TokenizerResult;
1718
use net_traits::request::{
1819
CorsSettings, CredentialsMode, InsecureRequestsPolicy, ParserMetadata, Referrer,
1920
};

components/script/dom/servoparser/xml.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66

77
use std::cell::Cell;
88

9-
use html5ever::tokenizer::TokenizerResult;
9+
use markup5ever::TokenizerResult;
1010
use script_bindings::trace::CustomTraceable;
1111
use servo_url::ServoUrl;
1212
use xml5ever::buffer_queue::BufferQueue;
1313
use xml5ever::tokenizer::XmlTokenizer;
1414
use xml5ever::tree_builder::XmlTreeBuilder;
1515

16+
use crate::dom::bindings::inheritance::Castable;
1617
use crate::dom::bindings::root::{Dom, DomRoot};
1718
use crate::dom::document::Document;
1819
use crate::dom::htmlscriptelement::HTMLScriptElement;
@@ -43,10 +44,17 @@ impl Tokenizer {
4344
}
4445

4546
pub(crate) fn feed(&self, input: &BufferQueue) -> TokenizerResult<DomRoot<HTMLScriptElement>> {
46-
self.inner.run(input);
47-
match self.inner.sink.sink.script.take() {
48-
Some(script) => TokenizerResult::Script(script),
49-
None => TokenizerResult::Done,
47+
loop {
48+
match self.inner.run(input) {
49+
TokenizerResult::Done => return TokenizerResult::Done,
50+
TokenizerResult::Script(handle) => {
51+
// Apparently the parser can sometimes create <script> elements without a namespace, resulting
52+
// in them not being HTMLScriptElements.
53+
if let Some(script) = handle.downcast::<HTMLScriptElement>() {
54+
return TokenizerResult::Script(DomRoot::from_ref(script));
55+
}
56+
},
57+
}
5058
}
5159
}
5260

0 commit comments

Comments
 (0)