OLD | NEW |
---|---|
(Empty) | |
1 | |
2 // Copyright 2017 The Chromium Authors. All rights reserved. | |
3 // Use of this source code is governed by a BSD-style license that can be | |
4 // found in the LICENSE file. | |
5 | |
6 #include "modules/indexeddb/IDBRequestQueue.h" | |
7 | |
8 #include "core/dom/DOMException.h" | |
9 #include "modules/indexeddb/IDBKey.h" | |
10 #include "modules/indexeddb/IDBRequest.h" | |
11 #include "modules/indexeddb/IDBRequestLoader.h" | |
12 #include "modules/indexeddb/IDBValue.h" | |
13 #include "public/platform/modules/indexeddb/WebIDBCursor.h" | |
14 | |
15 namespace blink { | |
16 | |
17 IDBRequestQueueItem::IDBRequestQueueItem(IDBRequest* request, | |
18 DOMException* error) | |
19 : request_(request), error_(error), mode_(kError) {} | |
20 | |
21 IDBRequestQueueItem::IDBRequestQueueItem(IDBRequest* request, IDBKey* key) | |
22 : request_(request), key_(key), mode_(kKey) {} | |
23 | |
24 IDBRequestQueueItem::IDBRequestQueueItem(IDBRequest* request, | |
25 PassRefPtr<IDBValue> value) | |
26 : request_(request), mode_(kValue) { | |
27 values_.push_back(std::move(value)); | |
28 } | |
29 | |
30 IDBRequestQueueItem::IDBRequestQueueItem(IDBRequest* request, | |
31 const Vector<RefPtr<IDBValue>>& values) | |
32 : request_(request), values_(values), mode_(kValueArray) {} | |
33 | |
34 IDBRequestQueueItem::IDBRequestQueueItem(IDBRequest* request, | |
35 IDBKey* key, | |
36 IDBKey* primary_key, | |
37 PassRefPtr<IDBValue> value) | |
38 : request_(request), | |
39 key_(key), | |
40 primary_key_(primary_key), | |
41 mode_(kKeyPrimaryKeyValue) { | |
42 values_.push_back(std::move(value)); | |
43 } | |
44 | |
45 IDBRequestQueueItem::IDBRequestQueueItem(IDBRequest* request, | |
46 std::unique_ptr<WebIDBCursor> backend, | |
47 IDBKey* key, | |
48 IDBKey* primary_key, | |
49 PassRefPtr<IDBValue> value) | |
50 : request_(request), | |
51 key_(key), | |
52 primary_key_(primary_key), | |
53 backend_(std::move(backend)), | |
54 mode_(kBackendKeyPrimaryKeyValue) { | |
55 values_.push_back(std::move(value)); | |
56 } | |
57 | |
58 void IDBRequestQueueItem::MarkReady() { | |
59 DCHECK(!ready_); | |
60 ready_ = true; | |
61 | |
62 request_->transaction()->OnResultReady(); | |
63 } | |
64 | |
65 void IDBRequestQueueItem::MarkReady(DOMException* error) { | |
66 DCHECK(!ready_); | |
67 DCHECK(mode_ != kError); | |
68 | |
69 mode_ = kError; | |
70 error_ = error; | |
71 | |
72 // This is not necessary, but releases non-trivial amounts of memory early. | |
73 values_.clear(); | |
74 | |
75 MarkReady(); | |
76 } | |
77 | |
78 void IDBRequestQueueItem::AttachLoader() { | |
79 DCHECK(!loader_); | |
80 DCHECK(!values_.IsEmpty()); | |
81 DCHECK(IDBRequestLoader::NeedUnwrapping(values_)); | |
82 | |
83 ready_ = false; | |
84 loader_ = new IDBRequestLoader(this, &values_); | |
dmurph
2017/05/04 22:27:07
The loader will definitely be only loading one blo
pwnall
2017/05/11 23:54:24
IDBObjectStore.getAll() returns an array of IDBVal
| |
85 } | |
86 | |
87 void IDBRequestQueueItem::StartLoading() { | |
88 if (loader_) { | |
89 DCHECK(!ready_); | |
90 loader_->Start(); | |
91 } | |
92 } | |
93 | |
94 void IDBRequestQueueItem::FireCallback() { | |
95 #if DCHECK_IS_ON() | |
96 DCHECK(ready_); | |
97 DCHECK(!callback_fired_); | |
98 callback_fired_ = true; | |
99 #endif // DCHECK_IS_ON() | |
100 | |
101 switch (mode_) { | |
102 case kError: | |
103 DCHECK(error_); | |
104 request_->OnError(error_); | |
105 break; | |
106 | |
107 case kBackendKeyPrimaryKeyValue: | |
108 DCHECK_EQ(values_.size(), 1U); | |
109 request_->OnSuccess(std::move(backend_), key_, primary_key_, | |
110 std::move(values_.front())); | |
111 break; | |
112 | |
113 case kKeyPrimaryKeyValue: | |
114 DCHECK_EQ(values_.size(), 1U); | |
115 request_->OnSuccess(key_, primary_key_, std::move(values_.front())); | |
116 break; | |
117 | |
118 case kKey: | |
119 request_->OnSuccess(key_); | |
120 break; | |
121 | |
122 case kValue: | |
123 DCHECK_EQ(values_.size(), 1U); | |
124 request_->OnSuccess(std::move(values_.front())); | |
125 break; | |
126 | |
127 case kValueArray: | |
128 request_->OnSuccess(values_); | |
129 break; | |
130 } | |
131 } | |
132 | |
133 DEFINE_TRACE(IDBRequestQueueItem) { | |
134 visitor->Trace(error_); | |
135 visitor->Trace(loader_); | |
136 visitor->Trace(request_); | |
137 visitor->Trace(key_); | |
138 visitor->Trace(primary_key_); | |
139 } | |
140 | |
141 } // namespace blink | |
OLD | NEW |