aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-05-17 13:40:30 -0500
committerbors-servo <metajack+bors@gmail.com>2015-05-17 13:40:30 -0500
commit0f1f71b56f55c0cf4cb0d075916f34ebfc706783 (patch)
treeed9ab7cc50a7ea30967ba57230d8a0e26c6c619b /components/script/dom
parentd6c3ddd8fd80853b6f679c5a9539ae86587c9b8e (diff)
parentd0f62c7b73121d8d18af6c76775df991f82b8260 (diff)
downloadservo-0f1f71b56f55c0cf4cb0d075916f34ebfc706783.tar.gz
servo-0f1f71b56f55c0cf4cb0d075916f34ebfc706783.zip
Auto merge of #6064 - nox:characterdata-overflow, r=Ms2ger
<!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/6064) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/characterdata.rs34
1 files changed, 18 insertions, 16 deletions
diff --git a/components/script/dom/characterdata.rs b/components/script/dom/characterdata.rs
index 3ea3609c7d7..017bc79f5a2 100644
--- a/components/script/dom/characterdata.rs
+++ b/components/script/dom/characterdata.rs
@@ -21,7 +21,6 @@ use util::str::DOMString;
use std::borrow::ToOwned;
use std::cell::Ref;
-use std::cmp;
// https://dom.spec.whatwg.org/#characterdata
#[dom_struct]
@@ -68,47 +67,50 @@ impl<'a> CharacterDataMethods for JSRef<'a, CharacterData> {
data.chars().count() as u32
}
- // https://dom.spec.whatwg.org/#dom-characterdata-substringdata
+ // https://dom.spec.whatwg.org/#dom-characterdata-substringdataoffset-count
fn SubstringData(self, offset: u32, count: u32) -> Fallible<DOMString> {
let data = self.data.borrow();
// Step 1.
- let len = data.chars().count();
- if offset as usize > len {
+ let length = data.chars().count() as u32;
+ if offset > length {
// Step 2.
return Err(IndexSize);
}
- // Step 3.
- let end = cmp::min((offset + count) as usize, len);
- // Step 4.
- Ok(data.slice_chars(offset as usize, end).to_owned())
+ // Steps 3-4.
+ let end = if length - offset < count { length } else { offset + count };
+ Ok(data.slice_chars(offset as usize, end as usize).to_owned())
}
- // https://dom.spec.whatwg.org/#dom-characterdata-appenddata
+ // https://dom.spec.whatwg.org/#dom-characterdata-appenddatadata
fn AppendData(self, data: DOMString) {
self.data.borrow_mut().push_str(&data);
}
- // https://dom.spec.whatwg.org/#dom-characterdata-insertdata
+ // https://dom.spec.whatwg.org/#dom-characterdata-insertdataoffset-data
fn InsertData(self, offset: u32, arg: DOMString) -> ErrorResult {
self.ReplaceData(offset, 0, arg)
}
- // https://dom.spec.whatwg.org/#dom-characterdata-deletedata
+ // https://dom.spec.whatwg.org/#dom-characterdata-deletedataoffset-count
fn DeleteData(self, offset: u32, count: u32) -> ErrorResult {
self.ReplaceData(offset, count, "".to_owned())
}
- // https://dom.spec.whatwg.org/#dom-characterdata-replacedata
+ // https://dom.spec.whatwg.org/#dom-characterdata-replacedataoffset-count-data
fn ReplaceData(self, offset: u32, count: u32, arg: DOMString) -> ErrorResult {
+ // Step 1.
let length = self.data.borrow().chars().count() as u32;
if offset > length {
+ // Step 2.
return Err(IndexSize);
}
- let count = if offset + count > length {
- length - offset
- } else {
- count
+ // Step 3.
+ let count = match length - offset {
+ diff if diff < count => diff,
+ _ => count,
};
+ // Step 4: Mutation observers.
+ // Step 5.
let mut data = self.data.borrow().slice_chars(0, offset as usize).to_owned();
data.push_str(&arg);
data.push_str(&self.data.borrow().slice_chars((offset + count) as usize, length as usize));