aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorSimon Sapin <simon.sapin@exyr.org>2015-06-25 20:40:38 -0700
committerSimon Sapin <simon.sapin@exyr.org>2015-06-25 20:40:38 -0700
commit34bfa1651793c3287e7c63f96d0095494af6eb29 (patch)
tree695fa05027c3883443760022d611bd377821ba19 /components/script
parentea06bebca9fab485485ce60bd3f464bc64bf1c36 (diff)
downloadservo-34bfa1651793c3287e7c63f96d0095494af6eb29.tar.gz
servo-34bfa1651793c3287e7c63f96d0095494af6eb29.zip
Update to zero-copy* HTML parsing
html5ever now uses the Tendril string type to minimize copying internally, but Servo still converts from/to `String` at the boundary (which involves copying).
Diffstat (limited to 'components/script')
-rw-r--r--components/script/Cargo.toml3
-rw-r--r--components/script/dom/servohtmlparser.rs2
-rw-r--r--components/script/lib.rs1
-rw-r--r--components/script/parse/html.rs19
4 files changed, 15 insertions, 10 deletions
diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml
index 31be05ac9bb..84da9d7c98b 100644
--- a/components/script/Cargo.toml
+++ b/components/script/Cargo.toml
@@ -76,7 +76,8 @@ num = "0.1.24"
websocket = "0.12"
uuid = "0.1.16"
smallvec = "0.1"
-html5ever = "0.1"
+html5ever = "0.2"
string_cache = "0.1"
string_cache_plugin = "0.1"
euclid = "0.1"
+tendril = "0.1.1"
diff --git a/components/script/dom/servohtmlparser.rs b/components/script/dom/servohtmlparser.rs
index a7b3031587d..35ffad67859 100644
--- a/components/script/dom/servohtmlparser.rs
+++ b/components/script/dom/servohtmlparser.rs
@@ -312,7 +312,7 @@ impl<'a> PrivateServoHTMLParserHelpers for &'a ServoHTMLParser {
let mut pending_input = self.pending_input.borrow_mut();
if !pending_input.is_empty() {
let chunk = pending_input.remove(0);
- self.tokenizer.borrow_mut().feed(chunk);
+ self.tokenizer.borrow_mut().feed(chunk.into());
} else {
self.tokenizer.borrow_mut().run();
}
diff --git a/components/script/lib.rs b/components/script/lib.rs
index def826fb377..28bbed62101 100644
--- a/components/script/lib.rs
+++ b/components/script/lib.rs
@@ -67,6 +67,7 @@ extern crate url;
extern crate uuid;
extern crate string_cache;
extern crate offscreen_gl_context;
+extern crate tendril;
pub mod cors;
pub mod document_loader;
diff --git a/components/script/parse/html.rs b/components/script/parse/html.rs
index d7fd0946995..3401239382f 100644
--- a/components/script/parse/html.rs
+++ b/components/script/parse/html.rs
@@ -44,6 +44,7 @@ use html5ever::serialize::TraversalScope;
use html5ever::serialize::TraversalScope::{IncludeNode, ChildrenOnly};
use html5ever::tree_builder::{TreeSink, QuirksMode, NodeOrText, AppendNode, AppendText, NextParserState};
use string_cache::QualName;
+use tendril::StrTendril;
trait SinkHelpers {
fn get_or_create(&self, child: NodeOrText<JS<Node>>) -> Root<Node>;
@@ -55,7 +56,7 @@ impl SinkHelpers for servohtmlparser::Sink {
AppendNode(n) => n.root(),
AppendText(t) => {
let doc = self.document.root();
- let text = Text::new(t, doc.r());
+ let text = Text::new(t.into(), doc.r());
NodeCast::from_root(text)
}
}
@@ -91,16 +92,16 @@ impl<'a> TreeSink for servohtmlparser::Sink {
ElementCreator::ParserCreated);
for attr in attrs.into_iter() {
- elem.r().set_attribute_from_parser(attr.name, attr.value, None);
+ elem.r().set_attribute_from_parser(attr.name, attr.value.into(), None);
}
let node = NodeCast::from_ref(elem.r());
JS::from_ref(node)
}
- fn create_comment(&mut self, text: String) -> JS<Node> {
+ fn create_comment(&mut self, text: StrTendril) -> JS<Node> {
let doc = self.document.root();
- let comment = Comment::new(text, doc.r());
+ let comment = Comment::new(text.into(), doc.r());
let node = NodeCast::from_root(comment);
JS::from_rooted(&node)
}
@@ -137,10 +138,12 @@ impl<'a> TreeSink for servohtmlparser::Sink {
assert!(parent.r().AppendChild(child.r()).is_ok());
}
- fn append_doctype_to_document(&mut self, name: String, public_id: String, system_id: String) {
+ fn append_doctype_to_document(&mut self, name: StrTendril, public_id: StrTendril,
+ system_id: StrTendril) {
let doc = self.document.root();
let doc_node = NodeCast::from_ref(doc.r());
- let doctype = DocumentType::new(name, Some(public_id), Some(system_id), doc.r());
+ let doctype = DocumentType::new(
+ name.into(), Some(public_id.into()), Some(system_id.into()), doc.r());
let node: Root<Node> = NodeCast::from_root(doctype);
assert!(doc_node.AppendChild(node.r()).is_ok());
@@ -151,7 +154,7 @@ impl<'a> TreeSink for servohtmlparser::Sink {
let elem = ElementCast::to_ref(node.r())
.expect("tried to set attrs on non-Element in HTML parsing");
for attr in attrs.into_iter() {
- elem.set_attribute_from_parser(attr.name, attr.value, None);
+ elem.set_attribute_from_parser(attr.name, attr.value.into(), None);
}
}
@@ -275,7 +278,7 @@ pub fn parse_html(document: &Document,
ParseContext::Fragment(fc) =>
ServoHTMLParser::new_for_fragment(Some(url.clone()), document, fc),
};
- parser.r().parse_chunk(input);
+ parser.r().parse_chunk(input.into());
}
// https://html.spec.whatwg.org/multipage/#parsing-html-fragments