diff options
Diffstat (limited to 'components/script/parse/html.rs')
-rw-r--r-- | components/script/parse/html.rs | 78 |
1 files changed, 37 insertions, 41 deletions
diff --git a/components/script/parse/html.rs b/components/script/parse/html.rs index a9e125f7da9..d7fd0946995 100644 --- a/components/script/parse/html.rs +++ b/components/script/parse/html.rs @@ -12,8 +12,8 @@ use dom::bindings::codegen::InheritTypes::{CharacterDataCast, DocumentTypeCast}; use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLScriptElementCast}; use dom::bindings::codegen::InheritTypes::{HTMLFormElementDerived, NodeCast}; use dom::bindings::codegen::InheritTypes::ProcessingInstructionCast; -use dom::bindings::js::{JS, JSRef, OptionalRootable, Root, Rootable}; -use dom::bindings::js::{RootedReference, Temporary}; +use dom::bindings::js::{JS, Root}; +use dom::bindings::js::{RootedReference}; use dom::bindings::trace::RootedVec; use dom::characterdata::{CharacterDataHelpers, CharacterDataTypeId}; use dom::comment::Comment; @@ -25,7 +25,6 @@ use dom::htmlscriptelement::HTMLScriptElement; use dom::htmlscriptelement::HTMLScriptElementHelpers; use dom::node::{Node, NodeHelpers, NodeTypeId}; use dom::node::{document_from_node, window_from_node}; -use dom::processinginstruction::ProcessingInstruction; use dom::processinginstruction::ProcessingInstructionHelpers; use dom::servohtmlparser; use dom::servohtmlparser::{ServoHTMLParser, FragmentContext}; @@ -47,17 +46,17 @@ use html5ever::tree_builder::{TreeSink, QuirksMode, NodeOrText, AppendNode, Appe use string_cache::QualName; trait SinkHelpers { - fn get_or_create(&self, child: NodeOrText<JS<Node>>) -> Temporary<Node>; + fn get_or_create(&self, child: NodeOrText<JS<Node>>) -> Root<Node>; } impl SinkHelpers for servohtmlparser::Sink { - fn get_or_create(&self, child: NodeOrText<JS<Node>>) -> Temporary<Node> { + fn get_or_create(&self, child: NodeOrText<JS<Node>>) -> Root<Node> { match child { - AppendNode(n) => Temporary::from_rooted(n), + AppendNode(n) => n.root(), AppendText(t) => { let doc = self.document.root(); let text = Text::new(t, doc.r()); - NodeCast::from_temporary(text) + NodeCast::from_root(text) } } } @@ -67,8 +66,8 @@ impl<'a> TreeSink for servohtmlparser::Sink { type Handle = JS<Node>; fn get_document(&mut self) -> JS<Node> { let doc = self.document.root(); - let node: JSRef<Node> = NodeCast::from_ref(doc.r()); - JS::from_rooted(node) + let node = NodeCast::from_ref(doc.r()); + JS::from_ref(node) } fn same_node(&self, x: JS<Node>, y: JS<Node>) -> bool { @@ -77,7 +76,7 @@ impl<'a> TreeSink for servohtmlparser::Sink { fn elem_name(&self, target: JS<Node>) -> QualName { let node: Root<Node> = target.root(); - let elem: JSRef<Element> = ElementCast::to_ref(node.r()) + let elem = ElementCast::to_ref(node.r()) .expect("tried to get name of non-Element in HTML parsing"); QualName { ns: elem.namespace().clone(), @@ -89,21 +88,21 @@ impl<'a> TreeSink for servohtmlparser::Sink { -> JS<Node> { let doc = self.document.root(); let elem = Element::create(name, None, doc.r(), - ElementCreator::ParserCreated).root(); + ElementCreator::ParserCreated); for attr in attrs.into_iter() { elem.r().set_attribute_from_parser(attr.name, attr.value, None); } - let node: JSRef<Node> = NodeCast::from_ref(elem.r()); - JS::from_rooted(node) + let node = NodeCast::from_ref(elem.r()); + JS::from_ref(node) } fn create_comment(&mut self, text: String) -> JS<Node> { let doc = self.document.root(); let comment = Comment::new(text, doc.r()); - let node: Root<Node> = NodeCast::from_temporary(comment).root(); - JS::from_rooted(node.r()) + let node = NodeCast::from_root(comment); + JS::from_rooted(&node) } fn append_before_sibling(&mut self, @@ -112,11 +111,11 @@ impl<'a> TreeSink for servohtmlparser::Sink { // If there is no parent, return the node to the parser. let sibling: Root<Node> = sibling.root(); let parent = match sibling.r().GetParentNode() { - Some(p) => p.root(), + Some(p) => p, None => return Err(new_node), }; - let child = self.get_or_create(new_node).root(); + let child = self.get_or_create(new_node); assert!(parent.r().InsertBefore(child.r(), Some(sibling.r())).is_ok()); Ok(()) } @@ -132,7 +131,7 @@ impl<'a> TreeSink for servohtmlparser::Sink { fn append(&mut self, parent: JS<Node>, child: NodeOrText<JS<Node>>) { let parent: Root<Node> = parent.root(); - let child = self.get_or_create(child).root(); + let child = self.get_or_create(child); // FIXME(#3701): Use a simpler algorithm and merge adjacent text nodes assert!(parent.r().AppendChild(child.r()).is_ok()); @@ -140,16 +139,16 @@ impl<'a> TreeSink for servohtmlparser::Sink { fn append_doctype_to_document(&mut self, name: String, public_id: String, system_id: String) { let doc = self.document.root(); - let doc_node: JSRef<Node> = NodeCast::from_ref(doc.r()); + let doc_node = NodeCast::from_ref(doc.r()); let doctype = DocumentType::new(name, Some(public_id), Some(system_id), doc.r()); - let node: Root<Node> = NodeCast::from_temporary(doctype).root(); + let node: Root<Node> = NodeCast::from_root(doctype); assert!(doc_node.AppendChild(node.r()).is_ok()); } fn add_attrs_if_missing(&mut self, target: JS<Node>, attrs: Vec<Attribute>) { let node: Root<Node> = target.root(); - let elem: JSRef<Element> = ElementCast::to_ref(node.r()) + 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); @@ -158,20 +157,20 @@ impl<'a> TreeSink for servohtmlparser::Sink { fn remove_from_parent(&mut self, target: JS<Node>) { let node = target.root(); - if let Some(ref parent) = node.r().GetParentNode().root() { + if let Some(ref parent) = node.r().GetParentNode() { parent.r().RemoveChild(node.r()).unwrap(); } } fn mark_script_already_started(&mut self, node: JS<Node>) { let node: Root<Node> = node.root(); - let script: Option<JSRef<HTMLScriptElement>> = HTMLScriptElementCast::to_ref(node.r()); + let script: Option<&HTMLScriptElement> = HTMLScriptElementCast::to_ref(node.r()); script.map(|script| script.mark_already_started()); } fn complete_script(&mut self, node: JS<Node>) -> NextParserState { let node: Root<Node> = node.root(); - let script: Option<JSRef<HTMLScriptElement>> = HTMLScriptElementCast::to_ref(node.r()); + let script: Option<&HTMLScriptElement> = HTMLScriptElementCast::to_ref(node.r()); if let Some(script) = script { return script.prepare(); } @@ -183,20 +182,20 @@ impl<'a> TreeSink for servohtmlparser::Sink { let new_parent = new_parent.r(); let old_parent = node.root(); let old_parent = old_parent.r(); - while let Some(ref child) = old_parent.GetFirstChild().root() { + while let Some(ref child) = old_parent.GetFirstChild() { new_parent.AppendChild(child.r()).unwrap(); } } } -impl<'a> Serializable for JSRef<'a, Node> { +impl<'a> Serializable for &'a Node { fn serialize<'wr, Wr: Write>(&self, serializer: &mut Serializer<'wr, Wr>, traversal_scope: TraversalScope) -> io::Result<()> { let node = *self; match (traversal_scope, node.type_id()) { (_, NodeTypeId::Element(..)) => { - let elem: JSRef<Element> = ElementCast::to_ref(node).unwrap(); + let elem = ElementCast::to_ref(node).unwrap(); let name = QualName::new(elem.namespace().clone(), elem.local_name().clone()); if traversal_scope == IncludeNode { @@ -215,7 +214,6 @@ impl<'a> Serializable for JSRef<'a, Node> { } for handle in node.children() { - let handle = handle.root(); try!(handle.r().serialize(serializer, IncludeNode)); } @@ -227,7 +225,6 @@ impl<'a> Serializable for JSRef<'a, Node> { (ChildrenOnly, NodeTypeId::Document) => { for handle in node.children() { - let handle = handle.root(); try!(handle.r().serialize(serializer, IncludeNode)); } Ok(()) @@ -236,7 +233,7 @@ impl<'a> Serializable for JSRef<'a, Node> { (ChildrenOnly, _) => Ok(()), (IncludeNode, NodeTypeId::DocumentType) => { - let doctype: JSRef<DocumentType> = DocumentTypeCast::to_ref(node).unwrap(); + let doctype = DocumentTypeCast::to_ref(node).unwrap(); serializer.write_doctype(&doctype.name()) }, @@ -251,7 +248,7 @@ impl<'a> Serializable for JSRef<'a, Node> { }, (IncludeNode, NodeTypeId::CharacterData(CharacterDataTypeId::ProcessingInstruction)) => { - let pi: JSRef<ProcessingInstruction> = ProcessingInstructionCast::to_ref(node).unwrap(); + let pi = ProcessingInstructionCast::to_ref(node).unwrap(); let data = CharacterDataCast::from_ref(pi).data(); serializer.write_processing_instruction(&pi.target(), &data) }, @@ -268,7 +265,7 @@ pub enum ParseContext<'a> { Owner(Option<PipelineId>), } -pub fn parse_html(document: JSRef<Document>, +pub fn parse_html(document: &Document, input: String, url: &Url, context: ParseContext) { @@ -277,16 +274,16 @@ pub fn parse_html(document: JSRef<Document>, ServoHTMLParser::new(Some(url.clone()), document, owner), ParseContext::Fragment(fc) => ServoHTMLParser::new_for_fragment(Some(url.clone()), document, fc), - }.root(); + }; parser.r().parse_chunk(input); } // https://html.spec.whatwg.org/multipage/#parsing-html-fragments -pub fn parse_html_fragment(context_node: JSRef<Node>, +pub fn parse_html_fragment(context_node: &Node, input: DOMString, output: &mut RootedVec<JS<Node>>) { - let window = window_from_node(context_node).root(); - let context_document = document_from_node(context_node).root(); + let window = window_from_node(context_node); + let context_document = document_from_node(context_node); let context_document = context_document.r(); let url = context_document.url(); @@ -296,14 +293,13 @@ pub fn parse_html_fragment(context_node: JSRef<Node>, IsHTMLDocument::HTMLDocument, None, None, DocumentSource::FromParser, - loader).root(); + loader); // Step 2. document.r().set_quirks_mode(context_document.quirks_mode()); // Step 11. let form = context_node.inclusive_ancestors() - .map(|element| element.root()) .find(|element| element.r().is_htmlformelement()); let fragment_context = FragmentContext { context_elem: context_node, @@ -312,9 +308,9 @@ pub fn parse_html_fragment(context_node: JSRef<Node>, parse_html(document.r(), input, &url, ParseContext::Fragment(fragment_context)); // Step 14. - let root_element = document.r().GetDocumentElement().expect("no document element").root(); - let root_node: JSRef<Node> = NodeCast::from_ref(root_element.r()); + let root_element = document.r().GetDocumentElement().expect("no document element"); + let root_node = NodeCast::from_ref(root_element.r()); for child in root_node.children() { - output.push(JS::from_rooted(child)); + output.push(JS::from_rooted(&child)); } } |