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_); |