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

Side by Side Diff: content/browser/service_worker/service_worker_fetch_dispatcher.cc

Issue 2645493002: Increase the lifetime of Navigation Preload related objects. (Closed)
Patch Set: send abort error and fix flaky test and add abort-when-responded layouttest 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 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 "content/browser/service_worker/service_worker_fetch_dispatcher.h" 5 #include "content/browser/service_worker/service_worker_fetch_dispatcher.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoader); 68 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoader);
69 }; 69 };
70 70
71 // This class wraps a mojo::InterfacePtr<URLLoaderClient>. It also is a 71 // This class wraps a mojo::InterfacePtr<URLLoaderClient>. It also is a
72 // URLLoaderClient implementation and delegates URLLoaderClient calls to the 72 // URLLoaderClient implementation and delegates URLLoaderClient calls to the
73 // wrapped client. 73 // wrapped client.
74 class DelegatingURLLoaderClient final : public mojom::URLLoaderClient { 74 class DelegatingURLLoaderClient final : public mojom::URLLoaderClient {
75 public: 75 public:
76 explicit DelegatingURLLoaderClient(mojom::URLLoaderClientPtr client) 76 explicit DelegatingURLLoaderClient(mojom::URLLoaderClientPtr client)
77 : binding_(this), client_(std::move(client)) {} 77 : binding_(this), client_(std::move(client)) {}
78 ~DelegatingURLLoaderClient() override {} 78 ~DelegatingURLLoaderClient() override {
79 if (!completed_) {
80 ResourceRequestCompletionStatus status;
81 status.error_code = net::ERR_ABORTED;
82 client_->OnComplete(status);
83 }
84 }
79 85
80 void OnDataDownloaded(int64_t data_length, int64_t encoded_length) override { 86 void OnDataDownloaded(int64_t data_length, int64_t encoded_length) override {
81 client_->OnDataDownloaded(data_length, encoded_length); 87 client_->OnDataDownloaded(data_length, encoded_length);
82 } 88 }
83 void OnTransferSizeUpdated(int32_t transfer_size_diff) override { 89 void OnTransferSizeUpdated(int32_t transfer_size_diff) override {
84 client_->OnTransferSizeUpdated(transfer_size_diff); 90 client_->OnTransferSizeUpdated(transfer_size_diff);
85 } 91 }
86 void OnReceiveResponse( 92 void OnReceiveResponse(
87 const ResourceResponseHead& head, 93 const ResourceResponseHead& head,
88 mojom::DownloadedTempFilePtr downloaded_file) override { 94 mojom::DownloadedTempFilePtr downloaded_file) override {
89 client_->OnReceiveResponse(head, std::move(downloaded_file)); 95 client_->OnReceiveResponse(head, std::move(downloaded_file));
90 } 96 }
91 void OnReceiveRedirect(const net::RedirectInfo& redirect_info, 97 void OnReceiveRedirect(const net::RedirectInfo& redirect_info,
92 const ResourceResponseHead& head) override { 98 const ResourceResponseHead& head) override {
93 client_->OnReceiveRedirect(redirect_info, head); 99 client_->OnReceiveRedirect(redirect_info, head);
94 } 100 }
95 void OnStartLoadingResponseBody( 101 void OnStartLoadingResponseBody(
96 mojo::ScopedDataPipeConsumerHandle body) override { 102 mojo::ScopedDataPipeConsumerHandle body) override {
97 client_->OnStartLoadingResponseBody(std::move(body)); 103 client_->OnStartLoadingResponseBody(std::move(body));
98 } 104 }
99 void OnComplete( 105 void OnComplete(
100 const ResourceRequestCompletionStatus& completion_status) override { 106 const ResourceRequestCompletionStatus& completion_status) override {
101 client_->OnComplete(completion_status); 107 client_->OnComplete(completion_status);
108 completed_ = true;
102 } 109 }
103 110
104 void Bind(mojom::URLLoaderClientAssociatedPtrInfo* ptr_info, 111 void Bind(mojom::URLLoaderClientAssociatedPtrInfo* ptr_info,
105 mojo::AssociatedGroup* associated_group) { 112 mojo::AssociatedGroup* associated_group) {
106 binding_.Bind(ptr_info, associated_group); 113 binding_.Bind(ptr_info, associated_group);
107 } 114 }
108 115
109 private: 116 private:
110 mojo::AssociatedBinding<mojom::URLLoaderClient> binding_; 117 mojo::AssociatedBinding<mojom::URLLoaderClient> binding_;
111 mojom::URLLoaderClientPtr client_; 118 mojom::URLLoaderClientPtr client_;
119 bool completed_ = false;
112 120
113 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoaderClient); 121 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoaderClient);
114 }; 122 };
115 123
116 using EventType = ServiceWorkerMetrics::EventType; 124 using EventType = ServiceWorkerMetrics::EventType;
117 EventType ResourceTypeToEventType(ResourceType resource_type) { 125 EventType ResourceTypeToEventType(ResourceType resource_type) {
118 switch (resource_type) { 126 switch (resource_type) {
119 case RESOURCE_TYPE_MAIN_FRAME: 127 case RESOURCE_TYPE_MAIN_FRAME:
120 return EventType::FETCH_MAIN_FRAME; 128 return EventType::FETCH_MAIN_FRAME;
121 case RESOURCE_TYPE_SUB_FRAME: 129 case RESOURCE_TYPE_SUB_FRAME:
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType( 168 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType(
161 ServiceWorkerFetchType type) { 169 ServiceWorkerFetchType type) {
162 if (type == ServiceWorkerFetchType::FOREIGN_FETCH) 170 if (type == ServiceWorkerFetchType::FOREIGN_FETCH)
163 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL; 171 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL;
164 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL; 172 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL;
165 } 173 }
166 174
167 void OnFetchEventFinished( 175 void OnFetchEventFinished(
168 ServiceWorkerVersion* version, 176 ServiceWorkerVersion* version,
169 int event_finish_id, 177 int event_finish_id,
170 mojom::URLLoaderFactoryPtr url_loader_factory,
171 std::unique_ptr<mojom::URLLoader> url_loader,
172 std::unique_ptr<mojom::URLLoaderClient> url_loader_client,
173 ServiceWorkerStatusCode status, 178 ServiceWorkerStatusCode status,
174 base::Time dispatch_event_time) { 179 base::Time dispatch_event_time) {
175 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT, 180 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT,
176 dispatch_event_time); 181 dispatch_event_time);
177 } 182 }
178 183
179 } // namespace 184 } // namespace
180 185
181 // Helper to receive the fetch event response even if 186 // Helper to receive the fetch event response even if
182 // ServiceWorkerFetchDispatcher has been destroyed. 187 // ServiceWorkerFetchDispatcher has been destroyed.
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 330
326 ResponseCallback* response_callback = 331 ResponseCallback* response_callback =
327 new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get()); 332 new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get());
328 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( 333 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>(
329 fetch_event_id, 334 fetch_event_id,
330 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run, 335 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run,
331 base::Owned(response_callback))); 336 base::Owned(response_callback)));
332 337
333 // |event_dispatcher| is owned by |version_|. So it is safe to pass the 338 // |event_dispatcher| is owned by |version_|. So it is safe to pass the
334 // unretained raw pointer of |version_| to OnFetchEventFinished callback. 339 // unretained raw pointer of |version_| to OnFetchEventFinished callback.
335 // Pass |url_loader_factory_|, |url_Loader_| and |url_loader_client_| to the
336 // callback to keep them alive while the FetchEvent is onging in the service
337 // worker.
338 version_->event_dispatcher()->DispatchFetchEvent( 340 version_->event_dispatcher()->DispatchFetchEvent(
339 fetch_event_id, *request_, std::move(preload_handle_), 341 fetch_event_id, *request_, std::move(preload_handle_),
340 base::Bind(&OnFetchEventFinished, base::Unretained(version_.get()), 342 base::Bind(&OnFetchEventFinished, base::Unretained(version_.get()),
341 event_finish_id, base::Passed(std::move(url_loader_factory_)), 343 event_finish_id));
342 base::Passed(std::move(url_loader_)),
343 base::Passed(std::move(url_loader_client_))));
344 } 344 }
345 345
346 void ServiceWorkerFetchDispatcher::DidFailToDispatch( 346 void ServiceWorkerFetchDispatcher::DidFailToDispatch(
347 ServiceWorkerStatusCode status) { 347 ServiceWorkerStatusCode status) {
348 EndNetLogEventWithServiceWorkerStatus( 348 EndNetLogEventWithServiceWorkerStatus(
349 net_log_, net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT, status); 349 net_log_, net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT, status);
350 DidFail(status); 350 DidFail(status);
351 } 351 }
352 352
353 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { 353 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) {
(...skipping 19 matching lines...) Expand all
373 did_complete_ = true; 373 did_complete_ = true;
374 net_log_.EndEvent( 374 net_log_.EndEvent(
375 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT, 375 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT,
376 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); 376 base::Bind(&NetLogFetchEventCallback, status, fetch_result));
377 377
378 FetchCallback fetch_callback = fetch_callback_; 378 FetchCallback fetch_callback = fetch_callback_;
379 scoped_refptr<ServiceWorkerVersion> version = version_; 379 scoped_refptr<ServiceWorkerVersion> version = version_;
380 fetch_callback.Run(status, fetch_result, response, version); 380 fetch_callback.Run(status, fetch_result, response, version);
381 } 381 }
382 382
383 void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( 383 bool ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload(
384 net::URLRequest* original_request) { 384 net::URLRequest* original_request) {
385 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME && 385 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME &&
386 resource_type_ != RESOURCE_TYPE_SUB_FRAME) { 386 resource_type_ != RESOURCE_TYPE_SUB_FRAME) {
387 return; 387 return false;
388 } 388 }
389 if (!version_->navigation_preload_state().enabled) 389 if (!version_->navigation_preload_state().enabled)
390 return; 390 return false;
391 // TODO(horo): Currently NavigationPreload doesn't support request body. 391 // TODO(horo): Currently NavigationPreload doesn't support request body.
392 if (!request_->blob_uuid.empty()) 392 if (!request_->blob_uuid.empty())
393 return; 393 return false;
394 394
395 ServiceWorkerVersion::NavigationPreloadSupportStatus support_status = 395 ServiceWorkerVersion::NavigationPreloadSupportStatus support_status =
396 version_->GetNavigationPreloadSupportStatus(); 396 version_->GetNavigationPreloadSupportStatus();
397 if (support_status != 397 if (support_status !=
398 ServiceWorkerVersion::NavigationPreloadSupportStatus::SUPPORTED) { 398 ServiceWorkerVersion::NavigationPreloadSupportStatus::SUPPORTED) {
399 return; 399 return false;
400 } 400 }
401 401
402 ResourceRequestInfoImpl* original_info = 402 ResourceRequestInfoImpl* original_info =
403 ResourceRequestInfoImpl::ForRequest(original_request); 403 ResourceRequestInfoImpl::ForRequest(original_request);
404 ResourceRequesterInfo* requester_info = original_info->requester_info(); 404 ResourceRequesterInfo* requester_info = original_info->requester_info();
405 if (IsBrowserSideNavigationEnabled()) { 405 if (IsBrowserSideNavigationEnabled()) {
406 DCHECK(requester_info->IsBrowserSideNavigation()); 406 DCHECK(requester_info->IsBrowserSideNavigation());
407 } else { 407 } else {
408 DCHECK(requester_info->IsRenderer()); 408 DCHECK(requester_info->IsRenderer());
409 if (!requester_info->filter()) 409 if (!requester_info->filter())
410 return; 410 return false;
411 } 411 }
412 412
413 DCHECK(!url_loader_factory_); 413 DCHECK(!url_loader_factory_);
414 mojom::URLLoaderFactoryPtr factory; 414 mojom::URLLoaderFactoryPtr factory;
415 URLLoaderFactoryImpl::Create( 415 URLLoaderFactoryImpl::Create(
416 ResourceRequesterInfo::CreateForNavigationPreload(requester_info), 416 ResourceRequesterInfo::CreateForNavigationPreload(requester_info),
417 mojo::MakeRequest(&url_loader_factory_)); 417 mojo::MakeRequest(&url_loader_factory_));
418 418
419 preload_handle_ = mojom::FetchEventPreloadHandle::New(); 419 preload_handle_ = mojom::FetchEventPreloadHandle::New();
420 420
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 mojo::MakeRequest(&url_loader_associated_ptr, 464 mojo::MakeRequest(&url_loader_associated_ptr,
465 url_loader_factory_.associated_group()), 465 url_loader_factory_.associated_group()),
466 original_info->GetRouteID(), request_id, request, 466 original_info->GetRouteID(), request_id, request,
467 std::move(url_loader_client_associated_ptr_info)); 467 std::move(url_loader_client_associated_ptr_info));
468 468
469 std::unique_ptr<DelegatingURLLoader> url_loader( 469 std::unique_ptr<DelegatingURLLoader> url_loader(
470 new DelegatingURLLoader(std::move(url_loader_associated_ptr))); 470 new DelegatingURLLoader(std::move(url_loader_associated_ptr)));
471 preload_handle_->url_loader = url_loader->CreateInterfacePtrAndBind(); 471 preload_handle_->url_loader = url_loader->CreateInterfacePtrAndBind();
472 url_loader_ = std::move(url_loader); 472 url_loader_ = std::move(url_loader);
473 url_loader_client_ = std::move(url_loader_client); 473 url_loader_client_ = std::move(url_loader_client);
474 return true;
474 } 475 }
475 476
476 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() 477 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType()
477 const { 478 const {
478 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) 479 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH)
479 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; 480 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH;
480 return ResourceTypeToEventType(resource_type_); 481 return ResourceTypeToEventType(resource_type_);
481 } 482 }
482 483
483 } // namespace content 484 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698