Chromium Code Reviews| 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 |