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

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

Issue 2168513004: [DO NOT COMMIT] ServiceWorker: First touch of mojo (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove an unnecessary file Created 4 years, 4 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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 base::Bind(&NetLogServiceWorkerStatusCallback, status)); 62 base::Bind(&NetLogServiceWorkerStatusCallback, status));
63 } 63 }
64 64
65 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType( 65 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType(
66 ServiceWorkerFetchType type) { 66 ServiceWorkerFetchType type) {
67 if (type == ServiceWorkerFetchType::FOREIGN_FETCH) 67 if (type == ServiceWorkerFetchType::FOREIGN_FETCH)
68 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL; 68 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL;
69 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL; 69 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL;
70 } 70 }
71 71
72 template<typename T, typename U>
73 T MojoType(const U& type) {
74 return static_cast<T>(type);
75 }
76
77 #define CastAndCopyToMojo(from, to) do { \
78 from = MojoType<decltype(from)>(to); \
79 } while(false)
80
81 blink::mojom::ServiceWorkerFetchRequestPtr CreateMojoType(
82 const content::ServiceWorkerFetchRequest* request) {
83 auto mojo_request = blink::mojom::ServiceWorkerFetchRequest::New();
84 CastAndCopyToMojo(mojo_request->mode, request->mode);
85 mojo_request->is_main_resource_load = request->is_main_resource_load;
86 CastAndCopyToMojo(mojo_request->request_context_type,
87 request->request_context_type);
88 CastAndCopyToMojo(mojo_request->frame_type, request->frame_type);
89 mojo_request->url = request->url;
90 mojo_request->method = request->method;
91 // mojo_request->headers = request->headers;
92 mojo_request->blob_uuid = request->blob_uuid;
93 // mojo_request->referrer = request->referrer;
94 CastAndCopyToMojo(mojo_request->credentials_mode, request->credentials_mode);
95 CastAndCopyToMojo(mojo_request->redirect_mode, request->redirect_mode);
96 mojo_request->client_id = request->client_id;
97 mojo_request->is_reload = request->is_reload;
98 CastAndCopyToMojo(mojo_request->fetch_type, request->fetch_type);
99 return mojo_request;
100 }
101
72 } // namespace 102 } // namespace
73 103
74 // Helper to receive the fetch event response even if 104 // Helper to receive the fetch event response even if
75 // ServiceWorkerFetchDispatcher has been destroyed. 105 // ServiceWorkerFetchDispatcher has been destroyed.
76 class ServiceWorkerFetchDispatcher::ResponseCallback { 106 class ServiceWorkerFetchDispatcher::ResponseCallback {
77 public: 107 public:
78 ResponseCallback(base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher, 108 ResponseCallback(base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher,
79 ServiceWorkerVersion* version) 109 ServiceWorkerVersion* version)
80 : fetch_dispatcher_(fetch_dispatcher), version_(version) {} 110 : fetch_dispatcher_(fetch_dispatcher), version_(version) {}
81 111
(...skipping 11 matching lines...) Expand all
93 } 123 }
94 124
95 private: 125 private:
96 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_; 126 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_;
97 // Owns |this|. 127 // Owns |this|.
98 ServiceWorkerVersion* version_; 128 ServiceWorkerVersion* version_;
99 129
100 DISALLOW_COPY_AND_ASSIGN(ResponseCallback); 130 DISALLOW_COPY_AND_ASSIGN(ResponseCallback);
101 }; 131 };
102 132
133 class ServiceWorkerFetchDispatcher::ResponseMojoCallback {
134 public:
135 ResponseMojoCallback(
136 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher,
137 ServiceWorkerVersion* version)
138 : fetch_dispatcher_(fetch_dispatcher), version_(version) {
139 }
140
141 void Run(int request_id, bool handled, blink::mojom::ServiceWorkerResponsePtr response) {
142 LOG(ERROR) << "ServiceWorkerFetchDispatcher::ResponseMojoCallback";
143 LOG(ERROR) << "(handled: " << (handled ? "true": "false") << ")";
144 ServiceWorkerResponse result;
145 if (response) {
146 LOG(ERROR) << " url: " << response->url;
147 LOG(ERROR) << " status_code: " << response->status_code;
148 LOG(ERROR) << " status_text: " << response->status_text;
149 LOG(ERROR) << " blob_uuid: " << response->blob_uuid;
150 LOG(ERROR) << " blob_size: " << response->blob_size;
151 LOG(ERROR) << " stream_url: " << response->stream_url;
152 result.url = GURL(std::string(response->url));
153 result.status_code = response->status_code;
154 result.status_text = response->status_text;
155 result.blob_uuid = response->blob_uuid;
156 result.blob_size = response->blob_size;
157 result.stream_url = GURL(std::string(response->stream_url));
158 }
159 if (!version_->FinishRequest(request_id, handled))
160 NOTREACHED() << "Should only receive one reply per event";
161 LOG(ERROR) << "Complete";
162 // |fetch_dispatcher| is null if the URLRequest was killed.
163 if (fetch_dispatcher_)
164 fetch_dispatcher_->Complete(
165 SERVICE_WORKER_OK,
166 handled ? SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE
167 : SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK,
168 result);
169 }
170 private:
171 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_;
172 ServiceWorkerVersion* version_;
173 };
174
103 ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher( 175 ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher(
104 std::unique_ptr<ServiceWorkerFetchRequest> request, 176 std::unique_ptr<ServiceWorkerFetchRequest> request,
105 ServiceWorkerVersion* version, 177 ServiceWorkerVersion* version,
106 ResourceType resource_type, 178 ResourceType resource_type,
107 const net::BoundNetLog& net_log, 179 const net::BoundNetLog& net_log,
108 const base::Closure& prepare_callback, 180 const base::Closure& prepare_callback,
109 const FetchCallback& fetch_callback) 181 const FetchCallback& fetch_callback)
110 : version_(version), 182 : version_(version),
111 net_log_(net_log), 183 net_log_(net_log),
112 prepare_callback_(prepare_callback), 184 prepare_callback_(prepare_callback),
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 254
183 void ServiceWorkerFetchDispatcher::DispatchFetchEvent() { 255 void ServiceWorkerFetchDispatcher::DispatchFetchEvent() {
184 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()) 256 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status())
185 << "Worker stopped too soon after it was started."; 257 << "Worker stopped too soon after it was started.";
186 258
187 DCHECK(!prepare_callback_.is_null()); 259 DCHECK(!prepare_callback_.is_null());
188 base::Closure prepare_callback = prepare_callback_; 260 base::Closure prepare_callback = prepare_callback_;
189 prepare_callback.Run(); 261 prepare_callback.Run();
190 262
191 net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT); 263 net_log_.BeginEvent(net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT);
264
265
192 int response_id = version_->StartRequest( 266 int response_id = version_->StartRequest(
193 GetEventType(), 267 GetEventType(),
194 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch, 268 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch,
195 weak_factory_.GetWeakPtr())); 269 weak_factory_.GetWeakPtr()));
196 int event_finish_id = version_->StartRequest( 270 int event_finish_id = version_->StartRequest(
197 FetchTypeToWaitUntilEventType(request_->fetch_type), 271 FetchTypeToWaitUntilEventType(request_->fetch_type),
198 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); 272 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
199 273
274 // Try mojo
275 base::WeakPtr<blink::mojom::ServiceWorkerGlobalScopeClient> client =
276 version_->GetMojoServiceForRequest<
277 blink::mojom::ServiceWorkerGlobalScopeClient>(response_id);
278 if (client) {
279 LOG(ERROR) << "Mojo fetchevent!";
280 ResponseMojoCallback* mojo_callback =
281 new ResponseMojoCallback(weak_factory_.GetWeakPtr(), version_.get());
282 client->DispatchFetchEvent(response_id, event_finish_id,
283 CreateMojoType(request_.get()),
284 base::Bind(&ResponseMojoCallback::Run,
285 base::Owned(mojo_callback),
286 response_id));
287 return;
288 }
289
200 ResponseCallback* response_callback = 290 ResponseCallback* response_callback =
201 new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get()); 291 new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get());
202 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( 292 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>(
203 response_id, 293 response_id,
204 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run, 294 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run,
205 base::Owned(response_callback))); 295 base::Owned(response_callback)));
206 version_->RegisterSimpleRequest<ServiceWorkerHostMsg_FetchEventFinished>( 296 version_->RegisterSimpleRequest<ServiceWorkerHostMsg_FetchEventFinished>(
207 event_finish_id); 297 event_finish_id);
208 version_->DispatchEvent({response_id, event_finish_id}, 298 version_->DispatchEvent({response_id, event_finish_id},
209 ServiceWorkerMsg_FetchEvent( 299 ServiceWorkerMsg_FetchEvent(
210 response_id, event_finish_id, *request_.get())); 300 response_id, event_finish_id, *request_.get()));
301
211 } 302 }
212 303
213 void ServiceWorkerFetchDispatcher::DidFailToDispatch( 304 void ServiceWorkerFetchDispatcher::DidFailToDispatch(
214 ServiceWorkerStatusCode status) { 305 ServiceWorkerStatusCode status) {
215 EndNetLogEventWithServiceWorkerStatus( 306 EndNetLogEventWithServiceWorkerStatus(
216 net_log_, net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT, status); 307 net_log_, net::NetLog::TYPE_SERVICE_WORKER_FETCH_EVENT, status);
217 DidFail(status); 308 DidFail(status);
218 } 309 }
219 310
220 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { 311 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) {
(...skipping 27 matching lines...) Expand all
248 } 339 }
249 340
250 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() 341 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType()
251 const { 342 const {
252 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) 343 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH)
253 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; 344 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH;
254 return ResourceTypeToEventType(resource_type_); 345 return ResourceTypeToEventType(resource_type_);
255 } 346 }
256 347
257 } // namespace content 348 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698