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

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

Issue 2449933003: Use Associated interfaces for mojo-loading (Closed)
Patch Set: fix Created 4 years, 1 month 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"
11 #include "base/feature_list.h" 11 #include "base/feature_list.h"
12 #include "base/time/time.h" 12 #include "base/time/time.h"
13 #include "base/trace_event/trace_event.h" 13 #include "base/trace_event/trace_event.h"
14 #include "content/browser/loader/resource_dispatcher_host_impl.h" 14 #include "content/browser/loader/resource_dispatcher_host_impl.h"
15 #include "content/browser/loader/resource_request_info_impl.h" 15 #include "content/browser/loader/resource_request_info_impl.h"
16 #include "content/browser/service_worker/embedded_worker_status.h" 16 #include "content/browser/service_worker/embedded_worker_status.h"
17 #include "content/browser/service_worker/service_worker_version.h" 17 #include "content/browser/service_worker/service_worker_version.h"
18 #include "content/common/service_worker/fetch_event_dispatcher.mojom.h" 18 #include "content/common/service_worker/fetch_event_dispatcher.mojom.h"
19 #include "content/common/service_worker/service_worker_messages.h" 19 #include "content/common/service_worker/service_worker_messages.h"
20 #include "content/common/service_worker/service_worker_status_code.h" 20 #include "content/common/service_worker/service_worker_status_code.h"
21 #include "content/common/service_worker/service_worker_types.h" 21 #include "content/common/service_worker/service_worker_types.h"
22 #include "content/common/service_worker/service_worker_utils.h" 22 #include "content/common/service_worker/service_worker_utils.h"
23 #include "content/common/url_loader.mojom.h"
24 #include "content/common/url_loader_factory.mojom.h"
25 #include "content/public/common/browser_side_navigation_policy.h" 23 #include "content/public/common/browser_side_navigation_policy.h"
26 #include "content/public/common/content_features.h" 24 #include "content/public/common/content_features.h"
25 #include "mojo/public/cpp/bindings/associated_binding.h"
26 #include "mojo/public/cpp/bindings/binding.h"
27 #include "net/log/net_log.h" 27 #include "net/log/net_log.h"
28 #include "net/log/net_log_capture_mode.h" 28 #include "net/log/net_log_capture_mode.h"
29 #include "net/log/net_log_event_type.h" 29 #include "net/log/net_log_event_type.h"
30 #include "net/url_request/url_request.h" 30 #include "net/url_request/url_request.h"
31 31
32 namespace content { 32 namespace content {
33 33
34 namespace { 34 namespace {
35 35
36 class DelegatingURLLoader final : public mojom::URLLoader {
horo 2016/11/02 02:24:23 Please write comments about the purpose of this cl
yhirano 2016/11/02 03:58:59 Done.
37 public:
38 explicit DelegatingURLLoader(mojom::URLLoaderAssociatedPtr loader)
39 : binding_(this), loader_(std::move(loader)) {}
40 ~DelegatingURLLoader() override {}
41
42 void FollowRedirect() override { loader_->FollowRedirect(); }
43 void Cancel() override { loader_->Cancel(); }
44
45 mojom::URLLoaderPtr CreateInterfacePtrAndBind() {
46 return binding_.CreateInterfacePtrAndBind();
47 }
48
49 private:
50 mojo::Binding<mojom::URLLoader> binding_;
51 mojom::URLLoaderAssociatedPtr loader_;
52
53 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoader);
54 };
55
56 class DelegatingURLLoaderClient final : public mojom::URLLoaderClient {
horo 2016/11/02 02:24:23 ditto
yhirano 2016/11/02 03:58:59 Done.
57 public:
58 explicit DelegatingURLLoaderClient(mojom::URLLoaderClientPtr client)
59 : binding_(this), client_(std::move(client)) {}
60 ~DelegatingURLLoaderClient() override {}
61
62 void OnReceiveResponse(const ResourceResponseHead& head) override {
63 client_->OnReceiveResponse(head);
64 }
65 void OnStartLoadingResponseBody(
66 mojo::ScopedDataPipeConsumerHandle body) override {
67 client_->OnStartLoadingResponseBody(std::move(body));
68 }
69 void OnComplete(
70 const ResourceRequestCompletionStatus& completion_status) override {
71 client_->OnComplete(completion_status);
72 }
73
74 void Bind(mojom::URLLoaderClientAssociatedPtrInfo* ptr_info,
75 mojo::AssociatedGroup* associated_group) {
76 binding_.Bind(ptr_info, associated_group);
77 }
78
79 private:
80 mojo::AssociatedBinding<mojom::URLLoaderClient> binding_;
81 mojom::URLLoaderClientPtr client_;
82
83 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoaderClient);
84 };
85
36 using EventType = ServiceWorkerMetrics::EventType; 86 using EventType = ServiceWorkerMetrics::EventType;
37 EventType ResourceTypeToEventType(ResourceType resource_type) { 87 EventType ResourceTypeToEventType(ResourceType resource_type) {
38 switch (resource_type) { 88 switch (resource_type) {
39 case RESOURCE_TYPE_MAIN_FRAME: 89 case RESOURCE_TYPE_MAIN_FRAME:
40 return EventType::FETCH_MAIN_FRAME; 90 return EventType::FETCH_MAIN_FRAME;
41 case RESOURCE_TYPE_SUB_FRAME: 91 case RESOURCE_TYPE_SUB_FRAME:
42 return EventType::FETCH_SUB_FRAME; 92 return EventType::FETCH_SUB_FRAME;
43 case RESOURCE_TYPE_SHARED_WORKER: 93 case RESOURCE_TYPE_SHARED_WORKER:
44 return EventType::FETCH_SHARED_WORKER; 94 return EventType::FETCH_SHARED_WORKER;
45 case RESOURCE_TYPE_SERVICE_WORKER: 95 case RESOURCE_TYPE_SERVICE_WORKER:
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 base::Bind(&NetLogServiceWorkerStatusCallback, status)); 127 base::Bind(&NetLogServiceWorkerStatusCallback, status));
78 } 128 }
79 129
80 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType( 130 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType(
81 ServiceWorkerFetchType type) { 131 ServiceWorkerFetchType type) {
82 if (type == ServiceWorkerFetchType::FOREIGN_FETCH) 132 if (type == ServiceWorkerFetchType::FOREIGN_FETCH)
83 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL; 133 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL;
84 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL; 134 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL;
85 } 135 }
86 136
87 void OnFetchEventFinished(ServiceWorkerVersion* version, 137 void OnFetchEventFinished(
88 int event_finish_id, 138 ServiceWorkerVersion* version,
89 ServiceWorkerStatusCode status, 139 int event_finish_id,
90 base::Time dispatch_event_time) { 140 mojom::URLLoaderFactoryPtr url_loader_factory,
141 std::unique_ptr<mojom::URLLoader> url_loader,
142 std::unique_ptr<mojom::URLLoaderClient> url_loader_client,
143 ServiceWorkerStatusCode status,
144 base::Time dispatch_event_time) {
91 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT, 145 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT,
92 dispatch_event_time); 146 dispatch_event_time);
93 } 147 }
94 148
95 } // namespace 149 } // namespace
96 150
97 // Helper to receive the fetch event response even if 151 // Helper to receive the fetch event response even if
98 // ServiceWorkerFetchDispatcher has been destroyed. 152 // ServiceWorkerFetchDispatcher has been destroyed.
99 class ServiceWorkerFetchDispatcher::ResponseCallback { 153 class ServiceWorkerFetchDispatcher::ResponseCallback {
100 public: 154 public:
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( 282 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>(
229 fetch_event_id, 283 fetch_event_id,
230 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run, 284 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run,
231 base::Owned(response_callback))); 285 base::Owned(response_callback)));
232 286
233 base::WeakPtr<mojom::FetchEventDispatcher> dispatcher = 287 base::WeakPtr<mojom::FetchEventDispatcher> dispatcher =
234 version_->GetMojoServiceForRequest<mojom::FetchEventDispatcher>( 288 version_->GetMojoServiceForRequest<mojom::FetchEventDispatcher>(
235 event_finish_id); 289 event_finish_id);
236 // |dispatcher| is owned by |version_|. So it is safe to pass the unretained 290 // |dispatcher| is owned by |version_|. So it is safe to pass the unretained
237 // raw pointer of |version_| to OnFetchEventFinished callback. 291 // raw pointer of |version_| to OnFetchEventFinished callback.
238 dispatcher->DispatchFetchEvent( 292 dispatcher->DispatchFetchEvent(
horo 2016/11/02 02:24:23 Write comment about passing those classes. Like: P
yhirano 2016/11/02 03:58:59 Done.
239 fetch_event_id, *request_, std::move(preload_handle_), 293 fetch_event_id, *request_, std::move(preload_handle_),
240 base::Bind(&OnFetchEventFinished, base::Unretained(version_.get()), 294 base::Bind(&OnFetchEventFinished, base::Unretained(version_.get()),
241 event_finish_id)); 295 event_finish_id, base::Passed(std::move(url_loader_factory_)),
296 base::Passed(std::move(url_loader_)),
297 base::Passed(std::move(url_loader_client_))));
242 } 298 }
243 299
244 void ServiceWorkerFetchDispatcher::DidFailToDispatch( 300 void ServiceWorkerFetchDispatcher::DidFailToDispatch(
245 ServiceWorkerStatusCode status) { 301 ServiceWorkerStatusCode status) {
246 EndNetLogEventWithServiceWorkerStatus( 302 EndNetLogEventWithServiceWorkerStatus(
247 net_log_, net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT, status); 303 net_log_, net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT, status);
248 DidFail(status); 304 DidFail(status);
249 } 305 }
250 306
251 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { 307 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 features::kServiceWorkerNavigationPreload)) { 350 features::kServiceWorkerNavigationPreload)) {
295 // TODO(horo): Check |version_|'s origin_trial_tokens() here if we use 351 // TODO(horo): Check |version_|'s origin_trial_tokens() here if we use
296 // Origin-Trial for NavigationPreload. 352 // Origin-Trial for NavigationPreload.
297 return; 353 return;
298 } 354 }
299 if (IsBrowserSideNavigationEnabled()) { 355 if (IsBrowserSideNavigationEnabled()) {
300 // TODO(horo): Support NavigationPreload with PlzNavigate. 356 // TODO(horo): Support NavigationPreload with PlzNavigate.
301 NOTIMPLEMENTED(); 357 NOTIMPLEMENTED();
302 return; 358 return;
303 } 359 }
360
361 DCHECK(!url_loader_factory_);
304 DCHECK(!url_loader_factory_getter.is_null()); 362 DCHECK(!url_loader_factory_getter.is_null());
305 mojom::URLLoaderFactoryPtr factory; 363 url_loader_factory_getter.Run(mojo::GetProxy(&url_loader_factory_));
306 url_loader_factory_getter.Run(mojo::GetProxy(&factory));
307 if (url_loader_factory_getter.IsCancelled()) 364 if (url_loader_factory_getter.IsCancelled())
308 return; 365 return;
309 366
310 preload_handle_ = mojom::FetchEventPreloadHandle::New();
311 const ResourceRequestInfoImpl* original_info = 367 const ResourceRequestInfoImpl* original_info =
312 ResourceRequestInfoImpl::ForRequest(original_request); 368 ResourceRequestInfoImpl::ForRequest(original_request);
313 369
314 mojom::URLLoaderClientPtr url_loader_client;
315 preload_handle_->url_loader_client_request = GetProxy(&url_loader_client);
316
317 ResourceRequest request; 370 ResourceRequest request;
318 request.method = original_request->method(); 371 request.method = original_request->method();
319 request.url = original_request->url(); 372 request.url = original_request->url();
320 request.referrer = GURL(original_request->referrer()); 373 request.referrer = GURL(original_request->referrer());
321 request.referrer_policy = original_info->GetReferrerPolicy(); 374 request.referrer_policy = original_info->GetReferrerPolicy();
322 request.visibility_state = original_info->GetVisibilityState(); 375 request.visibility_state = original_info->GetVisibilityState();
323 request.load_flags = original_request->load_flags(); 376 request.load_flags = original_request->load_flags();
324 // Set to SUB_RESOURCE because we shouldn't trigger NavigationResourceThrottle 377 // Set to SUB_RESOURCE because we shouldn't trigger NavigationResourceThrottle
325 // for the service worker navigation preload request. 378 // for the service worker navigation preload request.
326 request.resource_type = RESOURCE_TYPE_SUB_RESOURCE; 379 request.resource_type = RESOURCE_TYPE_SUB_RESOURCE;
327 request.priority = original_request->priority(); 380 request.priority = original_request->priority();
328 request.skip_service_worker = SkipServiceWorker::ALL; 381 request.skip_service_worker = SkipServiceWorker::ALL;
329 request.do_not_prompt_for_login = true; 382 request.do_not_prompt_for_login = true;
330 request.render_frame_id = original_info->GetRenderFrameID(); 383 request.render_frame_id = original_info->GetRenderFrameID();
331 request.is_main_frame = original_info->IsMainFrame(); 384 request.is_main_frame = original_info->IsMainFrame();
332 request.parent_is_main_frame = original_info->ParentIsMainFrame(); 385 request.parent_is_main_frame = original_info->ParentIsMainFrame();
333 const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID(); 386 const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID();
334 DCHECK_LT(request_id, -1); 387 DCHECK_LT(request_id, -1);
388
389 preload_handle_ = mojom::FetchEventPreloadHandle::New();
390 mojom::URLLoaderClientPtr url_loader_client_ptr;
391 preload_handle_->url_loader_client_request =
392 mojo::GetProxy(&url_loader_client_ptr);
393 std::unique_ptr<DelegatingURLLoaderClient> url_loader_client(
394 new DelegatingURLLoaderClient(std::move(url_loader_client_ptr)));
395 mojom::URLLoaderClientAssociatedPtrInfo url_loader_client_associated_ptr_info;
396 url_loader_client->Bind(&url_loader_client_associated_ptr_info,
397 url_loader_factory_.associated_group());
398 mojom::URLLoaderAssociatedPtr url_loader_associated_ptr;
399
335 // TODO(horo): Add "Service-Worker-Navigation-Preload" header. 400 // TODO(horo): Add "Service-Worker-Navigation-Preload" header.
336 // See: https://github.com/w3c/ServiceWorker/issues/920#issuecomment-251150270 401 // See: https://github.com/w3c/ServiceWorker/issues/920#issuecomment-251150270
337 factory->CreateLoaderAndStart(GetProxy(&preload_handle_->url_loader), 402 url_loader_factory_->CreateLoaderAndStart(
338 original_info->GetRouteID(), request_id, 403 mojo::GetProxy(&url_loader_associated_ptr,
339 request, std::move(url_loader_client)); 404 url_loader_factory_.associated_group()),
405 original_info->GetRouteID(), request_id, request,
406 std::move(url_loader_client_associated_ptr_info));
407
408 std::unique_ptr<DelegatingURLLoader> url_loader(
409 new DelegatingURLLoader(std::move(url_loader_associated_ptr)));
410 preload_handle_->url_loader = url_loader->CreateInterfacePtrAndBind();
411 url_loader_ = std::move(url_loader);
412 url_loader_client_ = std::move(url_loader_client);
340 } 413 }
341 414
342 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() 415 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType()
343 const { 416 const {
344 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) 417 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH)
345 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; 418 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH;
346 return ResourceTypeToEventType(resource_type_); 419 return ResourceTypeToEventType(resource_type_);
347 } 420 }
348 421
349 } // namespace content 422 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/service_worker/service_worker_fetch_dispatcher.h ('k') | content/child/resource_dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698