mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Rewrite Blob constructor interface
This commit is contained in:
parent
33fa63a3c5
commit
f43009333f
5 changed files with 60 additions and 50 deletions
|
@ -28,6 +28,7 @@ pub struct DataSlice {
|
|||
}
|
||||
|
||||
impl DataSlice {
|
||||
/// Construct DataSlice from reference counted bytes
|
||||
pub fn new(bytes: Arc<Vec<u8>>, start: Option<i64>, end: Option<i64>) -> DataSlice {
|
||||
let size = bytes.len() as i64;
|
||||
let relativeStart: i64 = match start {
|
||||
|
@ -62,14 +63,21 @@ impl DataSlice {
|
|||
}
|
||||
}
|
||||
|
||||
/// Construct an empty data slice
|
||||
pub fn empty() -> DataSlice {
|
||||
DataSlice {
|
||||
bytes: Arc::new(Vec::new()),
|
||||
bytes_start: 0,
|
||||
bytes_end: 0,
|
||||
}
|
||||
}
|
||||
|
||||
/// Get sliced bytes
|
||||
pub fn get_bytes(&self) -> &[u8] {
|
||||
&self.bytes[self.bytes_start..self.bytes_end]
|
||||
}
|
||||
|
||||
pub fn get_all_bytes(&self) -> Arc<Vec<u8>> {
|
||||
self.bytes.clone()
|
||||
}
|
||||
|
||||
/// Get length of sliced bytes
|
||||
pub fn size(&self) -> u64 {
|
||||
(self.bytes_end as u64) - (self.bytes_start as u64)
|
||||
}
|
||||
|
@ -86,38 +94,20 @@ pub struct Blob {
|
|||
isClosed_: Cell<bool>,
|
||||
}
|
||||
|
||||
fn is_ascii_printable(string: &str) -> bool {
|
||||
// Step 5.1 in Sec 5.1 of File API spec
|
||||
// https://w3c.github.io/FileAPI/#constructorBlob
|
||||
string.chars().all(|c| c >= '\x20' && c <= '\x7E')
|
||||
}
|
||||
|
||||
impl Blob {
|
||||
pub fn new_inherited(bytes: Arc<Vec<u8>>,
|
||||
bytes_start: Option<i64>,
|
||||
bytes_end: Option<i64>,
|
||||
typeString: &str) -> Blob {
|
||||
Blob {
|
||||
reflector_: Reflector::new(),
|
||||
data: DataSlice::new(bytes, bytes_start, bytes_end),
|
||||
typeString: typeString.to_owned(),
|
||||
isClosed_: Cell::new(false),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new(global: GlobalRef, bytes: Vec<u8>, typeString: &str) -> Root<Blob> {
|
||||
let boxed_blob = box Blob::new_inherited(Arc::new(bytes), None, None, typeString);
|
||||
pub fn new(global: GlobalRef, slice: DataSlice, typeString: &str) -> Root<Blob> {
|
||||
let boxed_blob = box Blob::new_inherited(slice, typeString);
|
||||
reflect_dom_object(boxed_blob, global, BlobBinding::Wrap)
|
||||
}
|
||||
|
||||
fn new_sliced(global: GlobalRef,
|
||||
bytes: Arc<Vec<u8>>,
|
||||
bytes_start: Option<i64>,
|
||||
bytes_end: Option<i64>,
|
||||
typeString: &str) -> Root<Blob> {
|
||||
|
||||
let boxed_blob = box Blob::new_inherited(bytes, bytes_start, bytes_end, typeString);
|
||||
reflect_dom_object(boxed_blob, global, BlobBinding::Wrap)
|
||||
pub fn new_inherited(slice: DataSlice, typeString: &str) -> Blob {
|
||||
Blob {
|
||||
reflector_: Reflector::new(),
|
||||
data: slice,
|
||||
typeString: typeString.to_owned(),
|
||||
isClosed_: Cell::new(false),
|
||||
}
|
||||
}
|
||||
|
||||
// https://w3c.github.io/FileAPI/#constructorBlob
|
||||
|
@ -143,12 +133,9 @@ impl Blob {
|
|||
.collect()
|
||||
}
|
||||
};
|
||||
let typeString = if is_ascii_printable(&blobPropertyBag.type_) {
|
||||
&*blobPropertyBag.type_
|
||||
} else {
|
||||
""
|
||||
};
|
||||
Ok(Blob::new(global, bytes, &typeString.to_ascii_lowercase()))
|
||||
|
||||
let slice = DataSlice::new(Arc::new(bytes), None, None);
|
||||
Ok(Blob::new(global, slice, blobPropertyBag.get_typestring()))
|
||||
}
|
||||
|
||||
pub fn get_data(&self) -> &DataSlice {
|
||||
|
@ -187,7 +174,7 @@ impl BlobMethods for Blob {
|
|||
};
|
||||
let global = self.global();
|
||||
let bytes = self.data.bytes.clone();
|
||||
Blob::new_sliced(global.r(), bytes, start, end, &relativeContentType)
|
||||
Blob::new(global.r(), DataSlice::new(bytes, start, end), &relativeContentType)
|
||||
}
|
||||
|
||||
// https://w3c.github.io/FileAPI/#dfn-isClosed
|
||||
|
@ -209,3 +196,20 @@ impl BlobMethods for Blob {
|
|||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
impl BlobBinding::BlobPropertyBag {
|
||||
pub fn get_typestring(&self) -> &str {
|
||||
if is_ascii_printable(&self.type_) {
|
||||
&*self.type_
|
||||
} else {
|
||||
""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn is_ascii_printable(string: &str) -> bool {
|
||||
// Step 5.1 in Sec 5.1 of File API spec
|
||||
// https://w3c.github.io/FileAPI/#constructorBlob
|
||||
string.chars().all(|c| c >= '\x20' && c <= '\x7E')
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue