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

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

Issue 2034663002: ServiceWorker: Keep the worker alive until FetchEvent.waitUntil settles (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add an inline comment Created 4 years, 6 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 <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/trace_event/trace_event.h" 10 #include "base/trace_event/trace_event.h"
11 #include "content/browser/service_worker/embedded_worker_status.h" 11 #include "content/browser/service_worker/embedded_worker_status.h"
12 #include "content/browser/service_worker/service_worker_version.h" 12 #include "content/browser/service_worker/service_worker_version.h"
13 #include "content/common/service_worker/service_worker_messages.h" 13 #include "content/common/service_worker/service_worker_messages.h"
14 #include "content/common/service_worker/service_worker_utils.h"
14 15
15 namespace content { 16 namespace content {
16 17
17 namespace { 18 namespace {
18 using EventType = ServiceWorkerMetrics::EventType; 19 using EventType = ServiceWorkerMetrics::EventType;
19 EventType ResourceTypeToEventType(ResourceType resource_type) { 20 EventType ResourceTypeToEventType(ResourceType resource_type) {
20 switch (resource_type) { 21 switch (resource_type) {
21 case RESOURCE_TYPE_MAIN_FRAME: 22 case RESOURCE_TYPE_MAIN_FRAME:
22 return EventType::FETCH_MAIN_FRAME; 23 return EventType::FETCH_MAIN_FRAME;
23 case RESOURCE_TYPE_SUB_FRAME: 24 case RESOURCE_TYPE_SUB_FRAME:
24 return EventType::FETCH_SUB_FRAME; 25 return EventType::FETCH_SUB_FRAME;
25 case RESOURCE_TYPE_SHARED_WORKER: 26 case RESOURCE_TYPE_SHARED_WORKER:
26 return EventType::FETCH_SHARED_WORKER; 27 return EventType::FETCH_SHARED_WORKER;
27 case RESOURCE_TYPE_SERVICE_WORKER: 28 case RESOURCE_TYPE_SERVICE_WORKER:
28 case RESOURCE_TYPE_LAST_TYPE: 29 case RESOURCE_TYPE_LAST_TYPE:
29 NOTREACHED() << resource_type; 30 NOTREACHED() << resource_type;
30 return EventType::FETCH_SUB_RESOURCE; 31 return EventType::FETCH_SUB_RESOURCE;
31 default: 32 default:
32 return EventType::FETCH_SUB_RESOURCE; 33 return EventType::FETCH_SUB_RESOURCE;
33 } 34 }
34 } 35 }
36
37 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType(
38 ServiceWorkerFetchType type) {
39 if (type == ServiceWorkerFetchType::FOREIGN_FETCH)
40 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL;
41 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL;
42 }
35 } // namespace 43 } // namespace
36 44
37 ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher( 45 ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher(
38 std::unique_ptr<ServiceWorkerFetchRequest> request, 46 std::unique_ptr<ServiceWorkerFetchRequest> request,
39 ServiceWorkerVersion* version, 47 ServiceWorkerVersion* version,
40 ResourceType resource_type, 48 ResourceType resource_type,
41 const base::Closure& prepare_callback, 49 const base::Closure& prepare_callback,
42 const FetchCallback& fetch_callback) 50 const FetchCallback& fetch_callback)
43 : version_(version), 51 : version_(version),
44 prepare_callback_(prepare_callback), 52 prepare_callback_(prepare_callback),
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 } 96 }
89 97
90 void ServiceWorkerFetchDispatcher::DispatchFetchEvent() { 98 void ServiceWorkerFetchDispatcher::DispatchFetchEvent() {
91 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()) 99 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status())
92 << "Worker stopped too soon after it was started."; 100 << "Worker stopped too soon after it was started.";
93 101
94 DCHECK(!prepare_callback_.is_null()); 102 DCHECK(!prepare_callback_.is_null());
95 base::Closure prepare_callback = prepare_callback_; 103 base::Closure prepare_callback = prepare_callback_;
96 prepare_callback.Run(); 104 prepare_callback.Run();
97 105
98 int request_id = version_->StartRequest( 106 int response_id = version_->StartRequest(
99 GetEventType(), base::Bind(&ServiceWorkerFetchDispatcher::DidFail, 107 GetEventType(), base::Bind(&ServiceWorkerFetchDispatcher::DidFail,
100 weak_factory_.GetWeakPtr())); 108 weak_factory_.GetWeakPtr()));
101 version_->DispatchEvent<ServiceWorkerHostMsg_FetchEventFinished>( 109 int event_finish_id = version_->StartRequest(
102 request_id, ServiceWorkerMsg_FetchEvent(request_id, *request_.get()), 110 FetchTypeToWaitUntilEventType(request_->fetch_type),
103 base::Bind(&ServiceWorkerFetchDispatcher::DidFinish, 111 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
104 weak_factory_.GetWeakPtr())); 112
113 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>(
114 response_id, base::Bind(&ServiceWorkerFetchDispatcher::DidFinish,
115 weak_factory_.GetWeakPtr()));
116 version_->RegisterSimpleRequest<ServiceWorkerHostMsg_FetchEventFinished>(
117 event_finish_id);
118 version_->DispatchEvent({response_id, event_finish_id},
119 ServiceWorkerMsg_FetchEvent(
120 response_id, event_finish_id, *request_.get()));
105 } 121 }
106 122
107 void ServiceWorkerFetchDispatcher::DidPrepare() { 123 void ServiceWorkerFetchDispatcher::DidPrepare() {
108 DCHECK(!prepare_callback_.is_null()); 124 DCHECK(!prepare_callback_.is_null());
109 base::Closure prepare_callback = prepare_callback_; 125 base::Closure prepare_callback = prepare_callback_;
110 prepare_callback.Run(); 126 prepare_callback.Run();
111 } 127 }
112 128
113 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { 129 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) {
114 DCHECK(!fetch_callback_.is_null()); 130 DCHECK(!fetch_callback_.is_null());
(...skipping 19 matching lines...) Expand all
134 } 150 }
135 151
136 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() 152 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType()
137 const { 153 const {
138 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) 154 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH)
139 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; 155 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH;
140 return ResourceTypeToEventType(resource_type_); 156 return ResourceTypeToEventType(resource_type_);
141 } 157 }
142 158
143 } // namespace content 159 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698