Index: content/child/blob_storage/blob_transport_controller.cc |
diff --git a/content/child/blob_storage/blob_transport_controller.cc b/content/child/blob_storage/blob_transport_controller.cc |
index b5cc88416ca6f89b5c319c100d175ac2460b0f8e..db16bd15adc2af9b3e4d4d53617a1340ab016591 100644 |
--- a/content/child/blob_storage/blob_transport_controller.cc |
+++ b/content/child/blob_storage/blob_transport_controller.cc |
@@ -4,8 +4,10 @@ |
#include "content/child/blob_storage/blob_transport_controller.h" |
+#include <algorithm> |
#include <limits> |
#include <memory> |
+#include <set> |
#include <utility> |
#include <vector> |
@@ -33,6 +35,7 @@ |
#include "content/common/fileapi/webblob_messages.h" |
#include "ipc/ipc_message.h" |
#include "ipc/ipc_sender.h" |
+#include "ipc/ipc_sync_message_filter.h" |
#include "storage/common/blob_storage/blob_item_bytes_request.h" |
#include "storage/common/blob_storage/blob_item_bytes_response.h" |
#include "storage/common/data_element.h" |
@@ -170,22 +173,13 @@ void BlobTransportController::InitiateBlobTransfer( |
main_runner->PostTask(FROM_HERE, base::Bind(&IncChildProcessRefCount)); |
} |
- std::vector<storage::DataElement> descriptions; |
- std::set<std::string> referenced_blobs = consolidation->referenced_blobs(); |
- BlobTransportController::GetDescriptions( |
- consolidation.get(), kBlobStorageIPCThresholdBytes, &descriptions); |
- // I post the task first to make sure that we store our consolidation before |
- // we get a request back from the browser. |
io_runner->PostTask( |
FROM_HERE, |
base::Bind(&BlobTransportController::StoreBlobDataForRequests, |
base::Unretained(BlobTransportController::GetInstance()), uuid, |
- base::Passed(std::move(consolidation)), |
+ content_type, base::Passed(std::move(consolidation)), |
+ sender->sync_message_filter(), |
base::Passed(std::move(main_runner)))); |
- // TODO(dmurph): Merge register and start messages. |
- sender->Send(new BlobStorageMsg_RegisterBlobUUID(uuid, content_type, "", |
- referenced_blobs)); |
- sender->Send(new BlobStorageMsg_StartBuildingBlob(uuid, descriptions)); |
} |
void BlobTransportController::OnMemoryRequest( |
@@ -304,16 +298,18 @@ void BlobTransportController::OnMemoryRequest( |
sender->Send(new BlobStorageMsg_MemoryItemResponse(uuid, responses)); |
} |
-void BlobTransportController::OnCancel( |
+void BlobTransportController::OnBuildBlobComplete( |
const std::string& uuid, |
- storage::IPCBlobCreationCancelCode code) { |
- DVLOG(1) << "Received blob cancel for blob " << uuid |
- << " with code: " << static_cast<int>(code); |
- ReleaseBlobConsolidation(uuid); |
-} |
- |
-void BlobTransportController::OnDone(const std::string& uuid) { |
- ReleaseBlobConsolidation(uuid); |
+ mojom::BlobAssociatedPtr blob, |
+ mojom::BlobCreationCancelCode cancel_code) { |
+ if (blob) { |
+ ReleaseBlobConsolidation(uuid); |
+ blob_proxies_.insert(uuid, std::move(blob)); |
+ } else { |
+ DVLOG(1) << "Received blob cancel for blob " << uuid |
+ << " with code: " << static_cast<int>(code); |
+ ReleaseBlobConsolidation(uuid); |
+ } |
} |
void BlobTransportController::CancelAllBlobTransfers() { |
@@ -402,11 +398,28 @@ void BlobTransportController::OnFileWriteComplete( |
void BlobTransportController::StoreBlobDataForRequests( |
const std::string& uuid, |
+ const std::string& content_type, |
scoped_refptr<BlobConsolidation> consolidation, |
+ scoped_refptr<IPC::SyncMessageFilter> sync_message_filter, |
scoped_refptr<base::SingleThreadTaskRunner> main_runner) { |
if (!main_thread_runner_.get()) { |
+ DCHECK(!blob_factory_.is_bound()); |
main_thread_runner_ = std::move(main_runner); |
+ sync_message_filter->GetRemoteAssociatedInterface(&blob_factory_); |
} |
+ |
+ std::set<std::string> referenced_blob_set = consolidation->referenced_blobs(); |
+ std::vector<std::string> referenced_blobs; |
+ std::copy(referenced_blob_set.begin(), referenced_blob_set.end(), |
+ std::back_inserter(referenced_blobs)); |
+ |
+ std::vector<storage::DataElement> descriptions; |
+ BlobTransportController::GetDescriptions( |
+ consolidation.get(), kBlobStorageIPCThresholdBytes, &descriptions); |
+ |
+ blob_factory_->BuildBlob( |
+ uuid, content_type, "", referenced_blobs, descriptions, |
+ base::Bind(&OnBuildBlobComplete, base::Unretained(this), uuid)); |
blob_storage_[uuid] = std::move(consolidation); |
} |