Index: content/browser/service_worker/service_worker_fetch_dispatcher.cc |
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
index 6c712a3f8a33e330593bf560ede0d358554c9191..0522102510df3aa6de445baaaa1994e21916bdd0 100644 |
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
@@ -75,7 +75,13 @@ class DelegatingURLLoaderClient final : public mojom::URLLoaderClient { |
public: |
explicit DelegatingURLLoaderClient(mojom::URLLoaderClientPtr client) |
: binding_(this), client_(std::move(client)) {} |
- ~DelegatingURLLoaderClient() override {} |
+ ~DelegatingURLLoaderClient() override { |
+ if (!completed_) { |
+ ResourceRequestCompletionStatus status; |
+ status.error_code = net::ERR_ABORTED; |
+ client_->OnComplete(status); |
+ } |
+ } |
void OnDataDownloaded(int64_t data_length, int64_t encoded_length) override { |
client_->OnDataDownloaded(data_length, encoded_length); |
@@ -99,6 +105,7 @@ class DelegatingURLLoaderClient final : public mojom::URLLoaderClient { |
void OnComplete( |
const ResourceRequestCompletionStatus& completion_status) override { |
client_->OnComplete(completion_status); |
+ completed_ = true; |
} |
void Bind(mojom::URLLoaderClientAssociatedPtrInfo* ptr_info, |
@@ -109,6 +116,7 @@ class DelegatingURLLoaderClient final : public mojom::URLLoaderClient { |
private: |
mojo::AssociatedBinding<mojom::URLLoaderClient> binding_; |
mojom::URLLoaderClientPtr client_; |
+ bool completed_ = false; |
DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoaderClient); |
}; |
@@ -167,9 +175,6 @@ ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType( |
void OnFetchEventFinished( |
ServiceWorkerVersion* version, |
int event_finish_id, |
- mojom::URLLoaderFactoryPtr url_loader_factory, |
- std::unique_ptr<mojom::URLLoader> url_loader, |
- std::unique_ptr<mojom::URLLoaderClient> url_loader_client, |
ServiceWorkerStatusCode status, |
base::Time dispatch_event_time) { |
version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT, |
@@ -332,15 +337,10 @@ void ServiceWorkerFetchDispatcher::DispatchFetchEvent() { |
// |event_dispatcher| is owned by |version_|. So it is safe to pass the |
// unretained raw pointer of |version_| to OnFetchEventFinished callback. |
- // Pass |url_loader_factory_|, |url_Loader_| and |url_loader_client_| to the |
- // callback to keep them alive while the FetchEvent is onging in the service |
- // worker. |
version_->event_dispatcher()->DispatchFetchEvent( |
fetch_event_id, *request_, std::move(preload_handle_), |
base::Bind(&OnFetchEventFinished, base::Unretained(version_.get()), |
- event_finish_id, base::Passed(std::move(url_loader_factory_)), |
- base::Passed(std::move(url_loader_)), |
- base::Passed(std::move(url_loader_client_)))); |
+ event_finish_id)); |
} |
void ServiceWorkerFetchDispatcher::DidFailToDispatch( |
@@ -380,23 +380,23 @@ void ServiceWorkerFetchDispatcher::Complete( |
fetch_callback.Run(status, fetch_result, response, version); |
} |
-void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( |
+bool ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( |
net::URLRequest* original_request) { |
if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME && |
resource_type_ != RESOURCE_TYPE_SUB_FRAME) { |
- return; |
+ return false; |
} |
if (!version_->navigation_preload_state().enabled) |
- return; |
+ return false; |
// TODO(horo): Currently NavigationPreload doesn't support request body. |
if (!request_->blob_uuid.empty()) |
- return; |
+ return false; |
ServiceWorkerVersion::NavigationPreloadSupportStatus support_status = |
version_->GetNavigationPreloadSupportStatus(); |
if (support_status != |
ServiceWorkerVersion::NavigationPreloadSupportStatus::SUPPORTED) { |
- return; |
+ return false; |
} |
ResourceRequestInfoImpl* original_info = |
@@ -407,7 +407,7 @@ void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( |
} else { |
DCHECK(requester_info->IsRenderer()); |
if (!requester_info->filter()) |
- return; |
+ return false; |
} |
DCHECK(!url_loader_factory_); |
@@ -471,6 +471,7 @@ void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( |
preload_handle_->url_loader = url_loader->CreateInterfacePtrAndBind(); |
url_loader_ = std::move(url_loader); |
url_loader_client_ = std::move(url_loader_client); |
+ return true; |
} |
ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() |