1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/*
2d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2010 Google Inc. All rights reserved.
3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Redistribution and use in source and binary forms, with or without
5563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * modification, are permitted provided that the following conditions
6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * are met:
7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
8563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 1.  Redistributions of source code must retain the above copyright
9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     notice, this list of conditions and the following disclaimer.
10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 2.  Redistributions in binary form must reproduce the above copyright
11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     notice, this list of conditions and the following disclaimer in the
12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     documentation and/or other materials provided with the distribution.
13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef IDBDatabase_h
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define IDBDatabase_h
28d0825bca7fe65beaee391d30da42e937db621564Steve Block
292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "ActiveDOMObject.h"
30dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "DOMStringList.h"
312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "Event.h"
322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "EventTarget.h"
33a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "ExceptionCode.h"
34dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "IDBDatabaseBackendInterface.h"
352bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "IDBDatabaseCallbacksImpl.h"
36a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "IDBObjectStore.h"
37dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "IDBTransaction.h"
384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "OptionsObject.h"
395af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include <wtf/PassRefPtr.h>
40dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <wtf/RefCounted.h>
41dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <wtf/RefPtr.h>
42d0825bca7fe65beaee391d30da42e937db621564Steve Block
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(INDEXED_DATABASE)
44d0825bca7fe65beaee391d30da42e937db621564Steve Block
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WebCore {
46d0825bca7fe65beaee391d30da42e937db621564Steve Block
4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass IDBVersionChangeRequest;
4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass ScriptExecutionContext;
495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
502bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass IDBDatabase : public RefCounted<IDBDatabase>, public EventTarget, public ActiveDOMObject {
51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic:
522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    static PassRefPtr<IDBDatabase> create(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendInterface>);
53dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ~IDBDatabase();
545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    void setSetVersionTransaction(IDBTransaction*);
56a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
57dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Implement the IDL
58dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    String name() const { return m_backend->name(); }
59dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    String version() const { return m_backend->version(); }
604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    PassRefPtr<DOMStringList> objectStoreNames() const { return m_backend->objectStoreNames(); }
61545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
62a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // FIXME: Try to modify the code generator so this is unneeded.
634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    PassRefPtr<IDBObjectStore> createObjectStore(const String& name, ExceptionCode& ec) { return createObjectStore(name, OptionsObject(), ec); }
642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    PassRefPtr<IDBTransaction> transaction(ScriptExecutionContext* context, ExceptionCode& ec) { return transaction(context, 0, ec); }
652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    PassRefPtr<IDBTransaction> transaction(ScriptExecutionContext* context, PassRefPtr<DOMStringList> storeNames, ExceptionCode& ec) { return transaction(context, storeNames, IDBTransaction::READ_ONLY, ec); }
662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    PassRefPtr<IDBTransaction> transaction(ScriptExecutionContext*, PassRefPtr<DOMStringList>, unsigned short mode, ExceptionCode&);
67a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    PassRefPtr<IDBObjectStore> createObjectStore(const String& name, const OptionsObject&, ExceptionCode&);
694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    void deleteObjectStore(const String& name, ExceptionCode&);
7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    PassRefPtr<IDBVersionChangeRequest> setVersion(ScriptExecutionContext*, const String& version, ExceptionCode&);
71a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    void close();
725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);
742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    DEFINE_ATTRIBUTE_EVENT_LISTENER(versionchange);
7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // IDBDatabaseCallbacks
7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual void onVersionChange(const String& requestedVersion);
792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // ActiveDOMObject
812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    virtual bool hasPendingActivity() const;
822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    virtual void stop();
832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // EventTarget
852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    virtual IDBDatabase* toIDBDatabase() { return this; }
862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    virtual ScriptExecutionContext* scriptExecutionContext() const;
872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
8981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void open();
9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void enqueueEvent(PassRefPtr<Event>);
9181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    bool dispatchEvent(PassRefPtr<Event> event, ExceptionCode& ec) { return EventTarget::dispatchEvent(event, ec); }
9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual bool dispatchEvent(PassRefPtr<Event>);
9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
942bde8e466a4451c7319e3a072d118917957d6554Steve Block    using RefCounted<IDBDatabase>::ref;
952bde8e466a4451c7319e3a072d118917957d6554Steve Block    using RefCounted<IDBDatabase>::deref;
962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
97dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochprivate:
982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    IDBDatabase(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendInterface>);
992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // EventTarget
1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    virtual void refEventTarget() { ref(); }
1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    virtual void derefEventTarget() { deref(); }
1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    virtual EventTargetData* eventTargetData();
1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    virtual EventTargetData* ensureEventTargetData();
105545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
106dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    RefPtr<IDBDatabaseBackendInterface> m_backend;
1072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<IDBTransaction> m_setVersionTransaction;
1082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool m_noNewTransactions;
1102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool m_stopped;
1112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    EventTargetData m_eventTargetData;
11381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Keep track of the versionchange events waiting to be fired on this
11581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // database so that we can cancel them if the database closes.
11681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Vector<RefPtr<Event> > m_enqueuedEvents;
1172bde8e466a4451c7319e3a072d118917957d6554Steve Block
1182bde8e466a4451c7319e3a072d118917957d6554Steve Block    RefPtr<IDBDatabaseCallbacksImpl> m_databaseCallbacks;
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
120d0825bca7fe65beaee391d30da42e937db621564Steve Block
121d0825bca7fe65beaee391d30da42e937db621564Steve Block} // namespace WebCore
1220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif // IDBDatabase_h
126