Skip to content

Commit

Permalink
Auto merge of #5806 - nox:splittext, r=Ms2ger
Browse files Browse the repository at this point in the history
<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/5806)
<!-- Reviewable:end -->
  • Loading branch information
bors-servo committed Apr 23, 2015
2 parents d037187 + 163d97d commit 1b08211
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 12 deletions.
43 changes: 41 additions & 2 deletions components/script/dom/text.rs
Expand Up @@ -3,12 +3,15 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

use dom::bindings::codegen::Bindings::TextBinding::{self, TextMethods};
use dom::bindings::codegen::Bindings::CharacterDataBinding::CharacterDataMethods;
use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
use dom::bindings::codegen::InheritTypes::{CharacterDataCast, TextDerived};
use dom::bindings::codegen::InheritTypes::NodeCast;
use dom::bindings::error::Fallible;
use dom::bindings::error::{Error, Fallible};
use dom::bindings::global::GlobalRef;
use dom::bindings::js::{JSRef, Temporary};
use dom::bindings::js::{JSRef, OptionalRootable, RootedReference, Temporary};
use dom::characterdata::{CharacterData, CharacterDataHelpers};
use dom::document::Document;
use dom::eventtarget::{EventTarget, EventTargetTypeId};
Expand Down Expand Up @@ -46,6 +49,42 @@ impl Text {
}

impl<'a> TextMethods for JSRef<'a, Text> {
// https://dom.spec.whatwg.org/#dom-text-splittextoffset
fn SplitText(self, offset: u32) -> Fallible<Temporary<Text>> {
let cdata = CharacterDataCast::from_ref(self);
// Step 1.
let length = cdata.Length();
if offset > length {
// Step 2.
return Err(Error::IndexSize);
}
// Step 3.
let count = length - offset;
// Step 4.
let new_data = cdata.SubstringData(offset, count).unwrap();
// Step 5.
let node = NodeCast::from_ref(self);
let owner_doc = node.owner_doc().root();
let new_node = owner_doc.r().CreateTextNode(new_data).root();
// Step 6.
let parent = node.parent_node().root();
if let Some(ref parent) = parent {
// Step 7.
parent.r().InsertBefore(NodeCast::from_ref(new_node.r()),
node.next_sibling().root().r())
.unwrap();
// TODO: Ranges.
}
// Step 8.
cdata.DeleteData(offset, count).unwrap();
if parent.is_none() {
// Step 9.
// TODO: Ranges
}
// Step 10.
Ok(Temporary::from_rooted(new_node.r()))
}

// https://dom.spec.whatwg.org/#dom-text-wholetext
fn WholeText(self) -> DOMString {
let first = NodeCast::from_ref(self).inclusively_preceding_siblings()
Expand Down
3 changes: 2 additions & 1 deletion components/script/dom/webidls/Text.webidl
Expand Up @@ -13,6 +13,7 @@
// https://dom.spec.whatwg.org/#text
[Constructor(optional DOMString data = "")]
interface Text : CharacterData {
//[NewObject] Text splitText(unsigned long offset);
[NewObject, Throws]
Text splitText(unsigned long offset);
readonly attribute DOMString wholeText;
};
9 changes: 0 additions & 9 deletions tests/wpt/metadata/dom/interfaces.html.ini
Expand Up @@ -276,15 +276,6 @@
[Text interface object length]
expected: FAIL
[Text interface: operation splitText(unsigned long)]
expected: FAIL
[Text interface: document.createTextNode("abc") must inherit property "splitText" with the proper type (0)]
expected: FAIL
[Text interface: calling splitText(unsigned long) on document.createTextNode("abc") with too few arguments must throw TypeError]
expected: FAIL
[CharacterData interface: calling before([object Object\],[object Object\]) on document.createTextNode("abc") with too few arguments must throw TypeError]
expected: FAIL
Expand Down

0 comments on commit 1b08211

Please sign in to comment.