diff -r 000000000000 -r 6474c204b198 dom/indexedDB/IDBFactory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/indexedDB/IDBFactory.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,229 @@ +/* -*- 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/. */ + +#ifndef mozilla_dom_indexeddb_idbfactory_h__ +#define mozilla_dom_indexeddb_idbfactory_h__ + +#include "mozilla/dom/BindingDeclarations.h" // for Optional +#include "mozilla/dom/StorageTypeBinding.h" +#include "mozilla/dom/quota/PersistenceType.h" +#include "mozilla/dom/quota/StoragePrivilege.h" +#include "nsCOMPtr.h" +#include "nsCycleCollectionParticipant.h" +#include "nsWrapperCache.h" + +class mozIStorageConnection; +class nsIFile; +class nsIFileURL; +class nsIPrincipal; +class nsPIDOMWindow; +template class nsRefPtr; + +namespace mozilla { +class ErrorResult; + +namespace dom { +class ContentParent; +class IDBOpenDBOptions; + +namespace indexedDB { + +struct DatabaseInfo; +class IDBDatabase; +class IDBOpenDBRequest; +class IndexedDBChild; +class IndexedDBParent; + +struct ObjectStoreInfo; + +class IDBFactory MOZ_FINAL : public nsISupports, + public nsWrapperCache +{ + typedef mozilla::dom::ContentParent ContentParent; + typedef mozilla::dom::quota::PersistenceType PersistenceType; + typedef nsTArray > ObjectStoreInfoArray; + typedef mozilla::dom::quota::StoragePrivilege StoragePrivilege; + +public: + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(IDBFactory) + + // Called when using IndexedDB from a window in a different process. + static nsresult Create(nsPIDOMWindow* aWindow, + const nsACString& aGroup, + const nsACString& aASCIIOrigin, + ContentParent* aContentParent, + IDBFactory** aFactory); + + // Called when using IndexedDB from a window in the current process. + static nsresult Create(nsPIDOMWindow* aWindow, + ContentParent* aContentParent, + IDBFactory** aFactory) + { + return Create(aWindow, EmptyCString(), EmptyCString(), aContentParent, + aFactory); + } + + // Called when using IndexedDB from a JS component or a JSM in the current + // process. + static nsresult Create(JSContext* aCx, + JS::Handle aOwningObject, + ContentParent* aContentParent, + IDBFactory** aFactory); + + // Called when using IndexedDB from a JS component or a JSM in a different + // process. + static nsresult Create(ContentParent* aContentParent, + IDBFactory** aFactory); + + static already_AddRefed + GetDatabaseFileURL(nsIFile* aDatabaseFile, + PersistenceType aPersistenceType, + const nsACString& aGroup, + const nsACString& aOrigin); + + static already_AddRefed + GetConnection(const nsAString& aDatabaseFilePath, + PersistenceType aPersistenceType, + const nsACString& aGroup, + const nsACString& aOrigin); + + static nsresult + SetDefaultPragmas(mozIStorageConnection* aConnection); + + static nsresult + LoadDatabaseInformation(mozIStorageConnection* aConnection, + const nsACString& aDatabaseId, + uint64_t* aVersion, + ObjectStoreInfoArray& aObjectStores); + + static nsresult + SetDatabaseMetadata(DatabaseInfo* aDatabaseInfo, + uint64_t aVersion, + ObjectStoreInfoArray& aObjectStores); + + nsresult + OpenInternal(const nsAString& aName, + int64_t aVersion, + PersistenceType aPersistenceType, + const nsACString& aGroup, + const nsACString& aASCIIOrigin, + StoragePrivilege aStoragePrivilege, + bool aDeleting, + IDBOpenDBRequest** _retval); + + nsresult + OpenInternal(const nsAString& aName, + int64_t aVersion, + PersistenceType aPersistenceType, + bool aDeleting, + IDBOpenDBRequest** _retval) + { + return OpenInternal(aName, aVersion, aPersistenceType, mGroup, mASCIIOrigin, + mPrivilege, aDeleting, _retval); + } + + void + SetActor(IndexedDBChild* aActorChild) + { + NS_ASSERTION(!aActorChild || !mActorChild, "Shouldn't have more than one!"); + mActorChild = aActorChild; + } + + void + SetActor(IndexedDBParent* aActorParent) + { + NS_ASSERTION(!aActorParent || !mActorParent, "Shouldn't have more than one!"); + mActorParent = aActorParent; + } + + const nsCString& + GetASCIIOrigin() const + { + return mASCIIOrigin; + } + + bool + FromIPC() + { + return !!mContentParent; + } + + // nsWrapperCache + virtual JSObject* + WrapObject(JSContext* aCx) MOZ_OVERRIDE; + + // WebIDL + nsPIDOMWindow* + GetParentObject() const + { + return mWindow; + } + + already_AddRefed + Open(const nsAString& aName, uint64_t aVersion, ErrorResult& aRv) + { + return Open(nullptr, aName, Optional(aVersion), + Optional(), false, aRv); + } + + already_AddRefed + Open(const nsAString& aName, const IDBOpenDBOptions& aOptions, + ErrorResult& aRv); + + already_AddRefed + DeleteDatabase(const nsAString& aName, const IDBOpenDBOptions& aOptions, + ErrorResult& aRv); + + int16_t + Cmp(JSContext* aCx, JS::Handle aFirst, + JS::Handle aSecond, ErrorResult& aRv); + + already_AddRefed + OpenForPrincipal(nsIPrincipal* aPrincipal, const nsAString& aName, + uint64_t aVersion, ErrorResult& aRv); + + already_AddRefed + OpenForPrincipal(nsIPrincipal* aPrincipal, const nsAString& aName, + const IDBOpenDBOptions& aOptions, ErrorResult& aRv); + + already_AddRefed + DeleteForPrincipal(nsIPrincipal* aPrincipal, const nsAString& aName, + const IDBOpenDBOptions& aOptions, ErrorResult& aRv); + +private: + IDBFactory(); + ~IDBFactory(); + + already_AddRefed + Open(nsIPrincipal* aPrincipal, const nsAString& aName, + const Optional& aVersion, + const Optional& aStorageType, bool aDelete, + ErrorResult& aRv); + + nsCString mGroup; + nsCString mASCIIOrigin; + StoragePrivilege mPrivilege; + PersistenceType mDefaultPersistenceType; + + // If this factory lives on a window then mWindow must be non-null. Otherwise + // mOwningObject must be non-null. + nsCOMPtr mWindow; + JS::Heap mOwningObject; + + IndexedDBChild* mActorChild; + IndexedDBParent* mActorParent; + + mozilla::dom::ContentParent* mContentParent; + + bool mRootedOwningObject; +}; + +} // namespace indexedDB +} // namespace dom +} // namespace mozilla + +#endif // mozilla_dom_indexeddb_idbfactory_h__