#ifndef IDBDatabase_h
#define IDBDatabase_h
#include "ActiveDOMObject.h"
#include "DOMStringList.h"
#include "Dictionary.h"
#include "Event.h"
#include "EventTarget.h"
#include "IDBDatabaseCallbacks.h"
#include "IDBDatabaseMetadata.h"
#include "IDBObjectStore.h"
#include "IDBTransaction.h"
#include "IndexedDB.h"
#include "ScriptWrappable.h"
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
#if ENABLE(INDEXED_DATABASE)
namespace WebCore {
class ScriptExecutionContext;
typedef int ExceptionCode;
class IDBDatabase final : public RefCounted<IDBDatabase>, public ScriptWrappable, public EventTargetWithInlineData, public ActiveDOMObject {
public:
static Ref<IDBDatabase> create(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackend>, PassRefPtr<IDBDatabaseCallbacks>);
~IDBDatabase();
void setMetadata(const IDBDatabaseMetadata& metadata) { m_metadata = metadata; }
void transactionCreated(IDBTransaction*);
void transactionFinished(IDBTransaction*);
const String name() const { return m_metadata.name; }
uint64_t version() const;
PassRefPtr<DOMStringList> objectStoreNames() const;
PassRefPtr<IDBObjectStore> createObjectStore(const String& name, const Dictionary&, ExceptionCode&);
PassRefPtr<IDBObjectStore> createObjectStore(const String& name, const IDBKeyPath&, bool autoIncrement, ExceptionCode&);
PassRefPtr<IDBTransaction> transaction(ScriptExecutionContext* context, PassRefPtr<DOMStringList> scope, const String& mode, ExceptionCode& ec) { return transaction(context, *scope, mode, ec); }
PassRefPtr<IDBTransaction> transaction(ScriptExecutionContext*, const Vector<String>&, const String& mode, ExceptionCode&);
PassRefPtr<IDBTransaction> transaction(ScriptExecutionContext*, const String&, const String& mode, ExceptionCode&);
void deleteObjectStore(const String& name, ExceptionCode&);
void close();
virtual void onVersionChange(uint64_t oldVersion, uint64_t newVersion);
virtual void onAbort(int64_t, PassRefPtr<IDBDatabaseError>);
virtual void onComplete(int64_t);
virtual EventTargetInterface eventTargetInterface() const override final { return IDBDatabaseEventTargetInterfaceType; }
virtual ScriptExecutionContext* scriptExecutionContext() const override final { return ActiveDOMObject::scriptExecutionContext(); }
bool isClosePending() const { return m_closePending; }
void forceClose();
const IDBDatabaseMetadata metadata() const { return m_metadata; }
void enqueueEvent(PassRefPtr<Event>);
using EventTarget::dispatchEvent;
virtual bool dispatchEvent(PassRefPtr<Event>) override;
int64_t findObjectStoreId(const String& name) const;
bool containsObjectStore(const String& name) const
{
return findObjectStoreId(name) != IDBObjectStoreMetadata::InvalidId;
}
IDBDatabaseBackend* backend() const { return m_backend.get(); }
static int64_t nextTransactionId();
using RefCounted<IDBDatabase>::ref;
using RefCounted<IDBDatabase>::deref;
bool hasPendingActivity() const override;
private:
IDBDatabase(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackend>, PassRefPtr<IDBDatabaseCallbacks>);
void stop() override;
const char* activeDOMObjectName() const override;
bool canSuspendForPageCache() const override;
virtual void refEventTarget() override final { ref(); }
virtual void derefEventTarget() override final { deref(); }
void closeConnection();
IDBDatabaseMetadata m_metadata;
RefPtr<IDBDatabaseBackend> m_backend;
RefPtr<IDBTransaction> m_versionChangeTransaction;
typedef HashMap<int64_t, IDBTransaction*> TransactionMap;
TransactionMap m_transactions;
bool m_closePending;
bool m_isClosed;
bool m_contextStopped;
Vector<RefPtr<Event>> m_enqueuedEvents;
RefPtr<IDBDatabaseCallbacks> m_databaseCallbacks;
};
}
#endif
#endif // IDBDatabase_h