Unreviewed test gardening.
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / legacy / LegacyDatabase.h
1 /*
2  * Copyright (C) 2010 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef LegacyDatabase_h
27 #define LegacyDatabase_h
28
29 #include "ActiveDOMObject.h"
30 #include "DOMStringList.h"
31 #include "Dictionary.h"
32 #include "Event.h"
33 #include "EventTarget.h"
34 #include "IDBDatabase.h"
35 #include "IDBDatabaseCallbacks.h"
36 #include "IDBDatabaseMetadata.h"
37 #include "IDBObjectStore.h"
38 #include "IndexedDB.h"
39 #include "LegacyTransaction.h"
40 #include "ScriptWrappable.h"
41 #include <wtf/PassRefPtr.h>
42 #include <wtf/RefCounted.h>
43 #include <wtf/RefPtr.h>
44
45 #if ENABLE(INDEXED_DATABASE)
46
47 namespace WebCore {
48
49 class LegacyTransaction;
50 class ScriptExecutionContext;
51
52 typedef int ExceptionCode;
53
54 class LegacyDatabase final : public IDBDatabase {
55 public:
56     static Ref<LegacyDatabase> create(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackend>, PassRefPtr<IDBDatabaseCallbacks>);
57     ~LegacyDatabase();
58
59     void setMetadata(const IDBDatabaseMetadata& metadata) { m_metadata = metadata; }
60     void transactionCreated(LegacyTransaction*);
61     void transactionFinished(LegacyTransaction*);
62
63     // Implement the IDL
64     virtual const String name() const override final { return m_metadata.name; }
65     virtual uint64_t version() const override final;
66     virtual RefPtr<DOMStringList> objectStoreNames() const override final;
67
68     virtual RefPtr<IDBObjectStore> createObjectStore(const String& name, const Dictionary&, ExceptionCodeWithMessage&) override final;
69     virtual RefPtr<IDBObjectStore> createObjectStore(const String& name, const IDBKeyPath&, bool autoIncrement, ExceptionCodeWithMessage&) override final;
70     virtual RefPtr<IDBTransaction> transaction(ScriptExecutionContext*, const Vector<String>&, const String& mode, ExceptionCodeWithMessage&) override final;
71     virtual RefPtr<IDBTransaction> transaction(ScriptExecutionContext*, const String&, const String& mode, ExceptionCodeWithMessage&) override final;
72     virtual void deleteObjectStore(const String& name, ExceptionCodeWithMessage&) override final;
73     virtual void close() override final;
74
75     // IDBDatabaseCallbacks
76     virtual void onVersionChange(uint64_t oldVersion, uint64_t newVersion);
77     virtual void onAbort(int64_t, PassRefPtr<IDBDatabaseError>);
78     virtual void onComplete(int64_t);
79
80     // EventTarget
81     virtual EventTargetInterface eventTargetInterface() const override final { return IDBDatabaseEventTargetInterfaceType; }
82     virtual ScriptExecutionContext* scriptExecutionContext() const override final { return ActiveDOMObject::scriptExecutionContext(); }
83
84     bool isClosePending() const { return m_closePending; }
85     void forceClose();
86     const IDBDatabaseMetadata metadata() const { return m_metadata; }
87     void enqueueEvent(Ref<Event>&&);
88
89     using EventTarget::dispatchEvent;
90     virtual bool dispatchEvent(Event&) override;
91
92     int64_t findObjectStoreId(const String& name) const;
93     bool containsObjectStore(const String& name) const
94     {
95         return findObjectStoreId(name) != IDBObjectStoreMetadata::InvalidId;
96     }
97
98     IDBDatabaseBackend* backend() const { return m_backend.get(); }
99
100     static int64_t nextTransactionId();
101
102     // ActiveDOMObject API.
103     bool hasPendingActivity() const override;
104
105 private:
106     LegacyDatabase(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackend>, PassRefPtr<IDBDatabaseCallbacks>);
107
108     PassRefPtr<IDBTransaction> transaction(ScriptExecutionContext* context, PassRefPtr<DOMStringList> scope, const String& mode, ExceptionCodeWithMessage& ec) { return transaction(context, *scope, mode, ec); }
109
110     // ActiveDOMObject API.
111     void stop() override;
112     const char* activeDOMObjectName() const override;
113     bool canSuspendForDocumentSuspension() const override;
114
115     // EventTarget
116     virtual void refEventTarget() override final { ref(); }
117     virtual void derefEventTarget() override final { deref(); }
118
119     void closeConnection();
120
121     IDBDatabaseMetadata m_metadata;
122     RefPtr<IDBDatabaseBackend> m_backend;
123     RefPtr<LegacyTransaction> m_versionChangeTransaction;
124     typedef HashMap<int64_t, LegacyTransaction*> TransactionMap;
125     TransactionMap m_transactions;
126
127     bool m_closePending;
128     bool m_isClosed;
129     bool m_contextStopped;
130
131     // Keep track of the versionchange events waiting to be fired on this
132     // database so that we can cancel them if the database closes.
133     Vector<Ref<Event>> m_enqueuedEvents;
134
135     RefPtr<IDBDatabaseCallbacks> m_databaseCallbacks;
136 };
137
138 } // namespace WebCore
139
140 #endif
141
142 #endif // LegacyDatabase_h