Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(868)

Unified Diff: third_party/WebKit/Source/modules/serviceworkers/FetchEvent.cpp

Issue 2837943006: [WIP] Support PerformanceResourceTiming for Service Worker Navigation Preload (Closed)
Patch Set: clean up Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_);

Powered by Google App Engine
This is Rietveld 408576698