mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Adding for support Blob.{close,isClose} #6723
This commit is contained in:
parent
fff104bb41
commit
20f99e92d8
7 changed files with 67 additions and 61 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[Blob-close.html]
|
|
||||||
type: testharness
|
|
||||||
[Blob.close]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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."
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue