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

Side by Side Diff: content/renderer/service_worker/service_worker_context_client.cc

Issue 2620463002: Show service worker navigation preload requests in DevTools Network tab (Closed)
Patch Set: Created 3 years, 11 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "content/renderer/service_worker/service_worker_context_client.h" 5 #include "content/renderer/service_worker/service_worker_context_client.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 public: 260 public:
261 NavigationPreloadRequest(int fetch_event_id, 261 NavigationPreloadRequest(int fetch_event_id,
262 const GURL& url, 262 const GURL& url,
263 mojom::FetchEventPreloadHandlePtr preload_handle) 263 mojom::FetchEventPreloadHandlePtr preload_handle)
264 : fetch_event_id_(fetch_event_id), 264 : fetch_event_id_(fetch_event_id),
265 url_(url), 265 url_(url),
266 url_loader_(std::move(preload_handle->url_loader)), 266 url_loader_(std::move(preload_handle->url_loader)),
267 binding_(this, std::move(preload_handle->url_loader_client_request)) {} 267 binding_(this, std::move(preload_handle->url_loader_client_request)) {}
268 268
269 ~NavigationPreloadRequest() override { 269 ~NavigationPreloadRequest() override {
270 if (result_reported_) 270 if (!response_reported_) {
271 return; 271 MaybeReportErrorToClient(
272 ServiceWorkerContextClient* client = 272 blink::WebServiceWorkerError::ErrorTypeAbort,
273 ServiceWorkerContextClient::ThreadSpecificInstance(); 273 "Service Worker navigation preload aborted. Need to guard with "
274 if (!client) 274 "respondWith or waitUntil.");
falken 2017/01/17 14:38:36 FWIW this error message confused me, since I was n
horo 2017/01/18 14:25:02 Removed this error in https://codereview.chromium.
275 return; 275 }
276 client->OnNavigationPreloadError( 276 MaybeReportCompletionToClient();
277 fetch_event_id_,
278 base::MakeUnique<blink::WebServiceWorkerError>(
279 blink::WebServiceWorkerError::ErrorTypeAbort,
280 blink::WebString::fromASCII(
281 "Service Worker navigation preload aborted. Need to guard with "
282 "respondWith or waitUntil.")));
283 } 277 }
284 278
285 void OnReceiveResponse( 279 void OnReceiveResponse(
286 const ResourceResponseHead& response_head, 280 const ResourceResponseHead& response_head,
287 mojom::DownloadedTempFilePtr downloaded_file) override { 281 mojom::DownloadedTempFilePtr downloaded_file) override {
288 DCHECK(!response_); 282 DCHECK(!response_);
289 DCHECK(!downloaded_file); 283 DCHECK(!downloaded_file);
290 response_ = base::MakeUnique<blink::WebURLResponse>(); 284 response_ = base::MakeUnique<blink::WebURLResponse>();
291 // TODO(horo): Set report_security_info to true when DevTools is attached. 285 // TODO(horo): Set report_security_info to true when DevTools is attached.
292 const bool report_security_info = false; 286 const bool report_security_info = false;
293 WebURLLoaderImpl::PopulateURLResponse(url_, response_head, response_.get(), 287 WebURLLoaderImpl::PopulateURLResponse(url_, response_head, response_.get(),
294 report_security_info); 288 report_security_info);
295 MaybeReportResponseToClient(); 289 MaybeReportResponseToClient();
296 } 290 }
297 291
298 void OnReceiveRedirect(const net::RedirectInfo& redirect_info, 292 void OnReceiveRedirect(const net::RedirectInfo& redirect_info,
299 const ResourceResponseHead& response_head) override { 293 const ResourceResponseHead& response_head) override {
300 // Cancel the request. 294 // Cancel the request.
301 url_loader_ = nullptr; 295 url_loader_ = nullptr;
302 ReportErrorToClient( 296 MaybeReportErrorToClient(
297 blink::WebServiceWorkerError::ErrorTypeNetwork,
303 "Service Worker navigation preload doesn't suport redirect."); 298 "Service Worker navigation preload doesn't suport redirect.");
falken 2017/01/17 14:38:36 nit: "support redirects"
horo 2017/01/18 14:25:02 Done.
304 } 299 }
305 300
306 void OnDataDownloaded(int64_t data_length, 301 void OnDataDownloaded(int64_t data_length,
307 int64_t encoded_data_length) override { 302 int64_t encoded_data_length) override {
308 NOTREACHED(); 303 NOTREACHED();
309 } 304 }
310 305
311 void OnTransferSizeUpdated(int32_t transfer_size_diff) override { 306 void OnTransferSizeUpdated(int32_t transfer_size_diff) override {
312 NOTREACHED(); 307 // TODO(horo): Send this transfer size update notification to DevTools.
313 } 308 }
314 309
315 void OnStartLoadingResponseBody( 310 void OnStartLoadingResponseBody(
316 mojo::ScopedDataPipeConsumerHandle body) override { 311 mojo::ScopedDataPipeConsumerHandle body) override {
317 DCHECK(!body_.is_valid()); 312 DCHECK(!body_.is_valid());
318 body_ = std::move(body); 313 body_ = std::move(body);
319 MaybeReportResponseToClient(); 314 MaybeReportResponseToClient();
320 } 315 }
321 316
322 void OnComplete(const ResourceRequestCompletionStatus& status) override { 317 void OnComplete(const ResourceRequestCompletionStatus& status) override {
323 // We don't report to |client| if OnStartLoadingResponseBody() has already 318 if (status.error_code != net::OK) {
324 // called OnNavigationPreloadResponse(). 319 MaybeReportErrorToClient(
325 if (result_reported_) 320 blink::WebServiceWorkerError::ErrorTypeNetwork,
326 return; 321 "Service Worker navigation preload network error.");
327 DCHECK_NE(0, status.error_code); 322 }
328 ReportErrorToClient("Service Worker navigation preload network error."); 323 MaybeReportCompletionToClient();
329 } 324 }
330 325
331 private: 326 private:
332 void MaybeReportResponseToClient() { 327 void MaybeReportResponseToClient() {
333 DCHECK(!result_reported_); 328 if (error_reported_)
329 return;
330 DCHECK(!response_reported_);
334 if (!response_ || !body_.is_valid()) 331 if (!response_ || !body_.is_valid())
335 return; 332 return;
336 ServiceWorkerContextClient* client = 333 ServiceWorkerContextClient* client =
337 ServiceWorkerContextClient::ThreadSpecificInstance(); 334 ServiceWorkerContextClient::ThreadSpecificInstance();
338 if (!client) 335 if (!client)
339 return; 336 return;
340 337
341 client->OnNavigationPreloadResponse( 338 client->OnNavigationPreloadResponse(
342 fetch_event_id_, std::move(response_), 339 fetch_event_id_, std::move(response_),
343 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_))); 340 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_)));
344 result_reported_ = true; 341 response_reported_ = true;
345 } 342 }
346 343
347 void ReportErrorToClient(const char* error_message) { 344 void MaybeReportErrorToClient(
345 blink::WebServiceWorkerError::ErrorType error_type,
346 const char* error_message) {
347 if (response_reported_ || error_reported_)
348 return;
348 ServiceWorkerContextClient* client = 349 ServiceWorkerContextClient* client =
349 ServiceWorkerContextClient::ThreadSpecificInstance(); 350 ServiceWorkerContextClient::ThreadSpecificInstance();
350 if (!client) 351 if (!client)
351 return; 352 return;
352 client->OnNavigationPreloadError( 353 client->OnNavigationPreloadError(
353 fetch_event_id_, base::MakeUnique<blink::WebServiceWorkerError>( 354 fetch_event_id_,
354 blink::WebServiceWorkerError::ErrorTypeNetwork, 355 base::MakeUnique<blink::WebServiceWorkerError>(
355 blink::WebString::fromUTF8(error_message))); 356 error_type, blink::WebString::fromUTF8(error_message)));
356 result_reported_ = true; 357 error_reported_ = true;
358 }
359
360 void MaybeReportCompletionToClient() {
361 if (error_reported_ || completion_reported_)
362 return;
363 ServiceWorkerContextClient* client =
364 ServiceWorkerContextClient::ThreadSpecificInstance();
365 if (!client)
366 return;
367 client->OnNavigationPreloadCompleted(fetch_event_id_);
368 completion_reported_ = true;
357 } 369 }
358 370
359 const int fetch_event_id_; 371 const int fetch_event_id_;
360 const GURL url_; 372 const GURL url_;
361 mojom::URLLoaderPtr url_loader_; 373 mojom::URLLoaderPtr url_loader_;
362 mojo::Binding<mojom::URLLoaderClient> binding_; 374 mojo::Binding<mojom::URLLoaderClient> binding_;
363 375
364 std::unique_ptr<blink::WebURLResponse> response_; 376 std::unique_ptr<blink::WebURLResponse> response_;
365 mojo::ScopedDataPipeConsumerHandle body_; 377 mojo::ScopedDataPipeConsumerHandle body_;
366 bool result_reported_ = false; 378 bool response_reported_ = false;
379 bool error_reported_ = false;
380 bool completion_reported_ = false;
falken 2017/01/17 14:38:36 I didn't look too carefully but can we turn this i
horo 2017/01/18 14:25:02 Removed this in https://codereview.chromium.org/26
367 }; 381 };
368 382
369 ServiceWorkerContextClient* 383 ServiceWorkerContextClient*
370 ServiceWorkerContextClient::ThreadSpecificInstance() { 384 ServiceWorkerContextClient::ThreadSpecificInstance() {
371 return g_worker_client_tls.Pointer()->Get(); 385 return g_worker_client_tls.Pointer()->Get();
372 } 386 }
373 387
374 ServiceWorkerContextClient::ServiceWorkerContextClient( 388 ServiceWorkerContextClient::ServiceWorkerContextClient(
375 int embedded_worker_id, 389 int embedded_worker_id,
376 int64_t service_worker_version_id, 390 int64_t service_worker_version_id,
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after
973 TRACE_EVENT0("ServiceWorker", 987 TRACE_EVENT0("ServiceWorker",
974 "ServiceWorkerContextClient::OnInstallEvent"); 988 "ServiceWorkerContextClient::OnInstallEvent");
975 proxy_->dispatchInstallEvent(request_id); 989 proxy_->dispatchInstallEvent(request_id);
976 } 990 }
977 991
978 void ServiceWorkerContextClient::DispatchFetchEvent( 992 void ServiceWorkerContextClient::DispatchFetchEvent(
979 int fetch_event_id, 993 int fetch_event_id,
980 const ServiceWorkerFetchRequest& request, 994 const ServiceWorkerFetchRequest& request,
981 mojom::FetchEventPreloadHandlePtr preload_handle, 995 mojom::FetchEventPreloadHandlePtr preload_handle,
982 const DispatchFetchEventCallback& callback) { 996 const DispatchFetchEventCallback& callback) {
983 std::unique_ptr<NavigationPreloadRequest> preload_request = 997 std::unique_ptr<NavigationPreloadRequest> preload_request;
984 preload_handle 998 if (preload_handle) {
985 ? base::MakeUnique<NavigationPreloadRequest>( 999 proxy_->onNavigationPreloadSent(fetch_event_id, request.url,
986 fetch_event_id, request.url, std::move(preload_handle)) 1000 preload_handle->sent_timestamp,
987 : nullptr; 1001 preload_handle->sent_wall_time);
1002 preload_request = base::MakeUnique<NavigationPreloadRequest>(
1003 fetch_event_id, request.url, std::move(preload_handle));
1004 }
988 const bool navigation_preload_sent = !!preload_request; 1005 const bool navigation_preload_sent = !!preload_request;
989 blink::WebServiceWorkerRequest webRequest; 1006 blink::WebServiceWorkerRequest webRequest;
990 TRACE_EVENT0("ServiceWorker", 1007 TRACE_EVENT0("ServiceWorker",
991 "ServiceWorkerContextClient::DispatchFetchEvent"); 1008 "ServiceWorkerContextClient::DispatchFetchEvent");
992 context_->fetch_event_callbacks.AddWithID( 1009 context_->fetch_event_callbacks.AddWithID(
993 base::MakeUnique<FetchCallback>(callback), fetch_event_id); 1010 base::MakeUnique<FetchCallback>(callback), fetch_event_id);
994 if (preload_request) { 1011 if (preload_request) {
995 context_->preload_requests.AddWithID(std::move(preload_request), 1012 context_->preload_requests.AddWithID(std::move(preload_request),
996 fetch_event_id); 1013 fetch_event_id);
997 } 1014 }
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
1264 proxy_->onNavigationPreloadResponse(fetch_event_id, std::move(response), 1281 proxy_->onNavigationPreloadResponse(fetch_event_id, std::move(response),
1265 std::move(data_consumer_handle)); 1282 std::move(data_consumer_handle));
1266 } 1283 }
1267 1284
1268 void ServiceWorkerContextClient::OnNavigationPreloadError( 1285 void ServiceWorkerContextClient::OnNavigationPreloadError(
1269 int fetch_event_id, 1286 int fetch_event_id,
1270 std::unique_ptr<blink::WebServiceWorkerError> error) { 1287 std::unique_ptr<blink::WebServiceWorkerError> error) {
1271 proxy_->onNavigationPreloadError(fetch_event_id, std::move(error)); 1288 proxy_->onNavigationPreloadError(fetch_event_id, std::move(error));
1272 } 1289 }
1273 1290
1291 void ServiceWorkerContextClient::OnNavigationPreloadCompleted(
1292 int fetch_event_id) {
1293 proxy_->onNavigationPreloadCompleted(fetch_event_id);
1294 }
1295
1274 void ServiceWorkerContextClient::BindEventDispatcher( 1296 void ServiceWorkerContextClient::BindEventDispatcher(
1275 mojom::ServiceWorkerEventDispatcherRequest request) { 1297 mojom::ServiceWorkerEventDispatcherRequest request) {
1276 DCHECK(context_); 1298 DCHECK(context_);
1277 DCHECK(!context_->event_dispatcher_binding.is_bound()); 1299 DCHECK(!context_->event_dispatcher_binding.is_bound());
1278 context_->event_dispatcher_binding.Bind(std::move(request)); 1300 context_->event_dispatcher_binding.Bind(std::move(request));
1279 } 1301 }
1280 1302
1281 base::WeakPtr<ServiceWorkerContextClient> 1303 base::WeakPtr<ServiceWorkerContextClient>
1282 ServiceWorkerContextClient::GetWeakPtr() { 1304 ServiceWorkerContextClient::GetWeakPtr() {
1283 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); 1305 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread());
1284 DCHECK(context_); 1306 DCHECK(context_);
1285 return context_->weak_factory.GetWeakPtr(); 1307 return context_->weak_factory.GetWeakPtr();
1286 } 1308 }
1287 1309
1288 } // namespace content 1310 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698