Unreviewed, rolling out r191156.
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / client / IDBDatabaseImpl.cpp
1 /*
2  * Copyright (C) 2015 Apple 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "IDBDatabaseImpl.h"
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "IDBConnectionToServer.h"
32 #include "IDBOpenDBRequestImpl.h"
33 #include "IDBResultData.h"
34 #include "IDBTransactionImpl.h"
35 #include "Logging.h"
36
37 namespace WebCore {
38 namespace IDBClient {
39
40 Ref<IDBDatabase> IDBDatabase::create(ScriptExecutionContext& context, IDBConnectionToServer& connection, const IDBResultData& resultData)
41 {
42     return adoptRef(*new IDBDatabase(context, connection, resultData));
43 }
44
45 IDBDatabase::IDBDatabase(ScriptExecutionContext& context, IDBConnectionToServer& connection, const IDBResultData& resultData)
46     : WebCore::IDBDatabase(&context)
47     , m_connection(connection)
48     , m_info(resultData.databaseInfo())
49 {
50     suspendIfNeeded();
51     relaxAdoptionRequirement();
52     m_connection->registerDatabaseConnection(*this);
53 }
54
55 IDBDatabase::~IDBDatabase()
56 {
57     m_connection->unregisterDatabaseConnection(*this);
58 }
59
60 const String IDBDatabase::name() const
61 {
62     return m_info.name();
63 }
64
65 uint64_t IDBDatabase::version() const
66 {
67     return m_info.version();
68 }
69
70 RefPtr<DOMStringList> IDBDatabase::objectStoreNames() const
71 {
72     ASSERT_NOT_REACHED();
73     return nullptr;
74 }
75
76 RefPtr<IDBObjectStore> IDBDatabase::createObjectStore(const String&, const Dictionary&, ExceptionCode&)
77 {
78     ASSERT_NOT_REACHED();
79     return nullptr;
80 }
81
82 RefPtr<IDBObjectStore> IDBDatabase::createObjectStore(const String&, const IDBKeyPath&, bool, ExceptionCode&)
83 {
84     ASSERT_NOT_REACHED();
85     return nullptr;
86 }
87
88 RefPtr<WebCore::IDBTransaction> IDBDatabase::transaction(ScriptExecutionContext*, const Vector<String>&, const String&, ExceptionCode&)
89 {
90     ASSERT_NOT_REACHED();
91     return nullptr;
92 }
93
94 RefPtr<WebCore::IDBTransaction> IDBDatabase::transaction(ScriptExecutionContext*, const String&, const String&, ExceptionCode&)
95 {
96     ASSERT_NOT_REACHED();
97     return nullptr;
98 }
99
100 void IDBDatabase::deleteObjectStore(const String&, ExceptionCode&)
101 {
102     ASSERT_NOT_REACHED();
103 }
104
105 void IDBDatabase::close()
106 {
107     ASSERT_NOT_REACHED();
108 }
109
110 const char* IDBDatabase::activeDOMObjectName() const
111 {
112     return "IDBDatabase";
113 }
114
115 bool IDBDatabase::canSuspendForPageCache() const
116 {
117     // FIXME: This value will sometimes be false when database operations are actually in progress.
118     // Such database operations do not yet exist.
119     return true;
120 }
121
122 Ref<IDBTransaction> IDBDatabase::startVersionChangeTransaction(const IDBTransactionInfo& info)
123 {
124     LOG(IndexedDB, "IDBDatabase::startVersionChangeTransaction");
125
126     ASSERT(!m_versionChangeTransaction);
127     ASSERT(info.mode() == IndexedDB::TransactionMode::VersionChange);
128
129     Ref<IDBTransaction> transaction = IDBTransaction::create(*this, info);
130     m_versionChangeTransaction = &transaction.get();
131
132     m_activeTransactions.set(transaction->info().identifier(), &transaction.get());
133
134     return WTF::move(transaction);
135 }
136
137 void IDBDatabase::commitTransaction(IDBTransaction& transaction)
138 {
139     LOG(IndexedDB, "IDBDatabase::commitTransaction");
140
141     auto refTransaction = m_activeTransactions.take(transaction.info().identifier());
142     ASSERT(refTransaction);
143     m_committingTransactions.set(transaction.info().identifier(), WTF::move(refTransaction));
144
145     m_connection->commitTransaction(transaction);
146 }
147
148 void IDBDatabase::didCommitTransaction(IDBTransaction& transaction)
149 {
150     LOG(IndexedDB, "IDBDatabase::didCommitTransaction");
151
152     if (m_versionChangeTransaction == &transaction)
153         m_info.setVersion(transaction.info().newVersion());
154
155     didCommitOrAbortTransaction(transaction);
156 }
157
158 void IDBDatabase::didAbortTransaction(IDBTransaction& transaction)
159 {
160     LOG(IndexedDB, "IDBDatabase::didAbortTransaction");
161     didCommitOrAbortTransaction(transaction);
162 }
163
164 void IDBDatabase::didCommitOrAbortTransaction(IDBTransaction& transaction)
165 {
166     LOG(IndexedDB, "IDBDatabase::didCommitOrAbortTransaction");
167
168     if (m_versionChangeTransaction == &transaction)
169         m_versionChangeTransaction = nullptr;
170     
171     ASSERT(m_activeTransactions.contains(transaction.info().identifier()) || m_committingTransactions.contains(transaction.info().identifier()));
172
173     m_activeTransactions.remove(transaction.info().identifier());
174     m_committingTransactions.remove(transaction.info().identifier());
175 }
176
177 } // namespace IDBClient
178 } // namespace WebCore
179
180 #endif // ENABLE(INDEXED_DATABASE)