dom/indexedDB/IDBObjectStore.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* vim: set ts=2 et sw=2 tw=80: */
     3 /* This Source Code Form is subject to the terms of the Mozilla Public
     4  * License, v. 2.0. If a copy of the MPL was not distributed with this
     5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 #ifndef mozilla_dom_indexeddb_idbobjectstore_h__
     8 #define mozilla_dom_indexeddb_idbobjectstore_h__
    10 #include "mozilla/dom/indexedDB/IndexedDatabase.h"
    12 #include "js/TypeDecls.h"
    13 #include "mozilla/dom/IDBCursorBinding.h"
    14 #include "mozilla/dom/IDBIndexBinding.h"
    15 #include "mozilla/dom/IDBObjectStoreBinding.h"
    16 #include "nsCycleCollectionParticipant.h"
    17 #include "MainThreadUtils.h"
    19 #include "mozilla/dom/indexedDB/IDBRequest.h"
    20 #include "mozilla/dom/indexedDB/IDBTransaction.h"
    21 #include "mozilla/dom/indexedDB/KeyPath.h"
    23 class nsIDOMBlob;
    24 class nsIScriptContext;
    25 class nsPIDOMWindow;
    27 namespace mozilla {
    28 namespace dom {
    29 class ContentParent;
    30 class PBlobChild;
    31 class PBlobParent;
    32 }
    33 }
    35 BEGIN_INDEXEDDB_NAMESPACE
    37 class AsyncConnectionHelper;
    38 class FileManager;
    39 class IDBCursor;
    40 class IDBKeyRange;
    41 class IDBRequest;
    42 class IndexedDBObjectStoreChild;
    43 class IndexedDBObjectStoreParent;
    44 class Key;
    46 struct IndexInfo;
    47 struct IndexUpdateInfo;
    48 struct ObjectStoreInfo;
    50 struct FileHandleData;
    51 struct BlobOrFileData;
    53 class IDBObjectStore MOZ_FINAL : public nsISupports,
    54                                  public nsWrapperCache
    55 {
    56 public:
    57   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
    58   NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(IDBObjectStore)
    60   static already_AddRefed<IDBObjectStore>
    61   Create(IDBTransaction* aTransaction,
    62          ObjectStoreInfo* aInfo,
    63          const nsACString& aDatabaseId,
    64          bool aCreating);
    66   static nsresult
    67   AppendIndexUpdateInfo(int64_t aIndexID,
    68                         const KeyPath& aKeyPath,
    69                         bool aUnique,
    70                         bool aMultiEntry,
    71                         JSContext* aCx,
    72                         JS::Handle<JS::Value> aObject,
    73                         nsTArray<IndexUpdateInfo>& aUpdateInfoArray);
    75   static nsresult
    76   UpdateIndexes(IDBTransaction* aTransaction,
    77                 int64_t aObjectStoreId,
    78                 const Key& aObjectStoreKey,
    79                 bool aOverwrite,
    80                 int64_t aObjectDataId,
    81                 const nsTArray<IndexUpdateInfo>& aUpdateInfoArray);
    83   static nsresult
    84   GetStructuredCloneReadInfoFromStatement(mozIStorageStatement* aStatement,
    85                                           uint32_t aDataIndex,
    86                                           uint32_t aFileIdsIndex,
    87                                           IDBDatabase* aDatabase,
    88                                           StructuredCloneReadInfo& aInfo);
    90   static void
    91   ClearCloneReadInfo(StructuredCloneReadInfo& aReadInfo);
    93   static void
    94   ClearCloneWriteInfo(StructuredCloneWriteInfo& aWriteInfo);
    96   static bool
    97   DeserializeValue(JSContext* aCx,
    98                    StructuredCloneReadInfo& aCloneReadInfo,
    99                    JS::MutableHandle<JS::Value> aValue);
   101   static bool
   102   SerializeValue(JSContext* aCx,
   103                  StructuredCloneWriteInfo& aCloneWriteInfo,
   104                  JS::Handle<JS::Value> aValue);
   106   template <class DeserializationTraits>
   107   static JSObject*
   108   StructuredCloneReadCallback(JSContext* aCx,
   109                               JSStructuredCloneReader* aReader,
   110                               uint32_t aTag,
   111                               uint32_t aData,
   112                               void* aClosure);
   113   static bool
   114   StructuredCloneWriteCallback(JSContext* aCx,
   115                                JSStructuredCloneWriter* aWriter,
   116                                JS::Handle<JSObject*> aObj,
   117                                void* aClosure);
   119   static nsresult
   120   ConvertFileIdsToArray(const nsAString& aFileIds,
   121                         nsTArray<int64_t>& aResult);
   123   // Called only in the main process.
   124   static nsresult
   125   ConvertBlobsToActors(ContentParent* aContentParent,
   126                        FileManager* aFileManager,
   127                        const nsTArray<StructuredCloneFile>& aFiles,
   128                        InfallibleTArray<PBlobParent*>& aActors);
   130   // Called only in the child process.
   131   static void
   132   ConvertActorsToBlobs(const InfallibleTArray<PBlobChild*>& aActors,
   133                        nsTArray<StructuredCloneFile>& aFiles);
   135   const nsString& Name() const
   136   {
   137     return mName;
   138   }
   140   bool IsAutoIncrement() const
   141   {
   142     return mAutoIncrement;
   143   }
   145   bool IsWriteAllowed() const
   146   {
   147     return mTransaction->IsWriteAllowed();
   148   }
   150   int64_t Id() const
   151   {
   152     NS_ASSERTION(mId != INT64_MIN, "Don't ask for this yet!");
   153     return mId;
   154   }
   156   const KeyPath& GetKeyPath() const
   157   {
   158     return mKeyPath;
   159   }
   161   const bool HasValidKeyPath() const
   162   {
   163     return mKeyPath.IsValid();
   164   }
   166   IDBTransaction* Transaction()
   167   {
   168     return mTransaction;
   169   }
   171   ObjectStoreInfo* Info()
   172   {
   173     return mInfo;
   174   }
   176   void
   177   SetActor(IndexedDBObjectStoreChild* aActorChild)
   178   {
   179     NS_ASSERTION(!aActorChild || !mActorChild, "Shouldn't have more than one!");
   180     mActorChild = aActorChild;
   181   }
   183   void
   184   SetActor(IndexedDBObjectStoreParent* aActorParent)
   185   {
   186     NS_ASSERTION(!aActorParent || !mActorParent,
   187                  "Shouldn't have more than one!");
   188     mActorParent = aActorParent;
   189   }
   191   IndexedDBObjectStoreChild*
   192   GetActorChild() const
   193   {
   194     return mActorChild;
   195   }
   197   IndexedDBObjectStoreParent*
   198   GetActorParent() const
   199   {
   200     return mActorParent;
   201   }
   203   already_AddRefed<IDBIndex>
   204   CreateIndexInternal(const IndexInfo& aInfo,
   205                       ErrorResult& aRv);
   207   nsresult AddOrPutInternal(
   208                       const SerializedStructuredCloneWriteInfo& aCloneWriteInfo,
   209                       const Key& aKey,
   210                       const InfallibleTArray<IndexUpdateInfo>& aUpdateInfoArray,
   211                       const nsTArray<nsCOMPtr<nsIDOMBlob> >& aBlobs,
   212                       bool aOverwrite,
   213                       IDBRequest** _retval);
   215   already_AddRefed<IDBRequest>
   216   GetInternal(IDBKeyRange* aKeyRange,
   217               ErrorResult& aRv);
   219   already_AddRefed<IDBRequest>
   220   GetAllInternal(IDBKeyRange* aKeyRange,
   221                  uint32_t aLimit,
   222                  ErrorResult& aRv);
   224   already_AddRefed<IDBRequest>
   225   GetAllKeysInternal(IDBKeyRange* aKeyRange,
   226                      uint32_t aLimit,
   227                      ErrorResult& aRv);
   229   already_AddRefed<IDBRequest>
   230   DeleteInternal(IDBKeyRange* aKeyRange,
   231                  ErrorResult& aRv);
   233   already_AddRefed<IDBRequest>
   234   CountInternal(IDBKeyRange* aKeyRange,
   235                 ErrorResult& aRv);
   237   already_AddRefed<IDBRequest>
   238   OpenCursorInternal(IDBKeyRange* aKeyRange,
   239                      size_t aDirection,
   240                      ErrorResult& aRv);
   242   already_AddRefed<IDBRequest>
   243   OpenKeyCursorInternal(IDBKeyRange* aKeyRange,
   244                         size_t aDirection,
   245                         ErrorResult& aRv);
   247   nsresult
   248   OpenCursorFromChildProcess(
   249                             IDBRequest* aRequest,
   250                             size_t aDirection,
   251                             const Key& aKey,
   252                             const SerializedStructuredCloneReadInfo& aCloneInfo,
   253                             nsTArray<StructuredCloneFile>& aBlobs,
   254                             IDBCursor** _retval);
   256   nsresult
   257   OpenCursorFromChildProcess(IDBRequest* aRequest,
   258                              size_t aDirection,
   259                              const Key& aKey,
   260                              IDBCursor** _retval);
   262   void
   263   SetInfo(ObjectStoreInfo* aInfo);
   265   static const JSClass sDummyPropJSClass;
   267   // nsWrapperCache
   268   virtual JSObject*
   269   WrapObject(JSContext* aCx) MOZ_OVERRIDE;
   271   // WebIDL
   272   IDBTransaction*
   273   GetParentObject() const
   274   {
   275     return mTransaction;
   276   }
   278   void
   279   GetName(nsString& aName) const
   280   {
   281     NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
   282     aName.Assign(mName);
   283   }
   285   void
   286   GetKeyPath(JSContext* aCx, JS::MutableHandle<JS::Value> aResult,
   287              ErrorResult& aRv);
   289   already_AddRefed<DOMStringList>
   290   GetIndexNames(ErrorResult& aRv);
   292   IDBTransaction*
   293   Transaction() const
   294   {
   295     NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
   296     return mTransaction;
   297   }
   299   bool
   300   AutoIncrement() const
   301   {
   302     NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
   303     return mAutoIncrement;
   304   }
   306   already_AddRefed<IDBRequest>
   307   Put(JSContext* aCx, JS::Handle<JS::Value> aValue,
   308       JS::Handle<JS::Value> aKey, ErrorResult& aRv)
   309   {
   310     NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
   311     return AddOrPut(aCx, aValue, aKey, true, aRv);
   312   }
   314   already_AddRefed<IDBRequest>
   315   Add(JSContext* aCx, JS::Handle<JS::Value> aValue,
   316       JS::Handle<JS::Value> aKey, ErrorResult& aRv)
   317   {
   318     NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
   319     return AddOrPut(aCx, aValue, aKey, false, aRv);
   320   }
   322   already_AddRefed<IDBRequest>
   323   Delete(JSContext* aCx, JS::Handle<JS::Value> aKey, ErrorResult& aRv);
   325   already_AddRefed<IDBRequest>
   326   Get(JSContext* aCx, JS::Handle<JS::Value> aKey, ErrorResult& aRv);
   328   already_AddRefed<IDBRequest>
   329   Clear(ErrorResult& aRv);
   331   already_AddRefed<IDBRequest>
   332   OpenCursor(JSContext* aCx, JS::Handle<JS::Value> aRange,
   333              IDBCursorDirection aDirection, ErrorResult& aRv);
   335   already_AddRefed<IDBIndex>
   336   CreateIndex(JSContext* aCx, const nsAString& aName, const nsAString& aKeyPath,
   337               const IDBIndexParameters& aOptionalParameters, ErrorResult& aRv);
   339   already_AddRefed<IDBIndex>
   340   CreateIndex(JSContext* aCx, const nsAString& aName,
   341               const Sequence<nsString>& aKeyPath,
   342               const IDBIndexParameters& aOptionalParameters, ErrorResult& aRv);
   344   already_AddRefed<IDBIndex>
   345   Index(const nsAString& aName, ErrorResult &aRv);
   347   void
   348   DeleteIndex(const nsAString& aIndexName, ErrorResult& aRv);
   350   already_AddRefed<IDBRequest>
   351   Count(JSContext* aCx, JS::Handle<JS::Value> aKey,
   352         ErrorResult& aRv);
   354   already_AddRefed<IDBRequest>
   355   GetAll(JSContext* aCx, JS::Handle<JS::Value> aKey,
   356          const Optional<uint32_t>& aLimit, ErrorResult& aRv);
   358   already_AddRefed<IDBRequest>
   359   GetAllKeys(JSContext* aCx, JS::Handle<JS::Value> aKey,
   360              const Optional<uint32_t>& aLimit, ErrorResult& aRv);
   362   already_AddRefed<IDBRequest>
   363   OpenKeyCursor(JSContext* aCx, JS::Handle<JS::Value> aRange,
   364                 IDBCursorDirection aDirection, ErrorResult& aRv);
   366 protected:
   367   IDBObjectStore();
   368   ~IDBObjectStore();
   370   nsresult GetAddInfo(JSContext* aCx,
   371                       JS::Handle<JS::Value> aValue,
   372                       JS::Handle<JS::Value> aKeyVal,
   373                       StructuredCloneWriteInfo& aCloneWriteInfo,
   374                       Key& aKey,
   375                       nsTArray<IndexUpdateInfo>& aUpdateInfoArray);
   377   already_AddRefed<IDBRequest>
   378   AddOrPut(JSContext* aCx, JS::Handle<JS::Value> aValue,
   379            JS::Handle<JS::Value> aKey, bool aOverwrite,
   380            ErrorResult& aRv);
   382   already_AddRefed<IDBIndex>
   383   CreateIndex(JSContext* aCx, const nsAString& aName, KeyPath& aKeyPath,
   384               const IDBIndexParameters& aOptionalParameters, ErrorResult& aRv);
   386   static void
   387   ClearStructuredCloneBuffer(JSAutoStructuredCloneBuffer& aBuffer);
   389   static bool
   390   ReadFileHandle(JSStructuredCloneReader* aReader,
   391                  FileHandleData* aRetval);
   393   static bool
   394   ReadBlobOrFile(JSStructuredCloneReader* aReader,
   395                  uint32_t aTag,
   396                  BlobOrFileData* aRetval);
   397 private:
   398   nsRefPtr<IDBTransaction> mTransaction;
   400   int64_t mId;
   401   nsString mName;
   402   KeyPath mKeyPath;
   403   JS::Heap<JS::Value> mCachedKeyPath;
   404   bool mRooted;
   405   bool mAutoIncrement;
   406   nsCString mDatabaseId;
   407   nsRefPtr<ObjectStoreInfo> mInfo;
   409   nsTArray<nsRefPtr<IDBIndex> > mCreatedIndexes;
   411   IndexedDBObjectStoreChild* mActorChild;
   412   IndexedDBObjectStoreParent* mActorParent;
   413 };
   415 END_INDEXEDDB_NAMESPACE
   417 #endif // mozilla_dom_indexeddb_idbobjectstore_h__

mercurial