diff options
Diffstat (limited to 'components/script/dom/filereader.rs')
-rw-r--r-- | components/script/dom/filereader.rs | 104 |
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(); } |