Deprecate ActiveDOMObject::canSuspendForDocumentSuspension()
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / IDBRequest.h
1 /*
2  * Copyright (C) 2015, 2016 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 #pragma once
27
28 #if ENABLE(INDEXED_DATABASE)
29
30 #include "EventTarget.h"
31 #include "ExceptionOr.h"
32 #include "IDBActiveDOMObject.h"
33 #include "IDBError.h"
34 #include "IDBGetAllResult.h"
35 #include "IDBGetResult.h"
36 #include "IDBKeyData.h"
37 #include "IDBResourceIdentifier.h"
38 #include "IDBValue.h"
39 #include "IndexedDB.h"
40 #include "JSValueInWrappedObject.h"
41 #include <JavaScriptCore/Strong.h>
42 #include <wtf/Function.h>
43 #include <wtf/Scope.h>
44 #include <wtf/ThreadSafeRefCounted.h>
45 #include <wtf/WeakPtr.h>
46
47 namespace WebCore {
48
49 class DOMException;
50 class Event;
51 class IDBCursor;
52 class IDBDatabase;
53 class IDBIndex;
54 class IDBObjectStore;
55 class IDBResultData;
56 class IDBTransaction;
57 class ThreadSafeDataBuffer;
58
59 namespace IDBClient {
60 class IDBConnectionProxy;
61 class IDBConnectionToServer;
62 }
63
64 class IDBRequest : public EventTargetWithInlineData, public IDBActiveDOMObject, public ThreadSafeRefCounted<IDBRequest>, public CanMakeWeakPtr<IDBRequest> {
65     WTF_MAKE_ISO_ALLOCATED(IDBRequest);
66 public:
67     enum class NullResultType {
68         Empty,
69         Undefined
70     };
71
72     static Ref<IDBRequest> create(ScriptExecutionContext&, IDBObjectStore&, IDBTransaction&);
73     static Ref<IDBRequest> create(ScriptExecutionContext&, IDBCursor&, IDBTransaction&);
74     static Ref<IDBRequest> create(ScriptExecutionContext&, IDBIndex&, IDBTransaction&);
75     static Ref<IDBRequest> createObjectStoreGet(ScriptExecutionContext&, IDBObjectStore&, IndexedDB::ObjectStoreRecordType, IDBTransaction&);
76     static Ref<IDBRequest> createIndexGet(ScriptExecutionContext&, IDBIndex&, IndexedDB::IndexRecordType, IDBTransaction&);
77
78     const IDBResourceIdentifier& resourceIdentifier() const { return m_resourceIdentifier; }
79
80     virtual ~IDBRequest();
81
82     using Result = Variant<RefPtr<IDBCursor>, RefPtr<IDBDatabase>, IDBKeyData, Vector<IDBKeyData>, IDBGetResult, IDBGetAllResult, uint64_t, NullResultType>;
83     ExceptionOr<Result> result() const;
84     JSValueInWrappedObject& resultWrapper() { return m_resultWrapper; }
85     JSValueInWrappedObject& cursorWrapper() { return m_cursorWrapper; }
86
87     using Source = Variant<RefPtr<IDBObjectStore>, RefPtr<IDBIndex>, RefPtr<IDBCursor>>;
88     const Optional<Source>& source() const { return m_source; }
89
90     ExceptionOr<DOMException*> error() const;
91
92     RefPtr<IDBTransaction> transaction() const;
93     
94     enum class ReadyState { Pending, Done };
95     ReadyState readyState() const { return m_readyState; }
96
97     bool isDone() const { return m_readyState == ReadyState::Done; }
98
99     uint64_t sourceObjectStoreIdentifier() const;
100     uint64_t sourceIndexIdentifier() const;
101     IndexedDB::ObjectStoreRecordType requestedObjectStoreRecordType() const;
102     IndexedDB::IndexRecordType requestedIndexRecordType() const;
103
104     ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); }
105
106     using ThreadSafeRefCounted::ref;
107     using ThreadSafeRefCounted::deref;
108
109     void completeRequestAndDispatchEvent(const IDBResultData&);
110
111     void setResult(const IDBKeyData&);
112     void setResult(const Vector<IDBKeyData>&);
113     void setResultToStructuredClone(const IDBGetResult&);
114     void setResult(const IDBGetAllResult&);
115     void setResult(uint64_t);
116     void setResultToUndefined();
117
118     void willIterateCursor(IDBCursor&);
119     void didOpenOrIterateCursor(const IDBResultData&);
120
121     const IDBCursor* pendingCursor() const { return m_pendingCursor.get(); }
122
123     void setSource(IDBCursor&);
124     void setVersionChangeTransaction(IDBTransaction&);
125
126     IndexedDB::RequestType requestType() const { return m_requestType; }
127
128     bool hasPendingActivity() const final;
129
130 protected:
131     IDBRequest(ScriptExecutionContext&, IDBClient::IDBConnectionProxy&);
132
133     void enqueueEvent(Ref<Event>&&);
134     void dispatchEvent(Event&) override;
135
136     void setResult(Ref<IDBDatabase>&&);
137
138     IDBClient::IDBConnectionProxy& connectionProxy() { return m_connectionProxy.get(); }
139
140     // FIXME: Protected data members aren't great for maintainability.
141     // Consider adding protected helper functions and making these private.
142     ReadyState m_readyState { ReadyState::Pending };
143     RefPtr<IDBTransaction> m_transaction;
144     bool m_shouldExposeTransactionToDOM { true };
145     RefPtr<DOMException> m_domError;
146     IndexedDB::RequestType m_requestType { IndexedDB::RequestType::Other };
147     bool m_contextStopped { false };
148     Event* m_openDatabaseSuccessEvent { nullptr };
149
150 private:
151     IDBRequest(ScriptExecutionContext&, IDBObjectStore&, IDBTransaction&);
152     IDBRequest(ScriptExecutionContext&, IDBCursor&, IDBTransaction&);
153     IDBRequest(ScriptExecutionContext&, IDBIndex&, IDBTransaction&);
154     IDBRequest(ScriptExecutionContext&, IDBObjectStore&, IndexedDB::ObjectStoreRecordType, IDBTransaction&);
155     IDBRequest(ScriptExecutionContext&, IDBIndex&, IndexedDB::IndexRecordType, IDBTransaction&);
156
157     EventTargetInterface eventTargetInterface() const override;
158
159     const char* activeDOMObjectName() const final;
160     void stop() final;
161     virtual void cancelForStop();
162
163     void refEventTarget() final { ref(); }
164     void derefEventTarget() final { deref(); }
165     void uncaughtExceptionInEventHandler() final;
166
167     virtual bool isOpenDBRequest() const { return false; }
168
169     void onError();
170     void onSuccess();
171
172     void clearWrappers();
173
174     IDBCursor* resultCursor();
175
176     IDBError m_idbError;
177     IDBResourceIdentifier m_resourceIdentifier;
178
179     JSValueInWrappedObject m_resultWrapper;
180     JSValueInWrappedObject m_cursorWrapper;
181     Result m_result;
182     Optional<Source> m_source;
183
184     bool m_hasPendingActivity { true };
185     IndexedDB::ObjectStoreRecordType m_requestedObjectStoreRecordType { IndexedDB::ObjectStoreRecordType::ValueOnly };
186     IndexedDB::IndexRecordType m_requestedIndexRecordType { IndexedDB::IndexRecordType::Key };
187
188     RefPtr<IDBCursor> m_pendingCursor;
189
190     Ref<IDBClient::IDBConnectionProxy> m_connectionProxy;
191
192     bool m_dispatchingEvent { false };
193     bool m_hasUncaughtException { false };
194 };
195
196 } // namespace WebCore
197
198 #endif // ENABLE(INDEXED_DATABASE)