Skip to content

Commit

Permalink
Refactor FileReader #6762 #6763 #6750 #6751
Browse files Browse the repository at this point in the history
  • Loading branch information
farodin91 committed Jul 29, 2015
1 parent 96b0f96 commit 5921af4
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 70 deletions.
11 changes: 3 additions & 8 deletions components/script/dom/blob.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -83,14 +80,12 @@ impl Blob {
}

pub trait BlobHelpers {
fn read_out_buffer(self) -> Receiver<Vec<u8>>;
fn read_out_buffer(self, send: Sender<Vec<u8>>);
}

impl<'a> BlobHelpers for &'a Blob {
fn read_out_buffer(self) -> Receiver<Vec<u8>> {
let (send, recv) = mpsc::channel();
fn read_out_buffer(self, send: Sender<Vec<u8>>) {
send.send(self.bytes.clone().unwrap_or(vec![])).unwrap();
recv
}
}

Expand Down
96 changes: 36 additions & 60 deletions components/script/dom/filereader.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -219,7 +219,7 @@ impl FileReader {

// https://w3c.github.io/FileAPI/#dfn-readAsText
fn perform_readastext(blob_body: BlobBody)
-> Result<Option<DOMString>, DOMErrorName> {
-> DOMString {

let blob_label = &blob_body.label;
let blob_type = &blob_body.blobtype;
Expand Down Expand Up @@ -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<Option<DOMString>, DOMErrorName> {
-> DOMString {
let config = Config {
char_set: CharacterSet::UrlSafe,
newline: Newline::LF,
Expand All @@ -267,7 +267,7 @@ impl FileReader {
format!("data:{};base64,{}", blob_body.blobtype, base64)
};

Ok(Some(output))
output
}
}

Expand All @@ -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<DOMString>) -> 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
Expand Down Expand Up @@ -377,7 +328,7 @@ impl<'a> FileReaderMethods for &'a FileReader {
trait PrivateFileReaderHelpers {
fn dispatch_progress_event(self, type_: DOMString, loaded: u64, total: Option<u64>);
fn terminate_ongoing_reading(self);
fn read(self, read_data: ReadData, global: GlobalRef) -> ErrorResult;
fn read(self, function: FileReaderFunction, blob: &Blob, label: Option<DOMString>) -> ErrorResult;
fn change_ready_state(self, state: FileReaderReadyState);
}

Expand All @@ -399,15 +350,40 @@ 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<DOMString>) -> 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();

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(())
}
Expand Down
2 changes: 0 additions & 2 deletions components/script/dom/mouseevent.rs
Expand Up @@ -6,7 +6,6 @@ use dom::bindings::codegen::Bindings::MouseEventBinding;
use dom::bindings::codegen::Bindings::MouseEventBinding::MouseEventMethods;
use dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods;
use dom::bindings::codegen::InheritTypes::{EventCast, UIEventCast, MouseEventDerived};
use dom::bindings::error::Error::NotSupported;
use dom::bindings::error::Fallible;
use dom::bindings::global::GlobalRef;
use dom::bindings::js::{JS, MutNullableHeap, Root, RootedReference};
Expand Down Expand Up @@ -215,4 +214,3 @@ impl<'a> MouseEventMethods for &'a MouseEvent {
self.related_target.set(relatedTargetArg.map(JS::from_ref));
}
}

0 comments on commit 5921af4

Please sign in to comment.