| OLD | NEW |
| 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" | 9 #include "base/guid.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 static std::string CreateBlobData( | 194 static std::string CreateBlobData( |
| 195 const IndexedDBBlobInfo& blob_info, | 195 const IndexedDBBlobInfo& blob_info, |
| 196 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, | 196 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host, |
| 197 webkit_blob::BlobStorageContext* blob_storage_context, | 197 webkit_blob::BlobStorageContext* blob_storage_context, |
| 198 base::TaskRunner* task_runner) { | 198 base::TaskRunner* task_runner) { |
| 199 std::string uuid = blob_info.uuid(); | 199 std::string uuid = blob_info.uuid(); |
| 200 if (!uuid.empty()) { | 200 if (!uuid.empty()) { |
| 201 // We're sending back a live blob, not a reference into our backing store. | 201 // We're sending back a live blob, not a reference into our backing store. |
| 202 scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle( | 202 scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle( |
| 203 blob_storage_context->GetBlobDataFromUUID(uuid)); | 203 blob_storage_context->GetBlobDataFromUUID(uuid)); |
| 204 dispatcher_host->HoldBlobDataHandle(uuid, blob_data_handle); | 204 dispatcher_host->HoldBlobDataHandle(uuid, blob_data_handle.Pass()); |
| 205 return uuid; | 205 return uuid; |
| 206 } | 206 } |
| 207 scoped_refptr<ShareableFileReference> shareable_file = | 207 scoped_refptr<ShareableFileReference> shareable_file = |
| 208 ShareableFileReference::Get(blob_info.file_path()); | 208 ShareableFileReference::Get(blob_info.file_path()); |
| 209 if (!shareable_file.get()) { | 209 if (!shareable_file.get()) { |
| 210 shareable_file = ShareableFileReference::GetOrCreate( | 210 shareable_file = ShareableFileReference::GetOrCreate( |
| 211 blob_info.file_path(), | 211 blob_info.file_path(), |
| 212 ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE, | 212 ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE, |
| 213 task_runner); | 213 task_runner); |
| 214 if (!blob_info.release_callback().is_null()) | 214 if (!blob_info.release_callback().is_null()) |
| 215 shareable_file->AddFinalReleaseCallback(blob_info.release_callback()); | 215 shareable_file->AddFinalReleaseCallback(blob_info.release_callback()); |
| 216 } | 216 } |
| 217 | 217 |
| 218 uuid = base::GenerateGUID(); | 218 uuid = base::GenerateGUID(); |
| 219 scoped_refptr<webkit_blob::BlobData> blob_data = | 219 scoped_refptr<webkit_blob::BlobData> blob_data = |
| 220 new webkit_blob::BlobData(uuid); | 220 new webkit_blob::BlobData(uuid); |
| 221 blob_data->AppendFile( | 221 blob_data->AppendFile( |
| 222 blob_info.file_path(), 0, blob_info.size(), blob_info.last_modified()); | 222 blob_info.file_path(), 0, blob_info.size(), blob_info.last_modified()); |
| 223 scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle( | 223 scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle( |
| 224 blob_storage_context->AddFinishedBlob(blob_data.get())); | 224 blob_storage_context->AddFinishedBlob(blob_data.get())); |
| 225 dispatcher_host->HoldBlobDataHandle(uuid, blob_data_handle); | 225 dispatcher_host->HoldBlobDataHandle(uuid, blob_data_handle.Pass()); |
| 226 | 226 |
| 227 return uuid; | 227 return uuid; |
| 228 } | 228 } |
| 229 | 229 |
| 230 static bool CreateAllBlobs( | 230 static bool CreateAllBlobs( |
| 231 const std::vector<IndexedDBBlobInfo>& blob_info, | 231 const std::vector<IndexedDBBlobInfo>& blob_info, |
| 232 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info, | 232 std::vector<IndexedDBMsg_BlobOrFileInfo>* blob_or_file_info, |
| 233 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) { | 233 scoped_refptr<IndexedDBDispatcherHost> dispatcher_host) { |
| 234 DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); | 234 DCHECK_EQ(blob_info.size(), blob_or_file_info->size()); |
| 235 size_t i; | 235 size_t i; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 dispatcher_host_, | 397 dispatcher_host_, |
| 398 value->blob_info, | 398 value->blob_info, |
| 399 base::Unretained(&p->blob_or_file_info))); | 399 base::Unretained(&p->blob_or_file_info))); |
| 400 } | 400 } |
| 401 dispatcher_host_ = NULL; | 401 dispatcher_host_ = NULL; |
| 402 } | 402 } |
| 403 | 403 |
| 404 void IndexedDBCallbacks::OnSuccessWithPrefetch( | 404 void IndexedDBCallbacks::OnSuccessWithPrefetch( |
| 405 const std::vector<IndexedDBKey>& keys, | 405 const std::vector<IndexedDBKey>& keys, |
| 406 const std::vector<IndexedDBKey>& primary_keys, | 406 const std::vector<IndexedDBKey>& primary_keys, |
| 407 std::vector<IndexedDBValue>& values) { | 407 std::vector<IndexedDBValue>* values) { |
| 408 DCHECK_EQ(keys.size(), primary_keys.size()); | 408 DCHECK_EQ(keys.size(), primary_keys.size()); |
| 409 DCHECK_EQ(keys.size(), values.size()); | 409 DCHECK_EQ(keys.size(), values->size()); |
| 410 | 410 |
| 411 DCHECK(dispatcher_host_.get()); | 411 DCHECK(dispatcher_host_.get()); |
| 412 | 412 |
| 413 DCHECK_NE(kNoCursor, ipc_cursor_id_); | 413 DCHECK_NE(kNoCursor, ipc_cursor_id_); |
| 414 DCHECK_EQ(kNoTransaction, host_transaction_id_); | 414 DCHECK_EQ(kNoTransaction, host_transaction_id_); |
| 415 DCHECK_EQ(kNoDatabase, ipc_database_id_); | 415 DCHECK_EQ(kNoDatabase, ipc_database_id_); |
| 416 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); | 416 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); |
| 417 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 417 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 418 | 418 |
| 419 std::vector<IndexedDBKey> msgKeys; | 419 std::vector<IndexedDBKey> msgKeys; |
| 420 std::vector<IndexedDBKey> msgPrimaryKeys; | 420 std::vector<IndexedDBKey> msgPrimaryKeys; |
| 421 | 421 |
| 422 for (size_t i = 0; i < keys.size(); ++i) { | 422 for (size_t i = 0; i < keys.size(); ++i) { |
| 423 msgKeys.push_back(keys[i]); | 423 msgKeys.push_back(keys[i]); |
| 424 msgPrimaryKeys.push_back(primary_keys[i]); | 424 msgPrimaryKeys.push_back(primary_keys[i]); |
| 425 } | 425 } |
| 426 | 426 |
| 427 scoped_ptr<IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params> params( | 427 scoped_ptr<IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params> params( |
| 428 new IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params()); | 428 new IndexedDBMsg_CallbacksSuccessCursorPrefetch_Params()); |
| 429 params->ipc_thread_id = ipc_thread_id_; | 429 params->ipc_thread_id = ipc_thread_id_; |
| 430 params->ipc_callbacks_id = ipc_callbacks_id_; | 430 params->ipc_callbacks_id = ipc_callbacks_id_; |
| 431 params->ipc_cursor_id = ipc_cursor_id_; | 431 params->ipc_cursor_id = ipc_cursor_id_; |
| 432 params->keys = msgKeys; | 432 params->keys = msgKeys; |
| 433 params->primary_keys = msgPrimaryKeys; | 433 params->primary_keys = msgPrimaryKeys; |
| 434 std::vector<std::string>& values_bits = params->values; | 434 std::vector<std::string>& values_bits = params->values; |
| 435 values_bits.resize(values.size()); | 435 values_bits.resize(values->size()); |
| 436 std::vector<std::vector<IndexedDBMsg_BlobOrFileInfo> >& values_blob_infos = | 436 std::vector<std::vector<IndexedDBMsg_BlobOrFileInfo> >& values_blob_infos = |
| 437 params->blob_or_file_infos; | 437 params->blob_or_file_infos; |
| 438 values_blob_infos.resize(values.size()); | 438 values_blob_infos.resize(values->size()); |
| 439 | 439 |
| 440 bool found_blob_info = false; | 440 bool found_blob_info = false; |
| 441 std::vector<IndexedDBValue>::iterator iter = values.begin(); | 441 std::vector<IndexedDBValue>::iterator iter = values->begin(); |
| 442 for (size_t i = 0; iter != values.end(); ++iter, ++i) { | 442 for (size_t i = 0; iter != values->end(); ++iter, ++i) { |
| 443 values_bits[i].swap(iter->bits); | 443 values_bits[i].swap(iter->bits); |
| 444 if (iter->blob_info.size()) { | 444 if (iter->blob_info.size()) { |
| 445 found_blob_info = true; | 445 found_blob_info = true; |
| 446 FillInBlobData(iter->blob_info, &values_blob_infos[i]); | 446 FillInBlobData(iter->blob_info, &values_blob_infos[i]); |
| 447 std::vector<IndexedDBBlobInfo>::const_iterator blob_iter; | 447 std::vector<IndexedDBBlobInfo>::const_iterator blob_iter; |
| 448 for (blob_iter = iter->blob_info.begin(); | 448 for (blob_iter = iter->blob_info.begin(); |
| 449 blob_iter != iter->blob_info.end(); | 449 blob_iter != iter->blob_info.end(); |
| 450 ++blob_iter) { | 450 ++blob_iter) { |
| 451 if (!blob_iter->mark_used_callback().is_null()) | 451 if (!blob_iter->mark_used_callback().is_null()) |
| 452 blob_iter->mark_used_callback().Run(); | 452 blob_iter->mark_used_callback().Run(); |
| 453 } | 453 } |
| 454 } | 454 } |
| 455 } | 455 } |
| 456 | 456 |
| 457 if (found_blob_info) { | 457 if (found_blob_info) { |
| 458 BrowserThread::PostTask( | 458 BrowserThread::PostTask(BrowserThread::IO, |
| 459 BrowserThread::IO, | 459 FROM_HERE, |
| 460 FROM_HERE, | 460 base::Bind(BlobLookupForCursorPrefetch, |
| 461 base::Bind(BlobLookupForCursorPrefetch, | 461 base::Owned(params.release()), |
| 462 base::Owned(params.release()), | 462 dispatcher_host_, |
| 463 dispatcher_host_, | 463 *values)); |
| 464 values)); | |
| 465 } else { | 464 } else { |
| 466 dispatcher_host_->Send( | 465 dispatcher_host_->Send( |
| 467 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params.get())); | 466 new IndexedDBMsg_CallbacksSuccessCursorPrefetch(*params.get())); |
| 468 } | 467 } |
| 469 dispatcher_host_ = NULL; | 468 dispatcher_host_ = NULL; |
| 470 } | 469 } |
| 471 | 470 |
| 472 void IndexedDBCallbacks::OnSuccess(IndexedDBValue* value, | 471 void IndexedDBCallbacks::OnSuccess(IndexedDBValue* value, |
| 473 const IndexedDBKey& key, | 472 const IndexedDBKey& key, |
| 474 const IndexedDBKeyPath& key_path) { | 473 const IndexedDBKeyPath& key_path) { |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 574 DCHECK_EQ(kNoDatabase, ipc_database_id_); | 573 DCHECK_EQ(kNoDatabase, ipc_database_id_); |
| 575 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); | 574 DCHECK_EQ(kNoDatabaseCallbacks, ipc_database_callbacks_id_); |
| 576 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); | 575 DCHECK_EQ(blink::WebIDBDataLossNone, data_loss_); |
| 577 | 576 |
| 578 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessUndefined( | 577 dispatcher_host_->Send(new IndexedDBMsg_CallbacksSuccessUndefined( |
| 579 ipc_thread_id_, ipc_callbacks_id_)); | 578 ipc_thread_id_, ipc_callbacks_id_)); |
| 580 dispatcher_host_ = NULL; | 579 dispatcher_host_ = NULL; |
| 581 } | 580 } |
| 582 | 581 |
| 583 } // namespace content | 582 } // namespace content |
| OLD | NEW |