aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorDavid Zbarsky <dzbarsky@gmail.com>2015-08-27 21:15:10 -0700
committerDavid Zbarsky <dzbarsky@gmail.com>2015-09-08 22:01:49 -0700
commit3bec4d37ddab4fa55c10eb8def059dce9532e8c2 (patch)
tree6335b072c03ee0c18f13eb84fb3b9b982ceac908 /components
parent0bc7ad9b08d3ae978be4a95687025f00cfcff312 (diff)
downloadservo-3bec4d37ddab4fa55c10eb8def059dce9532e8c2.tar.gz
servo-3bec4d37ddab4fa55c10eb8def059dce9532e8c2.zip
Implement Range#surroundContents
Diffstat (limited to 'components')
-rw-r--r--components/script/dom/range.rs37
-rw-r--r--components/script/dom/webidls/Range.webidl4
2 files changed, 38 insertions, 3 deletions
diff --git a/components/script/dom/range.rs b/components/script/dom/range.rs
index d86c4e96951..1b29c7333da 100644
--- a/components/script/dom/range.rs
+++ b/components/script/dom/range.rs
@@ -10,7 +10,7 @@ use dom::bindings::codegen::Bindings::RangeBinding::RangeMethods;
use dom::bindings::codegen::Bindings::RangeBinding::{self, RangeConstants};
use dom::bindings::codegen::Bindings::TextBinding::TextMethods;
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
-use dom::bindings::codegen::InheritTypes::{CharacterDataCast, NodeCast, TextCast};
+use dom::bindings::codegen::InheritTypes::{CharacterDataCast, NodeCast, TextCast, TextDerived};
use dom::bindings::error::Error::HierarchyRequest;
use dom::bindings::error::{Error, ErrorResult, Fallible};
use dom::bindings::global::GlobalRef;
@@ -668,6 +668,41 @@ impl RangeMethods for Range {
Ok(())
}
+
+ // https://dom.spec.whatwg.org/#dom-range-surroundcontents
+ fn SurroundContents(&self, new_parent: &Node) -> ErrorResult {
+ // Step 1.
+ let start = self.StartContainer();
+ let end = self.EndContainer();
+
+ if start.inclusive_ancestors().any(|n| !n.is_inclusive_ancestor_of(end.r()) && !n.is_text()) ||
+ end.inclusive_ancestors().any(|n| !n.is_inclusive_ancestor_of(start.r()) && !n.is_text()) {
+ return Err(Error::InvalidState);
+ }
+
+ // Step 2.
+ match new_parent.type_id() {
+ NodeTypeId::Document |
+ NodeTypeId::DocumentType |
+ NodeTypeId::DocumentFragment => return Err(Error::InvalidNodeType),
+ _ => ()
+ }
+
+ // Step 3.
+ let fragment = try!(self.ExtractContents());
+
+ // Step 4.
+ Node::replace_all(None, new_parent);
+
+ // Step 5.
+ try!(self.InsertNode(new_parent));
+
+ // Step 6.
+ let _ = try!(new_parent.AppendChild(NodeCast::from_ref(fragment.r())));
+
+ // Step 7.
+ self.SelectNode(new_parent)
+ }
}
#[derive(JSTraceable)]
diff --git a/components/script/dom/webidls/Range.webidl b/components/script/dom/webidls/Range.webidl
index eb0302d4298..5f8da542112 100644
--- a/components/script/dom/webidls/Range.webidl
+++ b/components/script/dom/webidls/Range.webidl
@@ -50,8 +50,8 @@ interface Range {
DocumentFragment cloneContents();
[Throws]
void insertNode(Node node);
- // [Throws]
- // void surroundContents(Node newParent);
+ [Throws]
+ void surroundContents(Node newParent);
[NewObject]
Range cloneRange();