Bug 860731 - Part c: Move LockedFile to WebIDL; r=janv

This commit is contained in:
Ms2ger 2014-03-24 16:10:27 +01:00
parent 941fe47b2d
commit 8e4b6960fa
17 changed files with 370 additions and 423 deletions

View File

@ -158,7 +158,6 @@
#endif
#include "nsIDOMGlobalObjectConstructor.h"
#include "nsIDOMLockedFile.h"
#include "nsDebug.h"
#include "mozilla/dom/BindingUtils.h"
@ -459,8 +458,6 @@ static nsDOMClassInfoData sClassInfoData[] = {
DOM_DEFAULT_SCRIPTABLE_FLAGS)
#endif
NS_DEFINE_CLASSINFO_DATA(LockedFile, nsEventTargetSH,
EVENTTARGET_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(CSSFontFeatureValuesRule, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
@ -1154,10 +1151,6 @@ nsDOMClassInfo::Init()
#endif
DOM_CLASSINFO_MAP_BEGIN(LockedFile, nsIDOMLockedFile)
DOM_CLASSINFO_MAP_ENTRY(nsIDOMLockedFile)
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(CSSFontFeatureValuesRule, nsIDOMCSSFontFeatureValuesRule)
DOM_CLASSINFO_MAP_ENTRY(nsIDOMCSSFontFeatureValuesRule)
DOM_CLASSINFO_MAP_END

View File

@ -98,8 +98,6 @@ DOMCI_CLASS(CSSPageRule)
DOMCI_CLASS(MozIccManager)
#endif
DOMCI_CLASS(LockedFile)
DOMCI_CLASS(CSSFontFeatureValuesRule)
DOMCI_CLASS(UserDataHandler)

View File

@ -692,6 +692,10 @@ DOMInterfaces = {
'register': False
},
'LockedFile': {
'nativeType': 'mozilla::dom::file::LockedFile',
},
'MediaList': {
'nativeType': 'nsMediaList',
'headerFile': 'nsIMediaList.h',
@ -1853,7 +1857,6 @@ addExternalIface('File')
addExternalIface('HitRegionOptions', nativeType='nsISupports')
addExternalIface('imgINotificationObserver', nativeType='imgINotificationObserver')
addExternalIface('imgIRequest', nativeType='imgIRequest', notflattened=True)
addExternalIface('LockedFile')
addExternalIface('MenuBuilder', nativeType='nsIMenuBuilder', notflattened=True)
addExternalIface('MozBoxObject', nativeType='nsIBoxObject')
addExternalIface('MozControllers', nativeType='nsIControllers')

View File

@ -52,3 +52,5 @@ MSG_DEF(MSG_NOT_DATE, 1, "{0} is not a date.")
MSG_DEF(MSG_INVALID_ADVANCE_COUNT, 0, "0 (Zero) is not a valid advance count.")
MSG_DEF(MSG_DEFINEPROPERTY_ON_GSP, 0, "Not allowed to define a property on the named properties object.")
MSG_DEF(MSG_INVALID_URL, 1, "{0} is not a valid URL.")
MSG_DEF(MSG_METADATA_NOT_CONFIGURED, 0, "Either size or lastModified should be true.")
MSG_DEF(MSG_INVALID_READ_SIZE, 0, "0 (Zero) is not a valid read size.")

View File

@ -128,7 +128,7 @@ FileHandle::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
return FileHandleBinding::Wrap(aCx, aScope, this);
}
already_AddRefed<nsIDOMLockedFile>
already_AddRefed<LockedFile>
FileHandle::Open(FileMode aMode, ErrorResult& aError)
{
MOZ_ASSERT(NS_IsMainThread());

View File

@ -113,7 +113,7 @@ public:
aType = mType;
}
already_AddRefed<nsIDOMLockedFile>
already_AddRefed<LockedFile>
Open(FileMode aMode, ErrorResult& aError);
already_AddRefed<DOMRequest>

View File

@ -115,7 +115,7 @@ FileRequest::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
return FileRequestBinding::Wrap(aCx, aScope, this);
}
nsIDOMLockedFile*
LockedFile*
FileRequest::GetLockedFile() const
{
MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!");

View File

@ -51,7 +51,7 @@ public:
WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope) MOZ_OVERRIDE;
// WebIDL
nsIDOMLockedFile*
LockedFile*
GetLockedFile() const;
IMPL_EVENT_HANDLER(progress)

View File

@ -284,7 +284,8 @@ FileService::AbortLockedFilesForStorage(nsIFileStorage* aFileStorage)
lockedFiles);
for (uint32_t index = 0; index < lockedFiles.Length(); index++) {
lockedFiles[index]->Abort();
ErrorResult ignored;
lockedFiles[index]->Abort(ignored);
}
}

View File

@ -6,21 +6,8 @@
#include "LockedFile.h"
#include "nsIAppShell.h"
#include "nsIDOMEvent.h"
#include "nsIDOMFile.h"
#include "nsIFileStorage.h"
#include "nsISeekableStream.h"
#include "jsfriendapi.h"
#include "nsNetUtil.h"
#include "nsDOMClassInfoID.h"
#include "nsJSUtils.h"
#include "nsStringStream.h"
#include "nsWidgetsCID.h"
#include "xpcpublic.h"
#include "AsyncHelper.h"
#include "nsIDOMEvent.h"
#include "FileHandle.h"
#include "FileHelper.h"
#include "FileRequest.h"
@ -28,18 +15,25 @@
#include "FileStreamWrappers.h"
#include "MemoryStreams.h"
#include "MetadataHelper.h"
#include "nsError.h"
#include "nsContentUtils.h"
#include "mozilla/EventDispatcher.h"
#include "mozilla/dom/DOMRequest.h"
#include "mozilla/dom/EncodingUtils.h"
#include "mozilla/dom/LockedFileBinding.h"
#include "mozilla/dom/TypedArray.h"
#include "mozilla/dom/UnionTypes.h"
#include "mozilla/EventDispatcher.h"
#include "nsContentUtils.h"
#include "nsError.h"
#include "nsIAppShell.h"
#include "nsIDOMFile.h"
#include "nsIFileStorage.h"
#include "nsISeekableStream.h"
#include "nsNetUtil.h"
#include "nsStringStream.h"
#include "nsWidgetsCID.h"
#define STREAM_COPY_BLOCK_SIZE 32768
using namespace mozilla;
using namespace mozilla::dom;
USING_FILE_NAMESPACE
BEGIN_FILE_NAMESPACE
namespace {
@ -215,61 +209,6 @@ CreateGenericEvent(mozilla::dom::EventTarget* aEventOwner,
return event.forget();
}
inline nsresult
GetInputStreamForJSVal(JS::Handle<JS::Value> aValue, JSContext* aCx,
nsIInputStream** aInputStream, uint64_t* aInputLength)
{
nsresult rv;
if (aValue.isObject()) {
JS::Rooted<JSObject*> obj(aCx, &aValue.toObject());
if (JS_IsArrayBufferObject(obj)) {
char* data = reinterpret_cast<char*>(JS_GetArrayBufferData(obj));
uint32_t length = JS_GetArrayBufferByteLength(obj);
rv = NS_NewByteInputStream(aInputStream, data, length,
NS_ASSIGNMENT_COPY);
NS_ENSURE_SUCCESS(rv, rv);
*aInputLength = length;
return NS_OK;
}
nsCOMPtr<nsIDOMBlob> blob = do_QueryInterface(
nsContentUtils::XPConnect()->GetNativeOfWrapper(aCx, obj));
if (blob) {
rv = blob->GetSize(aInputLength);
NS_ENSURE_SUCCESS(rv, rv);
rv = blob->GetInternalStream(aInputStream);
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
}
}
JSString* jsstr = JS::ToString(aCx, aValue);
NS_ENSURE_TRUE(jsstr, NS_ERROR_XPC_BAD_CONVERT_JS);
nsDependentJSString str;
if (!str.init(aCx, jsstr)) {
return NS_ERROR_FAILURE;
}
nsCString cstr;
CopyUTF16toUTF8(str, cstr);
nsCOMPtr<nsIInputStream> stream;
rv = NS_NewCStringInputStream(getter_AddRefs(stream), cstr);
NS_ENSURE_SUCCESS(rv, rv);
stream.forget(aInputStream);
*aInputLength = cstr.Length();
return NS_OK;
}
} // anonymous namespace
// static
@ -305,6 +244,54 @@ LockedFile::Create(FileHandle* aFileHandle,
return lockedFile.forget();
}
/* static */ already_AddRefed<nsIInputStream>
LockedFile::GetInputStream(const ArrayBuffer& aValue, uint64_t* aInputLength,
ErrorResult& aRv)
{
const char* data = reinterpret_cast<const char*>(aValue.Data());
uint32_t length = aValue.Length();
nsCOMPtr<nsIInputStream> stream;
aRv = NS_NewByteInputStream(getter_AddRefs(stream), data, length,
NS_ASSIGNMENT_COPY);
if (aRv.Failed()) {
return nullptr;
}
*aInputLength = length;
return stream.forget();
}
/* static */ already_AddRefed<nsIInputStream>
LockedFile::GetInputStream(nsIDOMBlob* aValue, uint64_t* aInputLength,
ErrorResult& aRv)
{
aRv = aValue->GetSize(aInputLength);
if (aRv.Failed()) {
return nullptr;
}
nsCOMPtr<nsIInputStream> stream;
aRv = aValue->GetInternalStream(getter_AddRefs(stream));
return stream.forget();
}
/* static */ already_AddRefed<nsIInputStream>
LockedFile::GetInputStream(const nsAString& aValue, uint64_t* aInputLength,
ErrorResult& aRv)
{
NS_ConvertUTF16toUTF8 cstr(aValue);
nsCOMPtr<nsIInputStream> stream;
aRv = NS_NewCStringInputStream(getter_AddRefs(stream), cstr);
if (aRv.Failed()) {
return nullptr;
}
*aInputLength = cstr.Length();
return stream.forget();
}
LockedFile::LockedFile()
: mReadyState(INITIAL),
mMode(FileMode::Readonly),
@ -315,6 +302,7 @@ LockedFile::LockedFile()
mCreating(false)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
SetIsDOMBinding();
}
LockedFile::~LockedFile()
@ -326,20 +314,12 @@ NS_IMPL_CYCLE_COLLECTION_INHERITED_1(LockedFile, nsDOMEventTargetHelper,
mFileHandle)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(LockedFile)
NS_INTERFACE_MAP_ENTRY(nsIDOMLockedFile)
NS_INTERFACE_MAP_ENTRY(nsIRunnable)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(LockedFile)
NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
NS_IMPL_ADDREF_INHERITED(LockedFile, nsDOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(LockedFile, nsDOMEventTargetHelper)
DOMCI_DATA(LockedFile, LockedFile)
NS_IMPL_EVENT_HANDLER(LockedFile, complete)
NS_IMPL_EVENT_HANDLER(LockedFile, abort)
NS_IMPL_EVENT_HANDLER(LockedFile, error)
nsresult
LockedFile::PreHandleEvent(EventChainPreVisitor& aVisitor)
{
@ -457,103 +437,27 @@ LockedFile::IsOpen() const
return false;
}
NS_IMETHODIMP
LockedFile::GetFileHandle(nsISupports** aFileHandle)
{
nsCOMPtr<nsISupports> result(mFileHandle);
result.forget(aFileHandle);
return NS_OK;
}
NS_IMETHODIMP
LockedFile::GetMode(nsAString& aMode)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
switch (mMode) {
case FileMode::Readonly:
aMode.AssignLiteral("readonly");
break;
case FileMode::Readwrite:
aMode.AssignLiteral("readwrite");
break;
default:
NS_NOTREACHED("Unknown mode!");
}
return NS_OK;
}
NS_IMETHODIMP
LockedFile::GetActive(bool* aActive)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
*aActive = IsOpen();
return NS_OK;
}
NS_IMETHODIMP
LockedFile::GetLocation(JSContext* aCx,
JS::MutableHandle<JS::Value> aLocation)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
if (mLocation == UINT64_MAX) {
aLocation.setNull();
}
else {
aLocation.setDouble(double(mLocation));
}
return NS_OK;
}
NS_IMETHODIMP
LockedFile::SetLocation(JSContext* aCx,
JS::Handle<JS::Value> aLocation)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
// Null means the end-of-file.
if (aLocation.isNull()) {
mLocation = UINT64_MAX;
return NS_OK;
}
uint64_t location;
if (!JS::ToUint64(aCx, aLocation, &location)) {
return NS_ERROR_TYPE_ERR;
}
mLocation = location;
return NS_OK;
}
NS_IMETHODIMP
LockedFile::GetMetadata(JS::Handle<JS::Value> aParameters,
JSContext* aCx,
nsISupports** _retval)
already_AddRefed<FileRequest>
LockedFile::GetMetadata(const DOMFileMetadataParameters& aParameters,
ErrorResult& aRv)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
if (!IsOpen()) {
return NS_ERROR_DOM_FILEHANDLE_LOCKEDFILE_INACTIVE_ERR;
aRv.Throw(NS_ERROR_DOM_FILEHANDLE_LOCKEDFILE_INACTIVE_ERR);
return nullptr;
}
// Do nothing if the window is closed
if (!GetOwner()) {
return NS_OK;
return nullptr;
}
// Get optional arguments.
DOMFileMetadataParameters config;
JS::Rooted<JS::Value> parameters(aCx, aParameters);
bool result = config.Init(aCx, parameters);
NS_ENSURE_TRUE(result, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
nsRefPtr<MetadataParameters> params =
new MetadataParameters(config.mSize, config.mLastModified);
new MetadataParameters(aParameters.mSize, aParameters.mLastModified);
if (!params->IsConfigured()) {
return NS_ERROR_TYPE_ERR;
aRv.ThrowTypeError(MSG_METADATA_NOT_CONFIGURED);
return nullptr;
}
nsRefPtr<FileRequest> fileRequest = GenerateFileRequest();
@ -561,36 +465,47 @@ LockedFile::GetMetadata(JS::Handle<JS::Value> aParameters,
nsRefPtr<MetadataHelper> helper =
new MetadataHelper(this, fileRequest, params);
nsresult rv = helper->Enqueue();
NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
if (NS_FAILED(helper->Enqueue())) {
aRv.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
return nullptr;
}
nsRefPtr<nsIDOMDOMRequest> request = fileRequest.forget();
request.forget(_retval);
return NS_OK;
return fileRequest.forget();
}
NS_IMETHODIMP
LockedFile::ReadAsArrayBuffer(uint64_t aSize,
JSContext* aCx,
nsISupports** _retval)
bool
LockedFile::CheckStateAndArgumentsForRead(uint64_t aSize, ErrorResult& aRv)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
if (!IsOpen()) {
return NS_ERROR_DOM_FILEHANDLE_LOCKEDFILE_INACTIVE_ERR;
aRv.Throw(NS_ERROR_DOM_FILEHANDLE_LOCKEDFILE_INACTIVE_ERR);
return false;
}
if (mLocation == UINT64_MAX) {
return NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR;
aRv.Throw(NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR);
return false;
}
if (!aSize) {
return NS_ERROR_TYPE_ERR;
aRv.ThrowTypeError(MSG_INVALID_READ_SIZE);
return false;
}
// Do nothing if the window is closed
if (!GetOwner()) {
return NS_OK;
return false;
}
return true;
}
already_AddRefed<FileRequest>
LockedFile::ReadAsArrayBuffer(uint64_t aSize, ErrorResult& aRv)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
if (!CheckStateAndArgumentsForRead(aSize, aRv)) {
return nullptr;
}
nsRefPtr<FileRequest> fileRequest = GenerateFileRequest();
@ -598,41 +513,24 @@ LockedFile::ReadAsArrayBuffer(uint64_t aSize,
nsRefPtr<ReadHelper> helper =
new ReadHelper(this, fileRequest, mLocation, aSize);
nsresult rv = helper->Init();
NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
rv = helper->Enqueue();
NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
if (NS_FAILED(helper->Init()) || NS_FAILED(helper->Enqueue())) {
aRv.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
return nullptr;
}
mLocation += aSize;
nsRefPtr<nsIDOMDOMRequest> request = fileRequest.forget();
request.forget(_retval);
return NS_OK;
return fileRequest.forget();
}
NS_IMETHODIMP
LockedFile::ReadAsText(uint64_t aSize,
const nsAString& aEncoding,
nsISupports** _retval)
already_AddRefed<FileRequest>
LockedFile::ReadAsText(uint64_t aSize, const nsAString& aEncoding,
ErrorResult& aRv)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
if (!IsOpen()) {
return NS_ERROR_DOM_FILEHANDLE_LOCKEDFILE_INACTIVE_ERR;
}
if (mLocation == UINT64_MAX) {
return NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR;
}
if (!aSize) {
return NS_ERROR_TYPE_ERR;
}
// Do nothing if the window is closed
if (!GetOwner()) {
return NS_OK;
if (!CheckStateAndArgumentsForRead(aSize, aRv)) {
return nullptr;
}
nsRefPtr<FileRequest> fileRequest = GenerateFileRequest();
@ -640,70 +538,57 @@ LockedFile::ReadAsText(uint64_t aSize,
nsRefPtr<ReadTextHelper> helper =
new ReadTextHelper(this, fileRequest, mLocation, aSize, aEncoding);
nsresult rv = helper->Init();
NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
rv = helper->Enqueue();
NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
if (NS_FAILED(helper->Init()) || NS_FAILED(helper->Enqueue())) {
aRv.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
return nullptr;
}
mLocation += aSize;
nsRefPtr<nsIDOMDOMRequest> request = fileRequest.forget();
request.forget(_retval);
return NS_OK;
return fileRequest.forget();
}
NS_IMETHODIMP
LockedFile::Write(JS::Handle<JS::Value> aValue,
JSContext* aCx,
nsISupports** _retval)
bool
LockedFile::CheckStateForWrite(ErrorResult& aRv)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
return WriteOrAppend(aValue, aCx, _retval, false);
}
NS_IMETHODIMP
LockedFile::Append(JS::Handle<JS::Value> aValue,
JSContext* aCx,
nsISupports** _retval)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
return WriteOrAppend(aValue, aCx, _retval, true);
}
NS_IMETHODIMP
LockedFile::Truncate(uint64_t aSize,
uint8_t aOptionalArgCount,
nsISupports** _retval)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
if (!IsOpen()) {
return NS_ERROR_DOM_FILEHANDLE_LOCKEDFILE_INACTIVE_ERR;
aRv.Throw(NS_ERROR_DOM_FILEHANDLE_LOCKEDFILE_INACTIVE_ERR);
return false;
}
if (mMode != FileMode::Readwrite) {
return NS_ERROR_DOM_FILEHANDLE_READ_ONLY_ERR;
}
uint64_t location;
if (aOptionalArgCount) {
// Just in case someone calls us from C++
NS_ASSERTION(aSize != UINT64_MAX, "Passed wrong size!");
location = aSize;
}
else {
if (mLocation == UINT64_MAX) {
return NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR;
}
location = mLocation;
aRv.Throw(NS_ERROR_DOM_FILEHANDLE_READ_ONLY_ERR);
return false;
}
// Do nothing if the window is closed
if (!GetOwner()) {
return NS_OK;
return false;
}
return true;
}
already_AddRefed<FileRequest>
LockedFile::Truncate(const Optional<uint64_t>& aSize, ErrorResult& aRv)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
uint64_t location;
if (aSize.WasPassed()) {
// Just in case someone calls us from C++
NS_ASSERTION(aSize.Value() != UINT64_MAX, "Passed wrong size!");
location = aSize.Value();
} else {
if (mLocation == UINT64_MAX) {
aRv.Throw(NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR);
return nullptr;
}
location = mLocation;
}
if (!CheckStateForWrite(aRv)) {
return nullptr;
}
nsRefPtr<FileRequest> fileRequest = GenerateFileRequest();
@ -711,50 +596,41 @@ LockedFile::Truncate(uint64_t aSize,
nsRefPtr<TruncateHelper> helper =
new TruncateHelper(this, fileRequest, location);
nsresult rv = helper->Enqueue();
NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
if (aOptionalArgCount) {
mLocation = aSize;
if (NS_FAILED(helper->Enqueue())) {
aRv.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
return nullptr;
}
nsRefPtr<nsIDOMDOMRequest> request = fileRequest.forget();
request.forget(_retval);
return NS_OK;
if (aSize.WasPassed()) {
mLocation = aSize.Value();
}
return fileRequest.forget();
}
NS_IMETHODIMP
LockedFile::Flush(nsISupports** _retval)
already_AddRefed<FileRequest>
LockedFile::Flush(ErrorResult& aRv)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
if (!IsOpen()) {
return NS_ERROR_DOM_FILEHANDLE_LOCKEDFILE_INACTIVE_ERR;
}
if (mMode != FileMode::Readwrite) {
return NS_ERROR_DOM_FILEHANDLE_READ_ONLY_ERR;
}
// Do nothing if the window is closed
if (!GetOwner()) {
return NS_OK;
if (!CheckStateForWrite(aRv)) {
return nullptr;
}
nsRefPtr<FileRequest> fileRequest = GenerateFileRequest();
nsRefPtr<FlushHelper> helper = new FlushHelper(this, fileRequest);
nsresult rv = helper->Enqueue();
NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
if (NS_FAILED(helper->Enqueue())) {
aRv.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
return nullptr;
}
nsRefPtr<nsIDOMDOMRequest> request = fileRequest.forget();
request.forget(_retval);
return NS_OK;
return fileRequest.forget();
}
NS_IMETHODIMP
LockedFile::Abort()
void
LockedFile::Abort(ErrorResult& aRv)
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
@ -762,7 +638,8 @@ LockedFile::Abort()
// even from outside of transaction callbacks.
if (mReadyState != LockedFile::INITIAL &&
mReadyState != LockedFile::LOADING) {
return NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR;
aRv.Throw(NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR);
return;
}
bool needToFinish = mReadyState == INITIAL;
@ -773,10 +650,8 @@ LockedFile::Abort()
// Fire the abort event if there are no outstanding requests. Otherwise the
// abort event will be fired when all outstanding requests finish.
if (needToFinish) {
return Finish();
aRv = Finish();
}
return NS_OK;
}
NS_IMETHODIMP
@ -829,38 +704,23 @@ LockedFile::OpenInputStream(bool aWholeFile, uint64_t aStart, uint64_t aLength,
return NS_OK;
}
nsresult
LockedFile::WriteOrAppend(JS::Handle<JS::Value> aValue,
JSContext* aCx,
nsISupports** _retval,
bool aAppend)
already_AddRefed<FileRequest>
LockedFile::WriteOrAppend(nsIInputStream* aInputStream, uint64_t aInputLength,
bool aAppend, ErrorResult& aRv)
{
if (!IsOpen()) {
return NS_ERROR_DOM_FILEHANDLE_LOCKEDFILE_INACTIVE_ERR;
}
if (mMode != FileMode::Readwrite) {
return NS_ERROR_DOM_FILEHANDLE_READ_ONLY_ERR;
}
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
if (!aAppend && mLocation == UINT64_MAX) {
return NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR;
aRv.Throw(NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR);
return nullptr;
}
// Do nothing if the window is closed
if (!GetOwner()) {
return NS_OK;
if (!CheckStateForWrite(aRv)) {
return nullptr;
}
nsCOMPtr<nsIInputStream> inputStream;
uint64_t inputLength;
nsresult rv =
GetInputStreamForJSVal(aValue, aCx, getter_AddRefs(inputStream),
&inputLength);
NS_ENSURE_SUCCESS(rv, rv);
if (!inputLength) {
return NS_OK;
if (!aInputLength) {
return nullptr;
}
nsRefPtr<FileRequest> fileRequest = GenerateFileRequest();
@ -868,21 +728,21 @@ LockedFile::WriteOrAppend(JS::Handle<JS::Value> aValue,
uint64_t location = aAppend ? UINT64_MAX : mLocation;
nsRefPtr<WriteHelper> helper =
new WriteHelper(this, fileRequest, location, inputStream, inputLength);
new WriteHelper(this, fileRequest, location, aInputStream, aInputLength);
rv = helper->Enqueue();
NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
if (NS_FAILED(helper->Enqueue())) {
aRv.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR);
return nullptr;
}
if (aAppend) {
mLocation = UINT64_MAX;
}
else {
mLocation += inputLength;
mLocation += aInputLength;
}
nsRefPtr<nsIDOMDOMRequest> request = fileRequest.forget();
request.forget(_retval);
return NS_OK;
return fileRequest.forget();
}
nsresult
@ -903,6 +763,13 @@ LockedFile::Finish()
return NS_OK;
}
/* virtual */ JSObject*
LockedFile::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
{
return LockedFileBinding::Wrap(aCx, aScope, this);
}
FinishHelper::FinishHelper(LockedFile* aLockedFile)
: mLockedFile(aLockedFile),
mAborted(aLockedFile->mAborted)
@ -1152,3 +1019,5 @@ OpenStreamHelper::DoAsyncRun(nsISupports* aStream)
return NS_OK;
}
END_FILE_NAMESPACE

View File

@ -7,15 +7,20 @@
#ifndef mozilla_dom_file_lockedfile_h__
#define mozilla_dom_file_lockedfile_h__
#include "mozilla/Attributes.h"
#include "FileCommon.h"
#include "mozilla/Attributes.h"
#include "mozilla/dom/FileModeBinding.h"
#include "nsIDOMLockedFile.h"
#include "mozilla/dom/TypedArray.h"
#include "nsDOMEventTargetHelper.h"
#include "nsIInputStream.h"
#include "nsIRunnable.h"
#include "nsDOMEventTargetHelper.h"
class nsIInputStream;
namespace mozilla {
namespace dom {
class DOMFileMetadataParameters;
class DOMRequest;
} // namespace dom
} // namespace mozilla
namespace mozilla {
class EventChainPreVisitor;
@ -28,7 +33,6 @@ class FileRequest;
class MetadataHelper;
class LockedFile : public nsDOMEventTargetHelper,
public nsIDOMLockedFile,
public nsIRunnable
{
friend class FinishHelper;
@ -38,7 +42,6 @@ class LockedFile : public nsDOMEventTargetHelper,
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSIDOMLOCKEDFILE
NS_DECL_NSIRUNNABLE
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(LockedFile, nsDOMEventTargetHelper)
@ -91,6 +94,94 @@ public:
OpenInputStream(bool aWholeFile, uint64_t aStart, uint64_t aLength,
nsIInputStream** aResult);
// WrapperCache
nsPIDOMWindow* GetParentObject() const
{
return GetOwner();
}
virtual JSObject*
WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope) MOZ_OVERRIDE;
// WebIDL
FileHandle* GetFileHandle() const
{
return Handle();
}
FileMode Mode() const
{
return mMode;
}
bool Active() const
{
return IsOpen();
}
Nullable<uint64_t> GetLocation() const
{
if (mLocation == UINT64_MAX) {
return Nullable<uint64_t>();
}
return Nullable<uint64_t>(mLocation);
}
void SetLocation(const Nullable<uint64_t>& aLocation)
{
// Null means the end-of-file.
if (aLocation.IsNull()) {
mLocation = UINT64_MAX;
} else {
mLocation = aLocation.Value();
}
}
already_AddRefed<FileRequest>
GetMetadata(const DOMFileMetadataParameters& aParameters, ErrorResult& aRv);
already_AddRefed<FileRequest>
ReadAsArrayBuffer(uint64_t aSize, ErrorResult& aRv);
already_AddRefed<FileRequest>
ReadAsText(uint64_t aSize, const nsAString& aEncoding, ErrorResult& aRv);
template<class T>
already_AddRefed<FileRequest>
Write(const T& aValue, ErrorResult& aRv)
{
uint64_t length;
nsCOMPtr<nsIInputStream> stream = GetInputStream(aValue, &length, aRv);
if (aRv.Failed()) {
return nullptr;
}
return Write(stream, length, aRv);
}
template<class T>
already_AddRefed<FileRequest>
Append(const T& aValue, ErrorResult& aRv)
{
uint64_t length;
nsCOMPtr<nsIInputStream> stream = GetInputStream(aValue, &length, aRv);
if (aRv.Failed()) {
return nullptr;
}
return Append(stream, length, aRv);
}
already_AddRefed<FileRequest>
Truncate(const Optional<uint64_t>& aSize, ErrorResult& aRv);
already_AddRefed<FileRequest>
Flush(ErrorResult& aRv);
void Abort(ErrorResult& aRv);
IMPL_EVENT_HANDLER(complete)
IMPL_EVENT_HANDLER(abort)
IMPL_EVENT_HANDLER(error)
private:
LockedFile();
~LockedFile();
@ -101,16 +192,40 @@ private:
void
OnRequestFinished();
bool CheckStateAndArgumentsForRead(uint64_t aSize, ErrorResult& aRv);
bool CheckStateForWrite(ErrorResult& aRv);
already_AddRefed<FileRequest>
GenerateFileRequest();
nsresult
WriteOrAppend(JS::Handle<JS::Value> aValue, JSContext* aCx,
nsISupports** _retval, bool aAppend);
already_AddRefed<FileRequest>
Write(nsIInputStream* aInputStream, uint64_t aInputLength, ErrorResult& aRv)
{
return WriteOrAppend(aInputStream, aInputLength, false, aRv);
}
already_AddRefed<FileRequest>
Append(nsIInputStream* aInputStream, uint64_t aInputLength, ErrorResult& aRv)
{
return WriteOrAppend(aInputStream, aInputLength, true, aRv);
}
already_AddRefed<FileRequest>
WriteOrAppend(nsIInputStream* aInputStream, uint64_t aInputLength,
bool aAppend, ErrorResult& aRv);
nsresult
Finish();
static already_AddRefed<nsIInputStream>
GetInputStream(const ArrayBuffer& aValue, uint64_t* aInputLength,
ErrorResult& aRv);
static already_AddRefed<nsIInputStream>
GetInputStream(nsIDOMBlob* aValue, uint64_t* aInputLength, ErrorResult& aRv);
static already_AddRefed<nsIInputStream>
GetInputStream(const nsAString& aValue, uint64_t* aInputLength,
ErrorResult& aRv);
nsRefPtr<FileHandle> mFileHandle;
ReadyState mReadyState;
FileMode mMode;

View File

@ -6,12 +6,6 @@
TEST_DIRS += ['test']
XPIDL_SOURCES += [
'nsIDOMLockedFile.idl',
]
XPIDL_MODULE = 'dom_file'
EXPORTS += [
'nsIFileStorage.h',
]

View File

@ -1,60 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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/. */
#include "nsISupports.idl"
interface nsIDOMEventListener;
[scriptable, builtinclass, uuid(a09cdc35-6b1e-42ce-95bb-f8f10a354202)]
interface nsIDOMLockedFile : nsISupports
{
readonly attribute nsISupports /* FileHandle */ fileHandle;
// "readonly" or "readwrite"
readonly attribute DOMString mode;
readonly attribute boolean active;
[implicit_jscontext]
attribute jsval location;
[implicit_jscontext]
nsISupports /* FileRequest */
getMetadata(/* DOMFileMetadataParameters */
[optional /* all */] in jsval parameters);
[implicit_jscontext]
nsISupports /* FileRequest */
readAsArrayBuffer(in unsigned long long size);
nsISupports /* FileRequest */
readAsText(in unsigned long long size,
[optional] in DOMString encoding);
[implicit_jscontext]
nsISupports /* FileRequest */
write(in jsval value);
[implicit_jscontext]
nsISupports /* FileRequest */
append(in jsval value);
[optional_argc]
nsISupports /* FileRequest */
truncate([optional] in unsigned long long size);
nsISupports /* FileRequest */
flush();
void
abort();
[implicit_jscontext] attribute jsval oncomplete;
[implicit_jscontext] attribute jsval onabort;
[implicit_jscontext] attribute jsval onerror;
};

View File

@ -3,8 +3,6 @@
* 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/. */
interface LockedFile;
interface FileHandle : EventTarget {
readonly attribute DOMString name;
readonly attribute DOMString type;

View File

@ -4,8 +4,6 @@
* 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/. */
interface LockedFile;
interface FileRequest : DOMRequest {
readonly attribute LockedFile? lockedFile;

View File

@ -7,3 +7,42 @@ dictionary DOMFileMetadataParameters
boolean size = true;
boolean lastModified = true;
};
interface LockedFile : EventTarget
{
readonly attribute FileHandle? fileHandle;
readonly attribute FileMode mode;
readonly attribute boolean active;
attribute unsigned long long? location;
[Throws]
FileRequest? getMetadata(optional DOMFileMetadataParameters parameters);
[Throws]
FileRequest? readAsArrayBuffer(unsigned long long size);
[Throws]
FileRequest? readAsText(unsigned long long size,
optional DOMString? encoding = null);
[Throws]
FileRequest? write(ArrayBuffer value);
[Throws]
FileRequest? write(Blob value);
[Throws]
FileRequest? write(DOMString value);
[Throws]
FileRequest? append(ArrayBuffer value);
[Throws]
FileRequest? append(Blob value);
[Throws]
FileRequest? append(DOMString value);
[Throws]
FileRequest? truncate(optional unsigned long long size);
[Throws]
FileRequest? flush();
[Throws]
void abort();
attribute EventHandler oncomplete;
attribute EventHandler onabort;
attribute EventHandler onerror;
};

View File

@ -65,9 +65,6 @@ members = [
# dom/indexedDB
'nsIIndexedDatabaseManager.*',
# dom/file
'nsIDOMLockedFile.*',
# dom/quota
'nsIQuotaManager.*',
'nsIQuotaRequest.*',