| Index: third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp
|
| diff --git a/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp b/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp
|
| index d1650d9c297c55c41e4d9b8c5c609089b29313c6..57fbe81897a06bf25bb4497f6912d550e4f13113 100644
|
| --- a/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp
|
| +++ b/third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp
|
| @@ -8,12 +8,14 @@
|
| #include "bindings/core/v8/ToV8ForCore.h"
|
| #include "bindings/core/v8/V8PrivateProperty.h"
|
| #include "core/dom/ExecutionContext.h"
|
| +#include "core/timing/WorkerGlobalScopePerformance.h"
|
| #include "modules/fetch/BytesConsumerForDataConsumerHandle.h"
|
| #include "modules/fetch/Request.h"
|
| #include "modules/fetch/Response.h"
|
| #include "modules/serviceworkers/FetchRespondWithObserver.h"
|
| #include "modules/serviceworkers/ServiceWorkerError.h"
|
| #include "modules/serviceworkers/ServiceWorkerGlobalScope.h"
|
| +#include "platform/loader/fetch/ResourceTimingInfo.h"
|
| #include "platform/network/NetworkUtils.h"
|
| #include "platform/wtf/PtrUtil.h"
|
| #include "platform/wtf/RefPtr.h"
|
| @@ -114,7 +116,9 @@ void FetchEvent::OnNavigationPreloadResponse(
|
| if (!script_state->ContextIsValid())
|
| return;
|
| DCHECK(preload_response_property_);
|
| + DCHECK(!preload_response_);
|
| ScriptState::Scope scope(script_state);
|
| + preload_response_ = std::move(response);
|
| FetchResponseData* response_data =
|
| data_consume_handle
|
| ? FetchResponseData::CreateWithBuffer(new BodyStreamBuffer(
|
| @@ -123,18 +127,19 @@ void FetchEvent::OnNavigationPreloadResponse(
|
| std::move(data_consume_handle))))
|
| : FetchResponseData::Create();
|
| Vector<KURL> url_list(1);
|
| - url_list[0] = response->Url();
|
| + url_list[0] = preload_response_->Url();
|
| response_data->SetURLList(url_list);
|
| - response_data->SetStatus(response->HttpStatusCode());
|
| - response_data->SetStatusMessage(response->HttpStatusText());
|
| - response_data->SetResponseTime(response->ToResourceResponse().ResponseTime());
|
| + response_data->SetStatus(preload_response_->HttpStatusCode());
|
| + response_data->SetStatusMessage(preload_response_->HttpStatusText());
|
| + response_data->SetResponseTime(
|
| + preload_response_->ToResourceResponse().ResponseTime());
|
| const HTTPHeaderMap& headers(
|
| - response->ToResourceResponse().HttpHeaderFields());
|
| + preload_response_->ToResourceResponse().HttpHeaderFields());
|
| for (const auto& header : headers) {
|
| response_data->HeaderList()->Append(header.key, header.value);
|
| }
|
| FetchResponseData* tainted_response =
|
| - NetworkUtils::IsRedirectResponseCode(response->HttpStatusCode())
|
| + NetworkUtils::IsRedirectResponseCode(preload_response_->HttpStatusCode())
|
| ? response_data->CreateOpaqueRedirectFilteredResponse()
|
| : response_data->CreateBasicFilteredResponse();
|
| preload_response_property_->Resolve(
|
| @@ -151,6 +156,33 @@ void FetchEvent::OnNavigationPreloadError(
|
| ServiceWorkerError::Take(nullptr, *error.get()));
|
| }
|
|
|
| +void FetchEvent::OnNavigationPreloadComplete(
|
| + WorkerGlobalScope* worker_global_scope,
|
| + double completion_time,
|
| + int64_t encoded_data_length,
|
| + int64_t encoded_body_length,
|
| + int64_t decoded_body_length) {
|
| + DCHECK(preload_response_);
|
| + std::unique_ptr<WebURLResponse> response = std::move(preload_response_);
|
| + ResourceResponse resource_response = response->ToResourceResponse();
|
| + resource_response.SetEncodedDataLength(encoded_data_length);
|
| + resource_response.SetEncodedBodyLength(encoded_body_length);
|
| + resource_response.SetDecodedBodyLength(decoded_body_length);
|
| + // According to the current spec of Resource Timing, the initiator type of
|
| + // navigation preload request must be "other". But it may change when the spec
|
| + // discussion is settled. https://github.com/w3c/resource-timing/issues/110
|
| + RefPtr<ResourceTimingInfo> info = ResourceTimingInfo::Create(
|
| + "other", resource_response.GetResourceLoadTiming()->RequestTime(),
|
| + false /* is_main_resource */);
|
| + info->SetNegativeAllowed(true);
|
| + info->SetLoadFinishTime(completion_time);
|
| + info->SetInitialURL(request_->url());
|
| + info->SetFinalResponse(resource_response);
|
| + info->AddFinalTransferSize(encoded_data_length);
|
| + WorkerGlobalScopePerformance::performance(*worker_global_scope)
|
| + ->AddResourceTiming(*info);
|
| +}
|
| +
|
| DEFINE_TRACE(FetchEvent) {
|
| visitor->Trace(observer_);
|
| visitor->Trace(request_);
|
|
|