summaryrefslogtreecommitdiffstats
path: root/dom/indexedDB/IDBRequest.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/indexedDB/IDBRequest.h')
-rw-r--r--dom/indexedDB/IDBRequest.h293
1 files changed, 293 insertions, 0 deletions
diff --git a/dom/indexedDB/IDBRequest.h b/dom/indexedDB/IDBRequest.h
new file mode 100644
index 000000000..1c7fca756
--- /dev/null
+++ b/dom/indexedDB/IDBRequest.h
@@ -0,0 +1,293 @@
+/* -*- 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_idbrequest_h__
+#define mozilla_dom_idbrequest_h__
+
+#include "js/RootingAPI.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/EventForwards.h"
+#include "mozilla/dom/IDBRequestBinding.h"
+#include "mozilla/dom/IDBWrapperCache.h"
+#include "nsAutoPtr.h"
+#include "nsCycleCollectionParticipant.h"
+
+#define PRIVATE_IDBREQUEST_IID \
+ {0xe68901e5, 0x1d50, 0x4ee9, {0xaf, 0x49, 0x90, 0x99, 0x4a, 0xff, 0xc8, 0x39}}
+
+class nsPIDOMWindowInner;
+struct PRThread;
+
+namespace mozilla {
+
+class ErrorResult;
+
+namespace dom {
+
+class DOMError;
+class IDBCursor;
+class IDBDatabase;
+class IDBFactory;
+class IDBIndex;
+class IDBObjectStore;
+class IDBTransaction;
+template <typename> struct Nullable;
+class OwningIDBObjectStoreOrIDBIndexOrIDBCursor;
+
+class IDBRequest
+ : public IDBWrapperCache
+{
+protected:
+ // mSourceAsObjectStore and mSourceAsIndex are exclusive and one must always
+ // be set. mSourceAsCursor is sometimes set also.
+ RefPtr<IDBObjectStore> mSourceAsObjectStore;
+ RefPtr<IDBIndex> mSourceAsIndex;
+ RefPtr<IDBCursor> mSourceAsCursor;
+
+ RefPtr<IDBTransaction> mTransaction;
+
+#ifdef DEBUG
+ PRThread* mOwningThread;
+#endif
+
+ JS::Heap<JS::Value> mResultVal;
+ RefPtr<DOMError> mError;
+
+ nsString mFilename;
+ uint64_t mLoggingSerialNumber;
+ nsresult mErrorCode;
+ uint32_t mLineNo;
+ uint32_t mColumn;
+ bool mHaveResultOrErrorCode;
+
+public:
+ class ResultCallback;
+
+ static already_AddRefed<IDBRequest>
+ Create(JSContext* aCx, IDBDatabase* aDatabase, IDBTransaction* aTransaction);
+
+ static already_AddRefed<IDBRequest>
+ Create(JSContext* aCx,
+ IDBObjectStore* aSource,
+ IDBDatabase* aDatabase,
+ IDBTransaction* aTransaction);
+
+ static already_AddRefed<IDBRequest>
+ Create(JSContext* aCx,
+ IDBIndex* aSource,
+ IDBDatabase* aDatabase,
+ IDBTransaction* aTransaction);
+
+ static void
+ CaptureCaller(JSContext* aCx, nsAString& aFilename, uint32_t* aLineNo,
+ uint32_t* aColumn);
+
+ static uint64_t
+ NextSerialNumber();
+
+ // nsIDOMEventTarget
+ virtual nsresult
+ PreHandleEvent(EventChainPreVisitor& aVisitor) override;
+
+ void
+ GetSource(Nullable<OwningIDBObjectStoreOrIDBIndexOrIDBCursor>& aSource) const;
+
+ void
+ Reset();
+
+ void
+ DispatchNonTransactionError(nsresult aErrorCode);
+
+ void
+ SetResultCallback(ResultCallback* aCallback);
+
+ void
+ SetError(nsresult aRv);
+
+ nsresult
+ GetErrorCode() const
+#ifdef DEBUG
+ ;
+#else
+ {
+ return mErrorCode;
+ }
+#endif
+
+ DOMError*
+ GetErrorAfterResult() const
+#ifdef DEBUG
+ ;
+#else
+ {
+ return mError;
+ }
+#endif
+
+ DOMError*
+ GetError(ErrorResult& aRv);
+
+ void
+ GetCallerLocation(nsAString& aFilename, uint32_t* aLineNo,
+ uint32_t* aColumn) const;
+
+ bool
+ IsPending() const
+ {
+ return !mHaveResultOrErrorCode;
+ }
+
+ uint64_t
+ LoggingSerialNumber() const
+ {
+ AssertIsOnOwningThread();
+
+ return mLoggingSerialNumber;
+ }
+
+ void
+ SetLoggingSerialNumber(uint64_t aLoggingSerialNumber);
+
+ nsPIDOMWindowInner*
+ GetParentObject() const
+ {
+ return GetOwner();
+ }
+
+ void
+ GetResult(JS::MutableHandle<JS::Value> aResult, ErrorResult& aRv) const;
+
+ void
+ GetResult(JSContext* aCx, JS::MutableHandle<JS::Value> aResult,
+ ErrorResult& aRv) const
+ {
+ GetResult(aResult, aRv);
+ }
+
+ IDBTransaction*
+ GetTransaction() const
+ {
+ AssertIsOnOwningThread();
+
+ return mTransaction;
+ }
+
+ IDBRequestReadyState
+ ReadyState() const;
+
+ void
+ SetSource(IDBCursor* aSource);
+
+ IMPL_EVENT_HANDLER(success);
+ IMPL_EVENT_HANDLER(error);
+
+ void
+ AssertIsOnOwningThread() const
+#ifdef DEBUG
+ ;
+#else
+ { }
+#endif
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(IDBRequest,
+ IDBWrapperCache)
+
+ // nsWrapperCache
+ virtual JSObject*
+ WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+protected:
+ explicit IDBRequest(IDBDatabase* aDatabase);
+ explicit IDBRequest(nsPIDOMWindowInner* aOwner);
+ ~IDBRequest();
+
+ void
+ InitMembers();
+
+ void
+ ConstructResult();
+};
+
+class NS_NO_VTABLE IDBRequest::ResultCallback
+{
+public:
+ virtual nsresult
+ GetResult(JSContext* aCx, JS::MutableHandle<JS::Value> aResult) = 0;
+
+protected:
+ ResultCallback()
+ { }
+};
+
+class IDBOpenDBRequest final
+ : public IDBRequest
+{
+ class WorkerHolder;
+
+ // Only touched on the owning thread.
+ RefPtr<IDBFactory> mFactory;
+
+ nsAutoPtr<WorkerHolder> mWorkerHolder;
+
+ const bool mFileHandleDisabled;
+
+public:
+ static already_AddRefed<IDBOpenDBRequest>
+ CreateForWindow(JSContext* aCx,
+ IDBFactory* aFactory,
+ nsPIDOMWindowInner* aOwner,
+ JS::Handle<JSObject*> aScriptOwner);
+
+ static already_AddRefed<IDBOpenDBRequest>
+ CreateForJS(JSContext* aCx,
+ IDBFactory* aFactory,
+ JS::Handle<JSObject*> aScriptOwner);
+
+ bool
+ IsFileHandleDisabled() const
+ {
+ return mFileHandleDisabled;
+ }
+
+ void
+ SetTransaction(IDBTransaction* aTransaction);
+
+ void
+ NoteComplete();
+
+ // nsIDOMEventTarget
+ virtual nsresult
+ PostHandleEvent(EventChainPostVisitor& aVisitor) override;
+
+ IDBFactory*
+ Factory() const
+ {
+ return mFactory;
+ }
+
+ IMPL_EVENT_HANDLER(blocked);
+ IMPL_EVENT_HANDLER(upgradeneeded);
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(IDBOpenDBRequest, IDBRequest)
+
+ // nsWrapperCache
+ virtual JSObject*
+ WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+private:
+ IDBOpenDBRequest(IDBFactory* aFactory,
+ nsPIDOMWindowInner* aOwner,
+ bool aFileHandleDisabled);
+
+ ~IDBOpenDBRequest();
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // mozilla_dom_idbrequest_h__