Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: content/browser/indexed_db/indexed_db_callbacks.cc

Issue 2500263003: Port messages sent by WebIDBCursorImpl to Mojo. (Closed)
Patch Set: Address yzshen@'s comments and fix leak. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/indexed_db/indexed_db_callbacks.h" 5 #include "content/browser/indexed_db/indexed_db_callbacks.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/metrics/histogram_macros.h" 12 #include "base/metrics/histogram_macros.h"
13 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
14 #include "base/time/time.h" 14 #include "base/time/time.h"
15 #include "content/browser/child_process_security_policy_impl.h" 15 #include "content/browser/child_process_security_policy_impl.h"
16 #include "content/browser/fileapi/fileapi_message_filter.h" 16 #include "content/browser/fileapi/fileapi_message_filter.h"
17 #include "content/browser/indexed_db/cursor_impl.h"
17 #include "content/browser/indexed_db/database_impl.h" 18 #include "content/browser/indexed_db/database_impl.h"
18 #include "content/browser/indexed_db/indexed_db_blob_info.h" 19 #include "content/browser/indexed_db/indexed_db_blob_info.h"
19 #include "content/browser/indexed_db/indexed_db_connection.h" 20 #include "content/browser/indexed_db/indexed_db_connection.h"
20 #include "content/browser/indexed_db/indexed_db_context_impl.h" 21 #include "content/browser/indexed_db/indexed_db_context_impl.h"
21 #include "content/browser/indexed_db/indexed_db_cursor.h" 22 #include "content/browser/indexed_db/indexed_db_cursor.h"
22 #include "content/browser/indexed_db/indexed_db_database_error.h" 23 #include "content/browser/indexed_db/indexed_db_database_error.h"
23 #include "content/browser/indexed_db/indexed_db_return_value.h" 24 #include "content/browser/indexed_db/indexed_db_return_value.h"
24 #include "content/browser/indexed_db/indexed_db_tracing.h" 25 #include "content/browser/indexed_db/indexed_db_tracing.h"
25 #include "content/browser/indexed_db/indexed_db_value.h" 26 #include "content/browser/indexed_db/indexed_db_value.h"
26 #include "content/common/indexed_db/indexed_db_constants.h" 27 #include "content/common/indexed_db/indexed_db_constants.h"
27 #include "content/common/indexed_db/indexed_db_messages.h" 28 #include "content/common/indexed_db/indexed_db_messages.h"
28 #include "content/common/indexed_db/indexed_db_metadata.h" 29 #include "content/common/indexed_db/indexed_db_metadata.h"
29 #include "mojo/public/cpp/bindings/strong_associated_binding.h" 30 #include "mojo/public/cpp/bindings/strong_associated_binding.h"
30 #include "storage/browser/blob/blob_storage_context.h" 31 #include "storage/browser/blob/blob_storage_context.h"
31 #include "storage/browser/blob/shareable_file_reference.h" 32 #include "storage/browser/blob/shareable_file_reference.h"
32 #include "storage/browser/quota/quota_manager.h" 33 #include "storage/browser/quota/quota_manager.h"
33 34
34 using indexed_db::mojom::CallbacksAssociatedPtrInfo; 35 using indexed_db::mojom::CallbacksAssociatedPtrInfo;
35 using std::swap; 36 using std::swap;
36 using storage::ShareableFileReference; 37 using storage::ShareableFileReference;
37 38
38 namespace content { 39 namespace content {
39 40
40 namespace { 41 namespace {
41 const int32_t kNoCursor = -1;
42 const int64_t kNoTransaction = -1; 42 const int64_t kNoTransaction = -1;
43 43
44 void ConvertBlobInfo( 44 void ConvertBlobInfo(
45 const std::vector<IndexedDBBlobInfo>& blob_info, 45 const std::vector<IndexedDBBlobInfo>& blob_info,
46 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info) { 46 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info) {
47 blob_or_file_info->reserve(blob_info.size()); 47 blob_or_file_info->reserve(blob_info.size());
48 for (const auto& iter : blob_info) { 48 for (const auto& iter : blob_info) {
49 if (!iter.mark_used_callback().is_null()) 49 if (!iter.mark_used_callback().is_null())
50 iter.mark_used_callback().Run(); 50 iter.mark_used_callback().Run();
51 51
(...skipping 18 matching lines...) Expand all
70 if (value->primary_key.IsValid()) { 70 if (value->primary_key.IsValid()) {
71 mojo_value->primary_key = value->primary_key; 71 mojo_value->primary_key = value->primary_key;
72 mojo_value->key_path = value->key_path; 72 mojo_value->key_path = value->key_path;
73 } 73 }
74 if (!value->empty()) 74 if (!value->empty())
75 swap(mojo_value->value->bits, value->bits); 75 swap(mojo_value->value->bits, value->bits);
76 ConvertBlobInfo(value->blob_info, &mojo_value->value->blob_or_file_info); 76 ConvertBlobInfo(value->blob_info, &mojo_value->value->blob_or_file_info);
77 return mojo_value; 77 return mojo_value;
78 } 78 }
79 79
80 // Destructively converts an IndexedDBValue to a Mojo Value.
81 ::indexed_db::mojom::ValuePtr ConvertValue(IndexedDBValue* value) {
82 auto mojo_value = ::indexed_db::mojom::Value::New();
83 if (!value->empty())
84 swap(mojo_value->bits, value->bits);
85 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info);
86 return mojo_value;
87 }
88
80 } // namespace 89 } // namespace
81 90
82 class IndexedDBCallbacks::IOThreadHelper { 91 class IndexedDBCallbacks::IOThreadHelper {
83 public: 92 public:
84 IOThreadHelper(CallbacksAssociatedPtrInfo callbacks_info, 93 IOThreadHelper(CallbacksAssociatedPtrInfo callbacks_info,
85 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host); 94 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host);
86 ~IOThreadHelper(); 95 ~IOThreadHelper();
87 96
88 void SendError(const IndexedDBDatabaseError& error); 97 void SendError(const IndexedDBDatabaseError& error);
89 void SendSuccessStringList(const std::vector<base::string16>& value); 98 void SendSuccessStringList(const std::vector<base::string16>& value);
90 void SendBlocked(int64_t existing_version); 99 void SendBlocked(int64_t existing_version);
91 void SendUpgradeNeeded(std::unique_ptr<DatabaseImpl> database, 100 void SendUpgradeNeeded(std::unique_ptr<DatabaseImpl> database,
92 int64_t old_version, 101 int64_t old_version,
93 blink::WebIDBDataLoss data_loss, 102 blink::WebIDBDataLoss data_loss,
94 const std::string& data_loss_message, 103 const std::string& data_loss_message,
95 const content::IndexedDBDatabaseMetadata& metadata); 104 const content::IndexedDBDatabaseMetadata& metadata);
96 void SendSuccessDatabase(std::unique_ptr<DatabaseImpl> database, 105 void SendSuccessDatabase(std::unique_ptr<DatabaseImpl> database,
97 const content::IndexedDBDatabaseMetadata& metadata); 106 const content::IndexedDBDatabaseMetadata& metadata);
98 void SendSuccessCursor(int32_t cursor_id, 107 void SendSuccessCursor(std::unique_ptr<CursorImpl> cursor,
99 const IndexedDBKey& key, 108 const IndexedDBKey& key,
100 const IndexedDBKey& primary_key, 109 const IndexedDBKey& primary_key,
101 ::indexed_db::mojom::ValuePtr value, 110 ::indexed_db::mojom::ValuePtr value,
102 const std::vector<IndexedDBBlobInfo>& blob_info); 111 const std::vector<IndexedDBBlobInfo>& blob_info);
103 void SendSuccessValue(::indexed_db::mojom::ReturnValuePtr value, 112 void SendSuccessValue(::indexed_db::mojom::ReturnValuePtr value,
104 const std::vector<IndexedDBBlobInfo>& blob_info); 113 const std::vector<IndexedDBBlobInfo>& blob_info);
114 void SendSuccessCursorContinue(
115 const IndexedDBKey& key,
116 const IndexedDBKey& primary_key,
117 ::indexed_db::mojom::ValuePtr value,
118 const std::vector<IndexedDBBlobInfo>& blob_info);
119 void SendSuccessCursorPrefetch(
120 const std::vector<IndexedDBKey>& keys,
121 const std::vector<IndexedDBKey>& primary_keys,
122 std::vector<::indexed_db::mojom::ValuePtr> mojo_values,
123 const std::vector<IndexedDBValue>& values);
105 void SendSuccessArray( 124 void SendSuccessArray(
106 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values, 125 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values,
107 const std::vector<IndexedDBReturnValue>& values); 126 const std::vector<IndexedDBReturnValue>& values);
108 void SendSuccessKey(const IndexedDBKey& value); 127 void SendSuccessKey(const IndexedDBKey& value);
109 void SendSuccessInteger(int64_t value); 128 void SendSuccessInteger(int64_t value);
110 void SendSuccess(); 129 void SendSuccess();
111 130
112 std::string CreateBlobData(const IndexedDBBlobInfo& blob_info); 131 std::string CreateBlobData(const IndexedDBBlobInfo& blob_info);
113 bool CreateAllBlobs( 132 bool CreateAllBlobs(
114 const std::vector<IndexedDBBlobInfo>& blob_info, 133 const std::vector<IndexedDBBlobInfo>& blob_info,
115 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info); 134 std::vector<::indexed_db::mojom::BlobInfoPtr>* blob_or_file_info);
116 135
117 private: 136 private:
118 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host_; 137 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host_;
119 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_; 138 ::indexed_db::mojom::CallbacksAssociatedPtr callbacks_;
120 139
121 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper); 140 DISALLOW_COPY_AND_ASSIGN(IOThreadHelper);
122 }; 141 };
123 142
124 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host,
125 int32_t ipc_thread_id,
126 int32_t ipc_callbacks_id)
127 : dispatcher_host_(dispatcher_host),
128 ipc_callbacks_id_(ipc_callbacks_id),
129 ipc_thread_id_(ipc_thread_id),
130 ipc_cursor_id_(kNoCursor),
131 host_transaction_id_(kNoTransaction),
132 data_loss_(blink::WebIDBDataLossNone),
133 sent_blocked_(false),
134 io_helper_(nullptr) {}
135
136 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host,
137 int32_t ipc_thread_id,
138 int32_t ipc_callbacks_id,
139 int32_t ipc_cursor_id)
140 : dispatcher_host_(dispatcher_host),
141 ipc_callbacks_id_(ipc_callbacks_id),
142 ipc_thread_id_(ipc_thread_id),
143 ipc_cursor_id_(ipc_cursor_id),
144 host_transaction_id_(kNoTransaction),
145 data_loss_(blink::WebIDBDataLossNone),
146 sent_blocked_(false),
147 io_helper_(nullptr) {}
148
149 IndexedDBCallbacks::IndexedDBCallbacks( 143 IndexedDBCallbacks::IndexedDBCallbacks(
150 IndexedDBDispatcherHost* dispatcher_host, 144 IndexedDBDispatcherHost* dispatcher_host,
151 const url::Origin& origin, 145 const url::Origin& origin,
152 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info) 146 ::indexed_db::mojom::CallbacksAssociatedPtrInfo callbacks_info)
153 : dispatcher_host_(dispatcher_host), 147 : dispatcher_host_(dispatcher_host),
154 ipc_cursor_id_(kNoCursor),
155 host_transaction_id_(kNoTransaction), 148 host_transaction_id_(kNoTransaction),
156 origin_(origin), 149 origin_(origin),
157 data_loss_(blink::WebIDBDataLossNone), 150 data_loss_(blink::WebIDBDataLossNone),
158 sent_blocked_(false), 151 sent_blocked_(false),
159 io_helper_( 152 io_helper_(
160 new IOThreadHelper(std::move(callbacks_info), dispatcher_host_)) { 153 new IOThreadHelper(std::move(callbacks_info), dispatcher_host_)) {
161 DCHECK_CURRENTLY_ON(BrowserThread::IO); 154 DCHECK_CURRENTLY_ON(BrowserThread::IO);
162 thread_checker_.DetachFromThread(); 155 thread_checker_.DetachFromThread();
163 } 156 }
164 157
165 IndexedDBCallbacks::~IndexedDBCallbacks() { 158 IndexedDBCallbacks::~IndexedDBCallbacks() {
166 DCHECK(thread_checker_.CalledOnValidThread()); 159 DCHECK(thread_checker_.CalledOnValidThread());
167 } 160 }
168 161
169 void IndexedDBCallbacks::OnError(const IndexedDBDatabaseError& error) { 162 void IndexedDBCallbacks::OnError(const IndexedDBDatabaseError& error) {
170 DCHECK(thread_checker_.CalledOnValidThread()); 163 DCHECK(thread_checker_.CalledOnValidThread());
171 DCHECK(dispatcher_host_); 164 DCHECK(dispatcher_host_);
172 165
173 if (io_helper_) { 166 BrowserThread::PostTask(
174 BrowserThread::PostTask( 167 BrowserThread::IO, FROM_HERE,
175 BrowserThread::IO, FROM_HERE, 168 base::Bind(&IOThreadHelper::SendError, base::Unretained(io_helper_.get()),
176 base::Bind(&IOThreadHelper::SendError, 169 error));
177 base::Unretained(io_helper_.get()), error));
178 } else {
179 dispatcher_host_->Send(new IndexedDBMsg_CallbacksError(
180 ipc_thread_id_, ipc_callbacks_id_, error.code(), error.message()));
181 }
182 dispatcher_host_ = nullptr; 170 dispatcher_host_ = nullptr;
183 171
184 if (!connection_open_start_time_.is_null()) { 172 if (!connection_open_start_time_.is_null()) {
185 UMA_HISTOGRAM_MEDIUM_TIMES( 173 UMA_HISTOGRAM_MEDIUM_TIMES(
186 "WebCore.IndexedDB.OpenTime.Error", 174 "WebCore.IndexedDB.OpenTime.Error",
187 base::TimeTicks::Now() - connection_open_start_time_); 175 base::TimeTicks::Now() - connection_open_start_time_);
188 connection_open_start_time_ = base::TimeTicks(); 176 connection_open_start_time_ = base::TimeTicks();
189 } 177 }
190 } 178 }
191 179
192 void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) { 180 void IndexedDBCallbacks::OnSuccess(const std::vector<base::string16>& value) {
193 DCHECK(thread_checker_.CalledOnValidThread()); 181 DCHECK(thread_checker_.CalledOnValidThread());
194 DCHECK(dispatcher_host_); 182 DCHECK(dispatcher_host_);
195 DCHECK(io_helper_); 183 DCHECK(io_helper_);
196 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
197 DCHECK_EQ(kNoTransaction, host_transaction_id_); 184 DCHECK_EQ(kNoTransaction, host_transaction_id_);
198 185
199 BrowserThread::PostTask( 186 BrowserThread::PostTask(
200 BrowserThread::IO, FROM_HERE, 187 BrowserThread::IO, FROM_HERE,
201 base::Bind(&IOThreadHelper::SendSuccessStringList, 188 base::Bind(&IOThreadHelper::SendSuccessStringList,
202 base::Unretained(io_helper_.get()), value)); 189 base::Unretained(io_helper_.get()), value));
203 dispatcher_host_ = nullptr; 190 dispatcher_host_ = nullptr;
204 } 191 }
205 192
206 void IndexedDBCallbacks::OnBlocked(int64_t existing_version) { 193 void IndexedDBCallbacks::OnBlocked(int64_t existing_version) {
207 DCHECK(thread_checker_.CalledOnValidThread()); 194 DCHECK(thread_checker_.CalledOnValidThread());
208 DCHECK(dispatcher_host_); 195 DCHECK(dispatcher_host_);
209 DCHECK(io_helper_); 196 DCHECK(io_helper_);
210 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
211 197
212 if (sent_blocked_) 198 if (sent_blocked_)
213 return; 199 return;
214 200
215 sent_blocked_ = true; 201 sent_blocked_ = true;
216 202
217 BrowserThread::PostTask( 203 BrowserThread::PostTask(
218 BrowserThread::IO, FROM_HERE, 204 BrowserThread::IO, FROM_HERE,
219 base::Bind(&IOThreadHelper::SendBlocked, 205 base::Bind(&IOThreadHelper::SendBlocked,
220 base::Unretained(io_helper_.get()), existing_version)); 206 base::Unretained(io_helper_.get()), existing_version));
221 207
222 if (!connection_open_start_time_.is_null()) { 208 if (!connection_open_start_time_.is_null()) {
223 UMA_HISTOGRAM_MEDIUM_TIMES( 209 UMA_HISTOGRAM_MEDIUM_TIMES(
224 "WebCore.IndexedDB.OpenTime.Blocked", 210 "WebCore.IndexedDB.OpenTime.Blocked",
225 base::TimeTicks::Now() - connection_open_start_time_); 211 base::TimeTicks::Now() - connection_open_start_time_);
226 connection_open_start_time_ = base::TimeTicks(); 212 connection_open_start_time_ = base::TimeTicks();
227 } 213 }
228 } 214 }
229 215
230 void IndexedDBCallbacks::OnUpgradeNeeded( 216 void IndexedDBCallbacks::OnUpgradeNeeded(
231 int64_t old_version, 217 int64_t old_version,
232 std::unique_ptr<IndexedDBConnection> connection, 218 std::unique_ptr<IndexedDBConnection> connection,
233 const IndexedDBDatabaseMetadata& metadata, 219 const IndexedDBDatabaseMetadata& metadata,
234 const IndexedDBDataLossInfo& data_loss_info) { 220 const IndexedDBDataLossInfo& data_loss_info) {
235 DCHECK(thread_checker_.CalledOnValidThread()); 221 DCHECK(thread_checker_.CalledOnValidThread());
236 DCHECK(dispatcher_host_); 222 DCHECK(dispatcher_host_);
237 DCHECK(io_helper_); 223 DCHECK(io_helper_);
238 224
239 DCHECK_NE(kNoTransaction, host_transaction_id_); 225 DCHECK_NE(kNoTransaction, host_transaction_id_);
240 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
241 DCHECK(!database_sent_); 226 DCHECK(!database_sent_);
242 227
243 data_loss_ = data_loss_info.status; 228 data_loss_ = data_loss_info.status;
244 dispatcher_host_->RegisterTransactionId(host_transaction_id_, origin_); 229 dispatcher_host_->RegisterTransactionId(host_transaction_id_, origin_);
245 database_sent_ = true; 230 database_sent_ = true;
246 auto database = base::MakeUnique<DatabaseImpl>(std::move(connection), origin_, 231 auto database = base::MakeUnique<DatabaseImpl>(std::move(connection), origin_,
247 dispatcher_host_); 232 dispatcher_host_);
248 233
249 BrowserThread::PostTask( 234 BrowserThread::PostTask(
250 BrowserThread::IO, FROM_HERE, 235 BrowserThread::IO, FROM_HERE,
(...skipping 10 matching lines...) Expand all
261 } 246 }
262 } 247 }
263 248
264 void IndexedDBCallbacks::OnSuccess( 249 void IndexedDBCallbacks::OnSuccess(
265 std::unique_ptr<IndexedDBConnection> connection, 250 std::unique_ptr<IndexedDBConnection> connection,
266 const IndexedDBDatabaseMetadata& metadata) { 251 const IndexedDBDatabaseMetadata& metadata) {
267 DCHECK(thread_checker_.CalledOnValidThread()); 252 DCHECK(thread_checker_.CalledOnValidThread());
268 DCHECK(dispatcher_host_); 253 DCHECK(dispatcher_host_);
269 DCHECK(io_helper_); 254 DCHECK(io_helper_);
270 255
271 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
272 DCHECK_NE(kNoTransaction, host_transaction_id_); 256 DCHECK_NE(kNoTransaction, host_transaction_id_);
273 DCHECK_EQ(database_sent_, !connection); 257 DCHECK_EQ(database_sent_, !connection);
274 258
275 scoped_refptr<IndexedDBCallbacks> self(this); 259 scoped_refptr<IndexedDBCallbacks> self(this);
276 260
277 // Only send a new Database if the connection was not previously sent in 261 // Only send a new Database if the connection was not previously sent in
278 // OnUpgradeNeeded. 262 // OnUpgradeNeeded.
279 std::unique_ptr<DatabaseImpl> database; 263 std::unique_ptr<DatabaseImpl> database;
280 if (!database_sent_) 264 if (!database_sent_)
281 database.reset( 265 database.reset(
282 new DatabaseImpl(std::move(connection), origin_, dispatcher_host_)); 266 new DatabaseImpl(std::move(connection), origin_, dispatcher_host_));
283 267
284 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 268 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
285 base::Bind(&IOThreadHelper::SendSuccessDatabase, 269 base::Bind(&IOThreadHelper::SendSuccessDatabase,
286 base::Unretained(io_helper_.get()), 270 base::Unretained(io_helper_.get()),
287 base::Passed(&database), metadata)); 271 base::Passed(&database), metadata));
288 dispatcher_host_ = nullptr; 272 dispatcher_host_ = nullptr;
289 273
290 if (!connection_open_start_time_.is_null()) { 274 if (!connection_open_start_time_.is_null()) {
291 UMA_HISTOGRAM_MEDIUM_TIMES( 275 UMA_HISTOGRAM_MEDIUM_TIMES(
292 "WebCore.IndexedDB.OpenTime.Success", 276 "WebCore.IndexedDB.OpenTime.Success",
293 base::TimeTicks::Now() - connection_open_start_time_); 277 base::TimeTicks::Now() - connection_open_start_time_);
294 connection_open_start_time_ = base::TimeTicks(); 278 connection_open_start_time_ = base::TimeTicks();
295 } 279 }
296 } 280 }
297 281
298 static std::string CreateBlobData(
299 const IndexedDBBlobInfo& blob_info,
300 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
301 base::TaskRunner* task_runner) {
302 if (!blob_info.uuid().empty()) {
303 // We're sending back a live blob, not a reference into our backing store.
304 return dispatcher_host->HoldBlobData(blob_info);
305 }
306 scoped_refptr<ShareableFileReference> shareable_file =
307 ShareableFileReference::Get(blob_info.file_path());
308 if (!shareable_file.get()) {
309 shareable_file = ShareableFileReference::GetOrCreate(
310 blob_info.file_path(),
311 ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE,
312 task_runner);
313 if (!blob_info.release_callback().is_null())
314 shareable_file->AddFinalReleaseCallback(blob_info.release_callback());
315 }
316 return dispatcher_host->HoldBlobData(blob_info);
317 }
318
319 static bool CreateAllBlobs(
320 const std::vector<IndexedDBBlobInfo>& blob_info,
321 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info,
322 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) {
323 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs");
324 DCHECK_EQ(blob_info.size(), blob_or_file_info->size());
325 size_t i;
326 if (!dispatcher_host->blob_storage_context())
327 return false;
328 for (i = 0; i < blob_info.size(); ++i) {
329 (*blob_or_file_info)[i].uuid =
330 CreateBlobData(blob_info[i], dispatcher_host,
331 dispatcher_host->context()->TaskRunner());
332 }
333 return true;
334 }
335
336 template <class ParamType, class MsgType>
337 static void CreateBlobsAndSend(
338 ParamType* params,
339 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
340 const std::vector<IndexedDBBlobInfo>& blob_info,
341 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) {
342 DCHECK_CURRENTLY_ON(BrowserThread::IO);
343 if (CreateAllBlobs(blob_info, blob_or_file_info, dispatcher_host))
344 dispatcher_host->Send(new MsgType(*params));
345 }
346
347 static void BlobLookupForCursorPrefetch(
348 IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params* params,
349 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
350 const std::vector<IndexedDBValue>& values) {
351 DCHECK_CURRENTLY_ON(BrowserThread::IO);
352 DCHECK_EQ(values.size(), params->values.size());
353
354 for (size_t i = 0; i < values.size(); ++i) {
355 if (!CreateAllBlobs(values[i].blob_info,
356 &params->values[i].blob_or_file_info, dispatcher_host))
357 return;
358 }
359
360 dispatcher_host->Send(
361 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params));
362 }
363
364 static void FillInBlobData(
365 const std::vector<IndexedDBBlobInfo>& blob_info,
366 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) {
367 for (const auto& iter : blob_info) {
368 if (iter.is_file()) {
369 IndexedDBMsg_BlobOrFileInfo info;
370 info.is_file = true;
371 info.mime_type = iter.type();
372 info.file_name = iter.file_name();
373 info.file_path = iter.file_path().AsUTF16Unsafe();
374 info.size = iter.size();
375 info.last_modified = iter.last_modified().ToDoubleT();
376 blob_or_file_info->push_back(info);
377 } else {
378 IndexedDBMsg_BlobOrFileInfo info;
379 info.mime_type = iter.type();
380 info.size = iter.size();
381 blob_or_file_info->push_back(info);
382 }
383 }
384 }
385
386 void IndexedDBCallbacks::RegisterBlobsAndSend(
387 const std::vector<IndexedDBBlobInfo>& blob_info,
388 const base::Closure& callback) {
389 for (const auto& iter : blob_info) {
390 if (!iter.mark_used_callback().is_null())
391 iter.mark_used_callback().Run();
392 }
393 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
394 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback);
395 }
396
397 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor, 282 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor,
398 const IndexedDBKey& key, 283 const IndexedDBKey& key,
399 const IndexedDBKey& primary_key, 284 const IndexedDBKey& primary_key,
400 IndexedDBValue* value) { 285 IndexedDBValue* value) {
401 DCHECK(thread_checker_.CalledOnValidThread()); 286 DCHECK(thread_checker_.CalledOnValidThread());
402 DCHECK(dispatcher_host_); 287 DCHECK(dispatcher_host_);
403 DCHECK(io_helper_); 288 DCHECK(io_helper_);
404 289
405 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
406 DCHECK_EQ(kNoTransaction, host_transaction_id_); 290 DCHECK_EQ(kNoTransaction, host_transaction_id_);
407 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 291 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
408 292
293 std::unique_ptr<CursorImpl> cursor_impl(
294 new CursorImpl(cursor, origin_, dispatcher_host_));
295
409 ::indexed_db::mojom::ValuePtr mojo_value; 296 ::indexed_db::mojom::ValuePtr mojo_value;
410 std::vector<IndexedDBBlobInfo> blob_info; 297 std::vector<IndexedDBBlobInfo> blob_info;
411 if (value) { 298 if (value) {
412 mojo_value = ::indexed_db::mojom::Value::New(); 299 mojo_value = ::indexed_db::mojom::Value::New();
413 if (!value->empty()) 300 if (!value->empty())
414 swap(mojo_value->bits, value->bits); 301 swap(mojo_value->bits, value->bits);
415 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info); 302 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info);
416 blob_info = value->blob_info; 303 blob_info = value->blob_info;
417 } 304 }
418 305
419 BrowserThread::PostTask( 306 BrowserThread::PostTask(
420 BrowserThread::IO, FROM_HERE, 307 BrowserThread::IO, FROM_HERE,
421 base::Bind(&IOThreadHelper::SendSuccessCursor, 308 base::Bind(&IOThreadHelper::SendSuccessCursor,
422 base::Unretained(io_helper_.get()), 309 base::Unretained(io_helper_.get()), base::Passed(&cursor_impl),
423 dispatcher_host_->Add(cursor.get()), key, primary_key, 310 key, primary_key, base::Passed(&mojo_value),
424 base::Passed(&mojo_value), base::Passed(&blob_info))); 311 base::Passed(&blob_info)));
425 dispatcher_host_ = nullptr; 312 dispatcher_host_ = nullptr;
426 } 313 }
427 314
428 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, 315 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key,
429 const IndexedDBKey& primary_key, 316 const IndexedDBKey& primary_key,
430 IndexedDBValue* value) { 317 IndexedDBValue* value) {
431 DCHECK(thread_checker_.CalledOnValidThread()); 318 DCHECK(thread_checker_.CalledOnValidThread());
432 DCHECK(dispatcher_host_); 319 DCHECK(dispatcher_host_);
433 DCHECK(!io_helper_); 320 DCHECK(io_helper_);
434 321
435 DCHECK_NE(kNoCursor, ipc_cursor_id_);
436 DCHECK_EQ(kNoTransaction, host_transaction_id_); 322 DCHECK_EQ(kNoTransaction, host_transaction_id_);
437 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 323 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
438 324
439 IndexedDBCursor* idb_cursor = 325 ::indexed_db::mojom::ValuePtr mojo_value;
440 dispatcher_host_->GetCursorFromId(ipc_cursor_id_); 326 std::vector<IndexedDBBlobInfo> blob_info;
327 if (value) {
328 mojo_value = ::indexed_db::mojom::Value::New();
329 if (!value->empty())
330 std::swap(mojo_value->bits, value->bits);
dcheng 2016/11/17 03:46:23 No std:: to get ADL
Reilly Grant (use Gerrit) 2016/11/17 20:04:52 Done.
331 ConvertBlobInfo(value->blob_info, &mojo_value->blob_or_file_info);
332 blob_info = value->blob_info;
333 }
441 334
442 DCHECK(idb_cursor); 335 BrowserThread::PostTask(
443 if (!idb_cursor) 336 BrowserThread::IO, FROM_HERE,
444 return; 337 base::Bind(&IOThreadHelper::SendSuccessCursorContinue,
445 338 base::Unretained(io_helper_.get()), key, primary_key,
446 std::unique_ptr<IndexedDBMsg_CallbacksSuccessCursorContinue_Params> params( 339 base::Passed(&mojo_value), base::Passed(&blob_info)));
447 new IndexedDBMsg_CallbacksSuccessCursorContinue_Params());
448 params->ipc_thread_id = ipc_thread_id_;
449 params->ipc_callbacks_id = ipc_callbacks_id_;
450 params->ipc_cursor_id = ipc_cursor_id_;
451 params->key = key;
452 params->primary_key = primary_key;
453 if (value && !value->empty())
454 swap(params->value.bits, value->bits);
455 // TODO(alecflett): Avoid a copy here: the whole params object is
456 // being copied into the message.
457 if (!value || value->blob_info.empty()) {
458 dispatcher_host_->Send(
459 new IndexedDBMsg_CallbacksSuccessCursorContinue(*params));
460 } else {
461 IndexedDBMsg_CallbacksSuccessCursorContinue_Params* p = params.get();
462 FillInBlobData(value->blob_info, &p->value.blob_or_file_info);
463 RegisterBlobsAndSend(
464 value->blob_info,
465 base::Bind(CreateBlobsAndSend<
466 IndexedDBMsg_CallbacksSuccessCursorContinue_Params,
467 IndexedDBMsg_CallbacksSuccessCursorContinue>,
468 base::Owned(params.release()), dispatcher_host_,
469 value->blob_info,
470 base::Unretained(&p->value.blob_or_file_info)));
471 }
472 dispatcher_host_ = nullptr; 340 dispatcher_host_ = nullptr;
473 } 341 }
474 342
475 void IndexedDBCallbacks::OnSuccessWithPrefetch( 343 void IndexedDBCallbacks::OnSuccessWithPrefetch(
476 const std::vector<IndexedDBKey>& keys, 344 const std::vector<IndexedDBKey>& keys,
477 const std::vector<IndexedDBKey>& primary_keys, 345 const std::vector<IndexedDBKey>& primary_keys,
478 std::vector<IndexedDBValue>* values) { 346 std::vector<IndexedDBValue>* values) {
479 DCHECK(thread_checker_.CalledOnValidThread()); 347 DCHECK(thread_checker_.CalledOnValidThread());
480 DCHECK(dispatcher_host_); 348 DCHECK(dispatcher_host_);
481 DCHECK(!io_helper_); 349 DCHECK(io_helper_);
482 DCHECK_EQ(keys.size(), primary_keys.size()); 350 DCHECK_EQ(keys.size(), primary_keys.size());
483 DCHECK_EQ(keys.size(), values->size()); 351 DCHECK_EQ(keys.size(), values->size());
484 352
485 DCHECK_NE(kNoCursor, ipc_cursor_id_);
486 DCHECK_EQ(kNoTransaction, host_transaction_id_); 353 DCHECK_EQ(kNoTransaction, host_transaction_id_);
487 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 354 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
488 355
489 std::vector<IndexedDBKey> msg_keys; 356 std::vector<::indexed_db::mojom::ValuePtr> mojo_values;
490 std::vector<IndexedDBKey> msg_primary_keys; 357 mojo_values.reserve(values->size());
358 for (size_t i = 0; i < values->size(); ++i)
359 mojo_values.push_back(ConvertValue(&(*values)[i]));
491 360
492 for (size_t i = 0; i < keys.size(); ++i) { 361 BrowserThread::PostTask(
493 msg_keys.push_back(keys[i]); 362 BrowserThread::IO, FROM_HERE,
494 msg_primary_keys.push_back(primary_keys[i]); 363 base::Bind(&IOThreadHelper::SendSuccessCursorPrefetch,
495 } 364 base::Unretained(io_helper_.get()), keys, primary_keys,
496 365 base::Passed(&mojo_values), *values));
497 std::unique_ptr<IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params> params(
498 new IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params());
499 params->ipc_thread_id = ipc_thread_id_;
500 params->ipc_callbacks_id = ipc_callbacks_id_;
501 params->ipc_cursor_id = ipc_cursor_id_;
502 params->keys = msg_keys;
503 params->primary_keys = msg_primary_keys;
504 params->values.resize(values->size());
505
506 bool found_blob_info = false;
507 for (size_t i = 0; i < values->size(); ++i) {
508 params->values[i].bits.swap(values->at(i).bits);
509 if (!values->at(i).blob_info.empty()) {
510 found_blob_info = true;
511 FillInBlobData(values->at(i).blob_info,
512 &params->values[i].blob_or_file_info);
513 for (const auto& blob_iter : values->at(i).blob_info) {
514 if (!blob_iter.mark_used_callback().is_null())
515 blob_iter.mark_used_callback().Run();
516 }
517 }
518 }
519
520 if (found_blob_info) {
521 BrowserThread::PostTask(BrowserThread::IO,
522 FROM_HERE,
523 base::Bind(BlobLookupForCursorPrefetch,
524 base::Owned(params.release()),
525 dispatcher_host_,
526 *values));
527 } else {
528 dispatcher_host_->Send(
529 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params.get()));
530 }
531 dispatcher_host_ = nullptr; 366 dispatcher_host_ = nullptr;
532 } 367 }
533 368
534 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) { 369 void IndexedDBCallbacks::OnSuccess(IndexedDBReturnValue* value) {
535 DCHECK(thread_checker_.CalledOnValidThread()); 370 DCHECK(thread_checker_.CalledOnValidThread());
536 DCHECK(dispatcher_host_); 371 DCHECK(dispatcher_host_);
537 372
538 if (value && value->primary_key.IsValid()) {
539 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
540 } else {
541 DCHECK(kNoCursor == ipc_cursor_id_ || value == NULL);
542 }
543 DCHECK_EQ(kNoTransaction, host_transaction_id_); 373 DCHECK_EQ(kNoTransaction, host_transaction_id_);
544 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 374 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
545 375
546 if (io_helper_) { 376 ::indexed_db::mojom::ReturnValuePtr mojo_value;
547 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 377 std::vector<IndexedDBBlobInfo> blob_info;
378 if (value) {
379 mojo_value = ConvertReturnValue(value);
380 blob_info = value->blob_info;
381 }
548 382
549 ::indexed_db::mojom::ReturnValuePtr mojo_value; 383 BrowserThread::PostTask(
550 std::vector<IndexedDBBlobInfo> blob_info; 384 BrowserThread::IO, FROM_HERE,
551 if (value) { 385 base::Bind(&IOThreadHelper::SendSuccessValue,
552 mojo_value = ConvertReturnValue(value); 386 base::Unretained(io_helper_.get()), base::Passed(&mojo_value),
553 blob_info = value->blob_info; 387 base::Passed(&blob_info)));
554 }
555 BrowserThread::PostTask(
556 BrowserThread::IO, FROM_HERE,
557 base::Bind(&IOThreadHelper::SendSuccessValue,
558 base::Unretained(io_helper_.get()),
559 base::Passed(&mojo_value), base::Passed(&blob_info)));
560 } else {
561 auto params = base::MakeUnique<IndexedDBMsg_CallbacksSuccessValue_Params>();
562 params->ipc_thread_id = ipc_thread_id_;
563 params->ipc_callbacks_id = ipc_callbacks_id_;
564 if (value && value->primary_key.IsValid()) {
565 params->value.primary_key = value->primary_key;
566 params->value.key_path = value->key_path;
567 }
568 if (value && !value->empty())
569 swap(params->value.bits, value->bits);
570 if (!value || value->blob_info.empty()) {
571 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessValue(*params));
572 } else {
573 IndexedDBMsg_CallbacksSuccessValue_Params* p = params.get();
574 FillInBlobData(value->blob_info, &p->value.blob_or_file_info);
575 RegisterBlobsAndSend(
576 value->blob_info,
577 base::Bind(
578 CreateBlobsAndSend<IndexedDBMsg_CallbacksSuccessValue_Params,
579 IndexedDBMsg_CallbacksSuccessValue>,
580 base::Owned(params.release()), dispatcher_host_, value->blob_info,
581 base::Unretained(&p->value.blob_or_file_info)));
582 }
583 }
584 dispatcher_host_ = nullptr; 388 dispatcher_host_ = nullptr;
585 } 389 }
586 390
587 void IndexedDBCallbacks::OnSuccessArray( 391 void IndexedDBCallbacks::OnSuccessArray(
588 std::vector<IndexedDBReturnValue>* values) { 392 std::vector<IndexedDBReturnValue>* values) {
589 DCHECK(thread_checker_.CalledOnValidThread()); 393 DCHECK(thread_checker_.CalledOnValidThread());
590 DCHECK(dispatcher_host_); 394 DCHECK(dispatcher_host_);
591 DCHECK(io_helper_); 395 DCHECK(io_helper_);
592 396
593 DCHECK_EQ(kNoTransaction, host_transaction_id_); 397 DCHECK_EQ(kNoTransaction, host_transaction_id_);
594 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 398 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
595 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
596 399
597 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values; 400 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values;
598 mojo_values.reserve(values->size()); 401 mojo_values.reserve(values->size());
599 for (size_t i = 0; i < values->size(); ++i) 402 for (size_t i = 0; i < values->size(); ++i)
600 mojo_values.push_back(ConvertReturnValue(&(*values)[i])); 403 mojo_values.push_back(ConvertReturnValue(&(*values)[i]));
601 404
602 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 405 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
603 base::Bind(&IOThreadHelper::SendSuccessArray, 406 base::Bind(&IOThreadHelper::SendSuccessArray,
604 base::Unretained(io_helper_.get()), 407 base::Unretained(io_helper_.get()),
605 base::Passed(&mojo_values), *values)); 408 base::Passed(&mojo_values), *values));
606 dispatcher_host_ = nullptr; 409 dispatcher_host_ = nullptr;
607 } 410 }
608 411
609 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { 412 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) {
610 DCHECK(thread_checker_.CalledOnValidThread()); 413 DCHECK(thread_checker_.CalledOnValidThread());
611 DCHECK(dispatcher_host_); 414 DCHECK(dispatcher_host_);
612 DCHECK(io_helper_); 415 DCHECK(io_helper_);
613 416
614 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
615 DCHECK_EQ(kNoTransaction, host_transaction_id_); 417 DCHECK_EQ(kNoTransaction, host_transaction_id_);
616 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 418 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
617 419
618 BrowserThread::PostTask( 420 BrowserThread::PostTask(
619 BrowserThread::IO, FROM_HERE, 421 BrowserThread::IO, FROM_HERE,
620 base::Bind(&IOThreadHelper::SendSuccessKey, 422 base::Bind(&IOThreadHelper::SendSuccessKey,
621 base::Unretained(io_helper_.get()), value)); 423 base::Unretained(io_helper_.get()), value));
622 dispatcher_host_ = nullptr; 424 dispatcher_host_ = nullptr;
623 } 425 }
624 426
625 void IndexedDBCallbacks::OnSuccess(int64_t value) { 427 void IndexedDBCallbacks::OnSuccess(int64_t value) {
626 DCHECK(thread_checker_.CalledOnValidThread()); 428 DCHECK(thread_checker_.CalledOnValidThread());
627 DCHECK(dispatcher_host_); 429 DCHECK(dispatcher_host_);
628 if (io_helper_) {
629 BrowserThread::PostTask(
630 BrowserThread::IO, FROM_HERE,
631 base::Bind(&IOThreadHelper::SendSuccessInteger,
632 base::Unretained(io_helper_.get()), value));
633 } else {
634 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
635 DCHECK_EQ(kNoTransaction, host_transaction_id_);
636 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
637 430
638 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessInteger( 431 BrowserThread::PostTask(
639 ipc_thread_id_, ipc_callbacks_id_, value)); 432 BrowserThread::IO, FROM_HERE,
640 } 433 base::Bind(&IOThreadHelper::SendSuccessInteger,
434 base::Unretained(io_helper_.get()), value));
641 dispatcher_host_ = nullptr; 435 dispatcher_host_ = nullptr;
642 } 436 }
643 437
644 void IndexedDBCallbacks::OnSuccess() { 438 void IndexedDBCallbacks::OnSuccess() {
645 DCHECK(thread_checker_.CalledOnValidThread()); 439 DCHECK(thread_checker_.CalledOnValidThread());
646 DCHECK(dispatcher_host_); 440 DCHECK(dispatcher_host_);
647 DCHECK(io_helper_); 441 DCHECK(io_helper_);
648 442
649 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
650 DCHECK_EQ(kNoTransaction, host_transaction_id_); 443 DCHECK_EQ(kNoTransaction, host_transaction_id_);
651 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); 444 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_);
652 445
653 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 446 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
654 base::Bind(&IOThreadHelper::SendSuccess, 447 base::Bind(&IOThreadHelper::SendSuccess,
655 base::Unretained(io_helper_.get()))); 448 base::Unretained(io_helper_.get())));
656 dispatcher_host_ = nullptr; 449 dispatcher_host_ = nullptr;
657 } 450 }
658 451
659 bool IndexedDBCallbacks::IsValid() const { 452 bool IndexedDBCallbacks::IsValid() const {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 if (database) { 506 if (database) {
714 ::indexed_db::mojom::DatabaseAssociatedRequest request; 507 ::indexed_db::mojom::DatabaseAssociatedRequest request;
715 callbacks_.associated_group()->CreateAssociatedInterface( 508 callbacks_.associated_group()->CreateAssociatedInterface(
716 mojo::AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request); 509 mojo::AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request);
717 mojo::MakeStrongAssociatedBinding(std::move(database), std::move(request)); 510 mojo::MakeStrongAssociatedBinding(std::move(database), std::move(request));
718 } 511 }
719 callbacks_->SuccessDatabase(std::move(ptr_info), metadata); 512 callbacks_->SuccessDatabase(std::move(ptr_info), metadata);
720 } 513 }
721 514
722 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursor( 515 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursor(
723 int32_t cursor_id, 516 std::unique_ptr<CursorImpl> cursor,
724 const IndexedDBKey& key, 517 const IndexedDBKey& key,
725 const IndexedDBKey& primary_key, 518 const IndexedDBKey& primary_key,
726 ::indexed_db::mojom::ValuePtr value, 519 ::indexed_db::mojom::ValuePtr value,
727 const std::vector<IndexedDBBlobInfo>& blob_info) { 520 const std::vector<IndexedDBBlobInfo>& blob_info) {
728 if (!value || CreateAllBlobs(blob_info, &value->blob_or_file_info)) 521 if (value && !CreateAllBlobs(blob_info, &value->blob_or_file_info))
729 callbacks_->SuccessCursor(cursor_id, key, primary_key, std::move(value)); 522 return;
523
524 ::indexed_db::mojom::CursorAssociatedPtrInfo ptr_info;
525 ::indexed_db::mojom::CursorAssociatedRequest request;
526 callbacks_.associated_group()->CreateAssociatedInterface(
527 mojo::AssociatedGroup::WILL_PASS_PTR, &ptr_info, &request);
528 mojo::MakeStrongAssociatedBinding(std::move(cursor), std::move(request));
529 callbacks_->SuccessCursor(std::move(ptr_info), key, primary_key,
530 std::move(value));
730 } 531 }
731 532
732 void IndexedDBCallbacks::IOThreadHelper::SendSuccessValue( 533 void IndexedDBCallbacks::IOThreadHelper::SendSuccessValue(
733 ::indexed_db::mojom::ReturnValuePtr value, 534 ::indexed_db::mojom::ReturnValuePtr value,
734 const std::vector<IndexedDBBlobInfo>& blob_info) { 535 const std::vector<IndexedDBBlobInfo>& blob_info) {
735 if (!value || CreateAllBlobs(blob_info, &value->value->blob_or_file_info)) 536 if (!value || CreateAllBlobs(blob_info, &value->value->blob_or_file_info))
736 callbacks_->SuccessValue(std::move(value)); 537 callbacks_->SuccessValue(std::move(value));
737 } 538 }
738 539
739 void IndexedDBCallbacks::IOThreadHelper::SendSuccessArray( 540 void IndexedDBCallbacks::IOThreadHelper::SendSuccessArray(
740 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values, 541 std::vector<::indexed_db::mojom::ReturnValuePtr> mojo_values,
741 const std::vector<IndexedDBReturnValue>& values) { 542 const std::vector<IndexedDBReturnValue>& values) {
742 DCHECK_EQ(mojo_values.size(), values.size()); 543 DCHECK_EQ(mojo_values.size(), values.size());
743 544
744 for (size_t i = 0; i < mojo_values.size(); ++i) { 545 for (size_t i = 0; i < mojo_values.size(); ++i) {
745 if (!CreateAllBlobs(values[i].blob_info, 546 if (!CreateAllBlobs(values[i].blob_info,
746 &mojo_values[i]->value->blob_or_file_info)) 547 &mojo_values[i]->value->blob_or_file_info))
747 return; 548 return;
748 } 549 }
749 callbacks_->SuccessArray(std::move(mojo_values)); 550 callbacks_->SuccessArray(std::move(mojo_values));
750 } 551 }
751 552
553 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursorContinue(
554 const IndexedDBKey& key,
555 const IndexedDBKey& primary_key,
556 ::indexed_db::mojom::ValuePtr value,
557 const std::vector<IndexedDBBlobInfo>& blob_info) {
558 if (!value || CreateAllBlobs(blob_info, &value->blob_or_file_info))
559 callbacks_->SuccessCursorContinue(key, primary_key, std::move(value));
560 }
561
562 void IndexedDBCallbacks::IOThreadHelper::SendSuccessCursorPrefetch(
563 const std::vector<IndexedDBKey>& keys,
564 const std::vector<IndexedDBKey>& primary_keys,
565 std::vector<::indexed_db::mojom::ValuePtr> mojo_values,
566 const std::vector<IndexedDBValue>& values) {
567 DCHECK_EQ(mojo_values.size(), values.size());
568
569 for (size_t i = 0; i < mojo_values.size(); ++i) {
570 if (!CreateAllBlobs(values[i].blob_info,
571 &mojo_values[i]->blob_or_file_info)) {
572 return;
573 }
574 }
575
576 callbacks_->SuccessCursorPrefetch(keys, primary_keys, std::move(mojo_values));
577 }
578
752 void IndexedDBCallbacks::IOThreadHelper::SendSuccessKey( 579 void IndexedDBCallbacks::IOThreadHelper::SendSuccessKey(
753 const IndexedDBKey& value) { 580 const IndexedDBKey& value) {
754 callbacks_->SuccessKey(value); 581 callbacks_->SuccessKey(value);
755 } 582 }
756 583
757 void IndexedDBCallbacks::IOThreadHelper::SendSuccessInteger(int64_t value) { 584 void IndexedDBCallbacks::IOThreadHelper::SendSuccessInteger(int64_t value) {
758 callbacks_->SuccessInteger(value); 585 callbacks_->SuccessInteger(value);
759 } 586 }
760 587
761 void IndexedDBCallbacks::IOThreadHelper::SendSuccess() { 588 void IndexedDBCallbacks::IOThreadHelper::SendSuccess() {
(...skipping 25 matching lines...) Expand all
787 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs"); 614 IDB_TRACE("IndexedDBCallbacks::CreateAllBlobs");
788 DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); 615 DCHECK_EQ(blob_info.size(), blob_or_file_info->size());
789 if (!dispatcher_host_->blob_storage_context()) 616 if (!dispatcher_host_->blob_storage_context())
790 return false; 617 return false;
791 for (size_t i = 0; i < blob_info.size(); ++i) 618 for (size_t i = 0; i < blob_info.size(); ++i)
792 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]); 619 (*blob_or_file_info)[i]->uuid = CreateBlobData(blob_info[i]);
793 return true; 620 return true;
794 } 621 }
795 622
796 } // namespace content 623 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698