aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-04-16 14:47:32 -0500
committerbors-servo <metajack+bors@gmail.com>2015-04-16 14:47:32 -0500
commit4fd4370a9680f4845f05efd43ce9cb26c7433f05 (patch)
tree5b17d69566afa9ca77da1011a6fc0181e1726030 /components/script
parente26219828bfd71c5dfce411f93f2ea5dbb131d7a (diff)
parent45e1b9628ee6a9adff54a0d552278a004ecf0da6 (diff)
downloadservo-4fd4370a9680f4845f05efd43ce9cb26c7433f05.tar.gz
servo-4fd4370a9680f4845f05efd43ce9cb26c7433f05.zip
Auto merge of #5721 - nox:nodeorstring, r=jdm
<!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/5721) <!-- Reviewable:end -->
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/characterdata.rs16
-rw-r--r--components/script/dom/document.rs41
-rw-r--r--components/script/dom/documentfragment.rs13
-rw-r--r--components/script/dom/documenttype.rs17
-rw-r--r--components/script/dom/element.rs26
-rw-r--r--components/script/dom/node.rs84
-rw-r--r--components/script/dom/webidls/ChildNode.webidl10
-rw-r--r--components/script/dom/webidls/ParentNode.webidl7
8 files changed, 205 insertions, 9 deletions
diff --git a/components/script/dom/characterdata.rs b/components/script/dom/characterdata.rs
index bc1106f94cc..4f10e7d39f4 100644
--- a/components/script/dom/characterdata.rs
+++ b/components/script/dom/characterdata.rs
@@ -8,6 +8,7 @@ use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::CharacterDataBinding::CharacterDataMethods;
use dom::bindings::codegen::InheritTypes::{CharacterDataDerived, ElementCast};
use dom::bindings::codegen::InheritTypes::NodeCast;
+use dom::bindings::codegen::UnionTypes::NodeOrString;
use dom::bindings::error::{Fallible, ErrorResult};
use dom::bindings::error::Error::IndexSize;
use dom::bindings::js::{JSRef, LayoutJS, Temporary};
@@ -118,6 +119,21 @@ impl<'a> CharacterDataMethods for JSRef<'a, CharacterData> {
Ok(())
}
+ // https://dom.spec.whatwg.org/#dom-childnode-before
+ fn Before(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).before(nodes)
+ }
+
+ // https://dom.spec.whatwg.org/#dom-childnode-after
+ fn After(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).after(nodes)
+ }
+
+ // https://dom.spec.whatwg.org/#dom-childnode-replacewith
+ fn ReplaceWith(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).replace_with(nodes)
+ }
+
// https://dom.spec.whatwg.org/#dom-childnode-remove
fn Remove(self) {
let node: JSRef<Node> = NodeCast::from_ref(self);
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index bff8ea0cdba..bab20db68ca 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -19,6 +19,7 @@ use dom::bindings::codegen::InheritTypes::{HTMLAnchorElementDerived, HTMLAppletE
use dom::bindings::codegen::InheritTypes::{HTMLAreaElementDerived, HTMLEmbedElementDerived};
use dom::bindings::codegen::InheritTypes::{HTMLFormElementDerived, HTMLImageElementDerived};
use dom::bindings::codegen::InheritTypes::{HTMLScriptElementDerived, CharacterDataCast};
+use dom::bindings::codegen::UnionTypes::NodeOrString;
use dom::bindings::error::{ErrorResult, Fallible};
use dom::bindings::error::Error::{NotSupported, InvalidCharacter, Security};
use dom::bindings::error::Error::HierarchyRequest;
@@ -223,6 +224,8 @@ pub trait DocumentHelpers<'a> {
button: MouseButton, point: Point2D<f32>);
fn dispatch_key_event(self, key: Key, state: KeyState,
modifiers: KeyModifiers, compositor: &mut Box<ScriptListener+'static>);
+ fn node_from_nodes_and_strings(self, nodes: Vec<NodeOrString>)
+ -> Fallible<Temporary<Node>>;
/// Handles a mouse-move event coming from the compositor.
fn handle_mouse_move_event(self,
@@ -702,6 +705,34 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> {
window.r().reflow(ReflowGoal::ForDisplay, ReflowQueryType::NoQuery, ReflowReason::KeyEvent);
}
+ fn node_from_nodes_and_strings(self, nodes: Vec<NodeOrString>)
+ -> Fallible<Temporary<Node>> {
+ if nodes.len() == 1 {
+ match nodes.into_iter().next().unwrap() {
+ NodeOrString::eNode(node) => Ok(Temporary::from_unrooted(node)),
+ NodeOrString::eString(string) => {
+ Ok(NodeCast::from_temporary(self.CreateTextNode(string)))
+ },
+ }
+ } else {
+ let fragment = NodeCast::from_temporary(self.CreateDocumentFragment()).root();
+ for node in nodes.into_iter() {
+ match node {
+ NodeOrString::eNode(node) => {
+ try!(fragment.r().AppendChild(node.root().r()));
+ },
+ NodeOrString::eString(string) => {
+ let node = NodeCast::from_temporary(self.CreateTextNode(string)).root();
+ // No try!() here because appending a text node
+ // should not fail.
+ fragment.r().AppendChild(node.r()).unwrap();
+ }
+ }
+ }
+ Ok(Temporary::from_rooted(fragment.r()))
+ }
+ }
+
fn set_current_script(self, script: Option<JSRef<HTMLScriptElement>>) {
self.current_script.assign(script);
}
@@ -1377,6 +1408,16 @@ impl<'a> DocumentMethods for JSRef<'a, Document> {
NodeCast::from_ref(self).child_elements().count() as u32
}
+ // https://dom.spec.whatwg.org/#dom-parentnode-prepend
+ fn Prepend(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).prepend(nodes)
+ }
+
+ // https://dom.spec.whatwg.org/#dom-parentnode-append
+ fn Append(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).append(nodes)
+ }
+
// https://dom.spec.whatwg.org/#dom-parentnode-queryselector
fn QuerySelector(self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>> {
let root: JSRef<Node> = NodeCast::from_ref(self);
diff --git a/components/script/dom/documentfragment.rs b/components/script/dom/documentfragment.rs
index 43af033a0fb..51f7fa48571 100644
--- a/components/script/dom/documentfragment.rs
+++ b/components/script/dom/documentfragment.rs
@@ -7,8 +7,9 @@ use dom::bindings::codegen::Bindings::DocumentFragmentBinding::DocumentFragmentM
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
use dom::bindings::codegen::InheritTypes::DocumentFragmentDerived;
use dom::bindings::codegen::InheritTypes::{ElementCast, NodeCast};
+use dom::bindings::codegen::UnionTypes::NodeOrString;
use dom::bindings::js::{JSRef, Temporary};
-use dom::bindings::error::Fallible;
+use dom::bindings::error::{ErrorResult, Fallible};
use dom::bindings::global::GlobalRef;
use dom::document::Document;
use dom::element::Element;
@@ -73,6 +74,16 @@ impl<'a> DocumentFragmentMethods for JSRef<'a, DocumentFragment> {
NodeCast::from_ref(self).child_elements().count() as u32
}
+ // https://dom.spec.whatwg.org/#dom-parentnode-prepend
+ fn Prepend(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).prepend(nodes)
+ }
+
+ // https://dom.spec.whatwg.org/#dom-parentnode-append
+ fn Append(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).append(nodes)
+ }
+
// https://dom.spec.whatwg.org/#dom-parentnode-queryselector
fn QuerySelector(self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>> {
let root: JSRef<Node> = NodeCast::from_ref(self);
diff --git a/components/script/dom/documenttype.rs b/components/script/dom/documenttype.rs
index c8e3dfaa40e..b5fd4300b70 100644
--- a/components/script/dom/documenttype.rs
+++ b/components/script/dom/documenttype.rs
@@ -5,6 +5,8 @@
use dom::bindings::codegen::Bindings::DocumentTypeBinding;
use dom::bindings::codegen::Bindings::DocumentTypeBinding::DocumentTypeMethods;
use dom::bindings::codegen::InheritTypes::{DocumentTypeDerived, NodeCast};
+use dom::bindings::codegen::UnionTypes::NodeOrString;
+use dom::bindings::error::ErrorResult;
use dom::bindings::js::{JSRef, Temporary};
use dom::document::Document;
use dom::eventtarget::{EventTarget, EventTargetTypeId};
@@ -87,6 +89,21 @@ impl<'a> DocumentTypeMethods for JSRef<'a, DocumentType> {
self.system_id.clone()
}
+ // https://dom.spec.whatwg.org/#dom-childnode-before
+ fn Before(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).before(nodes)
+ }
+
+ // https://dom.spec.whatwg.org/#dom-childnode-after
+ fn After(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).after(nodes)
+ }
+
+ // https://dom.spec.whatwg.org/#dom-childnode-replacewith
+ fn ReplaceWith(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).replace_with(nodes)
+ }
+
// https://dom.spec.whatwg.org/#dom-childnode-remove
fn Remove(self) {
let node: JSRef<Node> = NodeCast::from_ref(self);
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index f4f70020cde..24eda14cab5 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -23,6 +23,7 @@ use dom::bindings::codegen::InheritTypes::{HTMLTableElementDerived, HTMLTableCel
use dom::bindings::codegen::InheritTypes::{HTMLTableRowElementDerived, HTMLTextAreaElementDerived};
use dom::bindings::codegen::InheritTypes::{HTMLTableSectionElementDerived, NodeCast};
use dom::bindings::codegen::InheritTypes::HTMLAnchorElementCast;
+use dom::bindings::codegen::UnionTypes::NodeOrString;
use dom::bindings::error::{ErrorResult, Fallible};
use dom::bindings::error::Error::{InvalidCharacter, Syntax};
use dom::bindings::error::Error::NoModificationAllowed;
@@ -1292,6 +1293,16 @@ impl<'a> ElementMethods for JSRef<'a, Element> {
NodeCast::from_ref(self).child_elements().count() as u32
}
+ // https://dom.spec.whatwg.org/#dom-parentnode-prepend
+ fn Prepend(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).prepend(nodes)
+ }
+
+ // https://dom.spec.whatwg.org/#dom-parentnode-append
+ fn Append(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).append(nodes)
+ }
+
// https://dom.spec.whatwg.org/#dom-parentnode-queryselector
fn QuerySelector(self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>> {
let root: JSRef<Node> = NodeCast::from_ref(self);
@@ -1304,6 +1315,21 @@ impl<'a> ElementMethods for JSRef<'a, Element> {
root.query_selector_all(selectors)
}
+ // https://dom.spec.whatwg.org/#dom-childnode-before
+ fn Before(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).before(nodes)
+ }
+
+ // https://dom.spec.whatwg.org/#dom-childnode-after
+ fn After(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).after(nodes)
+ }
+
+ // https://dom.spec.whatwg.org/#dom-childnode-replacewith
+ fn ReplaceWith(self, nodes: Vec<NodeOrString>) -> ErrorResult {
+ NodeCast::from_ref(self).replace_with(nodes)
+ }
+
// https://dom.spec.whatwg.org/#dom-childnode-remove
fn Remove(self) {
let node: JSRef<Node> = NodeCast::from_ref(self);
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.
diff --git a/components/script/dom/webidls/ChildNode.webidl b/components/script/dom/webidls/ChildNode.webidl
index de8d8271537..7205d08b05e 100644
--- a/components/script/dom/webidls/ChildNode.webidl
+++ b/components/script/dom/webidls/ChildNode.webidl
@@ -9,10 +9,12 @@
[NoInterfaceObject]
interface ChildNode {
-// Not implemented yet:
-// void before((Node or DOMString)... nodes);
-// void after((Node or DOMString)... nodes);
-// void replace((Node or DOMString)... nodes);
+ [Throws]
+ void before((Node or DOMString)... nodes);
+ [Throws]
+ void after((Node or DOMString)... nodes);
+ [Throws]
+ void replaceWith((Node or DOMString)... nodes);
void remove();
};
diff --git a/components/script/dom/webidls/ParentNode.webidl b/components/script/dom/webidls/ParentNode.webidl
index 6d1d3037265..c7dc425a1fd 100644
--- a/components/script/dom/webidls/ParentNode.webidl
+++ b/components/script/dom/webidls/ParentNode.webidl
@@ -18,9 +18,10 @@ interface ParentNode {
[Pure]
readonly attribute unsigned long childElementCount;
- // Not implemented yet
- // void prepend((Node or DOMString)... nodes);
- // void append((Node or DOMString)... nodes);
+ [Throws]
+ void prepend((Node or DOMString)... nodes);
+ [Throws]
+ void append((Node or DOMString)... nodes);
//Element? query(DOMString relativeSelectors);
//[NewObject]