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

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