Fix Blob type-string

This commit is contained in:
Zhen Zhang 2016-07-13 22:21:21 +08:00
parent 2df5d705e1
commit 8985f37fa7
2 changed files with 22 additions and 28 deletions

View file

@ -17,7 +17,6 @@ use ipc_channel::ipc;
use net_traits::IpcSend; use net_traits::IpcSend;
use net_traits::blob_url_store::BlobBuf; use net_traits::blob_url_store::BlobBuf;
use net_traits::filemanager_thread::{FileManagerThreadMsg, SelectedFileId, RelativePos}; use net_traits::filemanager_thread::{FileManagerThreadMsg, SelectedFileId, RelativePos};
use std::ascii::AsciiExt;
use std::cell::Cell; use std::cell::Cell;
use std::ops::Index; use std::ops::Index;
use std::path::PathBuf; use std::path::PathBuf;
@ -86,7 +85,9 @@ impl Blob {
Blob { Blob {
reflector_: Reflector::new(), reflector_: Reflector::new(),
blob_impl: DOMRefCell::new(blob_impl), blob_impl: DOMRefCell::new(blob_impl),
typeString: typeString, // NOTE: Guarding the format correctness here,
// https://w3c.github.io/FileAPI/#dfn-type
typeString: normalize_type_string(&typeString),
isClosed_: Cell::new(false), isClosed_: Cell::new(false),
} }
} }
@ -135,7 +136,7 @@ impl Blob {
} }
}; };
Ok(Blob::new(global, BlobImpl::new_from_bytes(bytes), blobPropertyBag.get_typestring())) Ok(Blob::new(global, BlobImpl::new_from_bytes(bytes), blobPropertyBag.type_.to_string()))
} }
/// Get a slice to inner data, this might incur synchronous read and caching /// Get a slice to inner data, this might incur synchronous read and caching
@ -332,20 +333,8 @@ impl BlobMethods for Blob {
end: Option<i64>, end: Option<i64>,
contentType: Option<DOMString>) contentType: Option<DOMString>)
-> Root<Blob> { -> Root<Blob> {
let relativeContentType = match contentType {
None => DOMString::new(),
Some(mut str) => {
if is_ascii_printable(&str) {
str.make_ascii_lowercase();
str
} else {
DOMString::new()
}
}
};
let rel_pos = RelativePos::from_opts(start, end); let rel_pos = RelativePos::from_opts(start, end);
Blob::new_sliced(self, rel_pos, relativeContentType) Blob::new_sliced(self, rel_pos, contentType.unwrap_or(DOMString::from("")))
} }
// https://w3c.github.io/FileAPI/#dfn-isClosed // https://w3c.github.io/FileAPI/#dfn-isClosed
@ -368,15 +357,20 @@ impl BlobMethods for Blob {
} }
} }
impl BlobBinding::BlobPropertyBag { /// Get the normalized, MIME-parsable type string
/// Get the normalized inner type string /// https://w3c.github.io/FileAPI/#dfn-type
/// https://w3c.github.io/FileAPI/#dfn-type /// XXX: We will relax the restriction here,
pub fn get_typestring(&self) -> String { /// since the spec has some problem over this part.
if is_ascii_printable(&self.type_) { /// see https://github.com/w3c/FileAPI/issues/43
self.type_.to_lowercase() fn normalize_type_string(s: &str) -> String {
} else { if is_ascii_printable(s) {
"".to_string() let s_lower = s.to_lowercase();
} // match s_lower.parse() as Result<Mime, ()> {
// Ok(_) => s_lower,
// Err(_) => "".to_string()
s_lower
} else {
"".to_string()
} }
} }

View file

@ -55,7 +55,7 @@ impl File {
let global = GlobalRef::Window(window); let global = GlobalRef::Window(window);
File::new(global, BlobImpl::new_from_file(selected.id, selected.filename, selected.size), File::new(global, BlobImpl::new_from_file(selected.id, selected.filename, selected.size),
name, Some(selected.modified as i64), "") name, Some(selected.modified as i64), &selected.type_string)
} }
// https://w3c.github.io/FileAPI/#file-constructor // https://w3c.github.io/FileAPI/#file-constructor
@ -70,10 +70,10 @@ impl File {
}; };
let ref blobPropertyBag = filePropertyBag.parent; let ref blobPropertyBag = filePropertyBag.parent;
let typeString = blobPropertyBag.get_typestring(); let ref typeString = blobPropertyBag.type_;
let modified = filePropertyBag.lastModified; let modified = filePropertyBag.lastModified;
Ok(File::new(global, BlobImpl::new_from_bytes(bytes), filename, modified, &typeString)) Ok(File::new(global, BlobImpl::new_from_bytes(bytes), filename, modified, typeString))
} }
pub fn name(&self) -> &DOMString { pub fn name(&self) -> &DOMString {