script/dom/
filereadersync.rs1use std::ptr;
6
7use dom_struct::dom_struct;
8use js::jsapi::JSObject;
9use js::rust::HandleObject;
10use js::typedarray::{ArrayBufferU8, HeapArrayBuffer};
11use script_bindings::trace::RootedTraceableBox;
12
13use crate::dom::bindings::buffer_source::create_buffer_source;
14use crate::dom::bindings::codegen::Bindings::BlobBinding::BlobMethods;
15use crate::dom::bindings::codegen::Bindings::FileReaderSyncBinding::FileReaderSyncMethods;
16use crate::dom::bindings::error::{Error, Fallible};
17use crate::dom::bindings::reflector::{Reflector, reflect_dom_object_with_proto};
18use crate::dom::bindings::root::DomRoot;
19use crate::dom::bindings::str::DOMString;
20use crate::dom::blob::Blob;
21use crate::dom::filereader::FileReaderSharedFunctionality;
22use crate::dom::globalscope::GlobalScope;
23use crate::script_runtime::{CanGc, JSContext};
24
25#[dom_struct]
26pub(crate) struct FileReaderSync {
27 reflector: Reflector,
28}
29
30impl FileReaderSync {
31 pub(crate) fn new_inherited() -> FileReaderSync {
32 FileReaderSync {
33 reflector: Reflector::new(),
34 }
35 }
36
37 fn new(
38 global: &GlobalScope,
39 proto: Option<HandleObject>,
40 can_gc: CanGc,
41 ) -> DomRoot<FileReaderSync> {
42 reflect_dom_object_with_proto(
43 Box::new(FileReaderSync::new_inherited()),
44 global,
45 proto,
46 can_gc,
47 )
48 }
49
50 fn get_blob_bytes(blob: &Blob) -> Result<Vec<u8>, Error> {
51 blob.get_bytes().map_err(|_| Error::NotReadable(None))
52 }
53}
54
55impl FileReaderSyncMethods<crate::DomTypeHolder> for FileReaderSync {
56 fn Constructor(
58 global: &GlobalScope,
59 proto: Option<HandleObject>,
60 can_gc: CanGc,
61 ) -> Fallible<DomRoot<FileReaderSync>> {
62 Ok(FileReaderSync::new(global, proto, can_gc))
63 }
64
65 fn ReadAsBinaryString(&self, blob: &Blob) -> Fallible<DOMString> {
67 let blob_contents = FileReaderSync::get_blob_bytes(blob)?;
69
70 Ok(DOMString::from(String::from_utf8_lossy(&blob_contents)))
72 }
73
74 fn ReadAsText(&self, blob: &Blob, label: Option<DOMString>) -> Fallible<DOMString> {
76 let blob_contents = FileReaderSync::get_blob_bytes(blob)?;
78
79 let blob_label = label.map(String::from);
81 let blob_type = String::from(blob.Type());
82
83 let output =
84 FileReaderSharedFunctionality::text_decode(&blob_contents, &blob_type, &blob_label);
85
86 Ok(output)
87 }
88
89 fn ReadAsDataURL(&self, blob: &Blob) -> Fallible<DOMString> {
91 let blob_contents = FileReaderSync::get_blob_bytes(blob)?;
93
94 let output =
96 FileReaderSharedFunctionality::dataurl_format(&blob_contents, blob.Type().to_string());
97
98 Ok(output)
99 }
100
101 fn ReadAsArrayBuffer(
103 &self,
104 cx: JSContext,
105 blob: &Blob,
106 can_gc: CanGc,
107 ) -> Fallible<RootedTraceableBox<HeapArrayBuffer>> {
108 let blob_contents = FileReaderSync::get_blob_bytes(blob)?;
110
111 rooted!(in(*cx) let mut array_buffer = ptr::null_mut::<JSObject>());
113
114 create_buffer_source::<ArrayBufferU8>(cx, &blob_contents, array_buffer.handle_mut(), can_gc)
115 .map_err(|_| Error::JSFailed)
116 }
117}