From 1507d19112c920d2263d6eef024f2bbdb4d5f807 Mon Sep 17 00:00:00 2001 From: farodin91 Date: Wed, 29 Jul 2015 07:07:22 -0600 Subject: [PATCH] servo: Merge #6807 - Refactor FileReader #6762 #6763 #6750 #6751 (from farodin91:filereader); r=jdm Source-Repo: https://github.com/servo/servo Source-Revision: 52c2049f2a47c814888e98c509eac83dc071e829 --- servo/components/script/dom/blob.rs | 11 +-- servo/components/script/dom/filereader.rs | 96 +++++++++-------------- servo/components/script/dom/mouseevent.rs | 1 - 3 files changed, 39 insertions(+), 69 deletions(-) diff --git a/servo/components/script/dom/blob.rs b/servo/components/script/dom/blob.rs index 4213b8ff2a63..b20c5997a7b1 100644 --- a/servo/components/script/dom/blob.rs +++ b/servo/components/script/dom/blob.rs @@ -9,11 +9,8 @@ use dom::bindings::utils::{Reflector, reflect_dom_object}; use dom::bindings::error::Fallible; use dom::bindings::codegen::Bindings::BlobBinding; use dom::bindings::codegen::Bindings::BlobBinding::BlobMethods; -use std::sync::mpsc; -use std::sync::mpsc::Receiver; - +use std::sync::mpsc::Sender; use util::str::DOMString; - use num::ToPrimitive; use std::ascii::AsciiExt; use std::borrow::ToOwned; @@ -83,14 +80,12 @@ impl Blob { } pub trait BlobHelpers { - fn read_out_buffer(self) -> Receiver>; + fn read_out_buffer(self, send: Sender>); } impl<'a> BlobHelpers for &'a Blob { - fn read_out_buffer(self) -> Receiver> { - let (send, recv) = mpsc::channel(); + fn read_out_buffer(self, send: Sender>) { send.send(self.bytes.clone().unwrap_or(vec![])).unwrap(); - recv } } diff --git a/servo/components/script/dom/filereader.rs b/servo/components/script/dom/filereader.rs index 256b1c8b6bc4..dca2620cde60 100644 --- a/servo/components/script/dom/filereader.rs +++ b/servo/components/script/dom/filereader.rs @@ -21,6 +21,7 @@ use encoding::all::UTF_8; use encoding::types::{EncodingRef, DecoderTrap}; use encoding::label::encoding_from_whatwg_label; use hyper::mime::{Mime, Attr}; +use std::sync::mpsc; use script_task::{ScriptChan, ScriptMsg, Runnable, ScriptPort}; use std::cell::{Cell, RefCell}; use std::sync::mpsc::Receiver; @@ -202,8 +203,7 @@ impl FileReader { FileReader::perform_readastext(blob_body), }; - //FIXME handle error if error is possible - *fr.result.borrow_mut() = output.unwrap(); + *fr.result.borrow_mut() = Some(output); // Step 8.3 fr.dispatch_progress_event("load".to_owned(), 0, None); @@ -219,7 +219,7 @@ impl FileReader { // https://w3c.github.io/FileAPI/#dfn-readAsText fn perform_readastext(blob_body: BlobBody) - -> Result, DOMErrorName> { + -> DOMString { let blob_label = &blob_body.label; let blob_type = &blob_body.blobtype; @@ -247,12 +247,12 @@ impl FileReader { let convert = blob_bytes; // Step 7 let output = enc.decode(convert, DecoderTrap::Replace).unwrap(); - Ok(Some(output)) + output } //https://w3c.github.io/FileAPI/#dfn-readAsDataURL fn perform_readasdataurl(blob_body: BlobBody) - -> Result, DOMErrorName> { + -> DOMString { let config = Config { char_set: CharacterSet::UrlSafe, newline: Newline::LF, @@ -267,7 +267,7 @@ impl FileReader { format!("data:{};base64,{}", blob_body.blobtype, base64) }; - Ok(Some(output)) + output } } @@ -282,63 +282,14 @@ impl<'a> FileReaderMethods for &'a FileReader { //TODO https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer // https://w3c.github.io/FileAPI/#dfn-readAsDataURL fn ReadAsDataURL(self, blob: &Blob) -> ErrorResult { - let global = self.global.root(); - // Step 1 - if self.ready_state.get() == FileReaderReadyState::Loading { - return Err(InvalidState); - } - - // Step 2 - if blob.IsClosed() { - let global = self.global.root(); - let exception = DOMException::new(global.r(), DOMErrorName::InvalidStateError); - self.error.set(Some(JS::from_rooted(&exception))); - - self.dispatch_progress_event("error".to_owned(), 0, None); - return Ok(()); - } - - // Step 3 - self.change_ready_state(FileReaderReadyState::Loading); - - let bytes = blob.read_out_buffer(); - let type_ = blob.Type(); - - let load_data = ReadData::new(bytes, type_, None, FileReaderFunction::ReadAsDataUrl); - - self.read(load_data, global.r()) + self.read(FileReaderFunction::ReadAsDataUrl, blob, None) } // https://w3c.github.io/FileAPI/#dfn-readAsText fn ReadAsText(self, blob: &Blob, label:Option) -> ErrorResult { - let global = self.global.root(); - // Step 1 - if self.ready_state.get() == FileReaderReadyState::Loading { - return Err(InvalidState); - } - - // Step 2 - if blob.IsClosed() { - let global = self.global.root(); - let exception = DOMException::new(global.r(), DOMErrorName::InvalidStateError); - self.error.set(Some(JS::from_rooted(&exception))); - - self.dispatch_progress_event("error".to_owned(), 0, None); - return Ok(()); - } - - // Step 3 - self.change_ready_state(FileReaderReadyState::Loading); - - let bytes = blob.read_out_buffer(); - let type_ = blob.Type(); - - let load_data = ReadData::new(bytes, type_, label, FileReaderFunction::ReadAsText); - - self.read(load_data, global.r()) + self.read(FileReaderFunction::ReadAsText, blob, label) } - // https://w3c.github.io/FileAPI/#dfn-abort fn Abort(self) { // Step 2 @@ -377,7 +328,7 @@ impl<'a> FileReaderMethods for &'a FileReader { trait PrivateFileReaderHelpers { fn dispatch_progress_event(self, type_: DOMString, loaded: u64, total: Option); fn terminate_ongoing_reading(self); - fn read(self, read_data: ReadData, global: GlobalRef) -> ErrorResult; + fn read(self, function: FileReaderFunction, blob: &Blob, label: Option) -> ErrorResult; fn change_ready_state(self, state: FileReaderReadyState); } @@ -399,7 +350,32 @@ impl<'a> PrivateFileReaderHelpers for &'a FileReader { self.generation_id.set(GenerationId(prev_id + 1)); } - fn read(self, read_data: ReadData, global: GlobalRef) -> ErrorResult { + fn read(self, function: FileReaderFunction, blob: &Blob, label: Option) -> ErrorResult { + let root = self.global.root(); + let global = root.r(); + // Step 1 + if self.ready_state.get() == FileReaderReadyState::Loading { + return Err(InvalidState); + } + // Step 2 + if blob.IsClosed() { + let global = self.global.root(); + let exception = DOMException::new(global.r(), DOMErrorName::InvalidStateError); + self.error.set(Some(JS::from_rooted(&exception))); + + self.dispatch_progress_event("error".to_owned(), 0, None); + return Ok(()); + } + + // Step 3 + self.change_ready_state(FileReaderReadyState::Loading); + + // Step 4 + let (send, bytes) = mpsc::channel(); + blob.read_out_buffer(send); + let type_ = blob.Type(); + + let load_data = ReadData::new(bytes, type_, label, function); let fr = Trusted::new(global.get_cx(), self, global.script_chan()); let gen_id = self.generation_id.get(); @@ -407,7 +383,7 @@ impl<'a> PrivateFileReaderHelpers for &'a FileReader { let script_chan = global.script_chan(); spawn_named("file reader async operation".to_owned(), move || { - perform_annotated_read_operation(gen_id, read_data, fr, script_chan) + perform_annotated_read_operation(gen_id, load_data, fr, script_chan) }); Ok(()) } diff --git a/servo/components/script/dom/mouseevent.rs b/servo/components/script/dom/mouseevent.rs index 0238d253610f..fd3831e535b5 100644 --- a/servo/components/script/dom/mouseevent.rs +++ b/servo/components/script/dom/mouseevent.rs @@ -214,4 +214,3 @@ impl<'a> MouseEventMethods for &'a MouseEvent { self.related_target.set(relatedTargetArg.map(JS::from_ref)); } } -