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

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 #include "services/service_manager/public/cpp/identity.h"
32 #include "services/service_manager/public/cpp/interface_provider_spec.h"
31 33
32 namespace content { 34 namespace content {
33 35
34 namespace { 36 namespace {
35 37
38 class DelegatingURLLoader final : public mojom::URLLoader {
39 public:
40 explicit DelegatingURLLoader(mojom::URLLoaderAssociatedPtr loader)
41 : binding_(this), loader_(std::move(loader)) {}
42 ~DelegatingURLLoader() override {}
43
44 void FollowRedirect() override { loader_->FollowRedirect(); }
45 void Cancel() override { loader_->Cancel(); }
46
47 mojom::URLLoaderPtr CreateInterfacePtrAndBind() {
48 return binding_.CreateInterfacePtrAndBind();
49 }
50
51 private:
52 mojo::Binding<mojom::URLLoader> binding_;
53 mojom::URLLoaderAssociatedPtr loader_;
54
55 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoader);
56 };
57
58 class DelegatingURLLoaderClient final : public mojom::URLLoaderClient {
59 public:
60 explicit DelegatingURLLoaderClient(mojom::URLLoaderClientPtr client)
61 : binding_(this), client_(std::move(client)) {}
62 ~DelegatingURLLoaderClient() override {}
63
64 void OnReceiveResponse(const ResourceResponseHead& head) override {
65 client_->OnReceiveResponse(head);
66 }
67 void OnStartLoadingResponseBody(
68 mojo::ScopedDataPipeConsumerHandle body) override {
69 client_->OnStartLoadingResponseBody(std::move(body));
70 }
71 void OnComplete(
72 const ResourceRequestCompletionStatus& completion_status) override {
73 client_->OnComplete(completion_status);
74 }
75
76 void Bind(mojom::URLLoaderClientAssociatedPtrInfo* ptr_info,
77 mojo::AssociatedGroup* associated_group) {
78 binding_.Bind(ptr_info, associated_group);
79 }
80
81 private:
82 mojo::AssociatedBinding<mojom::URLLoaderClient> binding_;
83 mojom::URLLoaderClientPtr client_;
84
85 DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoaderClient);
86 };
87
36 using EventType = ServiceWorkerMetrics::EventType; 88 using EventType = ServiceWorkerMetrics::EventType;
37 EventType ResourceTypeToEventType(ResourceType resource_type) { 89 EventType ResourceTypeToEventType(ResourceType resource_type) {
38 switch (resource_type) { 90 switch (resource_type) {
39 case RESOURCE_TYPE_MAIN_FRAME: 91 case RESOURCE_TYPE_MAIN_FRAME:
40 return EventType::FETCH_MAIN_FRAME; 92 return EventType::FETCH_MAIN_FRAME;
41 case RESOURCE_TYPE_SUB_FRAME: 93 case RESOURCE_TYPE_SUB_FRAME:
42 return EventType::FETCH_SUB_FRAME; 94 return EventType::FETCH_SUB_FRAME;
43 case RESOURCE_TYPE_SHARED_WORKER: 95 case RESOURCE_TYPE_SHARED_WORKER:
44 return EventType::FETCH_SHARED_WORKER; 96 return EventType::FETCH_SHARED_WORKER;
45 case RESOURCE_TYPE_SERVICE_WORKER: 97 case RESOURCE_TYPE_SERVICE_WORKER:
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 const net::NetLogWithSource& net_log, 183 const net::NetLogWithSource& net_log,
132 const base::Closure& prepare_callback, 184 const base::Closure& prepare_callback,
133 const FetchCallback& fetch_callback) 185 const FetchCallback& fetch_callback)
134 : version_(version), 186 : version_(version),
135 net_log_(net_log), 187 net_log_(net_log),
136 prepare_callback_(prepare_callback), 188 prepare_callback_(prepare_callback),
137 fetch_callback_(fetch_callback), 189 fetch_callback_(fetch_callback),
138 request_(std::move(request)), 190 request_(std::move(request)),
139 resource_type_(resource_type), 191 resource_type_(resource_type),
140 did_complete_(false), 192 did_complete_(false),
193 interface_registry_(service_manager::Identity(),
194 service_manager::InterfaceProviderSpec()),
141 weak_factory_(this) { 195 weak_factory_(this) {
142 net_log_.BeginEvent(net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT, 196 net_log_.BeginEvent(net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT,
143 net::NetLog::StringCallback( 197 net::NetLog::StringCallback(
144 "event_type", ServiceWorkerMetrics::EventTypeToString( 198 "event_type", ServiceWorkerMetrics::EventTypeToString(
145 GetEventType()))); 199 GetEventType())));
146 } 200 }
147 201
148 ServiceWorkerFetchDispatcher::~ServiceWorkerFetchDispatcher() { 202 ServiceWorkerFetchDispatcher::~ServiceWorkerFetchDispatcher() {
149 if (!did_complete_) 203 if (!did_complete_)
150 net_log_.EndEvent( 204 net_log_.EndEvent(
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 features::kServiceWorkerNavigationPreload)) { 348 features::kServiceWorkerNavigationPreload)) {
295 // TODO(horo): Check |version_|'s origin_trial_tokens() here if we use 349 // TODO(horo): Check |version_|'s origin_trial_tokens() here if we use
296 // Origin-Trial for NavigationPreload. 350 // Origin-Trial for NavigationPreload.
297 return; 351 return;
298 } 352 }
299 if (IsBrowserSideNavigationEnabled()) { 353 if (IsBrowserSideNavigationEnabled()) {
300 // TODO(horo): Support NavigationPreload with PlzNavigate. 354 // TODO(horo): Support NavigationPreload with PlzNavigate.
301 NOTIMPLEMENTED(); 355 NOTIMPLEMENTED();
302 return; 356 return;
303 } 357 }
358
359 DCHECK(!url_loader_factory_);
360 service_manager::mojom::InterfaceProviderPtr provider_proxy;
361 interface_registry_.Bind(mojo::GetProxy(&provider_proxy),
362 service_manager::Identity(),
363 service_manager::InterfaceProviderSpec());
364 interface_provider_.Bind(std::move(provider_proxy));
365 interface_registry_.AddInterface(url_loader_factory_getter);
366 interface_provider_.GetInterface(&url_loader_factory_);
367
304 DCHECK(!url_loader_factory_getter.is_null()); 368 DCHECK(!url_loader_factory_getter.is_null());
305 mojom::URLLoaderFactoryPtr factory; 369 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())
308 return;
309 370
310 preload_handle_ = mojom::FetchEventPreloadHandle::New();
311 const ResourceRequestInfoImpl* original_info = 371 const ResourceRequestInfoImpl* original_info =
312 ResourceRequestInfoImpl::ForRequest(original_request); 372 ResourceRequestInfoImpl::ForRequest(original_request);
313 373
314 mojom::URLLoaderClientPtr url_loader_client;
315 preload_handle_->url_loader_client_request = GetProxy(&url_loader_client);
316
317 ResourceRequest request; 374 ResourceRequest request;
318 request.method = original_request->method(); 375 request.method = original_request->method();
319 request.url = original_request->url(); 376 request.url = original_request->url();
320 request.referrer = GURL(original_request->referrer()); 377 request.referrer = GURL(original_request->referrer());
321 request.referrer_policy = original_info->GetReferrerPolicy(); 378 request.referrer_policy = original_info->GetReferrerPolicy();
322 request.visibility_state = original_info->GetVisibilityState(); 379 request.visibility_state = original_info->GetVisibilityState();
323 request.load_flags = original_request->load_flags(); 380 request.load_flags = original_request->load_flags();
324 // Set to SUB_RESOURCE because we shouldn't trigger NavigationResourceThrottle 381 // Set to SUB_RESOURCE because we shouldn't trigger NavigationResourceThrottle
325 // for the service worker navigation preload request. 382 // for the service worker navigation preload request.
326 request.resource_type = RESOURCE_TYPE_SUB_RESOURCE; 383 request.resource_type = RESOURCE_TYPE_SUB_RESOURCE;
327 request.priority = original_request->priority(); 384 request.priority = original_request->priority();
328 request.skip_service_worker = SkipServiceWorker::ALL; 385 request.skip_service_worker = SkipServiceWorker::ALL;
329 request.do_not_prompt_for_login = true; 386 request.do_not_prompt_for_login = true;
330 request.render_frame_id = original_info->GetRenderFrameID(); 387 request.render_frame_id = original_info->GetRenderFrameID();
331 request.is_main_frame = original_info->IsMainFrame(); 388 request.is_main_frame = original_info->IsMainFrame();
332 request.parent_is_main_frame = original_info->ParentIsMainFrame(); 389 request.parent_is_main_frame = original_info->ParentIsMainFrame();
333 const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID(); 390 const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID();
334 DCHECK_LT(request_id, -1); 391 DCHECK_LT(request_id, -1);
335 // TODO(horo): Add "Service-Worker-Navigation-Preload" header. 392
336 // See: https://github.com/w3c/ServiceWorker/issues/920#issuecomment-251150270 393 preload_handle_ = mojom::FetchEventPreloadHandle::New();
337 factory->CreateLoaderAndStart(GetProxy(&preload_handle_->url_loader), 394 mojom::URLLoaderClientPtr url_loader_client_ptr;
338 original_info->GetRouteID(), request_id, 395 preload_handle_->url_loader_client_request =
339 request, std::move(url_loader_client)); 396 mojo::GetProxy(&url_loader_client_ptr);
397 std::unique_ptr<DelegatingURLLoaderClient> url_loader_client(
398 new DelegatingURLLoaderClient(std::move(url_loader_client_ptr)));
399 mojom::URLLoaderClientAssociatedPtrInfo url_loader_client_associated_ptr_info;
400 url_loader_client->Bind(&url_loader_client_associated_ptr_info,
401 url_loader_factory_.associated_group());
402 mojom::URLLoaderAssociatedPtr url_loader_associated_ptr;
403
404 // TODO(horo): Add "Service-Worker-Navigation-Preload" header. See
405 // https://getithub.com/w3c/ServiceWorker/issues/920#issuecomment-251150270
406 url_loader_factory_->CreateLoaderAndStart(
407 mojo::GetProxy(&url_loader_associated_ptr,
408 url_loader_factory_.associated_group()),
409 original_info->GetRouteID(), request_id, request,
410 std::move(url_loader_client_associated_ptr_info));
411
412 std::unique_ptr<DelegatingURLLoader> url_loader(
413 new DelegatingURLLoader(std::move(url_loader_associated_ptr)));
414 preload_handle_->url_loader = url_loader->CreateInterfacePtrAndBind();
415 url_loader_ = std::move(url_loader);
416 url_loader_client_ = std::move(url_loader_client);
340 } 417 }
341 418
342 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() 419 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType()
343 const { 420 const {
344 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) 421 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH)
345 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; 422 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH;
346 return ResourceTypeToEventType(resource_type_); 423 return ResourceTypeToEventType(resource_type_);
347 } 424 }
348 425
349 } // namespace content 426 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698