| Index: content/browser/blob_storage/blob_dispatcher_host.cc
|
| diff --git a/content/browser/blob_storage/blob_dispatcher_host.cc b/content/browser/blob_storage/blob_dispatcher_host.cc
|
| index 4f2ed8439f15ee20201f45bef45f5b836ccfb62f..3b87f1dd9aee1499ee78ea1781aeb4df586e2360 100644
|
| --- a/content/browser/blob_storage/blob_dispatcher_host.cc
|
| +++ b/content/browser/blob_storage/blob_dispatcher_host.cc
|
| @@ -47,9 +47,11 @@ BlobDispatcherHost::BlobDispatcherHost(
|
| scoped_refptr<ChromeBlobStorageContext> blob_storage_context,
|
| scoped_refptr<storage::FileSystemContext> file_system_context)
|
| : BrowserMessageFilter(BlobMsgStart),
|
| + BrowserAssociatedInterface<mojom::BlobFactory>(this, this),
|
| process_id_(process_id),
|
| file_system_context_(std::move(file_system_context)),
|
| - blob_storage_context_(std::move(blob_storage_context)) {}
|
| + blob_storage_context_(std::move(blob_storage_context)),
|
| + blob_bindings_(mojo::BindingSetDispatchMode::WITH_CONTEXT) {}
|
|
|
| BlobDispatcherHost::~BlobDispatcherHost() {
|
| ClearHostFromBlobStorageContext();
|
| @@ -64,10 +66,7 @@ void BlobDispatcherHost::OnChannelClosing() {
|
| bool BlobDispatcherHost::OnMessageReceived(const IPC::Message& message) {
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(BlobDispatcherHost, message)
|
| - IPC_MESSAGE_HANDLER(BlobStorageMsg_RegisterBlobUUID, OnRegisterBlobUUID)
|
| - IPC_MESSAGE_HANDLER(BlobStorageMsg_StartBuildingBlob, OnStartBuildingBlob)
|
| IPC_MESSAGE_HANDLER(BlobStorageMsg_MemoryItemResponse, OnMemoryItemResponse)
|
| - IPC_MESSAGE_HANDLER(BlobStorageMsg_CancelBuildingBlob, OnCancelBuildingBlob)
|
| IPC_MESSAGE_HANDLER(BlobHostMsg_IncrementRefCount, OnIncrementBlobRefCount)
|
| IPC_MESSAGE_HANDLER(BlobHostMsg_DecrementRefCount, OnDecrementBlobRefCount)
|
| IPC_MESSAGE_HANDLER(BlobHostMsg_RegisterPublicURL, OnRegisterPublicBlobURL)
|
| @@ -77,12 +76,15 @@ bool BlobDispatcherHost::OnMessageReceived(const IPC::Message& message) {
|
| return handled;
|
| }
|
|
|
| -void BlobDispatcherHost::OnRegisterBlobUUID(
|
| +void BlobDispatcherHost::BuildBlob(
|
| const std::string& uuid,
|
| const std::string& content_type,
|
| const std::string& content_disposition,
|
| - const std::set<std::string>& referenced_blob_uuids) {
|
| + const std::vector<std::string>& referenced_blob_uuids,
|
| + const std::vector<storage::DataElement>& item_descriptions,
|
| + const BuildBlobCallback& callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| +
|
| BlobStorageContext* context = this->context();
|
| if (uuid.empty() || context->registry().HasEntry(uuid) ||
|
| async_builder_.IsBeingBuilt(uuid)) {
|
| @@ -90,8 +92,13 @@ void BlobDispatcherHost::OnRegisterBlobUUID(
|
| return;
|
| }
|
| blobs_inuse_map_[uuid] = 1;
|
| + std::set<std::string> referenced_blob_uuid_set;
|
| + std::copy(referenced_blob_uuids.begin(), referenced_blob_uuids.end(),
|
| + std::inserter(referenced_blob_uuid_set,
|
| + referenced_blob_uuid_set.end()));
|
| BlobTransportResult result = async_builder_.RegisterBlobUUID(
|
| - uuid, content_type, content_disposition, referenced_blob_uuids, context);
|
| + uuid, content_type, content_disposition, referenced_blob_uuid_set,
|
| + context);
|
| switch (result) {
|
| case BlobTransportResult::BAD_IPC:
|
| blobs_inuse_map_.erase(uuid);
|
| @@ -101,9 +108,9 @@ void BlobDispatcherHost::OnRegisterBlobUUID(
|
| case BlobTransportResult::CANCEL_REFERENCED_BLOB_BROKEN:
|
| // The async builder builds the blob as broken, and we just need to send
|
| // the cancel message back to the renderer.
|
| - Send(new BlobStorageMsg_CancelBuildingBlob(
|
| - uuid, IPCBlobCreationCancelCode::REFERENCED_BLOB_BROKEN));
|
| - break;
|
| + callback.Run(
|
| + nullptr, mojom::BlobCreationCancelCode::REFERENCED_BLOB_BROKEN);
|
| + return;
|
| case BlobTransportResult::DONE:
|
| break;
|
| case BlobTransportResult::CANCEL_MEMORY_FULL:
|
| @@ -113,14 +120,9 @@ void BlobDispatcherHost::OnRegisterBlobUUID(
|
| NOTREACHED();
|
| break;
|
| }
|
| -}
|
|
|
| -void BlobDispatcherHost::OnStartBuildingBlob(
|
| - const std::string& uuid,
|
| - const std::vector<storage::DataElement>& descriptions) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| if (uuid.empty()) {
|
| - SendIPCResponse(uuid, BlobTransportResult::BAD_IPC);
|
| + SendIPCResponse(callback, BlobTransportResult::BAD_IPC);
|
| return;
|
| }
|
| BlobStorageContext* context = this->context();
|
| @@ -137,13 +139,14 @@ void BlobDispatcherHost::OnStartBuildingBlob(
|
| async_builder_.CancelBuildingBlob(
|
| uuid, IPCBlobCreationCancelCode::BLOB_DEREFERENCED_WHILE_BUILDING,
|
| context);
|
| - Send(new BlobStorageMsg_CancelBuildingBlob(
|
| - uuid, IPCBlobCreationCancelCode::BLOB_DEREFERENCED_WHILE_BUILDING));
|
| + callback.Run(
|
| + nullptr,
|
| + mojom::BlobCreationCancelCode::BLOB_DEREFERENCED_WHILE_BUILDING);
|
| }
|
| return;
|
| }
|
| if (!async_builder_.IsBeingBuilt(uuid)) {
|
| - SendIPCResponse(uuid, BlobTransportResult::BAD_IPC);
|
| + SendIPCResponse(callback, BlobTransportResult::BAD_IPC);
|
| return;
|
| }
|
|
|
| @@ -158,8 +161,7 @@ void BlobDispatcherHost::OnStartBuildingBlob(
|
| filesystem_url)) {
|
| async_builder_.CancelBuildingBlob(
|
| uuid, IPCBlobCreationCancelCode::FILE_WRITE_FAILED, context);
|
| - Send(new BlobStorageMsg_CancelBuildingBlob(
|
| - uuid, IPCBlobCreationCancelCode::FILE_WRITE_FAILED));
|
| + callback.Run(nullptr, mojom::BlobCreationCancelCode::FILE_WRITE_FAILED);
|
| return;
|
| }
|
| }
|
| @@ -167,8 +169,7 @@ void BlobDispatcherHost::OnStartBuildingBlob(
|
| !security_policy->CanReadFile(process_id_, item.path())) {
|
| async_builder_.CancelBuildingBlob(
|
| uuid, IPCBlobCreationCancelCode::FILE_WRITE_FAILED, context);
|
| - Send(new BlobStorageMsg_CancelBuildingBlob(
|
| - uuid, IPCBlobCreationCancelCode::FILE_WRITE_FAILED));
|
| + callback.Run(nullptr, mojom::BlobCreationCancelCode::FILE_WRITE_FAILED);
|
| return;
|
| }
|
| }
|
| @@ -178,7 +179,7 @@ void BlobDispatcherHost::OnStartBuildingBlob(
|
| uuid, descriptions, context->memory_available(), context,
|
| base::Bind(&BlobDispatcherHost::SendMemoryRequest, base::Unretained(this),
|
| uuid));
|
| - SendIPCResponse(uuid, result);
|
| + SendIPCResponse(callback, result);
|
| }
|
|
|
| void BlobDispatcherHost::OnMemoryItemResponse(
|
| @@ -352,36 +353,40 @@ void BlobDispatcherHost::SendMemoryRequest(
|
| file_handles));
|
| }
|
|
|
| -void BlobDispatcherHost::SendIPCResponse(const std::string& uuid,
|
| +void BlobDispatcherHost::SendIPCResponse(const BuildBlobCallback& callback,
|
| storage::BlobTransportResult result) {
|
| + mojom::BlobAssociatedPtr new_blob;
|
| + mojom::BlobCreationCancelCode cancel_code =
|
| + mojom:BlobCreationCancelCode::UNKNOWN;
|
| switch (result) {
|
| case BlobTransportResult::BAD_IPC:
|
| bad_message::ReceivedBadMessage(this,
|
| bad_message::BDH_CONSTRUCTION_FAILED);
|
| - return;
|
| + cancel_code = mojom::BlobCreationCancelCode::UNKNOWN;
|
| + break;
|
| case BlobTransportResult::CANCEL_MEMORY_FULL:
|
| - Send(new BlobStorageMsg_CancelBuildingBlob(
|
| - uuid, IPCBlobCreationCancelCode::OUT_OF_MEMORY));
|
| - return;
|
| + cancel_code = mojom::BlobCreationCancelCode::OUT_OF_MEMORY;
|
| + break;
|
| case BlobTransportResult::CANCEL_FILE_ERROR:
|
| - Send(new BlobStorageMsg_CancelBuildingBlob(
|
| - uuid, IPCBlobCreationCancelCode::FILE_WRITE_FAILED));
|
| - return;
|
| + cancel_code = mojom::BlobCreationCancelCode::FILE_WRITE_FAILED;
|
| + break;
|
| case BlobTransportResult::CANCEL_REFERENCED_BLOB_BROKEN:
|
| - Send(new BlobStorageMsg_CancelBuildingBlob(
|
| - uuid, IPCBlobCreationCancelCode::REFERENCED_BLOB_BROKEN));
|
| - return;
|
| + cancel_code = mojom::BlobCreationCancelCode::REFERENCED_BLOB_BROKEN;
|
| + break;
|
| case BlobTransportResult::CANCEL_UNKNOWN:
|
| - Send(new BlobStorageMsg_CancelBuildingBlob(
|
| - uuid, IPCBlobCreationCancelCode::UNKNOWN));
|
| - return;
|
| + cancel_code = mojom::BlobCreationCancelCode::UNKNOWN;
|
| + break;
|
| case BlobTransportResult::PENDING_RESPONSES:
|
| return;
|
| case BlobTransportResult::DONE:
|
| - Send(new BlobStorageMsg_DoneBuildingBlob(uuid));
|
| - return;
|
| + new_blob = blob_bindings_.CreateInterfacePtrAndBind(this);
|
| + break;
|
| + default:
|
| + NOTREACHED();
|
| + break;
|
| }
|
| - NOTREACHED();
|
| +
|
| + callback.Run(std::move(new_blob), cancel_code);
|
| }
|
|
|
| bool BlobDispatcherHost::IsInUseInHost(const std::string& uuid) {
|
|
|