1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "third_party/blink/renderer/modules/cache_storage/cache_utils.h"
6 
7 #include "third_party/blink/renderer/core/fetch/fetch_response_data.h"
8 #include "third_party/blink/renderer/core/fetch/response.h"
9 #include "third_party/blink/renderer/modules/cache_storage/cache_storage_blob_client_list.h"
10 #include "third_party/blink/renderer/platform/loader/fetch/data_pipe_bytes_consumer.h"
11 
12 namespace blink {
13 
CreateEagerResponse(ScriptState * script_state,mojom::blink::EagerResponsePtr eager_response,CacheStorageBlobClientList * client_list)14 Response* CreateEagerResponse(ScriptState* script_state,
15                               mojom::blink::EagerResponsePtr eager_response,
16                               CacheStorageBlobClientList* client_list) {
17   auto& response = eager_response->response;
18   DCHECK(!response->blob);
19 
20   ExecutionContext* context = ExecutionContext::From(script_state);
21 
22   FetchResponseData* fetch_data =
23       Response::CreateUnfilteredFetchResponseDataWithoutBody(script_state,
24                                                              *response);
25 
26   DataPipeBytesConsumer::CompletionNotifier* completion_notifier = nullptr;
27   fetch_data->ReplaceBodyStreamBuffer(BodyStreamBuffer::Create(
28       script_state,
29       MakeGarbageCollected<DataPipeBytesConsumer>(
30           context->GetTaskRunner(TaskType::kNetworking),
31           std::move(eager_response->pipe), &completion_notifier),
32       nullptr /* AbortSignal */, std::move(response->side_data_blob)));
33 
34   // Create a BlobReaderClient in the provided list.  This will track the
35   // completion of the eagerly read blob and propagate it to the given
36   // DataPipeBytesConsumer::CompletionNotifier.  The list will also hold
37   // the client alive.
38   client_list->AddClient(std::move(eager_response->client_receiver),
39                          std::move(completion_notifier));
40 
41   fetch_data = Response::FilterResponseData(
42       response->response_type, fetch_data, response->cors_exposed_header_names);
43 
44   return Response::Create(context, fetch_data);
45 }
46 
47 }  // namespace blink
48