diff options
author | David Zbarsky <dzbarsky@gmail.com> | 2015-08-27 21:15:10 -0700 |
---|---|---|
committer | David Zbarsky <dzbarsky@gmail.com> | 2015-09-08 22:01:49 -0700 |
commit | 3bec4d37ddab4fa55c10eb8def059dce9532e8c2 (patch) | |
tree | 6335b072c03ee0c18f13eb84fb3b9b982ceac908 /components/script | |
parent | 0bc7ad9b08d3ae978be4a95687025f00cfcff312 (diff) | |
download | servo-3bec4d37ddab4fa55c10eb8def059dce9532e8c2.tar.gz servo-3bec4d37ddab4fa55c10eb8def059dce9532e8c2.zip |
Implement Range#surroundContents
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/range.rs | 37 | ||||
-rw-r--r-- | components/script/dom/webidls/Range.webidl | 4 |
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(); |