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

Side by Side 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, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/serviceworkers/FetchEvent.h" 5 #include "modules/serviceworkers/FetchEvent.h"
6 6
7 #include "bindings/core/v8/ScriptState.h" 7 #include "bindings/core/v8/ScriptState.h"
8 #include "bindings/core/v8/ToV8ForCore.h" 8 #include "bindings/core/v8/ToV8ForCore.h"
9 #include "bindings/core/v8/V8PrivateProperty.h" 9 #include "bindings/core/v8/V8PrivateProperty.h"
10 #include "core/dom/ExecutionContext.h" 10 #include "core/dom/ExecutionContext.h"
11 #include "core/timing/WorkerGlobalScopePerformance.h"
11 #include "modules/fetch/BytesConsumerForDataConsumerHandle.h" 12 #include "modules/fetch/BytesConsumerForDataConsumerHandle.h"
12 #include "modules/fetch/Request.h" 13 #include "modules/fetch/Request.h"
13 #include "modules/fetch/Response.h" 14 #include "modules/fetch/Response.h"
14 #include "modules/serviceworkers/FetchRespondWithObserver.h" 15 #include "modules/serviceworkers/FetchRespondWithObserver.h"
15 #include "modules/serviceworkers/ServiceWorkerError.h" 16 #include "modules/serviceworkers/ServiceWorkerError.h"
16 #include "modules/serviceworkers/ServiceWorkerGlobalScope.h" 17 #include "modules/serviceworkers/ServiceWorkerGlobalScope.h"
18 #include "platform/loader/fetch/ResourceTimingInfo.h"
17 #include "platform/network/NetworkUtils.h" 19 #include "platform/network/NetworkUtils.h"
18 #include "platform/wtf/PtrUtil.h" 20 #include "platform/wtf/PtrUtil.h"
19 #include "platform/wtf/RefPtr.h" 21 #include "platform/wtf/RefPtr.h"
20 #include "public/platform/WebURLResponse.h" 22 #include "public/platform/WebURLResponse.h"
21 #include "public/platform/modules/serviceworker/WebServiceWorkerError.h" 23 #include "public/platform/modules/serviceworker/WebServiceWorkerError.h"
22 24
23 namespace blink { 25 namespace blink {
24 26
25 FetchEvent* FetchEvent::Create(ScriptState* script_state, 27 FetchEvent* FetchEvent::Create(ScriptState* script_state,
26 const AtomicString& type, 28 const AtomicString& type,
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 } 109 }
108 } 110 }
109 111
110 void FetchEvent::OnNavigationPreloadResponse( 112 void FetchEvent::OnNavigationPreloadResponse(
111 ScriptState* script_state, 113 ScriptState* script_state,
112 std::unique_ptr<WebURLResponse> response, 114 std::unique_ptr<WebURLResponse> response,
113 std::unique_ptr<WebDataConsumerHandle> data_consume_handle) { 115 std::unique_ptr<WebDataConsumerHandle> data_consume_handle) {
114 if (!script_state->ContextIsValid()) 116 if (!script_state->ContextIsValid())
115 return; 117 return;
116 DCHECK(preload_response_property_); 118 DCHECK(preload_response_property_);
119 DCHECK(!preload_response_);
117 ScriptState::Scope scope(script_state); 120 ScriptState::Scope scope(script_state);
121 preload_response_ = std::move(response);
118 FetchResponseData* response_data = 122 FetchResponseData* response_data =
119 data_consume_handle 123 data_consume_handle
120 ? FetchResponseData::CreateWithBuffer(new BodyStreamBuffer( 124 ? FetchResponseData::CreateWithBuffer(new BodyStreamBuffer(
121 script_state, new BytesConsumerForDataConsumerHandle( 125 script_state, new BytesConsumerForDataConsumerHandle(
122 ExecutionContext::From(script_state), 126 ExecutionContext::From(script_state),
123 std::move(data_consume_handle)))) 127 std::move(data_consume_handle))))
124 : FetchResponseData::Create(); 128 : FetchResponseData::Create();
125 Vector<KURL> url_list(1); 129 Vector<KURL> url_list(1);
126 url_list[0] = response->Url(); 130 url_list[0] = preload_response_->Url();
127 response_data->SetURLList(url_list); 131 response_data->SetURLList(url_list);
128 response_data->SetStatus(response->HttpStatusCode()); 132 response_data->SetStatus(preload_response_->HttpStatusCode());
129 response_data->SetStatusMessage(response->HttpStatusText()); 133 response_data->SetStatusMessage(preload_response_->HttpStatusText());
130 response_data->SetResponseTime(response->ToResourceResponse().ResponseTime()); 134 response_data->SetResponseTime(
135 preload_response_->ToResourceResponse().ResponseTime());
131 const HTTPHeaderMap& headers( 136 const HTTPHeaderMap& headers(
132 response->ToResourceResponse().HttpHeaderFields()); 137 preload_response_->ToResourceResponse().HttpHeaderFields());
133 for (const auto& header : headers) { 138 for (const auto& header : headers) {
134 response_data->HeaderList()->Append(header.key, header.value); 139 response_data->HeaderList()->Append(header.key, header.value);
135 } 140 }
136 FetchResponseData* tainted_response = 141 FetchResponseData* tainted_response =
137 NetworkUtils::IsRedirectResponseCode(response->HttpStatusCode()) 142 NetworkUtils::IsRedirectResponseCode(preload_response_->HttpStatusCode())
138 ? response_data->CreateOpaqueRedirectFilteredResponse() 143 ? response_data->CreateOpaqueRedirectFilteredResponse()
139 : response_data->CreateBasicFilteredResponse(); 144 : response_data->CreateBasicFilteredResponse();
140 preload_response_property_->Resolve( 145 preload_response_property_->Resolve(
141 Response::Create(ExecutionContext::From(script_state), tainted_response)); 146 Response::Create(ExecutionContext::From(script_state), tainted_response));
142 } 147 }
143 148
144 void FetchEvent::OnNavigationPreloadError( 149 void FetchEvent::OnNavigationPreloadError(
145 ScriptState* script_state, 150 ScriptState* script_state,
146 std::unique_ptr<WebServiceWorkerError> error) { 151 std::unique_ptr<WebServiceWorkerError> error) {
147 if (!script_state->ContextIsValid()) 152 if (!script_state->ContextIsValid())
148 return; 153 return;
149 DCHECK(preload_response_property_); 154 DCHECK(preload_response_property_);
150 preload_response_property_->Reject( 155 preload_response_property_->Reject(
151 ServiceWorkerError::Take(nullptr, *error.get())); 156 ServiceWorkerError::Take(nullptr, *error.get()));
152 } 157 }
153 158
159 void FetchEvent::OnNavigationPreloadComplete(
160 WorkerGlobalScope* worker_global_scope,
161 double completion_time,
162 int64_t encoded_data_length,
163 int64_t encoded_body_length,
164 int64_t decoded_body_length) {
165 DCHECK(preload_response_);
166 std::unique_ptr<WebURLResponse> response = std::move(preload_response_);
167 ResourceResponse resource_response = response->ToResourceResponse();
168 resource_response.SetEncodedDataLength(encoded_data_length);
169 resource_response.SetEncodedBodyLength(encoded_body_length);
170 resource_response.SetDecodedBodyLength(decoded_body_length);
171 // According to the current spec of Resource Timing, the initiator type of
172 // navigation preload request must be "other". But it may change when the spec
173 // discussion is settled. https://github.com/w3c/resource-timing/issues/110
174 RefPtr<ResourceTimingInfo> info = ResourceTimingInfo::Create(
175 "other", resource_response.GetResourceLoadTiming()->RequestTime(),
176 false /* is_main_resource */);
177 info->SetNegativeAllowed(true);
178 info->SetLoadFinishTime(completion_time);
179 info->SetInitialURL(request_->url());
180 info->SetFinalResponse(resource_response);
181 info->AddFinalTransferSize(encoded_data_length);
182 WorkerGlobalScopePerformance::performance(*worker_global_scope)
183 ->AddResourceTiming(*info);
184 }
185
154 DEFINE_TRACE(FetchEvent) { 186 DEFINE_TRACE(FetchEvent) {
155 visitor->Trace(observer_); 187 visitor->Trace(observer_);
156 visitor->Trace(request_); 188 visitor->Trace(request_);
157 visitor->Trace(preload_response_property_); 189 visitor->Trace(preload_response_property_);
158 ExtendableEvent::Trace(visitor); 190 ExtendableEvent::Trace(visitor);
159 } 191 }
160 192
161 } // namespace blink 193 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698