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

Unified Diff: content/browser/service_worker/service_worker_fetch_dispatcher.cc

Issue 2114893002: service worker: Clean up fetch event if URLRequest gets cancelled. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: revise Created 4 years, 5 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: 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 e499fa48abcdc7c0d8e2ffd1de58801939565b94..c08f2659c7b0f86dc4df5b515fd031a8733587c2 100644
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -71,6 +71,35 @@ ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType(
} // namespace
+// Helper to receive the fetch event response even if
+// ServiceWorkerFetchDispatcher has been destroyed.
+class ServiceWorkerFetchDispatcher::ResponseCallback {
+ public:
+ ResponseCallback(base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher,
+ ServiceWorkerVersion* version)
+ : fetch_dispatcher_(fetch_dispatcher), version_(version) {}
+
+ void Run(int request_id,
+ ServiceWorkerFetchEventResult fetch_result,
+ const ServiceWorkerResponse& response) {
+ const bool handled =
+ (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE);
+ if (!version_->FinishRequest(request_id, handled))
+ NOTREACHED() << "Should only receive one reply per event";
+
+ // |fetch_dispatcher| is null if the URLRequest was killed.
+ if (fetch_dispatcher_)
+ fetch_dispatcher_->DidFinish(request_id, fetch_result, response);
+ }
+
+ private:
+ base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_;
+ // Owns |this|.
+ ServiceWorkerVersion* version_;
+
+ DISALLOW_COPY_AND_ASSIGN(ResponseCallback);
+};
+
ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher(
std::unique_ptr<ServiceWorkerFetchRequest> request,
ServiceWorkerVersion* version,
@@ -168,9 +197,12 @@ void ServiceWorkerFetchDispatcher::DispatchFetchEvent() {
FetchTypeToWaitUntilEventType(request_->fetch_type),
base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
+ ResponseCallback* response_callback =
+ new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get());
version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>(
- response_id, base::Bind(&ServiceWorkerFetchDispatcher::DidFinish,
- weak_factory_.GetWeakPtr()));
+ response_id,
+ base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run,
+ base::Owned(response_callback)));
version_->RegisterSimpleRequest<ServiceWorkerHostMsg_FetchEventFinished>(
event_finish_id);
version_->DispatchEvent({response_id, event_finish_id},
@@ -196,12 +228,6 @@ void ServiceWorkerFetchDispatcher::DidFinish(
ServiceWorkerFetchEventResult fetch_result,
const ServiceWorkerResponse& response) {
net_log_.EndEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT);
-
- const bool handled =
- (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE);
- if (!version_->FinishRequest(request_id, handled))
- NOTREACHED() << "Should only receive one reply per event";
-
Complete(SERVICE_WORKER_OK, fetch_result, response);
}

Powered by Google App Engine
This is Rietveld 408576698