summaryrefslogtreecommitdiffstats
path: root/dom/indexedDB/IDBFileHandle.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/indexedDB/IDBFileHandle.h')
-rw-r--r--dom/indexedDB/IDBFileHandle.h253
1 files changed, 253 insertions, 0 deletions
diff --git a/dom/indexedDB/IDBFileHandle.h b/dom/indexedDB/IDBFileHandle.h
new file mode 100644
index 0000000000..521c183ea0
--- /dev/null
+++ b/dom/indexedDB/IDBFileHandle.h
@@ -0,0 +1,253 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=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/. */
+
+#ifndef mozilla_dom_idbfilehandle_h__
+#define mozilla_dom_idbfilehandle_h__
+
+#include "IDBFileRequest.h"
+#include "js/TypeDecls.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/dom/FileModeBinding.h"
+#include "mozilla/dom/TypedArray.h"
+#include "mozilla/DOMEventTargetHelper.h"
+#include "nsCycleCollectionParticipant.h"
+#include "nsIRunnable.h"
+#include "nsWeakReference.h"
+
+namespace mozilla::dom {
+
+class Blob;
+class FileRequestData;
+class FileRequestParams;
+struct IDBFileMetadataParameters;
+class IDBFileRequest;
+class IDBMutableFile;
+class StringOrArrayBufferOrArrayBufferViewOrBlob;
+
+namespace indexedDB {
+class BackgroundFileHandleChild;
+}
+
+class IDBFileHandle final : public DOMEventTargetHelper,
+ public nsIRunnable,
+ public nsSupportsWeakReference {
+ public:
+ enum ReadyState { INITIAL = 0, LOADING, FINISHING, DONE };
+
+ private:
+ RefPtr<IDBMutableFile> mMutableFile;
+
+ indexedDB::BackgroundFileHandleChild* mBackgroundActor;
+
+ uint64_t mLocation;
+
+ uint32_t mPendingRequestCount;
+
+ ReadyState mReadyState;
+ FileMode mMode;
+
+ bool mAborted;
+ bool mCreating;
+
+#ifdef DEBUG
+ bool mSentFinishOrAbort;
+ bool mFiredCompleteOrAbort;
+#endif
+
+ public:
+ [[nodiscard]] static RefPtr<IDBFileHandle> Create(
+ IDBMutableFile* aMutableFile, FileMode aMode);
+
+ static IDBFileHandle* GetCurrent();
+
+ void AssertIsOnOwningThread() const
+#ifdef DEBUG
+ ;
+#else
+ {
+ }
+#endif
+
+ void SetBackgroundActor(indexedDB::BackgroundFileHandleChild* aActor);
+
+ void ClearBackgroundActor() {
+ AssertIsOnOwningThread();
+
+ mBackgroundActor = nullptr;
+ }
+
+ void StartRequest(IDBFileRequest* aFileRequest,
+ const FileRequestParams& aParams);
+
+ void OnNewRequest();
+
+ void OnRequestFinished(bool aActorDestroyedNormally);
+
+ void FireCompleteOrAbortEvents(bool aAborted);
+
+ bool IsOpen() const;
+
+ bool IsFinishingOrDone() const {
+ AssertIsOnOwningThread();
+
+ return mReadyState == FINISHING || mReadyState == DONE;
+ }
+
+ bool IsDone() const {
+ AssertIsOnOwningThread();
+
+ return mReadyState == DONE;
+ }
+
+ bool IsAborted() const {
+ AssertIsOnOwningThread();
+ return mAborted;
+ }
+
+ void Abort();
+
+ // WebIDL
+ IDBMutableFile* GetMutableFile() const {
+ AssertIsOnOwningThread();
+ return mMutableFile;
+ }
+
+ IDBMutableFile* GetFileHandle() const {
+ AssertIsOnOwningThread();
+ return GetMutableFile();
+ }
+
+ FileMode Mode() const {
+ AssertIsOnOwningThread();
+ return mMode;
+ }
+
+ bool Active() const {
+ AssertIsOnOwningThread();
+ return IsOpen();
+ }
+
+ Nullable<uint64_t> GetLocation() const {
+ AssertIsOnOwningThread();
+
+ if (mLocation == UINT64_MAX) {
+ return Nullable<uint64_t>();
+ }
+
+ return Nullable<uint64_t>(mLocation);
+ }
+
+ void SetLocation(const Nullable<uint64_t>& aLocation) {
+ AssertIsOnOwningThread();
+
+ // Null means the end-of-file.
+ if (aLocation.IsNull()) {
+ mLocation = UINT64_MAX;
+ } else {
+ mLocation = aLocation.Value();
+ }
+ }
+
+ [[nodiscard]] RefPtr<IDBFileRequest> GetMetadata(
+ const IDBFileMetadataParameters& aParameters, ErrorResult& aRv);
+
+ [[nodiscard]] RefPtr<IDBFileRequest> ReadAsArrayBuffer(uint64_t aSize,
+ ErrorResult& aRv) {
+ AssertIsOnOwningThread();
+ return Read(aSize, false, VoidString(), aRv);
+ }
+
+ [[nodiscard]] RefPtr<IDBFileRequest> ReadAsText(uint64_t aSize,
+ const nsAString& aEncoding,
+ ErrorResult& aRv) {
+ AssertIsOnOwningThread();
+ return Read(aSize, true, aEncoding, aRv);
+ }
+
+ [[nodiscard]] RefPtr<IDBFileRequest> Write(
+ const StringOrArrayBufferOrArrayBufferViewOrBlob& aValue,
+ ErrorResult& aRv) {
+ AssertIsOnOwningThread();
+ return WriteOrAppend(aValue, false, aRv);
+ }
+
+ [[nodiscard]] RefPtr<IDBFileRequest> Append(
+ const StringOrArrayBufferOrArrayBufferViewOrBlob& aValue,
+ ErrorResult& aRv) {
+ AssertIsOnOwningThread();
+ return WriteOrAppend(aValue, true, aRv);
+ }
+
+ [[nodiscard]] RefPtr<IDBFileRequest> Truncate(const Optional<uint64_t>& aSize,
+ ErrorResult& aRv);
+
+ [[nodiscard]] RefPtr<IDBFileRequest> Flush(ErrorResult& aRv);
+
+ void Abort(ErrorResult& aRv);
+
+ IMPL_EVENT_HANDLER(complete)
+ IMPL_EVENT_HANDLER(abort)
+ IMPL_EVENT_HANDLER(error)
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_NSIRUNNABLE
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(IDBFileHandle, DOMEventTargetHelper)
+
+ // EventTarget
+ void GetEventTargetParent(EventChainPreVisitor& aVisitor) override;
+
+ // WrapperCache
+ virtual JSObject* WrapObject(JSContext* aCx,
+ JS::Handle<JSObject*> aGivenProto) override;
+
+ private:
+ IDBFileHandle(IDBMutableFile* aMutableFile, FileMode aMode);
+ ~IDBFileHandle();
+
+ bool CheckState(ErrorResult& aRv) const;
+
+ bool CheckStateAndArgumentsForRead(uint64_t aSize, ErrorResult& aRv);
+
+ bool CheckStateForWrite(ErrorResult& aRv);
+
+ bool CheckStateForWriteOrAppend(bool aAppend, ErrorResult& aRv);
+
+ bool CheckWindow();
+
+ [[nodiscard]] RefPtr<IDBFileRequest> Read(uint64_t aSize, bool aHasEncoding,
+ const nsAString& aEncoding,
+ ErrorResult& aRv);
+
+ [[nodiscard]] RefPtr<IDBFileRequest> WriteOrAppend(
+ const StringOrArrayBufferOrArrayBufferViewOrBlob& aValue, bool aAppend,
+ ErrorResult& aRv);
+
+ [[nodiscard]] RefPtr<IDBFileRequest> WriteOrAppend(const nsAString& aValue,
+ bool aAppend,
+ ErrorResult& aRv);
+
+ [[nodiscard]] RefPtr<IDBFileRequest> WriteOrAppend(const ArrayBuffer& aValue,
+ bool aAppend,
+ ErrorResult& aRv);
+
+ [[nodiscard]] RefPtr<IDBFileRequest> WriteOrAppend(
+ const ArrayBufferView& aValue, bool aAppend, ErrorResult& aRv);
+
+ [[nodiscard]] RefPtr<IDBFileRequest> WriteOrAppend(Blob& aValue, bool aAppend,
+ ErrorResult& aRv);
+
+ [[nodiscard]] RefPtr<IDBFileRequest> WriteInternal(
+ const FileRequestData& aData, uint64_t aDataLength, bool aAppend,
+ ErrorResult& aRv);
+
+ void SendFinish();
+
+ void SendAbort();
+};
+
+} // namespace mozilla::dom
+
+#endif // mozilla_dom_idbfilehandle_h__