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

Side by Side Diff: content/browser/loader/resource_dispatcher_host_impl.cc

Issue 2239273002: Don't use SSLStatus from FrameHostMsg_DidCommitProvisionalLoad and instead cache it on the browser … (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Store SSLStatus in NavigationHandle Created 4 years, 3 months 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc e-loading 5 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc e-loading
6 6
7 #include "content/browser/loader/resource_dispatcher_host_impl.h" 7 #include "content/browser/loader/resource_dispatcher_host_impl.h"
8 8
9 #include <stddef.h> 9 #include <stddef.h>
10 10
(...skipping 24 matching lines...) Expand all
35 #include "base/time/time.h" 35 #include "base/time/time.h"
36 #include "content/browser/appcache/appcache_interceptor.h" 36 #include "content/browser/appcache/appcache_interceptor.h"
37 #include "content/browser/appcache/chrome_appcache_service.h" 37 #include "content/browser/appcache/chrome_appcache_service.h"
38 #include "content/browser/bad_message.h" 38 #include "content/browser/bad_message.h"
39 #include "content/browser/blob_storage/chrome_blob_storage_context.h" 39 #include "content/browser/blob_storage/chrome_blob_storage_context.h"
40 #include "content/browser/cert_store_impl.h" 40 #include "content/browser/cert_store_impl.h"
41 #include "content/browser/child_process_security_policy_impl.h" 41 #include "content/browser/child_process_security_policy_impl.h"
42 #include "content/browser/download/download_resource_handler.h" 42 #include "content/browser/download/download_resource_handler.h"
43 #include "content/browser/download/save_file_resource_handler.h" 43 #include "content/browser/download/save_file_resource_handler.h"
44 #include "content/browser/frame_host/frame_tree.h" 44 #include "content/browser/frame_host/frame_tree.h"
45 #include "content/browser/frame_host/navigation_handle_impl.h"
45 #include "content/browser/frame_host/navigation_request_info.h" 46 #include "content/browser/frame_host/navigation_request_info.h"
46 #include "content/browser/frame_host/navigator.h" 47 #include "content/browser/frame_host/navigator.h"
47 #include "content/browser/loader/async_resource_handler.h" 48 #include "content/browser/loader/async_resource_handler.h"
48 #include "content/browser/loader/async_revalidation_manager.h" 49 #include "content/browser/loader/async_revalidation_manager.h"
49 #include "content/browser/loader/cross_site_resource_handler.h" 50 #include "content/browser/loader/cross_site_resource_handler.h"
50 #include "content/browser/loader/detachable_resource_handler.h" 51 #include "content/browser/loader/detachable_resource_handler.h"
51 #include "content/browser/loader/loader_delegate.h" 52 #include "content/browser/loader/loader_delegate.h"
52 #include "content/browser/loader/mime_type_resource_handler.h" 53 #include "content/browser/loader/mime_type_resource_handler.h"
53 #include "content/browser/loader/mojo_async_resource_handler.h" 54 #include "content/browser/loader/mojo_async_resource_handler.h"
54 #include "content/browser/loader/navigation_resource_handler.h" 55 #include "content/browser/loader/navigation_resource_handler.h"
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 if (frame_host) 415 if (frame_host)
415 routing_ids->insert(frame_host->GetGlobalFrameRoutingId()); 416 routing_ids->insert(frame_host->GetGlobalFrameRoutingId());
416 if (pending_frame_host) 417 if (pending_frame_host)
417 routing_ids->insert(pending_frame_host->GetGlobalFrameRoutingId()); 418 routing_ids->insert(pending_frame_host->GetGlobalFrameRoutingId());
418 } 419 }
419 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 420 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
420 base::Bind(&NotifyForRouteSetOnIO, frame_callback, 421 base::Bind(&NotifyForRouteSetOnIO, frame_callback,
421 base::Passed(std::move(routing_ids)))); 422 base::Passed(std::move(routing_ids))));
422 } 423 }
423 424
425 void UpdateSSLStatus(int render_process_id,
426 int render_frame_host_id,
427 int new_cert_id) {
428 DCHECK_CURRENTLY_ON(BrowserThread::UI);
429 RenderFrameHostImpl* render_frame_host =
430 RenderFrameHostImpl::FromID(render_process_id, render_frame_host_id);
431 if (!render_frame_host)
432 return;
433
434 NavigationHandleImpl* navigation_handle =
435 render_frame_host->navigation_handle();
436 if (!navigation_handle)
437 return;
438
439 navigation_handle->UpdateSSLCertId(new_cert_id);
nasko 2016/08/25 18:09:48 I think it is still possible to have race conditio
jam 2016/08/25 21:56:46 this method is just for one case (cross-site trans
clamy 2016/08/25 23:25:14 Regarding the possible race condition, the issue c
clamy 2016/08/26 00:06:57 Looking at the code some more, I'm wondering if it
jam 2016/08/26 03:36:43 The first paragraph makes it sound like there's a
jam 2016/08/26 03:36:43 which method are you referring to?
clamy 2016/08/26 18:14:30 Hmm my first paragraph is not very clear. What I m
clamy 2016/08/26 18:14:30 It was just an optimization to avoid thread hops,.
440 }
441
424 } // namespace 442 } // namespace
425 443
426 ResourceDispatcherHostImpl::HeaderInterceptorInfo::HeaderInterceptorInfo() {} 444 ResourceDispatcherHostImpl::HeaderInterceptorInfo::HeaderInterceptorInfo() {}
427 445
428 ResourceDispatcherHostImpl::HeaderInterceptorInfo::~HeaderInterceptorInfo() {} 446 ResourceDispatcherHostImpl::HeaderInterceptorInfo::~HeaderInterceptorInfo() {}
429 447
430 ResourceDispatcherHostImpl::HeaderInterceptorInfo::HeaderInterceptorInfo( 448 ResourceDispatcherHostImpl::HeaderInterceptorInfo::HeaderInterceptorInfo(
431 const HeaderInterceptorInfo& other) {} 449 const HeaderInterceptorInfo& other) {}
432 450
433 // static 451 // static
(...skipping 765 matching lines...) Expand 10 before | Expand all | Expand 10 after
1199 // ResourceRequestInfo rather than caching it locally. This lets us update 1217 // ResourceRequestInfo rather than caching it locally. This lets us update
1200 // the info object when a transfer occurs. 1218 // the info object when a transfer occurs.
1201 info->UpdateForTransfer(child_id, route_id, request_data.render_frame_id, 1219 info->UpdateForTransfer(child_id, route_id, request_data.render_frame_id,
1202 request_data.origin_pid, request_id, 1220 request_data.origin_pid, request_id,
1203 filter_->GetWeakPtr()); 1221 filter_->GetWeakPtr());
1204 1222
1205 // If a certificate is stored with the ResourceResponse, it has to be 1223 // If a certificate is stored with the ResourceResponse, it has to be
1206 // updated to be associated with the new process. 1224 // updated to be associated with the new process.
1207 if (loader->transferring_response()) { 1225 if (loader->transferring_response()) {
1208 UpdateResponseCertificateForTransfer(loader->transferring_response(), 1226 UpdateResponseCertificateForTransfer(loader->transferring_response(),
1209 loader->request()->ssl_info(), 1227 loader->request(),
1210 child_id); 1228 info);
1211 } 1229 }
1212 1230
1213 // Update maps that used the old IDs, if necessary. Some transfers in tests 1231 // Update maps that used the old IDs, if necessary. Some transfers in tests
1214 // do not actually use a different ID, so not all maps need to be updated. 1232 // do not actually use a different ID, so not all maps need to be updated.
1215 pending_loaders_[new_request_id] = std::move(loader); 1233 pending_loaders_[new_request_id] = std::move(loader);
1216 IncrementOutstandingRequestsMemory(1, *info); 1234 IncrementOutstandingRequestsMemory(1, *info);
1217 if (should_update_count) 1235 if (should_update_count)
1218 IncrementOutstandingRequestsCount(1, info); 1236 IncrementOutstandingRequestsCount(1, info);
1219 if (old_routing_id != new_routing_id) { 1237 if (old_routing_id != new_routing_id) {
1220 if (blocked_loaders_map_.find(old_routing_id) != 1238 if (blocked_loaders_map_.find(old_routing_id) !=
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after
1701 handler.reset(new MimeTypeResourceHandler(std::move(handler), this, 1719 handler.reset(new MimeTypeResourceHandler(std::move(handler), this,
1702 plugin_service, request)); 1720 plugin_service, request));
1703 1721
1704 ScopedVector<ResourceThrottle> throttles; 1722 ScopedVector<ResourceThrottle> throttles;
1705 1723
1706 // Add a NavigationResourceThrottle for navigations. 1724 // Add a NavigationResourceThrottle for navigations.
1707 // PlzNavigate: the throttle is unnecessary as communication with the UI 1725 // PlzNavigate: the throttle is unnecessary as communication with the UI
1708 // thread is handled by the NavigationURLloader. 1726 // thread is handled by the NavigationURLloader.
1709 if (!IsBrowserSideNavigationEnabled() && IsResourceTypeFrame(resource_type)) { 1727 if (!IsBrowserSideNavigationEnabled() && IsResourceTypeFrame(resource_type)) {
1710 throttles.push_back(new NavigationResourceThrottle( 1728 throttles.push_back(new NavigationResourceThrottle(
1711 request, delegate(), fetch_request_context_type)); 1729 request, delegate_, GetCertStore(), fetch_request_context_type));
1712 } 1730 }
1713 1731
1714 if (delegate_) { 1732 if (delegate_) {
1715 delegate_->RequestBeginning(request, 1733 delegate_->RequestBeginning(request,
1716 resource_context, 1734 resource_context,
1717 appcache_service, 1735 appcache_service,
1718 resource_type, 1736 resource_type,
1719 &throttles); 1737 &throttles);
1720 } 1738 }
1721 1739
(...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after
2290 // Hang on to a reference to ensure the blob is not released prior 2308 // Hang on to a reference to ensure the blob is not released prior
2291 // to the job being started. 2309 // to the job being started.
2292 storage::BlobProtocolHandler::SetRequestedBlobDataHandle( 2310 storage::BlobProtocolHandler::SetRequestedBlobDataHandle(
2293 new_request.get(), 2311 new_request.get(),
2294 blob_context->GetBlobDataFromPublicURL(new_request->url())); 2312 blob_context->GetBlobDataFromPublicURL(new_request->url()));
2295 } 2313 }
2296 2314
2297 // TODO(davidben): Attach AppCacheInterceptor. 2315 // TODO(davidben): Attach AppCacheInterceptor.
2298 2316
2299 std::unique_ptr<ResourceHandler> handler( 2317 std::unique_ptr<ResourceHandler> handler(
2300 new NavigationResourceHandler(new_request.get(), loader, delegate())); 2318 new NavigationResourceHandler(new_request.get(), loader, delegate(),
2319 GetCertStore()));
2301 2320
2302 // TODO(davidben): Pass in the appropriate appcache_service. Also fix the 2321 // TODO(davidben): Pass in the appropriate appcache_service. Also fix the
2303 // dependency on child_id/route_id. Those are used by the ResourceScheduler; 2322 // dependency on child_id/route_id. Those are used by the ResourceScheduler;
2304 // currently it's a no-op. 2323 // currently it's a no-op.
2305 handler = 2324 handler =
2306 AddStandardHandlers(new_request.get(), resource_type, resource_context, 2325 AddStandardHandlers(new_request.get(), resource_type, resource_context,
2307 info.begin_params.request_context_type, 2326 info.begin_params.request_context_type,
2308 nullptr, // appcache_service 2327 nullptr, // appcache_service
2309 -1, // child_id 2328 -1, // child_id
2310 -1, // route_id 2329 -1, // route_id
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
2638 } 2657 }
2639 2658
2640 if (is_sync_load) 2659 if (is_sync_load)
2641 load_flags |= net::LOAD_IGNORE_LIMITS; 2660 load_flags |= net::LOAD_IGNORE_LIMITS;
2642 2661
2643 return load_flags; 2662 return load_flags;
2644 } 2663 }
2645 2664
2646 void ResourceDispatcherHostImpl::UpdateResponseCertificateForTransfer( 2665 void ResourceDispatcherHostImpl::UpdateResponseCertificateForTransfer(
2647 ResourceResponse* response, 2666 ResourceResponse* response,
2648 const net::SSLInfo& ssl_info, 2667 net::URLRequest* request,
2649 int child_id) { 2668 ResourceRequestInfoImpl* info) {
2669 const net::SSLInfo& ssl_info = request->ssl_info();
2650 if (!ssl_info.cert) 2670 if (!ssl_info.cert)
2651 return; 2671 return;
2652 SSLStatus ssl; 2672 SSLStatus ssl;
2653 // DeserializeSecurityInfo() often takes security info sent by a 2673 // DeserializeSecurityInfo() often takes security info sent by a
2654 // renderer as input, in which case it's important to check that the 2674 // renderer as input, in which case it's important to check that the
2655 // security info deserializes properly and kill the renderer if 2675 // security info deserializes properly and kill the renderer if
2656 // not. In this case, however, the security info has been provided by 2676 // not. In this case, however, the security info has been provided by
2657 // the ResourceLoader, so it does not need to be treated as untrusted 2677 // the ResourceLoader, so it does not need to be treated as untrusted
2658 // data. 2678 // data.
2659 bool deserialized = 2679 bool deserialized =
2660 DeserializeSecurityInfo(response->head.security_info, &ssl); 2680 DeserializeSecurityInfo(response->head.security_info, &ssl);
2661 DCHECK(deserialized); 2681 DCHECK(deserialized);
2662 ssl.cert_id = GetCertStore()->StoreCert(ssl_info.cert.get(), child_id); 2682 ssl.cert_id = GetCertStore()->StoreCert(ssl_info.cert.get(),
2683 info->GetChildID());
2663 response->head.security_info = SerializeSecurityInfo(ssl); 2684 response->head.security_info = SerializeSecurityInfo(ssl);
2685
2686 if (info->GetResourceType() == RESOURCE_TYPE_MAIN_FRAME) {
2687 int render_process_id, render_frame_id;
2688 if (info->GetAssociatedRenderFrame(&render_process_id, &render_frame_id)) {
2689 BrowserThread::PostTask(BrowserThread::UI,
2690 FROM_HERE,
2691 base::Bind(UpdateSSLStatus,
2692 render_process_id,
2693 render_frame_id,
2694 ssl.cert_id));
2695 }
2696 }
2664 } 2697 }
2665 2698
2666 CertStore* ResourceDispatcherHostImpl::GetCertStore() { 2699 CertStore* ResourceDispatcherHostImpl::GetCertStore() {
2667 return cert_store_for_testing_ ? cert_store_for_testing_ 2700 return cert_store_for_testing_ ? cert_store_for_testing_
2668 : CertStore::GetInstance(); 2701 : CertStore::GetInstance();
2669 } 2702 }
2670 2703
2671 bool ResourceDispatcherHostImpl::ShouldServiceRequest( 2704 bool ResourceDispatcherHostImpl::ShouldServiceRequest(
2672 int process_type, 2705 int process_type,
2673 int child_id, 2706 int child_id,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2719 << iter->filesystem_url().spec(); 2752 << iter->filesystem_url().spec();
2720 return false; 2753 return false;
2721 } 2754 }
2722 } 2755 }
2723 } 2756 }
2724 } 2757 }
2725 return true; 2758 return true;
2726 } 2759 }
2727 2760
2728 } // namespace content 2761 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698