| Index: storage/browser/blob/blob_async_transport_request_builder.cc | 
| diff --git a/storage/browser/blob/blob_async_transport_strategy.cc b/storage/browser/blob/blob_async_transport_request_builder.cc | 
| similarity index 67% | 
| rename from storage/browser/blob/blob_async_transport_strategy.cc | 
| rename to storage/browser/blob/blob_async_transport_request_builder.cc | 
| index edae52c79ed0a76bcd6d2f3a6fc3f795de470ad8..a77d408ca8ffa34dd4ebea3e28b407520fe0cf5a 100644 | 
| --- a/storage/browser/blob/blob_async_transport_strategy.cc | 
| +++ b/storage/browser/blob/blob_async_transport_request_builder.cc | 
| @@ -8,7 +8,7 @@ | 
| #include <algorithm> | 
|  | 
| #include "base/numerics/safe_math.h" | 
| -#include "storage/browser/blob/blob_async_transport_strategy.h" | 
| +#include "storage/browser/blob/blob_async_transport_request_builder.h" | 
| #include "storage/common/blob_storage/blob_storage_constants.h" | 
|  | 
| namespace storage { | 
| @@ -37,7 +37,7 @@ bool IsBytes(DataElement::Type type) { | 
| class FileStorageStrategy { | 
| public: | 
| FileStorageStrategy( | 
| -      std::vector<BlobAsyncTransportStrategy::RendererMemoryItemRequest>* | 
| +      std::vector<BlobAsyncTransportRequestBuilder::RendererMemoryItemRequest>* | 
| requests, | 
| BlobDataBuilder* builder) | 
| : requests(requests), builder(builder), current_item_index(0) {} | 
| @@ -49,7 +49,7 @@ class FileStorageStrategy { | 
| size_t segment_index, | 
| uint64_t segment_offset, | 
| uint64_t size) { | 
| -    BlobAsyncTransportStrategy::RendererMemoryItemRequest request; | 
| +    BlobAsyncTransportRequestBuilder::RendererMemoryItemRequest request; | 
| request.browser_item_index = current_item_index; | 
| request.browser_item_offset = 0; | 
| request.message.request_number = requests->size(); | 
| @@ -72,7 +72,8 @@ class FileStorageStrategy { | 
|  | 
| void Done() {} | 
|  | 
| -  std::vector<BlobAsyncTransportStrategy::RendererMemoryItemRequest>* requests; | 
| +  std::vector<BlobAsyncTransportRequestBuilder::RendererMemoryItemRequest>* | 
| +      requests; | 
| BlobDataBuilder* builder; | 
|  | 
| size_t current_item_index; | 
| @@ -84,7 +85,7 @@ class SharedMemoryStorageStrategy { | 
| public: | 
| SharedMemoryStorageStrategy( | 
| size_t max_segment_size, | 
| -      std::vector<BlobAsyncTransportStrategy::RendererMemoryItemRequest>* | 
| +      std::vector<BlobAsyncTransportRequestBuilder::RendererMemoryItemRequest>* | 
| requests, | 
| BlobDataBuilder* builder) | 
| : requests(requests), | 
| @@ -104,7 +105,7 @@ class SharedMemoryStorageStrategy { | 
| current_item_index++; | 
| current_item_size = 0; | 
| } | 
| -    BlobAsyncTransportStrategy::RendererMemoryItemRequest request; | 
| +    BlobAsyncTransportRequestBuilder::RendererMemoryItemRequest request; | 
| request.browser_item_index = current_item_index; | 
| request.browser_item_offset = current_item_size; | 
| request.message.request_number = requests->size(); | 
| @@ -136,7 +137,8 @@ class SharedMemoryStorageStrategy { | 
| } | 
| } | 
|  | 
| -  std::vector<BlobAsyncTransportStrategy::RendererMemoryItemRequest>* requests; | 
| +  std::vector<BlobAsyncTransportRequestBuilder::RendererMemoryItemRequest>* | 
| +      requests; | 
|  | 
| size_t max_segment_size; | 
| BlobDataBuilder* builder; | 
| @@ -191,101 +193,61 @@ void ForEachWithSegment(const std::vector<DataElement>& elements, | 
| } | 
| }  // namespace | 
|  | 
| -BlobAsyncTransportStrategy::RendererMemoryItemRequest:: | 
| +BlobAsyncTransportRequestBuilder::RendererMemoryItemRequest:: | 
| RendererMemoryItemRequest() | 
| -    : browser_item_index(0), browser_item_offset(0), received(false) {} | 
| +    : browser_item_index(0), browser_item_offset(0) {} | 
|  | 
| -BlobAsyncTransportStrategy::BlobAsyncTransportStrategy() | 
| -    : error_(BlobAsyncTransportStrategy::ERROR_NONE), total_bytes_size_(0) {} | 
| +BlobAsyncTransportRequestBuilder::BlobAsyncTransportRequestBuilder() | 
| +    : total_bytes_size_(0) {} | 
|  | 
| -BlobAsyncTransportStrategy::~BlobAsyncTransportStrategy() {} | 
| +BlobAsyncTransportRequestBuilder::~BlobAsyncTransportRequestBuilder() {} | 
|  | 
| -// if total_blob_size > |memory_available| (say 400MB) | 
| -//   Request all data in files | 
| -//   (Segment all of the existing data into | 
| -//   file blocks, of <= |max_file_size|) | 
| -// else if total_blob_size > |max_ipc_memory_size| (say 150KB) | 
| -//   Request all data in shared memory | 
| -//   (Segment all of the existing data into | 
| -//   shared memory blocks, of <= |max_shared_memory_size|) | 
| -// else | 
| -//   Request all data to be sent over IPC | 
| -void BlobAsyncTransportStrategy::Initialize( | 
| -    size_t max_ipc_memory_size, | 
| -    size_t max_shared_memory_size, | 
| +// Initializes the transport strategy for file requests. | 
| +void BlobAsyncTransportRequestBuilder::InitializeForFileRequests( | 
| size_t max_file_size, | 
| -    uint64_t disk_space_left, | 
| -    size_t memory_available, | 
| -    const std::string& uuid, | 
| -    const std::vector<DataElement>& blob_item_infos) { | 
| -  DCHECK(handle_sizes_.empty()); | 
| +    uint64_t blob_total_size, | 
| +    const std::vector<DataElement>& elements, | 
| +    BlobDataBuilder* builder) { | 
| DCHECK(requests_.empty()); | 
| -  DCHECK(!builder_.get()); | 
| -  builder_.reset(new BlobDataBuilder(uuid)); | 
| -  error_ = BlobAsyncTransportStrategy::ERROR_NONE; | 
| - | 
| -  size_t memory_items = 0; | 
| -  base::CheckedNumeric<uint64_t> total_size_checked = 0; | 
| -  for (const auto& info : blob_item_infos) { | 
| -    if (!IsBytes(info.type())) { | 
| -      continue; | 
| -    } | 
| -    total_size_checked += info.length(); | 
| -    ++memory_items; | 
| -  } | 
| - | 
| -  if (!total_size_checked.IsValid()) { | 
| -    DVLOG(1) << "Impossible total size of all memory elements."; | 
| -    error_ = BlobAsyncTransportStrategy::ERROR_INVALID_PARAMS; | 
| -    return; | 
| -  } | 
| - | 
| -  total_bytes_size_ = total_size_checked.ValueOrDie(); | 
| - | 
| -  // See if we have enough memory. | 
| -  if (total_bytes_size_ > | 
| -      disk_space_left + static_cast<uint64_t>(memory_available)) { | 
| -    error_ = BlobAsyncTransportStrategy::ERROR_TOO_LARGE; | 
| -    return; | 
| -  } | 
| - | 
| -  // If we're more than the available memory, then we're going straight to disk. | 
| -  if (total_bytes_size_ > memory_available) { | 
| -    if (total_bytes_size_ > disk_space_left) { | 
| -      error_ = BlobAsyncTransportStrategy::ERROR_TOO_LARGE; | 
| -      return; | 
| -    } | 
| -    ComputeHandleSizes(total_bytes_size_, max_file_size, &handle_sizes_); | 
| -    FileStorageStrategy strategy(&requests_, builder_.get()); | 
| -    ForEachWithSegment(blob_item_infos, static_cast<uint64_t>(max_file_size), | 
| -                       &strategy); | 
| -    return; | 
| -  } | 
| +  total_bytes_size_ = blob_total_size; | 
| +  ComputeHandleSizes(total_bytes_size_, max_file_size, &file_sizes_); | 
| +  FileStorageStrategy strategy(&requests_, builder); | 
| +  ForEachWithSegment(elements, static_cast<uint64_t>(max_file_size), &strategy); | 
| +} | 
|  | 
| -  if (total_bytes_size_ > max_ipc_memory_size) { | 
| -    // Note: The size must be <= std::numeric_limits<size_t>::max(). Otherwise | 
| -    // we are guarenteed to be caught by the if statement above, | 
| -    // |total_bytes_size_ > memory_available|. | 
| -    ComputeHandleSizes(total_bytes_size_, max_shared_memory_size, | 
| -                       &handle_sizes_); | 
| -    SharedMemoryStorageStrategy strategy(max_shared_memory_size, &requests_, | 
| -                                         builder_.get()); | 
| -    ForEachWithSegment(blob_item_infos, | 
| -                       static_cast<uint64_t>(max_shared_memory_size), | 
| -                       &strategy); | 
| -    return; | 
| -  } | 
| +void BlobAsyncTransportRequestBuilder::InitializeForSharedMemoryRequests( | 
| +    size_t max_shared_memory_size, | 
| +    uint64_t blob_total_size, | 
| +    const std::vector<DataElement>& elements, | 
| +    BlobDataBuilder* builder) { | 
| +  DCHECK(requests_.empty()); | 
| +  DCHECK(blob_total_size <= std::numeric_limits<size_t>::max()); | 
| +  total_bytes_size_ = blob_total_size; | 
| +  ComputeHandleSizes(total_bytes_size_, max_shared_memory_size, | 
| +                     &shared_memory_sizes_); | 
| +  SharedMemoryStorageStrategy strategy(max_shared_memory_size, &requests_, | 
| +                                       builder); | 
| +  ForEachWithSegment(elements, static_cast<uint64_t>(max_shared_memory_size), | 
| +                     &strategy); | 
| +} | 
|  | 
| -  // Since they can all fit in IPC memory, we don't need to segment anything, | 
| -  // and just request them straight in IPC. | 
| -  size_t items_length = blob_item_infos.size(); | 
| +void BlobAsyncTransportRequestBuilder::InitializeForIPCRequests( | 
| +    size_t max_ipc_memory_size, | 
| +    uint64_t blob_total_size, | 
| +    const std::vector<DataElement>& elements, | 
| +    BlobDataBuilder* builder) { | 
| +  DCHECK(requests_.empty()); | 
| +  // We don't segment anything, and just request the memory items directly | 
| +  // in IPC. | 
| +  size_t items_length = elements.size(); | 
| +  total_bytes_size_ = blob_total_size; | 
| for (size_t i = 0; i < items_length; i++) { | 
| -    const auto& info = blob_item_infos.at(i); | 
| +    const auto& info = elements.at(i); | 
| if (!IsBytes(info.type())) { | 
| -      builder_->AppendIPCDataElement(info); | 
| +      builder->AppendIPCDataElement(info); | 
| continue; | 
| } | 
| -    BlobAsyncTransportStrategy::RendererMemoryItemRequest request; | 
| +    BlobAsyncTransportRequestBuilder::RendererMemoryItemRequest request; | 
| request.browser_item_index = i; | 
| request.browser_item_offset = 0; | 
| request.message.request_number = requests_.size(); | 
| @@ -294,12 +256,12 @@ void BlobAsyncTransportStrategy::Initialize( | 
| request.message.renderer_item_offset = 0; | 
| request.message.size = info.length(); | 
| requests_.push_back(request); | 
| -    builder_->AppendFutureData(info.length()); | 
| +    builder->AppendFutureData(info.length()); | 
| } | 
| } | 
|  | 
| /* static */ | 
| -bool BlobAsyncTransportStrategy::ShouldBeShortcut( | 
| +bool BlobAsyncTransportRequestBuilder::ShouldBeShortcut( | 
| const std::vector<DataElement>& elements, | 
| size_t memory_available) { | 
| base::CheckedNumeric<size_t> shortcut_bytes = 0; | 
| @@ -319,7 +281,7 @@ bool BlobAsyncTransportStrategy::ShouldBeShortcut( | 
| } | 
|  | 
| /* static */ | 
| -void BlobAsyncTransportStrategy::ComputeHandleSizes( | 
| +void BlobAsyncTransportRequestBuilder::ComputeHandleSizes( | 
| uint64_t total_memory_size, | 
| size_t max_segment_size, | 
| std::vector<size_t>* segment_sizes) { | 
|  |