/* -*- 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_idbrequest_h__ #define mozilla_dom_indexeddb_idbrequest_h__ #include "mozilla/dom/indexedDB/IndexedDatabase.h" #include "mozilla/Attributes.h" #include "mozilla/dom/DOMError.h" #include "mozilla/dom/IDBRequestBinding.h" #include "mozilla/ErrorResult.h" #include "nsCycleCollectionParticipant.h" #include "nsWrapperCache.h" #include "mozilla/dom/indexedDB/IDBWrapperCache.h" class nsIScriptContext; class nsPIDOMWindow; BEGIN_INDEXEDDB_NAMESPACE class HelperBase; class IDBFactory; class IDBTransaction; class IndexedDBRequestParentBase; class IDBRequest : public IDBWrapperCache { public: NS_DECL_ISUPPORTS_INHERITED NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(IDBRequest, IDBWrapperCache) static already_AddRefed Create(nsISupports* aSource, IDBWrapperCache* aOwnerCache, IDBTransaction* aTransaction); // nsIDOMEventTarget virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor) MOZ_OVERRIDE; nsISupports* Source() { return mSource; } void Reset(); nsresult NotifyHelperCompleted(HelperBase* aHelper); void NotifyHelperSentResultsToChildProcess(nsresult aRv); void SetError(nsresult aRv); nsresult GetErrorCode() const #ifdef DEBUG ; #else { return mErrorCode; } #endif DOMError* GetError(ErrorResult& aRv); JSContext* GetJSContext(); void SetActor(IndexedDBRequestParentBase* aActorParent) { NS_ASSERTION(!aActorParent || !mActorParent, "Shouldn't have more than one!"); mActorParent = aActorParent; } IndexedDBRequestParentBase* GetActorParent() const { return mActorParent; } void CaptureCaller(); void FillScriptErrorEvent(nsScriptErrorEvent* aEvent) const; bool IsPending() const { return !mHaveResultOrErrorCode; } #ifdef MOZ_ENABLE_PROFILER_SPS uint64_t GetSerialNumber() const { return mSerialNumber; } #endif // nsWrapperCache virtual JSObject* WrapObject(JSContext* aCx, JS::Handle aScope) MOZ_OVERRIDE; // WebIDL nsPIDOMWindow* GetParentObject() const { return GetOwner(); } JS::Value GetResult(JSContext* aCx, ErrorResult& aRv) const; nsISupports* GetSource() const { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); return mSource; } IDBTransaction* GetTransaction() const { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); return mTransaction; } IDBRequestReadyState ReadyState() const; IMPL_EVENT_HANDLER(success); IMPL_EVENT_HANDLER(error); protected: IDBRequest(); ~IDBRequest(); nsCOMPtr mSource; nsRefPtr mTransaction; JS::Heap mResultVal; nsRefPtr mError; IndexedDBRequestParentBase* mActorParent; nsString mFilename; #ifdef MOZ_ENABLE_PROFILER_SPS uint64_t mSerialNumber; #endif nsresult mErrorCode; uint32_t mLineNo; bool mHaveResultOrErrorCode; }; class IDBOpenDBRequest : public IDBRequest { public: NS_DECL_ISUPPORTS_INHERITED NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(IDBOpenDBRequest, IDBRequest) static already_AddRefed Create(IDBFactory* aFactory, nsPIDOMWindow* aOwner, JS::Handle aScriptOwner); void SetTransaction(IDBTransaction* aTransaction); // nsIDOMEventTarget virtual nsresult PostHandleEvent(nsEventChainPostVisitor& aVisitor) MOZ_OVERRIDE; DOMError* GetError(ErrorResult& aRv) { return IDBRequest::GetError(aRv); } IDBFactory* Factory() const { return mFactory; } // nsWrapperCache virtual JSObject* WrapObject(JSContext* aCx, JS::Handle aScope) MOZ_OVERRIDE; // WebIDL IMPL_EVENT_HANDLER(blocked); IMPL_EVENT_HANDLER(upgradeneeded); protected: IDBOpenDBRequest(); ~IDBOpenDBRequest(); // Only touched on the main thread. nsRefPtr mFactory; }; END_INDEXEDDB_NAMESPACE #endif // mozilla_dom_indexeddb_idbrequest_h__