Modern IDB: Pipe through cursor functions from client to server.
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / client / IDBRequestImpl.h
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 #ifndef IDBRequestImpl_h
27 #define IDBRequestImpl_h
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "IDBAnyImpl.h"
32 #include "IDBOpenDBRequest.h"
33 #include "IDBResourceIdentifier.h"
34 #include "IDBTransactionImpl.h"
35 #include <wtf/RefCounted.h>
36
37 namespace WebCore {
38
39 class Event;
40 class IDBKeyData;
41 class IDBResultData;
42 class ThreadSafeDataBuffer;
43
44 namespace IndexedDB {
45 enum class IndexRecordType;
46 }
47
48 namespace IDBClient {
49
50 class IDBConnectionToServer;
51
52 class IDBRequest : public WebCore::IDBOpenDBRequest, public RefCounted<IDBRequest> {
53 public:
54     static Ref<IDBRequest> create(ScriptExecutionContext&, IDBObjectStore&, IDBTransaction&);
55     static Ref<IDBRequest> create(ScriptExecutionContext&, IDBCursor&, IDBTransaction&);
56     static Ref<IDBRequest> createCount(ScriptExecutionContext&, IDBIndex&, IDBTransaction&);
57     static Ref<IDBRequest> createGet(ScriptExecutionContext&, IDBIndex&, IndexedDB::IndexRecordType, IDBTransaction&);
58
59     const IDBResourceIdentifier& resourceIdentifier() const { return m_resourceIdentifier; }
60
61     virtual ~IDBRequest() override;
62
63     virtual RefPtr<WebCore::IDBAny> result(ExceptionCode&) const override;
64     virtual unsigned short errorCode(ExceptionCode&) const override;
65     virtual RefPtr<DOMError> error(ExceptionCode&) const override;
66     virtual RefPtr<WebCore::IDBAny> source() const override;
67     virtual RefPtr<WebCore::IDBTransaction> transaction() const override;
68     virtual const String& readyState() const override;
69
70     uint64_t sourceObjectStoreIdentifier() const;
71     uint64_t sourceIndexIdentifier() const;
72     IndexedDB::IndexRecordType requestedIndexRecordType() const;
73
74     // EventTarget
75     virtual EventTargetInterface eventTargetInterface() const override;
76     virtual ScriptExecutionContext* scriptExecutionContext() const override final { return ActiveDOMObject::scriptExecutionContext(); }
77
78     using RefCounted<IDBRequest>::ref;
79     using RefCounted<IDBRequest>::deref;
80
81     void enqueueEvent(Ref<Event>&&);
82     virtual bool dispatchEvent(Event&) override final;
83
84     IDBConnectionToServer& connection() { return m_connection; }
85
86     void requestCompleted(const IDBResultData&);
87
88     void setResult(const IDBKeyData*);
89     void setResult(uint64_t);
90     void setResultToStructuredClone(const ThreadSafeDataBuffer&);
91     void setResultToUndefined();
92
93     IDBAny* modernResult() { return m_result.get(); }
94
95     void willIterateCursor(IDBCursor&);
96     void didOpenOrIterateCursor(const IDBResultData&);
97
98 protected:
99     IDBRequest(IDBConnectionToServer&, ScriptExecutionContext*);
100     IDBRequest(ScriptExecutionContext&, IDBObjectStore&, IDBTransaction&);
101     IDBRequest(ScriptExecutionContext&, IDBCursor&, IDBTransaction&);
102     IDBRequest(ScriptExecutionContext&, IDBIndex&, IDBTransaction&);
103     IDBRequest(ScriptExecutionContext&, IDBIndex&, IndexedDB::IndexRecordType, IDBTransaction&);
104
105     // ActiveDOMObject.
106     virtual const char* activeDOMObjectName() const override final;
107     virtual bool canSuspendForPageCache() const override final;
108     virtual bool hasPendingActivity() const override final;
109     
110     // EventTarget.
111     virtual void refEventTarget() override final { RefCounted<IDBRequest>::ref(); }
112     virtual void derefEventTarget() override final { RefCounted<IDBRequest>::deref(); }
113
114     IDBRequestReadyState m_readyState { IDBRequestReadyState::Pending };
115     RefPtr<IDBAny> m_result;
116     RefPtr<IDBTransaction> m_transaction;
117     RefPtr<DOMError> m_domError;
118     IDBError m_idbError;
119
120 private:
121     void onError();
122     void onSuccess();
123
124     IDBCursor* resultCursor();
125
126     IDBConnectionToServer& m_connection;
127     IDBResourceIdentifier m_resourceIdentifier;
128     RefPtr<IDBAny> m_source;
129     bool m_hasPendingActivity { true };
130     IndexedDB::IndexRecordType m_requestedIndexRecordType;
131
132     RefPtr<IDBCursor> m_pendingCursor;
133 };
134
135 } // namespace IDBClient
136 } // namespace WebCore
137
138 #endif // ENABLE(INDEXED_DATABASE)
139 #endif // IDBRequestImpl_h