#ifndef IDBRequest_h
#define IDBRequest_h
#include "bindings/v8/DOMRequestState.h"
#include "bindings/v8/ScriptValue.h"
#include "bindings/v8/ScriptWrappable.h"
#include "core/dom/ActiveDOMObject.h"
#include "core/dom/DOMError.h"
#include "core/dom/DOMStringList.h"
#include "core/events/Event.h"
#include "core/events/EventListener.h"
#include "core/events/EventTarget.h"
#include "heap/Handle.h"
#include "modules/indexeddb/IDBAny.h"
#include "modules/indexeddb/IDBTransaction.h"
#include "modules/indexeddb/IndexedDB.h"
#include "public/platform/WebIDBCursor.h"
namespace WebCore {
class ExceptionState;
class IDBCursor;
struct IDBDatabaseMetadata;
class SharedBuffer;
class IDBRequestBase : public WTF::RefCountedBase {
public:
virtual void deref() = 0;
protected:
virtual ~IDBRequestBase() { }
};
class IDBRequest : public IDBRequestBase, public ScriptWrappable, public EventTargetWithInlineData, public ActiveDOMObject {
DEFINE_EVENT_TARGET_REFCOUNTING(IDBRequestBase);
public:
static PassRefPtr<IDBRequest> create(ExecutionContext*, PassRefPtr<IDBAny> source, IDBTransaction*);
virtual ~IDBRequest();
ScriptValue result(ExceptionState&);
PassRefPtrWillBeRawPtr<DOMError> error(ExceptionState&) const;
ScriptValue source(ExecutionContext*) const;
PassRefPtr<IDBTransaction> transaction() const { return m_transaction; }
bool isResultDirty() const { return m_resultDirty; }
PassRefPtr<IDBAny> resultAsAny() const { return m_result; }
void preventPropagation() { m_preventPropagation = true; }
enum ReadyState {
PENDING = 1,
DONE = 2,
EarlyDeath = 3
};
const String& readyState() const;
DEFINE_ATTRIBUTE_EVENT_LISTENER(success);
DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
void setCursorDetails(IndexedDB::CursorType, blink::WebIDBCursor::Direction);
void setPendingCursor(PassRefPtr<IDBCursor>);
void abort();
virtual void onError(PassRefPtrWillBeRawPtr<DOMError>);
virtual void onSuccess(const Vector<String>&);
virtual void onSuccess(PassOwnPtr<blink::WebIDBCursor>, PassRefPtr<IDBKey>, PassRefPtr<IDBKey> primaryKey, PassRefPtr<SharedBuffer>);
virtual void onSuccess(PassRefPtr<IDBKey>);
virtual void onSuccess(PassRefPtr<SharedBuffer>);
virtual void onSuccess(PassRefPtr<SharedBuffer>, PassRefPtr<IDBKey>, const IDBKeyPath&);
virtual void onSuccess(int64_t);
virtual void onSuccess();
virtual void onSuccess(PassRefPtr<IDBKey>, PassRefPtr<IDBKey> primaryKey, PassRefPtr<SharedBuffer>);
virtual void onBlocked(int64_t oldVersion) { ASSERT_NOT_REACHED(); }
virtual void onUpgradeNeeded(int64_t oldVersion, PassOwnPtr<blink::WebIDBDatabase>, const IDBDatabaseMetadata&, blink::WebIDBDataLoss, String dataLossMessage) { ASSERT_NOT_REACHED(); }
virtual void onSuccess(PassOwnPtr<blink::WebIDBDatabase>, const IDBDatabaseMetadata&) { ASSERT_NOT_REACHED(); }
virtual bool hasPendingActivity() const OVERRIDE FINAL;
virtual void stop() OVERRIDE FINAL;
virtual const AtomicString& interfaceName() const OVERRIDE;
virtual ExecutionContext* executionContext() const OVERRIDE FINAL;
virtual void uncaughtExceptionInEventHandler() OVERRIDE FINAL;
using EventTarget::dispatchEvent;
virtual bool dispatchEvent(PassRefPtrWillBeRawPtr<Event>) OVERRIDE;
void transactionDidFinishAndDispatch();
virtual void deref() OVERRIDE FINAL
{
if (derefBase())
delete this;
else if (hasOneRef())
checkForReferenceCycle();
}
DOMRequestState* requestState() { return &m_requestState; }
IDBCursor* getResultCursor() const;
protected:
IDBRequest(ExecutionContext*, PassRefPtr<IDBAny> source, IDBTransaction*);
void enqueueEvent(PassRefPtrWillBeRawPtr<Event>);
void dequeueEvent(Event*);
virtual bool shouldEnqueueEvent() const;
void onSuccessInternal(PassRefPtr<IDBAny>);
void setResult(PassRefPtr<IDBAny>);
bool m_contextStopped;
RefPtr<IDBTransaction> m_transaction;
ReadyState m_readyState;
bool m_requestAborted;
private:
void setResultCursor(PassRefPtr<IDBCursor>, PassRefPtr<IDBKey>, PassRefPtr<IDBKey> primaryKey, PassRefPtr<SharedBuffer> value);
void checkForReferenceCycle();
RefPtr<IDBAny> m_source;
RefPtr<IDBAny> m_result;
RefPtrWillBePersistent<DOMError> m_error;
bool m_hasPendingActivity;
WillBePersistentHeapVector<RefPtrWillBeMember<Event> > m_enqueuedEvents;
IndexedDB::CursorType m_cursorType;
blink::WebIDBCursor::Direction m_cursorDirection;
RefPtr<IDBCursor> m_pendingCursor;
RefPtr<IDBKey> m_cursorKey;
RefPtr<IDBKey> m_cursorPrimaryKey;
RefPtr<SharedBuffer> m_cursorValue;
bool m_didFireUpgradeNeededEvent;
bool m_preventPropagation;
bool m_resultDirty;
DOMRequestState m_requestState;
};
}
#endif