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

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