Adding for support Blob.{close,isClose} #6723

This commit is contained in:
farodin91 2015-07-28 08:57:08 +02:00
parent fff104bb41
commit 20f99e92d8
7 changed files with 67 additions and 61 deletions

View file

@ -18,6 +18,7 @@ use num::ToPrimitive;
use std::ascii::AsciiExt; use std::ascii::AsciiExt;
use std::borrow::ToOwned; use std::borrow::ToOwned;
use std::cmp::{min, max}; use std::cmp::{min, max};
use std::cell::{Cell};
#[derive(JSTraceable)] #[derive(JSTraceable)]
pub enum BlobTypeId { pub enum BlobTypeId {
@ -32,8 +33,8 @@ pub struct Blob {
type_: BlobTypeId, type_: BlobTypeId,
bytes: Option<Vec<u8>>, bytes: Option<Vec<u8>>,
typeString: DOMString, typeString: DOMString,
global: GlobalField global: GlobalField,
// isClosed_: bool isClosed_: Cell<bool>
} }
fn is_ascii_printable(string: &DOMString) -> bool{ fn is_ascii_printable(string: &DOMString) -> bool{
@ -50,8 +51,8 @@ impl Blob {
type_: type_, type_: type_,
bytes: bytes, bytes: bytes,
typeString: typeString.to_owned(), typeString: typeString.to_owned(),
global: GlobalField::from_rooted(&global) global: GlobalField::from_rooted(&global),
//isClosed_: false isClosed_: Cell::new(false)
} }
} }
@ -83,7 +84,6 @@ impl Blob {
pub trait BlobHelpers { pub trait BlobHelpers {
fn read_out_buffer(self) -> Receiver<Vec<u8>>; fn read_out_buffer(self) -> Receiver<Vec<u8>>;
fn read_out_type(self) -> DOMString;
} }
impl<'a> BlobHelpers for &'a Blob { impl<'a> BlobHelpers for &'a Blob {
@ -92,9 +92,6 @@ impl<'a> BlobHelpers for &'a Blob {
send.send(self.bytes.clone().unwrap_or(vec![])).unwrap(); send.send(self.bytes.clone().unwrap_or(vec![])).unwrap();
recv recv
} }
fn read_out_type(self) -> DOMString {
self.typeString.clone()
}
} }
impl<'a> BlobMethods for &'a Blob { impl<'a> BlobMethods for &'a Blob {
@ -159,15 +156,24 @@ impl<'a> BlobMethods for &'a Blob {
} }
} }
// http://dev.w3.org/2006/webapi/FileAPI/#dfn-isClosed // https://dev.w3.org/2006/webapi/FileAPI/#dfn-isClosed
//fn IsClosed(self) -> bool { fn IsClosed(self) -> bool {
// self.isClosed_.clone() self.isClosed_.get()
//} }
// http://dev.w3.org/2006/webapi/FileAPI/#dfn-close // https://dev.w3.org/2006/webapi/FileAPI/#dfn-close
//fn Close(self) { fn Close(self) {
// TODO // Step 1
//} if self.isClosed_.get() {
return;
}
// Step 2
self.isClosed_.set(true);
// TODO Step 3 if Blob URL Store is implemented
}
} }
impl FileDerived for Blob { impl FileDerived for Blob {

View file

@ -2,6 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::bindings::codegen::Bindings::BlobBinding::BlobMethods;
use dom::bindings::codegen::Bindings::FileReaderBinding::{self, FileReaderConstants, FileReaderMethods}; use dom::bindings::codegen::Bindings::FileReaderBinding::{self, FileReaderConstants, FileReaderMethods};
use dom::bindings::codegen::InheritTypes::{EventCast, EventTargetCast}; use dom::bindings::codegen::InheritTypes::{EventCast, EventTargetCast};
use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull;
@ -268,7 +269,6 @@ impl FileReader {
Ok(Some(output)) Ok(Some(output))
} }
} }
impl<'a> FileReaderMethods for &'a FileReader { impl<'a> FileReaderMethods for &'a FileReader {
@ -287,13 +287,22 @@ impl<'a> FileReaderMethods for &'a FileReader {
if self.ready_state.get() == FileReaderReadyState::Loading { if self.ready_state.get() == FileReaderReadyState::Loading {
return Err(InvalidState); return Err(InvalidState);
} }
//TODO STEP 2 if isClosed implemented in Blob
// 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 // Step 3
self.change_ready_state(FileReaderReadyState::Loading); self.change_ready_state(FileReaderReadyState::Loading);
let bytes = blob.read_out_buffer(); let bytes = blob.read_out_buffer();
let type_ = blob.read_out_type(); let type_ = blob.Type();
let load_data = ReadData::new(bytes, type_, None, FileReaderFunction::ReadAsDataUrl); let load_data = ReadData::new(bytes, type_, None, FileReaderFunction::ReadAsDataUrl);
@ -307,13 +316,22 @@ impl<'a> FileReaderMethods for &'a FileReader {
if self.ready_state.get() == FileReaderReadyState::Loading { if self.ready_state.get() == FileReaderReadyState::Loading {
return Err(InvalidState); return Err(InvalidState);
} }
//TODO STEP 2 if isClosed implemented in Blob
// 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 // Step 3
self.change_ready_state(FileReaderReadyState::Loading); self.change_ready_state(FileReaderReadyState::Loading);
let bytes = blob.read_out_buffer(); let bytes = blob.read_out_buffer();
let type_ = blob.read_out_type(); let type_ = blob.Type();
let load_data = ReadData::new(bytes, type_, label, FileReaderFunction::ReadAsText); let load_data = ReadData::new(bytes, type_, label, FileReaderFunction::ReadAsText);

View file

@ -8,19 +8,20 @@
// Constructor(sequence<(ArrayBuffer or ArrayBufferView or Blob or DOMString)> blobParts, // Constructor(sequence<(ArrayBuffer or ArrayBufferView or Blob or DOMString)> blobParts,
// optional BlobPropertyBag options)] // optional BlobPropertyBag options)]
[Constructor, [Constructor,
Constructor(DOMString blobParts, optional BlobPropertyBag options)] Constructor(DOMString blobParts, optional BlobPropertyBag options),
Exposed=Window/*,Worker*/]
interface Blob { interface Blob {
readonly attribute unsigned long long size; readonly attribute unsigned long long size;
readonly attribute DOMString type; readonly attribute DOMString type;
//readonly attribute boolean isClosed; readonly attribute boolean isClosed;
//slice Blob into byte-ranged chunks //slice Blob into byte-ranged chunks
Blob slice([Clamp] optional long long start, Blob slice([Clamp] optional long long start,
[Clamp] optional long long end, [Clamp] optional long long end,
optional DOMString contentType); optional DOMString contentType);
//void close(); void close();
}; };

View file

@ -1,5 +0,0 @@
[Blob-close.html]
type: testharness
[Blob.close]
expected: FAIL

View file

@ -9,18 +9,6 @@
[URL interface: operation revokeObjectURL(DOMString)] [URL interface: operation revokeObjectURL(DOMString)]
expected: FAIL expected: FAIL
[Blob interface: attribute isClosed]
expected: FAIL
[Blob interface: operation close()]
expected: FAIL
[Blob interface: new Blob(["TEST"\]) must inherit property "isClosed" with the proper type (2)]
expected: FAIL
[Blob interface: new Blob(["TEST"\]) must inherit property "close" with the proper type (4)]
expected: FAIL
[File interface: existence and properties of interface object] [File interface: existence and properties of interface object]
expected: FAIL expected: FAIL

View file

@ -9,18 +9,6 @@
[URL interface: operation revokeObjectURL(DOMString)] [URL interface: operation revokeObjectURL(DOMString)]
expected: FAIL expected: FAIL
[Blob interface: attribute isClosed]
expected: FAIL
[Blob interface: operation close()]
expected: FAIL
[Blob interface: new Blob(["TEST"\]) must inherit property "isClosed" with the proper type (2)]
expected: FAIL
[Blob interface: new Blob(["TEST"\]) must inherit property "close" with the proper type (4)]
expected: FAIL
[File interface: existence and properties of interface object] [File interface: existence and properties of interface object]
expected: FAIL expected: FAIL

View file

@ -11,17 +11,27 @@ test(function() {
var blob = new Blob(["TEST"]); var blob = new Blob(["TEST"]);
var sliced = blob.slice(); var sliced = blob.slice();
blob.close(); blob.close();
test_blob(function() {
return blob; async_test(function(t) {
}, { var reader = new FileReader();
expected: "",
type: "", reader.onload = t.step_func(function(evt) {
desc: "Blob should be empty." assert_unreached("Should not dispatch the load event");
}); });
reader.onerror = t.step_func(function(e) {
assert_equals(reader.result, null);
assert_equals(reader.error.code, DOMException.INVALID_STATE_ERR);
t.done();
});
reader.readAsText(blob, "UTF-8");
}, "Closed Blob");
test_blob(function() { test_blob(function() {
return sliced; return sliced;
}, { }, {
expected: "PASS", expected: "TEST",
type: "", type: "",
desc: "Slice should still have the data." desc: "Slice should still have the data."
}); });