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

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 {
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 {
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 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 // TODO(horo): Check |version_|'s origin_trial_tokens() here if we use 345 // TODO(horo): Check |version_|'s origin_trial_tokens() here if we use
296 // Origin-Trial for NavigationPreload. 346 // Origin-Trial for NavigationPreload.
297 return; 347 return;
298 } 348 }
299 if (IsBrowserSideNavigationEnabled()) { 349 if (IsBrowserSideNavigationEnabled()) {
300 // TODO(horo): Support NavigationPreload with PlzNavigate. 350 // TODO(horo): Support NavigationPreload with PlzNavigate.
301 NOTIMPLEMENTED(); 351 NOTIMPLEMENTED();
302 return; 352 return;
303 } 353 }
304 DCHECK(!url_loader_factory_getter.is_null()); 354 DCHECK(!url_loader_factory_getter.is_null());
305 mojom::URLLoaderFactoryPtr factory; 355 DCHECK(!url_loader_factory_);
306 url_loader_factory_getter.Run(mojo::GetProxy(&factory)); 356 url_loader_factory_getter.Run(mojo::GetProxy(&url_loader_factory_));
307 if (url_loader_factory_getter.IsCancelled()) 357 if (url_loader_factory_getter.IsCancelled())
308 return; 358 return;
309 359
310 preload_handle_ = mojom::FetchEventPreloadHandle::New();
311 const ResourceRequestInfoImpl* original_info = 360 const ResourceRequestInfoImpl* original_info =
312 ResourceRequestInfoImpl::ForRequest(original_request); 361 ResourceRequestInfoImpl::ForRequest(original_request);
313 362
314 mojom::URLLoaderClientPtr url_loader_client;
315 preload_handle_->url_loader_client_request = GetProxy(&url_loader_client);
316
317 ResourceRequest request; 363 ResourceRequest request;
318 request.method = original_request->method(); 364 request.method = original_request->method();
319 request.url = original_request->url(); 365 request.url = original_request->url();
320 request.referrer = GURL(original_request->referrer()); 366 request.referrer = GURL(original_request->referrer());
321 request.referrer_policy = original_info->GetReferrerPolicy(); 367 request.referrer_policy = original_info->GetReferrerPolicy();
322 request.visibility_state = original_info->GetVisibilityState(); 368 request.visibility_state = original_info->GetVisibilityState();
323 request.load_flags = original_request->load_flags(); 369 request.load_flags = original_request->load_flags();
324 // Set to SUB_RESOURCE because we shouldn't trigger NavigationResourceThrottle 370 // Set to SUB_RESOURCE because we shouldn't trigger NavigationResourceThrottle
325 // for the service worker navigation preload request. 371 // for the service worker navigation preload request.
326 request.resource_type = RESOURCE_TYPE_SUB_RESOURCE; 372 request.resource_type = RESOURCE_TYPE_SUB_RESOURCE;
327 request.priority = original_request->priority(); 373 request.priority = original_request->priority();
328 request.skip_service_worker = SkipServiceWorker::ALL; 374 request.skip_service_worker = SkipServiceWorker::ALL;
329 request.do_not_prompt_for_login = true; 375 request.do_not_prompt_for_login = true;
330 request.render_frame_id = original_info->GetRenderFrameID(); 376 request.render_frame_id = original_info->GetRenderFrameID();
331 request.is_main_frame = original_info->IsMainFrame(); 377 request.is_main_frame = original_info->IsMainFrame();
332 request.parent_is_main_frame = original_info->ParentIsMainFrame(); 378 request.parent_is_main_frame = original_info->ParentIsMainFrame();
333 const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID(); 379 const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID();
334 DCHECK_LT(request_id, -1); 380 DCHECK_LT(request_id, -1);
335 // TODO(horo): Add "Service-Worker-Navigation-Preload" header. 381
336 // See: https://github.com/w3c/ServiceWorker/issues/920#issuecomment-251150270 382 preload_handle_ = mojom::FetchEventPreloadHandle::New();
337 factory->CreateLoaderAndStart(GetProxy(&preload_handle_->url_loader), 383 mojom::URLLoaderClientPtr url_loader_client_ptr;
338 original_info->GetRouteID(), request_id, 384 preload_handle_->url_loader_client_request =
339 request, std::move(url_loader_client)); 385 mojo::GetProxy(&url_loader_client_ptr);
386 std::unique_ptr<DelegatingURLLoaderClient> url_loader_client(
387 new DelegatingURLLoaderClient(std::move(url_loader_client_ptr)));
388 mojom::URLLoaderClientAssociatedPtrInfo url_loader_client_associated_ptr_info;
389 url_loader_client->Bind(&url_loader_client_associated_ptr_info,
390 url_loader_factory_.associated_group());
391 mojom::URLLoaderAssociatedPtr url_loader_associated_ptr;
392
393 // TODO(horo): Add "Service-Worker-Navigation-Preload" header. See
394 // https://ggetithub.com/w3c/ServiceWorker/issues/920#issuecomment-251150270
Ken Rockot(use gerrit already) 2016/10/27 16:20:23 nit: trampled URL
yhirano 2016/11/01 10:45:19 Done.
395 url_loader_factory_->CreateLoaderAndStart(
396 mojo::GetProxy(&url_loader_associated_ptr,
397 url_loader_factory_.associated_group()),
398 original_info->GetRouteID(), request_id, request,
399 std::move(url_loader_client_associated_ptr_info));
400
401 std::unique_ptr<DelegatingURLLoader> url_loader(
402 new DelegatingURLLoader(std::move(url_loader_associated_ptr)));
403 preload_handle_->url_loader = url_loader->CreateInterfacePtrAndBind();
404 url_loader_ = std::move(url_loader);
405 url_loader_client_ = std::move(url_loader_client);
340 } 406 }
341 407
342 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() 408 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType()
343 const { 409 const {
344 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) 410 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH)
345 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; 411 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH;
346 return ResourceTypeToEventType(resource_type_); 412 return ResourceTypeToEventType(resource_type_);
347 } 413 }
348 414
349 } // namespace content 415 } // 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