mirror of
https://github.com/servo/servo.git
synced 2025-08-01 11:40:30 +01:00
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 -->
This commit is contained in:
commit
0f1f71b56f
2 changed files with 18 additions and 19 deletions
|
@ -21,7 +21,6 @@ use util::str::DOMString;
|
||||||
|
|
||||||
use std::borrow::ToOwned;
|
use std::borrow::ToOwned;
|
||||||
use std::cell::Ref;
|
use std::cell::Ref;
|
||||||
use std::cmp;
|
|
||||||
|
|
||||||
// https://dom.spec.whatwg.org/#characterdata
|
// https://dom.spec.whatwg.org/#characterdata
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
|
@ -68,47 +67,50 @@ impl<'a> CharacterDataMethods for JSRef<'a, CharacterData> {
|
||||||
data.chars().count() as u32
|
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> {
|
fn SubstringData(self, offset: u32, count: u32) -> Fallible<DOMString> {
|
||||||
let data = self.data.borrow();
|
let data = self.data.borrow();
|
||||||
// Step 1.
|
// Step 1.
|
||||||
let len = data.chars().count();
|
let length = data.chars().count() as u32;
|
||||||
if offset as usize > len {
|
if offset > length {
|
||||||
// Step 2.
|
// Step 2.
|
||||||
return Err(IndexSize);
|
return Err(IndexSize);
|
||||||
}
|
}
|
||||||
// Step 3.
|
// Steps 3-4.
|
||||||
let end = cmp::min((offset + count) as usize, len);
|
let end = if length - offset < count { length } else { offset + count };
|
||||||
// Step 4.
|
Ok(data.slice_chars(offset as usize, end as usize).to_owned())
|
||||||
Ok(data.slice_chars(offset as usize, end).to_owned())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://dom.spec.whatwg.org/#dom-characterdata-appenddata
|
// https://dom.spec.whatwg.org/#dom-characterdata-appenddatadata
|
||||||
fn AppendData(self, data: DOMString) {
|
fn AppendData(self, data: DOMString) {
|
||||||
self.data.borrow_mut().push_str(&data);
|
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 {
|
fn InsertData(self, offset: u32, arg: DOMString) -> ErrorResult {
|
||||||
self.ReplaceData(offset, 0, arg)
|
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 {
|
fn DeleteData(self, offset: u32, count: u32) -> ErrorResult {
|
||||||
self.ReplaceData(offset, count, "".to_owned())
|
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 {
|
fn ReplaceData(self, offset: u32, count: u32, arg: DOMString) -> ErrorResult {
|
||||||
|
// Step 1.
|
||||||
let length = self.data.borrow().chars().count() as u32;
|
let length = self.data.borrow().chars().count() as u32;
|
||||||
if offset > length {
|
if offset > length {
|
||||||
|
// Step 2.
|
||||||
return Err(IndexSize);
|
return Err(IndexSize);
|
||||||
}
|
}
|
||||||
let count = if offset + count > length {
|
// Step 3.
|
||||||
length - offset
|
let count = match length - offset {
|
||||||
} else {
|
diff if diff < count => diff,
|
||||||
count
|
_ => count,
|
||||||
};
|
};
|
||||||
|
// Step 4: Mutation observers.
|
||||||
|
// Step 5.
|
||||||
let mut data = self.data.borrow().slice_chars(0, offset as usize).to_owned();
|
let mut data = self.data.borrow().slice_chars(0, offset as usize).to_owned();
|
||||||
data.push_str(&arg);
|
data.push_str(&arg);
|
||||||
data.push_str(&self.data.borrow().slice_chars((offset + count) as usize, length as usize));
|
data.push_str(&self.data.borrow().slice_chars((offset + count) as usize, length as usize));
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
[CharacterData-deleteData.html]
|
|
||||||
type: testharness
|
|
||||||
expected: TIMEOUT
|
|
Loading…
Add table
Add a link
Reference in a new issue