diff options
Diffstat (limited to 'components/script/dom/node.rs')
-rw-r--r-- | components/script/dom/node.rs | 84 |
1 files changed, 83 insertions, 1 deletions
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 9d7c8b7e6e1..ca7d7598480 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -19,8 +19,9 @@ use dom::bindings::codegen::InheritTypes::{ElementCast, NodeCast, ElementDerived use dom::bindings::codegen::InheritTypes::{HTMLLegendElementDerived, HTMLFieldSetElementDerived}; use dom::bindings::codegen::InheritTypes::{HTMLOptGroupElementDerived, NodeBase, NodeDerived}; use dom::bindings::codegen::InheritTypes::{ProcessingInstructionCast, TextCast}; +use dom::bindings::codegen::UnionTypes::NodeOrString; use dom::bindings::conversions; -use dom::bindings::error::Fallible; +use dom::bindings::error::{ErrorResult, Fallible}; use dom::bindings::error::Error::{NotFound, HierarchyRequest, Syntax}; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, JSRef, LayoutJS, RootedReference, Temporary, Root, Unrooted}; @@ -500,6 +501,12 @@ pub trait NodeHelpers { fn get_bounding_content_box(self) -> Rect<Au>; fn get_content_boxes(self) -> Vec<Rect<Au>>; + fn before(self, nodes: Vec<NodeOrString>) -> ErrorResult; + fn after(self, nodes: Vec<NodeOrString>) -> ErrorResult; + fn replace_with(self, nodes: Vec<NodeOrString>) -> ErrorResult; + fn prepend(self, nodes: Vec<NodeOrString>) -> ErrorResult; + fn append(self, nodes: Vec<NodeOrString>) -> ErrorResult; + fn query_selector(self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>>; #[allow(unsafe_code)] unsafe fn query_selector_iter(self, selectors: DOMString) -> Fallible<QuerySelectorIterator>; @@ -513,6 +520,7 @@ pub trait NodeHelpers { fn teardown(self); fn parse_fragment(self, markup: DOMString) -> Fallible<Temporary<DocumentFragment>>; + } impl<'a> NodeHelpers for JSRef<'a, Node> { @@ -803,6 +811,80 @@ impl<'a> NodeHelpers for JSRef<'a, Node> { window_from_node(self).root().r().content_boxes_query(self.to_trusted_node_address()) } + // https://dom.spec.whatwg.org/#dom-childnode-before + fn before(self, nodes: Vec<NodeOrString>) -> ErrorResult { + match self.parent_node().root() { + None => { + // Step 1. + Ok(()) + }, + Some(ref parent_node) => { + // Step 2. + let doc = self.owner_doc().root(); + let node = try!(doc.r().node_from_nodes_and_strings(nodes)).root(); + // Step 3. + Node::pre_insert(node.r(), parent_node.r(), + Some(self)).map(|_| ()) + }, + } + } + + // https://dom.spec.whatwg.org/#dom-childnode-after + fn after(self, nodes: Vec<NodeOrString>) -> ErrorResult { + match self.parent_node().root() { + None => { + // Step 1. + Ok(()) + }, + Some(ref parent_node) => { + // Step 2. + let doc = self.owner_doc().root(); + let node = try!(doc.r().node_from_nodes_and_strings(nodes)).root(); + // Step 3. + // FIXME(https://github.com/servo/servo/issues/5720) + let next_sibling = self.next_sibling().root(); + Node::pre_insert(node.r(), parent_node.r(), + next_sibling.r()).map(|_| ()) + }, + } + } + + // https://dom.spec.whatwg.org/#dom-childnode-replacewith + fn replace_with(self, nodes: Vec<NodeOrString>) -> ErrorResult { + match self.parent_node().root() { + None => { + // Step 1. + Ok(()) + }, + Some(ref parent_node) => { + // Step 2. + let doc = self.owner_doc().root(); + let node = try!(doc.r().node_from_nodes_and_strings(nodes)).root(); + // Step 3. + parent_node.r().ReplaceChild(node.r(), self).map(|_| ()) + }, + } + } + + // https://dom.spec.whatwg.org/#dom-parentnode-prepend + fn prepend(self, nodes: Vec<NodeOrString>) -> ErrorResult { + // Step 1. + let doc = self.owner_doc().root(); + let node = try!(doc.r().node_from_nodes_and_strings(nodes)).root(); + // Step 2. + let first_child = self.first_child().root(); + Node::pre_insert(node.r(), self, first_child.r()).map(|_| ()) + } + + // https://dom.spec.whatwg.org/#dom-parentnode-append + fn append(self, nodes: Vec<NodeOrString>) -> ErrorResult { + // Step 1. + let doc = self.owner_doc().root(); + let node = try!(doc.r().node_from_nodes_and_strings(nodes)).root(); + // Step 2. + self.AppendChild(node.r()).map(|_| ()) + } + // https://dom.spec.whatwg.org/#dom-parentnode-queryselector fn query_selector(self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>> { // Step 1. |