| Index: content/browser/indexed_db/indexed_db_callbacks.cc
|
| diff --git a/content/browser/indexed_db/indexed_db_callbacks.cc b/content/browser/indexed_db/indexed_db_callbacks.cc
|
| index ad5551f388417da4d261297fc6fa0111183b034b..74c2558bf7f613e23babf7ff525fce8b03811487 100644
|
| --- a/content/browser/indexed_db/indexed_db_callbacks.cc
|
| +++ b/content/browser/indexed_db/indexed_db_callbacks.cc
|
| @@ -186,6 +186,14 @@ static std::string CreateBlobData(
|
| scoped_refptr<IndexedDBDispatcherHost> dispatcher_host,
|
| webkit_blob::BlobStorageContext* blob_storage_context,
|
| base::TaskRunner* task_runner) {
|
| + std::string uuid = blob_info.uuid();
|
| + if (!uuid.empty()) {
|
| + // We're sending back a live blob, not a reference into our backing store.
|
| + scoped_ptr<webkit_blob::BlobDataHandle> blob_data_handle(
|
| + blob_storage_context->GetBlobDataFromUUID(uuid));
|
| + dispatcher_host->HoldBlobDataHandle(uuid, blob_data_handle);
|
| + return uuid;
|
| + }
|
| scoped_refptr<ShareableFileReference> shareable_file =
|
| ShareableFileReference::Get(blob_info.file_path());
|
| if (!shareable_file.get()) {
|
| @@ -193,10 +201,11 @@ static std::string CreateBlobData(
|
| blob_info.file_path(),
|
| ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE,
|
| task_runner);
|
| - shareable_file->AddFinalReleaseCallback(blob_info.release_callback());
|
| + if (!blob_info.release_callback().is_null())
|
| + shareable_file->AddFinalReleaseCallback(blob_info.release_callback());
|
| }
|
|
|
| - std::string uuid(base::GenerateGUID());
|
| + uuid = base::GenerateGUID();
|
| scoped_refptr<webkit_blob::BlobData> blob_data =
|
| new webkit_blob::BlobData(uuid);
|
| blob_data->AppendFile(
|
| @@ -270,7 +279,6 @@ static void FillInBlobData(
|
| info.mime_type = iter->type();
|
| info.file_name = iter->file_name();
|
| info.file_path = iter->file_path().AsUTF16Unsafe();
|
| - DCHECK_NE(-1, iter->size());
|
| info.size = iter->size();
|
| info.last_modified = iter->last_modified().ToDoubleT();
|
| blob_or_file_info->push_back(info);
|
| @@ -288,7 +296,8 @@ void IndexedDBCallbacks::RegisterBlobsAndSend(
|
| const base::Closure& callback) {
|
| std::vector<IndexedDBBlobInfo>::const_iterator iter;
|
| for (iter = blob_info.begin(); iter != blob_info.end(); ++iter) {
|
| - iter->mark_used_callback().Run();
|
| + if (!iter->mark_used_callback().is_null())
|
| + iter->mark_used_callback().Run();
|
| }
|
| DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, callback);
|
| @@ -431,7 +440,8 @@ void IndexedDBCallbacks::OnSuccessWithPrefetch(
|
| for (blob_iter = iter->blob_info.begin();
|
| blob_iter != iter->blob_info.end();
|
| ++blob_iter) {
|
| - blob_iter->mark_used_callback().Run();
|
| + if (!blob_iter->mark_used_callback().is_null())
|
| + blob_iter->mark_used_callback().Run();
|
| }
|
| }
|
| }
|
|
|