aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/filereader.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/filereader.rs')
-rw-r--r--components/script/dom/filereader.rs104
1 files changed, 39 insertions, 65 deletions
diff --git a/components/script/dom/filereader.rs b/components/script/dom/filereader.rs
index 7ac8f876157..964a980a0b1 100644
--- a/components/script/dom/filereader.rs
+++ b/components/script/dom/filereader.rs
@@ -2,8 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use dom::bindings::codegen::Bindings::FileReaderBinding;
-use dom::bindings::codegen::Bindings::FileReaderBinding::{FileReaderConstants, FileReaderMethods};
+use dom::bindings::codegen::Bindings::FileReaderBinding::{self, FileReaderConstants, FileReaderMethods};
use dom::bindings::codegen::InheritTypes::{EventCast, EventTargetCast};
use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
use dom::bindings::error::{ErrorResult, Fallible};
@@ -14,8 +13,7 @@ use dom::bindings::refcounted::Trusted;
use dom::bindings::utils::{reflect_dom_object, Reflectable};
use dom::event::{EventHelpers, EventCancelable, EventBubbles};
use dom::eventtarget::{EventTarget, EventTargetHelpers, EventTargetTypeId};
-use dom::blob::Blob;
-use dom::blob::BlobHelpers;
+use dom::blob::{Blob, BlobHelpers};
use dom::domexception::{DOMException, DOMErrorName};
use dom::progressevent::ProgressEvent;
use encoding::all::UTF_8;
@@ -229,33 +227,30 @@ impl FileReader {
fn perform_readastext(blob_body: BlobBody)
-> Result<Option<DOMString>, DOMErrorName> {
+ let blob_label = &blob_body.label;
+ let blob_type = &blob_body.blobtype;
+ let blob_bytes = &blob_body.bytes[..];
+
//https://w3c.github.io/FileAPI/#encoding-determination
// Steps 1 & 2 & 3
- let mut encoding = match blob_body.label {
- Some(e) => encoding_from_whatwg_label(&e),
- None => None
- };
+ let mut encoding = blob_label.as_ref()
+ .map(|string| &**string)
+ .and_then(encoding_from_whatwg_label);
// Step 4 & 5
- encoding = match encoding {
- Some(e) => Some(e),
- None => {
- let resultmime = blob_body.blobtype.parse::<Mime>().ok();
- resultmime.and_then(|Mime(_, _, ref parameters)| {
- parameters.iter()
- .find(|&&(ref k, _)| &Attr::Charset == k)
- .and_then(|&(_, ref v)| encoding_from_whatwg_label(&v.to_string()))
- })
- }
- };
+ encoding = encoding.or_else(|| {
+ let resultmime = blob_type.parse::<Mime>().ok();
+ resultmime.and_then(|Mime(_, _, ref parameters)| {
+ parameters.iter()
+ .find(|&&(ref k, _)| &Attr::Charset == k)
+ .and_then(|&(_, ref v)| encoding_from_whatwg_label(&v.to_string()))
+ })
+ });
// Step 6
- let enc = match encoding {
- Some(code) => code,
- None => UTF_8 as EncodingRef
- };
+ let enc = encoding.unwrap_or(UTF_8 as EncodingRef);
- let convert = &blob_body.bytes[..];
+ let convert = blob_bytes;
// Step 7
let output = enc.decode(convert, DecoderTrap::Replace).unwrap();
Ok(Some(output))
@@ -409,73 +404,51 @@ impl<'a> PrivateFileReaderHelpers for &'a FileReader {
}
#[derive(Clone)]
-pub enum Process {
+pub enum FileReaderEvent {
ProcessRead(TrustedFileReader, GenerationId),
ProcessReadData(TrustedFileReader, GenerationId, DOMString),
ProcessReadError(TrustedFileReader, GenerationId, DOMErrorName),
ProcessReadEOF(TrustedFileReader, GenerationId, Option<BlobBody>)
}
-impl Process {
- fn call(self, chan: &Box<ScriptChan + Send>) {
- let task = box FileReaderEvent::new(self);
- chan.send(ScriptMsg::RunnableMsg(task)).unwrap();
- }
-
- pub fn handle(process: Process) {
- match process {
- Process::ProcessRead(filereader, gen_id) => {
+impl Runnable for FileReaderEvent {
+ fn handler(self: Box<FileReaderEvent>) {
+ let file_reader_event = *self;
+ match file_reader_event {
+ FileReaderEvent::ProcessRead(filereader, gen_id) => {
FileReader::process_read(filereader, gen_id);
},
- Process::ProcessReadData(filereader, gen_id, _) => {
+ FileReaderEvent::ProcessReadData(filereader, gen_id, _) => {
FileReader::process_read_data(filereader, gen_id);
},
- Process::ProcessReadError(filereader, gen_id, error) => {
+ FileReaderEvent::ProcessReadError(filereader, gen_id, error) => {
FileReader::process_read_error(filereader, gen_id, error);
},
- Process::ProcessReadEOF(filereader, gen_id, blob_body) => {
+ FileReaderEvent::ProcessReadEOF(filereader, gen_id, blob_body) => {
FileReader::process_read_eof(filereader, gen_id, blob_body);
}
}
}
}
-pub struct FileReaderEvent {
- process: Process,
-}
-
-impl FileReaderEvent {
- pub fn new(process: Process) -> FileReaderEvent {
- FileReaderEvent {
- process: process,
- }
- }
-
-}
-
-impl Runnable for FileReaderEvent {
- fn handler(self: Box<FileReaderEvent>) {
- let this = *self;
- Process::handle(this.process);
- }
-}
-
-//https://w3c.github.io/FileAPI/#task-read-operation
+// https://w3c.github.io/FileAPI/#task-read-operation
fn perform_annotated_read_operation(gen_id: GenerationId, read_data: ReadData,
filereader: TrustedFileReader, script_chan: Box<ScriptChan + Send>) {
let chan = &script_chan;
// Step 4
- Process::ProcessRead(filereader.clone(),
- gen_id).call(chan);
+ let task = box FileReaderEvent::ProcessRead(filereader.clone(), gen_id);
+ chan.send(ScriptMsg::RunnableMsg(task)).unwrap();
- Process::ProcessReadData(filereader.clone(),
- gen_id, DOMString::new()).call(chan);
+ let task = box FileReaderEvent::ProcessReadData(filereader.clone(),
+ gen_id, DOMString::new());
+ chan.send(ScriptMsg::RunnableMsg(task)).unwrap();
let output = match read_data.bytes.recv() {
Ok(bytes) => bytes,
Err(_) => {
- Process::ProcessReadError(filereader,
- gen_id, DOMErrorName::NotFoundError).call(chan);
+ let task = box FileReaderEvent::ProcessReadError(filereader,
+ gen_id, DOMErrorName::NotFoundError);
+ chan.send(ScriptMsg::RunnableMsg(task)).unwrap();
return;
}
};
@@ -487,5 +460,6 @@ fn perform_annotated_read_operation(gen_id: GenerationId, read_data: ReadData,
BlobBody::new(bytes, blobtype, label, read_data.function)
});
- Process::ProcessReadEOF(filereader, gen_id, blob_body).call(chan);
+ let task = box FileReaderEvent::ProcessReadEOF(filereader, gen_id, blob_body);
+ chan.send(ScriptMsg::RunnableMsg(task)).unwrap();
}