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

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

Issue 18023022: Blob support for IDB [Chromium] (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Handle the rest of Josh's feedback. Created 7 years 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 | Annotate | Revision Log
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 <algorithm> 7 #include <algorithm>
8 8
9 #include "base/guid.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "base/time/time.h"
12 #include "content/browser/child_process_security_policy_impl.h"
13 #include "content/browser/fileapi/fileapi_message_filter.h"
14 #include "content/browser/indexed_db/indexed_db_blob_info.h"
9 #include "content/browser/indexed_db/indexed_db_connection.h" 15 #include "content/browser/indexed_db/indexed_db_connection.h"
16 #include "content/browser/indexed_db/indexed_db_context_impl.h"
10 #include "content/browser/indexed_db/indexed_db_cursor.h" 17 #include "content/browser/indexed_db/indexed_db_cursor.h"
11 #include "content/browser/indexed_db/indexed_db_database_callbacks.h" 18 #include "content/browser/indexed_db/indexed_db_database_callbacks.h"
12 #include "content/browser/indexed_db/indexed_db_database_error.h" 19 #include "content/browser/indexed_db/indexed_db_database_error.h"
13 #include "content/browser/indexed_db/indexed_db_metadata.h" 20 #include "content/browser/indexed_db/indexed_db_metadata.h"
21 #include "content/browser/indexed_db/indexed_db_value.h"
14 #include "content/common/indexed_db/indexed_db_constants.h" 22 #include "content/common/indexed_db/indexed_db_constants.h"
15 #include "content/common/indexed_db/indexed_db_messages.h" 23 #include "content/common/indexed_db/indexed_db_messages.h"
24 #include "webkit/browser/blob/blob_storage_context.h"
16 #include "webkit/browser/quota/quota_manager.h" 25 #include "webkit/browser/quota/quota_manager.h"
26 #include "webkit/common/blob/blob_data.h"
27 #include "webkit/common/blob/shareable_file_reference.h"
28
29 using webkit_blob::ShareableFileReference;
17 30
18 namespace content { 31 namespace content {
19 32
20 namespace { 33 namespace {
21 const int32 kNoCursor = -1; 34 const int32 kNoCursor = -1;
22 const int32 kNoDatabaseCallbacks = -1; 35 const int32 kNoDatabaseCallbacks = -1;
23 const int64 kNoTransaction = -1; 36 const int64 kNoTransaction = -1;
24 } 37 }
25 38
26 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host, 39 IndexedDBCallbacks::IndexedDBCallbacks(IndexedDBDispatcherHost* dispatcher_host,
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 165
153 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIDBDatabase( 166 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIDBDatabase(
154 ipc_thread_id_, 167 ipc_thread_id_,
155 ipc_callbacks_id_, 168 ipc_callbacks_id_,
156 ipc_database_callbacks_id_, 169 ipc_database_callbacks_id_,
157 ipc_object_id, 170 ipc_object_id,
158 IndexedDBDispatcherHost::ConvertMetadata(metadata))); 171 IndexedDBDispatcherHost::ConvertMetadata(metadata)));
159 dispatcher_host_ = NULL; 172 dispatcher_host_ = NULL;
160 } 173 }
161 174
175 static std::string CreateBlobData(
176 const IndexedDBBlobInfo& blob_info,
177 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
178 webkit_blob::BlobStorageContext* blob_storage_context,
179 base::TaskRunner* task_runner) {
180 scoped_refptr<ShareableFileReference> shareable_file =
181 ShareableFileReference::Get(blob_info.file_path());
182 if (!shareable_file.get()) {
183 shareable_file = ShareableFileReference::GetOrCreate(
184 blob_info.file_path(),
185 ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE,
186 task_runner);
187 shareable_file->AddFinalReleaseCallback(blob_info.release_callback());
188 }
189
190 std::string uuid(base::GenerateGUID());
191 scoped_refptr<webkit_blob::BlobData> blob_data =
192 new webkit_blob::BlobData(uuid);
193 blob_data->AppendFile(
194 blob_info.file_path(), 0, blob_info.size(), blob_info.last_modified());
195 scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle(
196 blob_storage_context->AddFinishedBlob(blob_data.get()));
197 dispatcher_host->HoldBlobDataHandle(uuid, blob_data_handle);
198
199 return uuid;
200 }
201
202 static bool CreateAllBlobs(
203 const std::vector<IndexedDBBlobInfo>& blob_info,
204 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info,
205 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) {
206 size_t i;
207 if (!dispatcher_host->blob_storage_context())
208 return false;
209 for (i = 0; i < blob_info.size(); ++i) {
210 (*blob_or_file_info)[i].uuid =
211 CreateBlobData(blob_info[i],
212 dispatcher_host,
213 dispatcher_host->blob_storage_context(),
214 dispatcher_host->Context()->TaskRunner());
215 }
216 return true;
217 }
218
219 static void BlobLookupForIDBCursor(
220 IndexedDBMsg_CallbacksSuccessIDBCursor_Params* params,
221 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
222 const std::vector<IndexedDBBlobInfo>& blob_info,
223 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) {
224 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
225 if (CreateAllBlobs(blob_info, blob_or_file_info, dispatcher_host))
226 dispatcher_host->Send(new IndexedDBMsg_CallbacksSuccessIDBCursor(*params));
227 }
228
229 static void BlobLookupForCursorContinue(
230 IndexedDBMsg_CallbacksSuccessCursorContinue_Params* params,
231 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
232 const std::vector<IndexedDBBlobInfo>& blob_info,
233 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) {
234 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
235 if (CreateAllBlobs(blob_info, blob_or_file_info, dispatcher_host))
236 dispatcher_host->Send(
237 new IndexedDBMsg_CallbacksSuccessCursorContinue(*params));
238 }
239
240 static void BlobLookupForValueWithKey(
241 IndexedDBMsg_CallbacksSuccessValueWithKey_Params* params,
242 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
243 const std::vector<IndexedDBBlobInfo>& blob_info,
244 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) {
245 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
246 if (CreateAllBlobs(blob_info, blob_or_file_info, dispatcher_host))
247 dispatcher_host->Send(
248 new IndexedDBMsg_CallbacksSuccessValueWithKey(*params));
249 }
250
251 static void BlobLookupForValue(
252 IndexedDBMsg_CallbacksSuccessValue_Params* params,
253 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
254 const std::vector<IndexedDBBlobInfo>& blob_info,
255 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) {
256 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
257 if (CreateAllBlobs(blob_info, blob_or_file_info, dispatcher_host))
258 dispatcher_host->Send(new IndexedDBMsg_CallbacksSuccessValue(*params));
259 }
260
261 static void BlobLookupForCursorPrefetch(
262 IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params* params,
263 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
264 const std::vector<IndexedDBValue>& values,
265 std::vector<std::vector<IndexedDBMsg_BlobOrFileInfo> >*
266 blob_or_file_infos) {
267 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
268 DCHECK(values.size() == blob_or_file_infos->size());
269
270 std::vector<IndexedDBValue>::const_iterator value_iter;
271 std::vector<std::vector<IndexedDBMsg_BlobOrFileInfo> >::iterator blob_iter;
272 for (value_iter = values.begin(), blob_iter = blob_or_file_infos->begin();
273 value_iter != values.end();
274 ++value_iter, ++blob_iter) {
275 if (!CreateAllBlobs(value_iter->blob_info, &*blob_iter, dispatcher_host))
276 return;
277 }
278 dispatcher_host->Send(
279 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params));
280 }
281
282 static void FillInBlobData(
283 const std::vector<IndexedDBBlobInfo>& blob_info,
284 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info) {
285 for (std::vector<IndexedDBBlobInfo>::const_iterator iter = blob_info.begin();
286 iter != blob_info.end();
287 ++iter) {
288 if (iter->is_file()) {
289 IndexedDBMsg_BlobOrFileInfo info;
290 info.is_file = true;
291 info.mime_type = iter->type();
292 info.file_name = iter->file_name();
293 info.file_path = iter->file_path().AsUTF16Unsafe();
294 DCHECK_NE(-1, iter->size());
295 info.size = iter->size();
296 info.last_modified = iter->last_modified().ToDoubleT();
297 blob_or_file_info->push_back(info);
298 } else {
299 IndexedDBMsg_BlobOrFileInfo info;
300 info.mime_type = iter->type();
301 info.size = iter->size();
302 blob_or_file_info->push_back(info);
303 }
304 }
305 }
306
307 void IndexedDBCallbacks::RegisterBlobsAndSend(
308 const std::vector<IndexedDBBlobInfo>& blob_info,
309 const base::Closure& callback) {
310 std::vector<IndexedDBBlobInfo>::const_iterator iter;
311 for (iter = blob_info.begin(); iter != blob_info.end(); ++iter) {
312 iter->mark_used_callback().Run();
313 }
314 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
315 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback);
316 }
317
162 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor, 318 void IndexedDBCallbacks::OnSuccess(scoped_refptr<IndexedDBCursor> cursor,
163 const IndexedDBKey& key, 319 const IndexedDBKey& key,
164 const IndexedDBKey& primary_key, 320 const IndexedDBKey& primary_key,
165 std::string* value) { 321 IndexedDBValue* value) {
166 DCHECK(dispatcher_host_.get()); 322 DCHECK(dispatcher_host_.get());
167 323
168 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 324 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
169 DCHECK_EQ(kNoTransaction, host_transaction_id_); 325 DCHECK_EQ(kNoTransaction, host_transaction_id_);
170 DCHECK_EQ(kNoDatabase, ipc_database_id_); 326 DCHECK_EQ(kNoDatabase, ipc_database_id_);
171 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); 327 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
172 328
173 int32 ipc_object_id = dispatcher_host_->Add(cursor.get()); 329 int32 ipc_object_id = dispatcher_host_->Add(cursor.get());
174 IndexedDBMsg_CallbacksSuccessIDBCursor_Params params; 330 scoped_ptr<IndexedDBMsg_CallbacksSuccessIDBCursor_Params> params(
175 params.ipc_thread_id = ipc_thread_id_; 331 new IndexedDBMsg_CallbacksSuccessIDBCursor_Params());
176 params.ipc_callbacks_id = ipc_callbacks_id_; 332 params->ipc_thread_id = ipc_thread_id_;
177 params.ipc_cursor_id = ipc_object_id; 333 params->ipc_callbacks_id = ipc_callbacks_id_;
178 params.key = key; 334 params->ipc_cursor_id = ipc_object_id;
179 params.primary_key = primary_key; 335 params->key = key;
336 params->primary_key = primary_key;
180 if (value && !value->empty()) 337 if (value && !value->empty())
181 std::swap(params.value, *value); 338 std::swap(params->value, value->bits);
182 // TODO(alecflett): Avoid a copy here: the whole params object is 339 // TODO(alecflett): Avoid a copy here: the whole params object is
183 // being copied into the message. 340 // being copied into the message.
184 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIDBCursor(params)); 341 if (!value || value->blob_info.empty()) {
185 342 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessIDBCursor(*params));
343 } else {
344 IndexedDBMsg_CallbacksSuccessIDBCursor_Params* p = params.get();
345 FillInBlobData(value->blob_info, &p->blob_or_file_info);
346 RegisterBlobsAndSend(value->blob_info,
347 base::Bind(BlobLookupForIDBCursor,
348 base::Owned(params.release()),
349 dispatcher_host_,
350 value->blob_info,
351 base::Unretained(&p->blob_or_file_info)));
352 }
186 dispatcher_host_ = NULL; 353 dispatcher_host_ = NULL;
187 } 354 }
188 355
189 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key, 356 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& key,
190 const IndexedDBKey& primary_key, 357 const IndexedDBKey& primary_key,
191 std::string* value) { 358 IndexedDBValue* value) {
192 DCHECK(dispatcher_host_.get()); 359 DCHECK(dispatcher_host_.get());
193 360
194 DCHECK_NE(kNoCursor, ipc_cursor_id_); 361 DCHECK_NE(kNoCursor, ipc_cursor_id_);
195 DCHECK_EQ(kNoTransaction, host_transaction_id_); 362 DCHECK_EQ(kNoTransaction, host_transaction_id_);
196 DCHECK_EQ(kNoDatabase, ipc_database_id_); 363 DCHECK_EQ(kNoDatabase, ipc_database_id_);
197 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); 364 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
198 365
199 IndexedDBCursor* idb_cursor = 366 IndexedDBCursor* idb_cursor =
200 dispatcher_host_->GetCursorFromId(ipc_cursor_id_); 367 dispatcher_host_->GetCursorFromId(ipc_cursor_id_);
201 368
202 DCHECK(idb_cursor); 369 DCHECK(idb_cursor);
203 if (!idb_cursor) 370 if (!idb_cursor)
204 return; 371 return;
205 IndexedDBMsg_CallbacksSuccessCursorContinue_Params params; 372
206 params.ipc_thread_id = ipc_thread_id_; 373 scoped_ptr<IndexedDBMsg_CallbacksSuccessCursorContinue_Params> params(
207 params.ipc_callbacks_id = ipc_callbacks_id_; 374 new IndexedDBMsg_CallbacksSuccessCursorContinue_Params());
208 params.ipc_cursor_id = ipc_cursor_id_; 375 params->ipc_thread_id = ipc_thread_id_;
209 params.key = key; 376 params->ipc_callbacks_id = ipc_callbacks_id_;
210 params.primary_key = primary_key; 377 params->ipc_cursor_id = ipc_cursor_id_;
378 params->key = key;
379 params->primary_key = primary_key;
211 if (value && !value->empty()) 380 if (value && !value->empty())
212 std::swap(params.value, *value); 381 std::swap(params->value, value->bits);
213 // TODO(alecflett): Avoid a copy here: the whole params object is 382 // TODO(alecflett): Avoid a copy here: the whole params object is
214 // being copied into the message. 383 // being copied into the message.
215 dispatcher_host_->Send( 384 if (!value || value->blob_info.empty()) {
216 new IndexedDBMsg_CallbacksSuccessCursorContinue(params)); 385 dispatcher_host_->Send(
386 new IndexedDBMsg_CallbacksSuccessCursorContinue(*params));
387 } else {
388 IndexedDBMsg_CallbacksSuccessCursorContinue_Params* p = params.get();
389 FillInBlobData(value->blob_info, &p->blob_or_file_info);
390 RegisterBlobsAndSend(value->blob_info,
391 base::Bind(BlobLookupForCursorContinue,
392 base::Owned(params.release()),
393 dispatcher_host_,
394 value->blob_info,
395 base::Unretained(&p->blob_or_file_info)));
396 }
217 dispatcher_host_ = NULL; 397 dispatcher_host_ = NULL;
218 } 398 }
219 399
220 void IndexedDBCallbacks::OnSuccessWithPrefetch( 400 void IndexedDBCallbacks::OnSuccessWithPrefetch(
221 const std::vector<IndexedDBKey>& keys, 401 const std::vector<IndexedDBKey>& keys,
222 const std::vector<IndexedDBKey>& primary_keys, 402 const std::vector<IndexedDBKey>& primary_keys,
223 const std::vector<std::string>& values) { 403 std::vector<IndexedDBValue>& values) {
224 DCHECK_EQ(keys.size(), primary_keys.size()); 404 DCHECK_EQ(keys.size(), primary_keys.size());
225 DCHECK_EQ(keys.size(), values.size()); 405 DCHECK_EQ(keys.size(), values.size());
226 406
227 DCHECK(dispatcher_host_.get()); 407 DCHECK(dispatcher_host_.get());
228 408
229 DCHECK_NE(kNoCursor, ipc_cursor_id_); 409 DCHECK_NE(kNoCursor, ipc_cursor_id_);
230 DCHECK_EQ(kNoTransaction, host_transaction_id_); 410 DCHECK_EQ(kNoTransaction, host_transaction_id_);
231 DCHECK_EQ(kNoDatabase, ipc_database_id_); 411 DCHECK_EQ(kNoDatabase, ipc_database_id_);
232 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); 412 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
233 413
234 std::vector<IndexedDBKey> msgKeys; 414 std::vector<IndexedDBKey> msgKeys;
235 std::vector<IndexedDBKey> msgPrimaryKeys; 415 std::vector<IndexedDBKey> msgPrimaryKeys;
236 416
237 for (size_t i = 0; i < keys.size(); ++i) { 417 for (size_t i = 0; i < keys.size(); ++i) {
238 msgKeys.push_back(keys[i]); 418 msgKeys.push_back(keys[i]);
239 msgPrimaryKeys.push_back(primary_keys[i]); 419 msgPrimaryKeys.push_back(primary_keys[i]);
240 } 420 }
241 421
242 IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params params; 422 scoped_ptr<IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params> params(
243 params.ipc_thread_id = ipc_thread_id_; 423 new IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params());
244 params.ipc_callbacks_id = ipc_callbacks_id_; 424 params->ipc_thread_id = ipc_thread_id_;
245 params.ipc_cursor_id = ipc_cursor_id_; 425 params->ipc_callbacks_id = ipc_callbacks_id_;
246 params.keys = msgKeys; 426 params->ipc_cursor_id = ipc_cursor_id_;
247 params.primary_keys = msgPrimaryKeys; 427 params->keys = msgKeys;
248 params.values = values; 428 params->primary_keys = msgPrimaryKeys;
249 dispatcher_host_->Send( 429 std::vector<std::string> values_bits(values.size());
250 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(params)); 430 std::vector<std::vector<IndexedDBMsg_BlobOrFileInfo> > values_blob_infos(
431 values.size());
432 std::vector<IndexedDBValue>::iterator iter = values.begin();
433
434 bool found_blob_info = false;
435 for (size_t i = 0; iter != values.end(); ++iter, ++i) {
436 values_bits[i].swap(iter->bits);
437 if (iter->blob_info.size()) {
438 found_blob_info = true;
439 FillInBlobData(iter->blob_info, &values_blob_infos[i]);
440 std::vector<IndexedDBBlobInfo>::const_iterator blob_iter;
441 for (blob_iter = iter->blob_info.begin();
442 blob_iter != iter->blob_info.end();
443 ++blob_iter) {
444 blob_iter->mark_used_callback().Run();
445 }
446 }
447 }
448
449 params->values.swap(values_bits);
450 params->blob_or_file_infos.swap(values_blob_infos);
451 if (found_blob_info) {
452 BrowserThread::PostTask(
453 BrowserThread::IO,
454 FROM_HERE,
455 base::Bind(BlobLookupForCursorPrefetch,
456 base::Owned(params.release()),
457 dispatcher_host_,
458 values,
459 base::Unretained(&params->blob_or_file_infos)));
460 } else {
461 dispatcher_host_->Send(
462 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params.get()));
463 }
251 dispatcher_host_ = NULL; 464 dispatcher_host_ = NULL;
252 } 465 }
253 466
254 void IndexedDBCallbacks::OnSuccess(std::string* value, 467 void IndexedDBCallbacks::OnSuccess(IndexedDBValue* value,
255 const IndexedDBKey& key, 468 const IndexedDBKey& key,
256 const IndexedDBKeyPath& key_path) { 469 const IndexedDBKeyPath& key_path) {
257 DCHECK(dispatcher_host_.get()); 470 DCHECK(dispatcher_host_.get());
258 471
259 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 472 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
260 DCHECK_EQ(kNoTransaction, host_transaction_id_); 473 DCHECK_EQ(kNoTransaction, host_transaction_id_);
261 DCHECK_EQ(kNoDatabase, ipc_database_id_); 474 DCHECK_EQ(kNoDatabase, ipc_database_id_);
262 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); 475 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
263 476
264 std::string value_copy; 477 scoped_ptr<IndexedDBMsg_CallbacksSuccessValueWithKey_Params> params(
478 new IndexedDBMsg_CallbacksSuccessValueWithKey_Params());
479 params->ipc_thread_id = ipc_thread_id_;
480 params->ipc_callbacks_id = ipc_callbacks_id_;
481 params->primary_key = key;
482 params->key_path = key_path;
265 if (value && !value->empty()) 483 if (value && !value->empty())
266 std::swap(value_copy, *value); 484 std::swap(params->value, value->bits);
267 485 if (!value || value->blob_info.empty()) {
268 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessValueWithKey( 486 dispatcher_host_->Send(
269 ipc_thread_id_, 487 new IndexedDBMsg_CallbacksSuccessValueWithKey(*params));
270 ipc_callbacks_id_, 488 } else {
271 // TODO(alecflett): Avoid a copy here. 489 IndexedDBMsg_CallbacksSuccessValueWithKey_Params* p = params.get();
272 value_copy, 490 FillInBlobData(value->blob_info, &p->blob_or_file_info);
273 key, 491 RegisterBlobsAndSend(value->blob_info,
274 key_path)); 492 base::Bind(BlobLookupForValueWithKey,
493 base::Owned(params.release()),
494 dispatcher_host_,
495 value->blob_info,
496 base::Unretained(&p->blob_or_file_info)));
497 }
275 dispatcher_host_ = NULL; 498 dispatcher_host_ = NULL;
276 } 499 }
277 500
278 void IndexedDBCallbacks::OnSuccess(std::string* value) { 501 void IndexedDBCallbacks::OnSuccess(IndexedDBValue* value) {
279 DCHECK(dispatcher_host_.get()); 502 DCHECK(dispatcher_host_.get());
280
281 DCHECK(kNoCursor == ipc_cursor_id_ || value == NULL); 503 DCHECK(kNoCursor == ipc_cursor_id_ || value == NULL);
282 DCHECK_EQ(kNoTransaction, host_transaction_id_); 504 DCHECK_EQ(kNoTransaction, host_transaction_id_);
283 DCHECK_EQ(kNoDatabase, ipc_database_id_); 505 DCHECK_EQ(kNoDatabase, ipc_database_id_);
284 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); 506 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
285 507
286 std::string value_copy; 508 scoped_ptr<IndexedDBMsg_CallbacksSuccessValue_Params> params(
509 new IndexedDBMsg_CallbacksSuccessValue_Params());
510 params->ipc_thread_id = ipc_thread_id_;
511 params->ipc_callbacks_id = ipc_callbacks_id_;
287 if (value && !value->empty()) 512 if (value && !value->empty())
288 std::swap(value_copy, *value); 513 std::swap(params->value, value->bits);
289 514 if (!value || value->blob_info.empty()) {
290 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessValue( 515 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessValue(*params));
291 ipc_thread_id_, 516 } else {
292 ipc_callbacks_id_, 517 IndexedDBMsg_CallbacksSuccessValue_Params* p = params.get();
293 // TODO(alecflett): avoid a copy here. 518 FillInBlobData(value->blob_info, &p->blob_or_file_info);
294 value_copy)); 519 RegisterBlobsAndSend(value->blob_info,
520 base::Bind(BlobLookupForValue,
521 base::Owned(params.release()),
522 dispatcher_host_,
523 value->blob_info,
524 base::Unretained(&p->blob_or_file_info)));
525 }
295 dispatcher_host_ = NULL; 526 dispatcher_host_ = NULL;
296 } 527 }
297 528
298 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) { 529 void IndexedDBCallbacks::OnSuccess(const IndexedDBKey& value) {
299 DCHECK(dispatcher_host_.get()); 530 DCHECK(dispatcher_host_.get());
300 531
301 DCHECK_EQ(kNoCursor, ipc_cursor_id_); 532 DCHECK_EQ(kNoCursor, ipc_cursor_id_);
302 DCHECK_EQ(kNoTransaction, host_transaction_id_); 533 DCHECK_EQ(kNoTransaction, host_transaction_id_);
303 DCHECK_EQ(kNoDatabase, ipc_database_id_); 534 DCHECK_EQ(kNoDatabase, ipc_database_id_);
304 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); 535 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
(...skipping 23 matching lines...) Expand all
328 DCHECK_EQ(kNoTransaction, host_transaction_id_); 559 DCHECK_EQ(kNoTransaction, host_transaction_id_);
329 DCHECK_EQ(kNoDatabase, ipc_database_id_); 560 DCHECK_EQ(kNoDatabase, ipc_database_id_);
330 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); 561 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_);
331 562
332 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessUndefined( 563 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessUndefined(
333 ipc_thread_id_, ipc_callbacks_id_)); 564 ipc_thread_id_, ipc_callbacks_id_));
334 dispatcher_host_ = NULL; 565 dispatcher_host_ = NULL;
335 } 566 }
336 567
337 } // namespace content 568 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698