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

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

Issue 2098923002: Remove dependency of ResourceDispatcherHostImpl on RenderViewHostImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 5 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
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_manager.h" 43 #include "content/browser/download/save_file_manager.h"
44 #include "content/browser/download/save_file_resource_handler.h" 44 #include "content/browser/download/save_file_resource_handler.h"
45 #include "content/browser/frame_host/frame_tree.h" 45 #include "content/browser/frame_host/frame_tree.h"
46 #include "content/browser/frame_host/navigation_request_info.h" 46 #include "content/browser/frame_host/navigation_request_info.h"
47 #include "content/browser/frame_host/navigator.h" 47 #include "content/browser/frame_host/navigator.h"
48 #include "content/browser/loader/async_resource_handler.h" 48 #include "content/browser/loader/async_resource_handler.h"
49 #include "content/browser/loader/async_revalidation_manager.h" 49 #include "content/browser/loader/async_revalidation_manager.h"
50 #include "content/browser/loader/cross_site_resource_handler.h" 50 #include "content/browser/loader/cross_site_resource_handler.h"
51 #include "content/browser/loader/detachable_resource_handler.h" 51 #include "content/browser/loader/detachable_resource_handler.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/navigation_resource_handler.h" 54 #include "content/browser/loader/navigation_resource_handler.h"
54 #include "content/browser/loader/navigation_resource_throttle.h" 55 #include "content/browser/loader/navigation_resource_throttle.h"
55 #include "content/browser/loader/navigation_url_loader_impl_core.h" 56 #include "content/browser/loader/navigation_url_loader_impl_core.h"
56 #include "content/browser/loader/power_save_block_resource_throttle.h" 57 #include "content/browser/loader/power_save_block_resource_throttle.h"
57 #include "content/browser/loader/redirect_to_file_resource_handler.h" 58 #include "content/browser/loader/redirect_to_file_resource_handler.h"
58 #include "content/browser/loader/resource_message_filter.h" 59 #include "content/browser/loader/resource_message_filter.h"
59 #include "content/browser/loader/resource_request_info_impl.h" 60 #include "content/browser/loader/resource_request_info_impl.h"
60 #include "content/browser/loader/stream_resource_handler.h" 61 #include "content/browser/loader/stream_resource_handler.h"
61 #include "content/browser/loader/sync_resource_handler.h" 62 #include "content/browser/loader/sync_resource_handler.h"
62 #include "content/browser/loader/throttling_resource_handler.h" 63 #include "content/browser/loader/throttling_resource_handler.h"
63 #include "content/browser/loader/upload_data_stream_builder.h" 64 #include "content/browser/loader/upload_data_stream_builder.h"
64 #include "content/browser/renderer_host/render_view_host_impl.h"
65 #include "content/browser/resource_context_impl.h" 65 #include "content/browser/resource_context_impl.h"
66 #include "content/browser/service_worker/foreign_fetch_request_handler.h" 66 #include "content/browser/service_worker/foreign_fetch_request_handler.h"
67 #include "content/browser/service_worker/link_header_support.h" 67 #include "content/browser/service_worker/link_header_support.h"
68 #include "content/browser/service_worker/service_worker_request_handler.h" 68 #include "content/browser/service_worker/service_worker_request_handler.h"
69 #include "content/browser/streams/stream.h" 69 #include "content/browser/streams/stream.h"
70 #include "content/browser/streams/stream_context.h" 70 #include "content/browser/streams/stream_context.h"
71 #include "content/browser/streams/stream_registry.h" 71 #include "content/browser/streams/stream_registry.h"
72 #include "content/browser/web_contents/web_contents_impl.h" 72 #include "content/browser/web_contents/web_contents_impl.h"
73 #include "content/common/navigation_params.h" 73 #include "content/common/navigation_params.h"
74 #include "content/common/net/url_request_service_worker_data.h" 74 #include "content/common/net/url_request_service_worker_data.h"
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
540 ResourceDispatcherHostImpl::ResourceDispatcherHostImpl() 540 ResourceDispatcherHostImpl::ResourceDispatcherHostImpl()
541 : save_file_manager_(new SaveFileManager()), 541 : save_file_manager_(new SaveFileManager()),
542 request_id_(-1), 542 request_id_(-1),
543 is_shutdown_(false), 543 is_shutdown_(false),
544 num_in_flight_requests_(0), 544 num_in_flight_requests_(0),
545 max_num_in_flight_requests_(base::SharedMemory::GetHandleLimit()), 545 max_num_in_flight_requests_(base::SharedMemory::GetHandleLimit()),
546 max_num_in_flight_requests_per_process_(static_cast<int>( 546 max_num_in_flight_requests_per_process_(static_cast<int>(
547 max_num_in_flight_requests_ * kMaxRequestsPerProcessRatio)), 547 max_num_in_flight_requests_ * kMaxRequestsPerProcessRatio)),
548 max_outstanding_requests_cost_per_process_( 548 max_outstanding_requests_cost_per_process_(
549 kMaxOutstandingRequestsCostPerProcess), 549 kMaxOutstandingRequestsCostPerProcess),
550 filter_(NULL), 550 filter_(nullptr),
551 delegate_(NULL), 551 delegate_(nullptr),
552 loader_delegate_(nullptr),
552 allow_cross_origin_auth_prompt_(false), 553 allow_cross_origin_auth_prompt_(false),
553 cert_store_for_testing_(nullptr) { 554 cert_store_for_testing_(nullptr) {
554 DCHECK_CURRENTLY_ON(BrowserThread::UI); 555 DCHECK_CURRENTLY_ON(BrowserThread::UI);
555 DCHECK(!g_resource_dispatcher_host); 556 DCHECK(!g_resource_dispatcher_host);
556 g_resource_dispatcher_host = this; 557 g_resource_dispatcher_host = this;
557 558
558 GetContentClient()->browser()->ResourceDispatcherHostCreated(); 559 GetContentClient()->browser()->ResourceDispatcherHostCreated();
559 560
560 ANNOTATE_BENIGN_RACE( 561 ANNOTATE_BENIGN_RACE(
561 &last_user_gesture_time_, 562 &last_user_gesture_time_,
(...skipping 1741 matching lines...) Expand 10 before | Expand all | Expand 10 after
2303 std::move(handler)); 2304 std::move(handler));
2304 2305
2305 BeginRequestInternal(std::move(new_request), std::move(handler)); 2306 BeginRequestInternal(std::move(new_request), std::move(handler));
2306 } 2307 }
2307 2308
2308 void ResourceDispatcherHostImpl::EnableStaleWhileRevalidateForTesting() { 2309 void ResourceDispatcherHostImpl::EnableStaleWhileRevalidateForTesting() {
2309 if (!async_revalidation_manager_) 2310 if (!async_revalidation_manager_)
2310 async_revalidation_manager_.reset(new AsyncRevalidationManager); 2311 async_revalidation_manager_.reset(new AsyncRevalidationManager);
2311 } 2312 }
2312 2313
2314 void ResourceDispatcherHostImpl::SetLoaderDelegate(
2315 LoaderDelegate* loader_delegate) {
2316 loader_delegate_ = loader_delegate;
2317 }
2318
2313 // static 2319 // static
2314 int ResourceDispatcherHostImpl::CalculateApproximateMemoryCost( 2320 int ResourceDispatcherHostImpl::CalculateApproximateMemoryCost(
2315 net::URLRequest* request) { 2321 net::URLRequest* request) {
2316 // The following fields should be a minor size contribution (experimentally 2322 // The following fields should be a minor size contribution (experimentally
2317 // on the order of 100). However since they are variable length, it could 2323 // on the order of 100). However since they are variable length, it could
2318 // in theory be a sizeable contribution. 2324 // in theory be a sizeable contribution.
2319 int strings_cost = request->extra_request_headers().ToString().size() + 2325 int strings_cost = request->extra_request_headers().ToString().size() +
2320 request->original_url().spec().size() + 2326 request->original_url().spec().size() +
2321 request->referrer().size() + 2327 request->referrer().size() +
2322 request->method().size(); 2328 request->method().size();
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
2418 uint64_t b_uploading_size = 0; 2424 uint64_t b_uploading_size = 0;
2419 if (b.load_state.state == net::LOAD_STATE_SENDING_REQUEST) 2425 if (b.load_state.state == net::LOAD_STATE_SENDING_REQUEST)
2420 b_uploading_size = b.upload_size; 2426 b_uploading_size = b.upload_size;
2421 2427
2422 if (a_uploading_size != b_uploading_size) 2428 if (a_uploading_size != b_uploading_size)
2423 return a_uploading_size > b_uploading_size; 2429 return a_uploading_size > b_uploading_size;
2424 2430
2425 return a.load_state.state > b.load_state.state; 2431 return a.load_state.state > b.load_state.state;
2426 } 2432 }
2427 2433
2428 // static
2429 void ResourceDispatcherHostImpl::UpdateLoadInfoOnUIThread(
2430 std::unique_ptr<LoadInfoMap> info_map) {
2431 // TODO(erikchen): Remove ScopedTracker below once http://crbug.com/466285
2432 // is fixed.
2433 tracked_objects::ScopedTracker tracking_profile(
2434 FROM_HERE_WITH_EXPLICIT_FUNCTION(
2435 "466285 ResourceDispatcherHostImpl::UpdateLoadInfoOnUIThread"));
2436 DCHECK_CURRENTLY_ON(BrowserThread::UI);
2437 for (const auto& load_info : *info_map) {
2438 RenderViewHostImpl* view = RenderViewHostImpl::FromID(
2439 load_info.first.child_id, load_info.first.route_id);
2440 // The view could be gone at this point.
2441 if (view) {
2442 view->LoadStateChanged(load_info.second.url, load_info.second.load_state,
2443 load_info.second.upload_position,
2444 load_info.second.upload_size);
2445 }
2446 }
2447 }
2448
2449 std::unique_ptr<ResourceDispatcherHostImpl::LoadInfoMap> 2434 std::unique_ptr<ResourceDispatcherHostImpl::LoadInfoMap>
2450 ResourceDispatcherHostImpl::GetLoadInfoForAllRoutes() { 2435 ResourceDispatcherHostImpl::GetLoadInfoForAllRoutes() {
2451 // Populate this map with load state changes, and then send them on to the UI 2436 // Populate this map with load state changes, and then send them on to the UI
2452 // thread where they can be passed along to the respective RVHs. 2437 // thread where they can be passed along to the respective RVHs.
2453 std::unique_ptr<LoadInfoMap> info_map(new LoadInfoMap()); 2438 std::unique_ptr<LoadInfoMap> info_map(new LoadInfoMap());
2454 2439
2455 for (const auto& loader : pending_loaders_) { 2440 for (const auto& loader : pending_loaders_) {
2456 net::URLRequest* request = loader.second->request(); 2441 net::URLRequest* request = loader.second->request();
2457 net::UploadProgress upload_progress = request->GetUploadProgress(); 2442 net::UploadProgress upload_progress = request->GetUploadProgress();
2458 2443
2459 LoadInfo load_info; 2444 LoadInfo load_info;
2460 load_info.url = request->url(); 2445 load_info.url = request->url();
2461 load_info.load_state = request->GetLoadState(); 2446 load_info.load_state = request->GetLoadState();
2462 load_info.upload_size = upload_progress.size(); 2447 load_info.upload_size = upload_progress.size();
2463 load_info.upload_position = upload_progress.position(); 2448 load_info.upload_position = upload_progress.position();
2464 2449
2465 GlobalRoutingID id(loader.second->GetRequestInfo()->GetGlobalRoutingID()); 2450 GlobalRoutingID id(loader.second->GetRequestInfo()->GetGlobalRoutingID());
2466 LoadInfoMap::iterator existing = info_map->find(id); 2451 LoadInfoMap::iterator existing = info_map->find(id);
2467 2452
2468 if (existing == info_map->end() || 2453 if (existing == info_map->end() ||
2469 LoadInfoIsMoreInteresting(load_info, existing->second)) { 2454 LoadInfoIsMoreInteresting(load_info, existing->second)) {
2470 (*info_map)[id] = load_info; 2455 (*info_map)[id] = load_info;
2471 } 2456 }
2472 } 2457 }
2473 return info_map; 2458 return info_map;
2474 } 2459 }
2475 2460
2476 void ResourceDispatcherHostImpl::UpdateLoadInfo() { 2461 void ResourceDispatcherHostImpl::UpdateLoadInfo() {
2462 if (!loader_delegate_)
jam 2016/06/28 16:23:49 do we really need this? i.e. we should just assume
scottmg 2016/06/28 18:33:39 Yeah, probably a good idea, done.
2463 return;
2464
2477 std::unique_ptr<LoadInfoMap> info_map(GetLoadInfoForAllRoutes()); 2465 std::unique_ptr<LoadInfoMap> info_map(GetLoadInfoForAllRoutes());
2478 2466
2479 // Stop the timer if there are no more pending requests. Future new requests 2467 // Stop the timer if there are no more pending requests. Future new requests
2480 // will restart it as necessary. 2468 // will restart it as necessary.
2481 // Also stop the timer if there are no loading clients, to avoid waking up 2469 // Also stop the timer if there are no loading clients, to avoid waking up
2482 // unnecessarily when there is a long running (hanging get) request. 2470 // unnecessarily when there is a long running (hanging get) request.
2483 if (info_map->empty() || !scheduler_->HasLoadingClients()) { 2471 if (info_map->empty() || !scheduler_->HasLoadingClients()) {
2484 update_load_states_timer_->Stop(); 2472 update_load_states_timer_->Stop();
2485 return; 2473 return;
2486 } 2474 }
2487 2475
2488 BrowserThread::PostTask( 2476 for (const auto& load_info : *info_map) {
2489 BrowserThread::UI, FROM_HERE, 2477 loader_delegate_->LoadStateChanged(
2490 base::Bind(&ResourceDispatcherHostImpl::UpdateLoadInfoOnUIThread, 2478 load_info.first, load_info.second.url, load_info.second.load_state,
2491 base::Passed(&info_map))); 2479 load_info.second.upload_position, load_info.second.upload_size);
2480 }
2492 } 2481 }
2493 2482
2494 void ResourceDispatcherHostImpl::BlockRequestsForRoute( 2483 void ResourceDispatcherHostImpl::BlockRequestsForRoute(
2495 const GlobalFrameRoutingId& global_routing_id) { 2484 const GlobalFrameRoutingId& global_routing_id) {
2496 DCHECK_CURRENTLY_ON(BrowserThread::IO); 2485 DCHECK_CURRENTLY_ON(BrowserThread::IO);
2497 DCHECK(blocked_loaders_map_.find(global_routing_id) == 2486 DCHECK(blocked_loaders_map_.find(global_routing_id) ==
2498 blocked_loaders_map_.end()) 2487 blocked_loaders_map_.end())
2499 << "BlockRequestsForRoute called multiple time for the same RFH"; 2488 << "BlockRequestsForRoute called multiple time for the same RFH";
2500 blocked_loaders_map_[global_routing_id] = 2489 blocked_loaders_map_[global_routing_id] =
2501 base::WrapUnique(new BlockedLoadersList()); 2490 base::WrapUnique(new BlockedLoadersList());
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
2649 ssl.cert_id = GetCertStore()->StoreCert(ssl_info.cert.get(), child_id); 2638 ssl.cert_id = GetCertStore()->StoreCert(ssl_info.cert.get(), child_id);
2650 response->head.security_info = SerializeSecurityInfo(ssl); 2639 response->head.security_info = SerializeSecurityInfo(ssl);
2651 } 2640 }
2652 2641
2653 CertStore* ResourceDispatcherHostImpl::GetCertStore() { 2642 CertStore* ResourceDispatcherHostImpl::GetCertStore() {
2654 return cert_store_for_testing_ ? cert_store_for_testing_ 2643 return cert_store_for_testing_ ? cert_store_for_testing_
2655 : CertStore::GetInstance(); 2644 : CertStore::GetInstance();
2656 } 2645 }
2657 2646
2658 } // namespace content 2647 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698