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