/* -*- 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_idbdatabase_h__ #define mozilla_dom_indexeddb_idbdatabase_h__ #include "mozilla/Attributes.h" #include "mozilla/dom/indexedDB/IndexedDatabase.h" #include "nsIDocument.h" #include "nsIFileStorage.h" #include "nsIIDBDatabase.h" #include "nsIOfflineStorage.h" #include "nsDOMEventTargetHelper.h" #include "mozilla/dom/indexedDB/FileManager.h" #include "mozilla/dom/indexedDB/IDBWrapperCache.h" class nsIScriptContext; class nsPIDOMWindow; namespace mozilla { namespace dom { class ContentParent; namespace quota { class Client; } } } BEGIN_INDEXEDDB_NAMESPACE class AsyncConnectionHelper; struct DatabaseInfo; class IDBFactory; class IDBIndex; class IDBObjectStore; class IDBTransaction; class IndexedDatabaseManager; class IndexedDBDatabaseChild; class IndexedDBDatabaseParent; struct ObjectStoreInfoGuts; class IDBDatabase : public IDBWrapperCache, public nsIIDBDatabase, public nsIOfflineStorage { friend class AsyncConnectionHelper; friend class IndexedDatabaseManager; friend class IndexedDBDatabaseChild; public: NS_DECL_ISUPPORTS_INHERITED NS_DECL_NSIIDBDATABASE NS_DECL_NSIFILESTORAGE NS_DECL_NSIOFFLINESTORAGE_NOCLOSE NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(IDBDatabase, IDBWrapperCache) static already_AddRefed Create(IDBWrapperCache* aOwnerCache, IDBFactory* aFactory, already_AddRefed aDatabaseInfo, const nsACString& aASCIIOrigin, FileManager* aFileManager, mozilla::dom::ContentParent* aContentParent); static IDBDatabase* FromStorage(nsIOfflineStorage* aStorage); static IDBDatabase* FromStorage(nsIFileStorage* aStorage) { nsCOMPtr storage = do_QueryInterface(aStorage); return storage ? FromStorage(storage) : nullptr; } // nsIDOMEventTarget virtual nsresult PostHandleEvent(nsEventChainPostVisitor& aVisitor) MOZ_OVERRIDE; DatabaseInfo* Info() const { return mDatabaseInfo; } const nsString& Name() const { return mName; } const nsString& FilePath() const { return mFilePath; } already_AddRefed GetOwnerDocument() { if (!GetOwner()) { return nullptr; } nsCOMPtr doc = GetOwner()->GetExtantDoc(); return doc.forget(); } void DisconnectFromActorParent(); void CloseInternal(bool aIsDead); void EnterSetVersionTransaction(); void ExitSetVersionTransaction(); // Called when a versionchange transaction is aborted to reset the // DatabaseInfo. void RevertToPreviousState(); FileManager* Manager() const { return mFileManager; } void SetActor(IndexedDBDatabaseChild* aActorChild) { NS_ASSERTION(!aActorChild || !mActorChild, "Shouldn't have more than one!"); mActorChild = aActorChild; } void SetActor(IndexedDBDatabaseParent* aActorParent) { NS_ASSERTION(!aActorParent || !mActorParent, "Shouldn't have more than one!"); mActorParent = aActorParent; } IndexedDBDatabaseChild* GetActorChild() const { return mActorChild; } IndexedDBDatabaseParent* GetActorParent() const { return mActorParent; } mozilla::dom::ContentParent* GetContentParent() const { return mContentParent; } nsresult CreateObjectStoreInternal(IDBTransaction* aTransaction, const ObjectStoreInfoGuts& aInfo, IDBObjectStore** _retval); private: IDBDatabase(); ~IDBDatabase(); void OnUnlink(); // The factory must be kept alive when IndexedDB is used in multiple // processes. If it dies then the entire actor tree will be destroyed with it // and the world will explode. nsRefPtr mFactory; nsRefPtr mDatabaseInfo; // Set to a copy of the existing DatabaseInfo when starting a versionchange // transaction. nsRefPtr mPreviousDatabaseInfo; nsCOMPtr mDatabaseId; nsString mName; nsString mFilePath; nsCString mASCIIOrigin; nsRefPtr mFileManager; IndexedDBDatabaseChild* mActorChild; IndexedDBDatabaseParent* mActorParent; mozilla::dom::ContentParent* mContentParent; nsRefPtr mQuotaClient; bool mInvalidated; bool mRegistered; bool mClosed; bool mRunningVersionChange; }; END_INDEXEDDB_NAMESPACE #endif // mozilla_dom_indexeddb_idbdatabase_h__