Unreviewed test gardening.
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / legacy / LegacyTransaction.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 LegacyTransaction_h
27 #define LegacyTransaction_h
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "ActiveDOMObject.h"
32 #include "DOMError.h"
33 #include "Event.h"
34 #include "EventListener.h"
35 #include "EventTarget.h"
36 #include "IDBDatabaseMetadata.h"
37 #include "IDBTransaction.h"
38 #include "IndexedDB.h"
39 #include "LegacyDatabase.h"
40 #include "LegacyRequest.h"
41 #include "ScriptWrappable.h"
42 #include <wtf/HashSet.h>
43 #include <wtf/RefCounted.h>
44
45 namespace WebCore {
46
47 class IDBDatabaseBackend;
48 class IDBDatabaseError;
49 class LegacyCursor;
50 class LegacyObjectStore;
51 class LegacyOpenDBRequest;
52 struct IDBObjectStoreMetadata;
53
54 class LegacyTransaction final : public IDBTransaction {
55 public:
56     static Ref<LegacyTransaction> create(ScriptExecutionContext*, int64_t, const Vector<String>& objectStoreNames, IndexedDB::TransactionMode, LegacyDatabase*);
57     static Ref<LegacyTransaction> create(ScriptExecutionContext*, int64_t, LegacyDatabase*, LegacyOpenDBRequest*, const IDBDatabaseMetadata& previousMetadata);
58     virtual ~LegacyTransaction();
59
60     IDBDatabaseBackend* backendDB() const;
61
62     int64_t id() const { return m_id; }
63     bool isActive() const { return m_state == Active; }
64     bool isFinished() const { return m_state == Finished; }
65     bool isReadOnly() const { return m_mode == IndexedDB::TransactionMode::ReadOnly; }
66     bool isVersionChange() const { return m_mode == IndexedDB::TransactionMode::VersionChange; }
67
68     virtual const String& mode() const override final;
69     virtual IDBDatabase* db() override final;
70     virtual RefPtr<DOMError> error() const override final { return m_error; }
71     virtual RefPtr<IDBObjectStore> objectStore(const String& name, ExceptionCodeWithMessage&) override final;
72     virtual void abort(ExceptionCodeWithMessage&) override final;
73
74     class OpenCursorNotifier {
75     public:
76         OpenCursorNotifier(PassRefPtr<LegacyTransaction>, LegacyCursor*);
77         ~OpenCursorNotifier();
78         void cursorFinished();
79     private:
80         RefPtr<LegacyTransaction> m_transaction;
81         LegacyCursor* m_cursor;
82     };
83
84     void registerRequest(LegacyRequest*);
85     void unregisterRequest(LegacyRequest*);
86     void objectStoreCreated(const String&, PassRefPtr<LegacyObjectStore>);
87     void objectStoreDeleted(const String&);
88     void setActive(bool);
89     void setError(PassRefPtr<DOMError>, const String& errorMessage);
90
91     void onAbort(PassRefPtr<IDBDatabaseError>);
92     void onComplete();
93
94     // EventTarget
95     virtual EventTargetInterface eventTargetInterface() const override final { return IDBTransactionEventTargetInterfaceType; }
96     virtual ScriptExecutionContext* scriptExecutionContext() const override final { return ActiveDOMObject::scriptExecutionContext(); }
97
98     using EventTarget::dispatchEvent;
99     virtual bool dispatchEvent(Event&) override final;
100
101     // ActiveDOMObject
102     virtual bool hasPendingActivity() const override final;
103
104 private:
105     LegacyTransaction(ScriptExecutionContext*, int64_t, const Vector<String>&, IndexedDB::TransactionMode, LegacyDatabase*, LegacyOpenDBRequest*, const IDBDatabaseMetadata&);
106
107     void enqueueEvent(Ref<Event>&&);
108     void closeOpenCursors();
109
110     void registerOpenCursor(LegacyCursor*);
111     void unregisterOpenCursor(LegacyCursor*);
112
113     // ActiveDOMObject API.
114     bool canSuspendForDocumentSuspension() const override;
115     void stop() override;
116     const char* activeDOMObjectName() const override;
117
118     // EventTarget API.
119     virtual void refEventTarget() override { ref(); }
120     virtual void derefEventTarget() override { deref(); }
121
122     enum State {
123         Inactive, // Created or started, but not in an event callback
124         Active, // Created or started, in creation scope or an event callback
125         Finishing, // In the process of aborting or completing.
126         Finished, // No more events will fire and no new requests may be filed.
127     };
128
129     int64_t m_id;
130     RefPtr<LegacyDatabase> m_database;
131     const Vector<String> m_objectStoreNames;
132     LegacyOpenDBRequest* m_openDBRequest;
133     const IndexedDB::TransactionMode m_mode;
134     State m_state;
135     bool m_hasPendingActivity;
136     bool m_contextStopped;
137     RefPtr<DOMError> m_error;
138     String m_errorMessage;
139
140     ListHashSet<RefPtr<LegacyRequest>> m_requestList;
141
142     typedef HashMap<String, RefPtr<LegacyObjectStore>> IDBObjectStoreMap;
143     IDBObjectStoreMap m_objectStoreMap;
144
145     typedef HashSet<RefPtr<LegacyObjectStore>> IDBObjectStoreSet;
146     IDBObjectStoreSet m_deletedObjectStores;
147
148     typedef HashMap<RefPtr<LegacyObjectStore>, IDBObjectStoreMetadata> IDBObjectStoreMetadataMap;
149     IDBObjectStoreMetadataMap m_objectStoreCleanupMap;
150     IDBDatabaseMetadata m_previousMetadata;
151
152     HashSet<LegacyCursor*> m_openCursors;
153 };
154
155 } // namespace WebCore
156
157 #endif // ENABLE(INDEXED_DATABASE)
158
159 #endif // LegacyTransaction_h