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

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

Issue 1542743002: [RDHI] Refactored blocked_loaders_map_ to key by render frame route id (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nasko nit Created 4 years, 10 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 #include <algorithm> 10 #include <algorithm>
(...skipping 21 matching lines...) Expand all
32 #include "base/time/time.h" 32 #include "base/time/time.h"
33 #include "content/browser/appcache/appcache_interceptor.h" 33 #include "content/browser/appcache/appcache_interceptor.h"
34 #include "content/browser/appcache/chrome_appcache_service.h" 34 #include "content/browser/appcache/chrome_appcache_service.h"
35 #include "content/browser/bad_message.h" 35 #include "content/browser/bad_message.h"
36 #include "content/browser/cert_store_impl.h" 36 #include "content/browser/cert_store_impl.h"
37 #include "content/browser/child_process_security_policy_impl.h" 37 #include "content/browser/child_process_security_policy_impl.h"
38 #include "content/browser/download/download_resource_handler.h" 38 #include "content/browser/download/download_resource_handler.h"
39 #include "content/browser/download/save_file_manager.h" 39 #include "content/browser/download/save_file_manager.h"
40 #include "content/browser/download/save_file_resource_handler.h" 40 #include "content/browser/download/save_file_resource_handler.h"
41 #include "content/browser/fileapi/chrome_blob_storage_context.h" 41 #include "content/browser/fileapi/chrome_blob_storage_context.h"
42 #include "content/browser/frame_host/frame_tree.h"
42 #include "content/browser/frame_host/navigation_request_info.h" 43 #include "content/browser/frame_host/navigation_request_info.h"
43 #include "content/browser/frame_host/navigator.h" 44 #include "content/browser/frame_host/navigator.h"
44 #include "content/browser/loader/async_resource_handler.h" 45 #include "content/browser/loader/async_resource_handler.h"
45 #include "content/browser/loader/async_revalidation_manager.h" 46 #include "content/browser/loader/async_revalidation_manager.h"
46 #include "content/browser/loader/cross_site_resource_handler.h" 47 #include "content/browser/loader/cross_site_resource_handler.h"
47 #include "content/browser/loader/detachable_resource_handler.h" 48 #include "content/browser/loader/detachable_resource_handler.h"
48 #include "content/browser/loader/mime_type_resource_handler.h" 49 #include "content/browser/loader/mime_type_resource_handler.h"
49 #include "content/browser/loader/navigation_resource_handler.h" 50 #include "content/browser/loader/navigation_resource_handler.h"
50 #include "content/browser/loader/navigation_resource_throttle.h" 51 #include "content/browser/loader/navigation_resource_throttle.h"
51 #include "content/browser/loader/navigation_url_loader_impl_core.h" 52 #include "content/browser/loader/navigation_url_loader_impl_core.h"
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 // slow bucket because a shocking number of aborts happen under 100ms. 460 // slow bucket because a shocking number of aborts happen under 100ms.
460 void RecordAbortRapporOnUI(const GURL& url, 461 void RecordAbortRapporOnUI(const GURL& url,
461 base::TimeDelta request_loading_time) { 462 base::TimeDelta request_loading_time) {
462 DCHECK_CURRENTLY_ON(BrowserThread::UI); 463 DCHECK_CURRENTLY_ON(BrowserThread::UI);
463 if (request_loading_time.InMilliseconds() < 100) 464 if (request_loading_time.InMilliseconds() < 100)
464 GetContentClient()->browser()->RecordURLMetric("Net.ErrAborted.Fast", url); 465 GetContentClient()->browser()->RecordURLMetric("Net.ErrAborted.Fast", url);
465 else 466 else
466 GetContentClient()->browser()->RecordURLMetric("Net.ErrAborted.Slow", url); 467 GetContentClient()->browser()->RecordURLMetric("Net.ErrAborted.Slow", url);
467 } 468 }
468 469
470 // The following functions simplify code paths where the UI thread notifies the
471 // ResourceDispatcherHostImpl of information pertaining to loading behavior of
472 // frame hosts.
473 void NotifyForRouteOnIO(
474 base::Callback<void(ResourceDispatcherHostImpl*,
475 const GlobalFrameRoutingId&)> frame_callback,
476 const GlobalFrameRoutingId& global_routing_id) {
477 DCHECK_CURRENTLY_ON(BrowserThread::IO);
478 ResourceDispatcherHostImpl* rdh = ResourceDispatcherHostImpl::Get();
479 if (rdh)
480 frame_callback.Run(rdh, global_routing_id);
481 }
482
483 void NotifyForRouteFromUI(
484 const GlobalFrameRoutingId& global_routing_id,
485 base::Callback<void(ResourceDispatcherHostImpl*,
486 const GlobalFrameRoutingId&)> frame_callback) {
487 DCHECK_CURRENTLY_ON(BrowserThread::UI);
488 BrowserThread::PostTask(
489 BrowserThread::IO, FROM_HERE,
490 base::Bind(&NotifyForRouteOnIO, frame_callback, global_routing_id));
491 }
492
493 void NotifyForRouteSetOnIO(
494 base::Callback<void(ResourceDispatcherHostImpl*,
495 const GlobalFrameRoutingId&)> frame_callback,
496 scoped_ptr<std::set<GlobalFrameRoutingId>> routing_ids) {
497 DCHECK_CURRENTLY_ON(BrowserThread::IO);
498 for (const auto& routing_id : *routing_ids)
499 NotifyForRouteOnIO(frame_callback, routing_id);
500 }
501
502 void NotifyForEachFrameFromUI(
503 RenderFrameHost* root_frame_host,
504 base::Callback<void(ResourceDispatcherHostImpl*,
505 const GlobalFrameRoutingId&)> frame_callback) {
506 DCHECK_CURRENTLY_ON(BrowserThread::UI);
507 FrameTree* frame_tree = static_cast<RenderFrameHostImpl*>(root_frame_host)
508 ->frame_tree_node()
509 ->frame_tree();
510 DCHECK_EQ(root_frame_host, frame_tree->GetMainFrame());
511 scoped_ptr<std::set<GlobalFrameRoutingId>> routing_ids(
512 new std::set<GlobalFrameRoutingId>());
513 for (FrameTreeNode* node : frame_tree->Nodes()) {
514 RenderFrameHostImpl* frame_host = node->current_frame_host();
515 RenderFrameHostImpl* pending_frame_host =
516 IsBrowserSideNavigationEnabled()
517 ? node->render_manager()->speculative_frame_host()
518 : node->render_manager()->pending_frame_host();
519 if (frame_host)
520 routing_ids->insert(frame_host->GetGlobalFrameRoutingId());
521 if (pending_frame_host)
522 routing_ids->insert(pending_frame_host->GetGlobalFrameRoutingId());
523 }
524 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
525 base::Bind(&NotifyForRouteSetOnIO, frame_callback,
526 base::Passed(std::move(routing_ids))));
527 }
528
469 } // namespace 529 } // namespace
470 530
531 LoaderIOThreadNotifier::LoaderIOThreadNotifier(WebContents* web_contents)
532 : WebContentsObserver(web_contents) {}
533
534 LoaderIOThreadNotifier::~LoaderIOThreadNotifier() {}
535
536 void LoaderIOThreadNotifier::RenderFrameDeleted(
537 RenderFrameHost* render_frame_host) {
538 NotifyForRouteFromUI(
539 static_cast<RenderFrameHostImpl*>(render_frame_host)
540 ->GetGlobalFrameRoutingId(),
541 base::Bind(&ResourceDispatcherHostImpl::OnRenderFrameDeleted));
542 }
543
471 // static 544 // static
472 ResourceDispatcherHost* ResourceDispatcherHost::Get() { 545 ResourceDispatcherHost* ResourceDispatcherHost::Get() {
473 return g_resource_dispatcher_host; 546 return g_resource_dispatcher_host;
474 } 547 }
475 548
476 ResourceDispatcherHostImpl::ResourceDispatcherHostImpl() 549 ResourceDispatcherHostImpl::ResourceDispatcherHostImpl()
477 : save_file_manager_(new SaveFileManager()), 550 : save_file_manager_(new SaveFileManager()),
478 request_id_(-1), 551 request_id_(-1),
479 is_shutdown_(false), 552 is_shutdown_(false),
480 num_in_flight_requests_(0), 553 num_in_flight_requests_(0),
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 DCHECK(outstanding_requests_stats_map_.empty()); 600 DCHECK(outstanding_requests_stats_map_.empty());
528 DCHECK(g_resource_dispatcher_host); 601 DCHECK(g_resource_dispatcher_host);
529 g_resource_dispatcher_host = NULL; 602 g_resource_dispatcher_host = NULL;
530 } 603 }
531 604
532 // static 605 // static
533 ResourceDispatcherHostImpl* ResourceDispatcherHostImpl::Get() { 606 ResourceDispatcherHostImpl* ResourceDispatcherHostImpl::Get() {
534 return g_resource_dispatcher_host; 607 return g_resource_dispatcher_host;
535 } 608 }
536 609
610 // static
611 void ResourceDispatcherHostImpl::ResumeBlockedRequestsForRouteFromUI(
612 const GlobalFrameRoutingId& global_routing_id) {
613 DCHECK_CURRENTLY_ON(BrowserThread::UI);
614 NotifyForRouteFromUI(
615 global_routing_id,
616 base::Bind(&ResourceDispatcherHostImpl::ResumeBlockedRequestsForRoute));
617 }
618
619 // static
620 void ResourceDispatcherHostImpl::BlockRequestsForFrameFromUI(
621 RenderFrameHost* root_frame_host) {
622 DCHECK_CURRENTLY_ON(BrowserThread::UI);
623 NotifyForEachFrameFromUI(
624 root_frame_host,
625 base::Bind(&ResourceDispatcherHostImpl::BlockRequestsForRoute));
626 }
627
628 // static
629 void ResourceDispatcherHostImpl::ResumeBlockedRequestsForFrameFromUI(
630 RenderFrameHost* root_frame_host) {
631 DCHECK_CURRENTLY_ON(BrowserThread::UI);
632 NotifyForEachFrameFromUI(
633 root_frame_host,
634 base::Bind(&ResourceDispatcherHostImpl::ResumeBlockedRequestsForRoute));
635 }
636
637 // static
638 void ResourceDispatcherHostImpl::CancelBlockedRequestsForFrameFromUI(
639 RenderFrameHostImpl* root_frame_host) {
640 DCHECK_CURRENTLY_ON(BrowserThread::UI);
641 NotifyForEachFrameFromUI(
642 root_frame_host,
643 base::Bind(&ResourceDispatcherHostImpl::CancelBlockedRequestsForRoute));
644 }
645
537 void ResourceDispatcherHostImpl::SetDelegate( 646 void ResourceDispatcherHostImpl::SetDelegate(
538 ResourceDispatcherHostDelegate* delegate) { 647 ResourceDispatcherHostDelegate* delegate) {
539 delegate_ = delegate; 648 delegate_ = delegate;
540 } 649 }
541 650
542 void ResourceDispatcherHostImpl::SetAllowCrossOriginAuthPrompt(bool value) { 651 void ResourceDispatcherHostImpl::SetAllowCrossOriginAuthPrompt(bool value) {
543 allow_cross_origin_auth_prompt_ = value; 652 allow_cross_origin_auth_prompt_ = value;
544 } 653 }
545 654
546 void ResourceDispatcherHostImpl::AddResourceContext(ResourceContext* context) { 655 void ResourceDispatcherHostImpl::AddResourceContext(ResourceContext* context) {
(...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after
1083 1192
1084 // Make sure we shutdown the timer now, otherwise by the time our destructor 1193 // Make sure we shutdown the timer now, otherwise by the time our destructor
1085 // runs if the timer is still running the Task is deleted twice (once by 1194 // runs if the timer is still running the Task is deleted twice (once by
1086 // the MessageLoop and the second time by RepeatingTimer). 1195 // the MessageLoop and the second time by RepeatingTimer).
1087 update_load_states_timer_.reset(); 1196 update_load_states_timer_.reset();
1088 1197
1089 // Clear blocked requests if any left. 1198 // Clear blocked requests if any left.
1090 // Note that we have to do this in 2 passes as we cannot call 1199 // Note that we have to do this in 2 passes as we cannot call
1091 // CancelBlockedRequestsForRoute while iterating over 1200 // CancelBlockedRequestsForRoute while iterating over
1092 // blocked_loaders_map_, as it modifies it. 1201 // blocked_loaders_map_, as it modifies it.
1093 std::set<GlobalRoutingID> ids; 1202 std::set<GlobalFrameRoutingId> ids;
1094 for (const auto& blocked_loaders : blocked_loaders_map_) { 1203 for (const auto& blocked_loaders : blocked_loaders_map_) {
1095 std::pair<std::set<GlobalRoutingID>::iterator, bool> result = 1204 std::pair<std::set<GlobalFrameRoutingId>::iterator, bool> result =
1096 ids.insert(blocked_loaders.first); 1205 ids.insert(blocked_loaders.first);
1097 // We should not have duplicates. 1206 // We should not have duplicates.
1098 DCHECK(result.second); 1207 DCHECK(result.second);
1099 } 1208 }
1100 for (const auto& routing_id : ids) { 1209 for (const auto& routing_id : ids) {
1101 CancelBlockedRequestsForRoute(routing_id.child_id, routing_id.route_id); 1210 CancelBlockedRequestsForRoute(routing_id);
1102 } 1211 }
1103 1212
1104 scheduler_.reset(); 1213 scheduler_.reset();
1105 } 1214 }
1106 1215
1107 bool ResourceDispatcherHostImpl::OnMessageReceived( 1216 bool ResourceDispatcherHostImpl::OnMessageReceived(
1108 const IPC::Message& message, 1217 const IPC::Message& message,
1109 ResourceMessageFilter* filter) { 1218 ResourceMessageFilter* filter) {
1110 filter_ = filter; 1219 filter_ = filter;
1111 bool handled = true; 1220 bool handled = true;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1201 return false; 1310 return false;
1202 } 1311 }
1203 1312
1204 void ResourceDispatcherHostImpl::UpdateRequestForTransfer( 1313 void ResourceDispatcherHostImpl::UpdateRequestForTransfer(
1205 int child_id, 1314 int child_id,
1206 int route_id, 1315 int route_id,
1207 int request_id, 1316 int request_id,
1208 const ResourceHostMsg_Request& request_data, 1317 const ResourceHostMsg_Request& request_data,
1209 LoaderMap::iterator iter) { 1318 LoaderMap::iterator iter) {
1210 ResourceRequestInfoImpl* info = iter->second->GetRequestInfo(); 1319 ResourceRequestInfoImpl* info = iter->second->GetRequestInfo();
1211 GlobalRoutingID old_routing_id( 1320 GlobalFrameRoutingId old_routing_id(request_data.transferred_request_child_id,
1212 request_data.transferred_request_child_id, info->GetRouteID()); 1321 info->GetRenderFrameID());
1213 GlobalRequestID old_request_id(request_data.transferred_request_child_id, 1322 GlobalRequestID old_request_id(request_data.transferred_request_child_id,
1214 request_data.transferred_request_request_id); 1323 request_data.transferred_request_request_id);
1215 GlobalRoutingID new_routing_id(child_id, route_id); 1324 GlobalFrameRoutingId new_routing_id(child_id, request_data.render_frame_id);
1216 GlobalRequestID new_request_id(child_id, request_id); 1325 GlobalRequestID new_request_id(child_id, request_id);
1217 1326
1218 // Clear out data that depends on |info| before updating it. 1327 // Clear out data that depends on |info| before updating it.
1219 // We always need to move the memory stats to the new process. In contrast, 1328 // We always need to move the memory stats to the new process. In contrast,
1220 // stats.num_requests is only tracked for some requests (those that require 1329 // stats.num_requests is only tracked for some requests (those that require
1221 // file descriptors for their shared memory buffer). 1330 // file descriptors for their shared memory buffer).
1222 IncrementOutstandingRequestsMemory(-1, *info); 1331 IncrementOutstandingRequestsMemory(-1, *info);
1223 bool should_update_count = info->counted_as_in_flight_request(); 1332 bool should_update_count = info->counted_as_in_flight_request();
1224 if (should_update_count) 1333 if (should_update_count)
1225 IncrementOutstandingRequestsCount(-1, info); 1334 IncrementOutstandingRequestsCount(-1, info);
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after
1780 blink::WebReferrerPolicyDefault, 1889 blink::WebReferrerPolicyDefault,
1781 blink::WebPageVisibilityStateVisible, 1890 blink::WebPageVisibilityStateVisible,
1782 context, 1891 context,
1783 base::WeakPtr<ResourceMessageFilter>(), // filter 1892 base::WeakPtr<ResourceMessageFilter>(), // filter
1784 false, // report_raw_headers 1893 false, // report_raw_headers
1785 true, // is_async 1894 true, // is_async
1786 false, // is_using_lofi 1895 false, // is_using_lofi
1787 std::string()); // original_headers 1896 std::string()); // original_headers
1788 } 1897 }
1789 1898
1899 void ResourceDispatcherHostImpl::OnRenderFrameDeleted(
1900 const GlobalFrameRoutingId& global_routing_id) {
1901 CancelRequestsForRoute(global_routing_id);
1902 }
1903
1790 void ResourceDispatcherHostImpl::OnRenderViewHostCreated(int child_id, 1904 void ResourceDispatcherHostImpl::OnRenderViewHostCreated(int child_id,
1791 int route_id) { 1905 int route_id) {
1792 scheduler_->OnClientCreated(child_id, route_id); 1906 scheduler_->OnClientCreated(child_id, route_id);
1793 } 1907 }
1794 1908
1795 void ResourceDispatcherHostImpl::OnRenderViewHostDeleted( 1909 void ResourceDispatcherHostImpl::OnRenderViewHostDeleted(int child_id,
1796 int child_id, 1910 int route_id) {
1797 int route_id) {
1798 scheduler_->OnClientDeleted(child_id, route_id); 1911 scheduler_->OnClientDeleted(child_id, route_id);
1799 CancelRequestsForRoute(child_id, route_id);
1800 } 1912 }
1801 1913
1802 void ResourceDispatcherHostImpl::OnRenderViewHostSetIsLoading(int child_id, 1914 void ResourceDispatcherHostImpl::OnRenderViewHostSetIsLoading(int child_id,
1803 int route_id, 1915 int route_id,
1804 bool is_loading) { 1916 bool is_loading) {
1805 scheduler_->OnLoadingStateChanged(child_id, route_id, !is_loading); 1917 scheduler_->OnLoadingStateChanged(child_id, route_id, !is_loading);
1806 } 1918 }
1807 1919
1808 // This function is only used for saving feature. 1920 // This function is only used for saving feature.
1809 void ResourceDispatcherHostImpl::BeginSaveFile(const GURL& url, 1921 void ResourceDispatcherHostImpl::BeginSaveFile(const GURL& url,
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1875 ResourceLoader* loader = GetLoader(id); 1987 ResourceLoader* loader = GetLoader(id);
1876 // The response we were meant to resume could have already been canceled. 1988 // The response we were meant to resume could have already been canceled.
1877 if (loader) 1989 if (loader)
1878 loader->CompleteTransfer(); 1990 loader->CompleteTransfer();
1879 } 1991 }
1880 1992
1881 // The object died, so cancel and detach all requests associated with it except 1993 // The object died, so cancel and detach all requests associated with it except
1882 // for downloads and detachable resources, which belong to the browser process 1994 // for downloads and detachable resources, which belong to the browser process
1883 // even if initiated via a renderer. 1995 // even if initiated via a renderer.
1884 void ResourceDispatcherHostImpl::CancelRequestsForProcess(int child_id) { 1996 void ResourceDispatcherHostImpl::CancelRequestsForProcess(int child_id) {
1885 CancelRequestsForRoute(child_id, -1 /* cancel all */); 1997 CancelRequestsForRoute(
1998 GlobalFrameRoutingId(child_id, MSG_ROUTING_NONE /* cancel all */));
1886 registered_temp_files_.erase(child_id); 1999 registered_temp_files_.erase(child_id);
1887 } 2000 }
1888 2001
1889 void ResourceDispatcherHostImpl::CancelRequestsForRoute(int child_id, 2002 void ResourceDispatcherHostImpl::CancelRequestsForRoute(
1890 int route_id) { 2003 const GlobalFrameRoutingId& global_routing_id) {
1891 // Since pending_requests_ is a map, we first build up a list of all of the 2004 // Since pending_requests_ is a map, we first build up a list of all of the
1892 // matching requests to be cancelled, and then we cancel them. Since there 2005 // matching requests to be cancelled, and then we cancel them. Since there
1893 // may be more than one request to cancel, we cannot simply hold onto the map 2006 // may be more than one request to cancel, we cannot simply hold onto the map
1894 // iterators found in the first loop. 2007 // iterators found in the first loop.
1895 2008
1896 // Find the global ID of all matching elements. 2009 // Find the global ID of all matching elements.
2010 int child_id = global_routing_id.child_id;
2011 int route_id = global_routing_id.frame_routing_id;
2012 bool cancel_all_routes = (route_id == MSG_ROUTING_NONE);
2013
1897 bool any_requests_transferring = false; 2014 bool any_requests_transferring = false;
1898 std::vector<GlobalRequestID> matching_requests; 2015 std::vector<GlobalRequestID> matching_requests;
1899 for (const auto& loader : pending_loaders_) { 2016 for (const auto& loader : pending_loaders_) {
1900 if (loader.first.child_id != child_id) 2017 if (loader.first.child_id != child_id)
1901 continue; 2018 continue;
1902 2019
1903 ResourceRequestInfoImpl* info = loader.second->GetRequestInfo(); 2020 ResourceRequestInfoImpl* info = loader.second->GetRequestInfo();
1904 2021
1905 GlobalRequestID id(child_id, loader.first.request_id); 2022 GlobalRequestID id(child_id, loader.first.request_id);
1906 DCHECK(id == loader.first); 2023 DCHECK(id == loader.first);
1907 // Don't cancel navigations that are expected to live beyond this process. 2024 // Don't cancel navigations that are expected to live beyond this process.
1908 if (IsTransferredNavigation(id)) 2025 if (IsTransferredNavigation(id))
1909 any_requests_transferring = true; 2026 any_requests_transferring = true;
1910 if (info->detachable_handler()) { 2027 if (info->detachable_handler()) {
1911 info->detachable_handler()->Detach(); 2028 info->detachable_handler()->Detach();
1912 } else if (!info->IsDownload() && !info->is_stream() && 2029 } else if (!info->IsDownload() && !info->is_stream() &&
1913 !IsTransferredNavigation(id) && 2030 !IsTransferredNavigation(id) &&
1914 (route_id == -1 || route_id == info->GetRouteID())) { 2031 (cancel_all_routes || route_id == info->GetRenderFrameID())) {
1915 matching_requests.push_back(id); 2032 matching_requests.push_back(id);
1916 } 2033 }
1917 } 2034 }
1918 2035
1919 // Remove matches. 2036 // Remove matches.
1920 for (size_t i = 0; i < matching_requests.size(); ++i) { 2037 for (size_t i = 0; i < matching_requests.size(); ++i) {
1921 LoaderMap::iterator iter = pending_loaders_.find(matching_requests[i]); 2038 LoaderMap::iterator iter = pending_loaders_.find(matching_requests[i]);
1922 // Although every matching request was in pending_requests_ when we built 2039 // Although every matching request was in pending_requests_ when we built
1923 // matching_requests, it is normal for a matching request to be not found 2040 // matching_requests, it is normal for a matching request to be not found
1924 // in pending_requests_ after we have removed some matching requests from 2041 // in pending_requests_ after we have removed some matching requests from
1925 // pending_requests_. For example, deleting a net::URLRequest that has 2042 // pending_requests_. For example, deleting a net::URLRequest that has
1926 // exclusive (write) access to an HTTP cache entry may unblock another 2043 // exclusive (write) access to an HTTP cache entry may unblock another
1927 // net::URLRequest that needs exclusive access to the same cache entry, and 2044 // net::URLRequest that needs exclusive access to the same cache entry, and
1928 // that net::URLRequest may complete and remove itself from 2045 // that net::URLRequest may complete and remove itself from
1929 // pending_requests_. So we need to check that iter is not equal to 2046 // pending_requests_. So we need to check that iter is not equal to
1930 // pending_requests_.end(). 2047 // pending_requests_.end().
1931 if (iter != pending_loaders_.end()) 2048 if (iter != pending_loaders_.end())
1932 RemovePendingLoader(iter); 2049 RemovePendingLoader(iter);
1933 } 2050 }
1934 2051
1935 // Don't clear the blocked loaders or offline policy maps if any of the 2052 // Don't clear the blocked loaders or offline policy maps if any of the
1936 // requests in route_id are being transferred to a new process, since those 2053 // requests in route_id are being transferred to a new process, since those
1937 // maps will be updated with the new route_id after the transfer. Otherwise 2054 // maps will be updated with the new route_id after the transfer. Otherwise
1938 // we will lose track of this info when the old route goes away, before the 2055 // we will lose track of this info when the old route goes away, before the
1939 // new one is created. 2056 // new one is created.
1940 if (any_requests_transferring) 2057 if (any_requests_transferring)
1941 return; 2058 return;
1942 2059
1943 // Now deal with blocked requests if any. 2060 // Now deal with blocked requests if any.
1944 if (route_id != -1) { 2061 if (!cancel_all_routes) {
1945 if (blocked_loaders_map_.find(GlobalRoutingID(child_id, route_id)) != 2062 if (blocked_loaders_map_.find(global_routing_id) !=
1946 blocked_loaders_map_.end()) { 2063 blocked_loaders_map_.end()) {
1947 CancelBlockedRequestsForRoute(child_id, route_id); 2064 CancelBlockedRequestsForRoute(global_routing_id);
1948 } 2065 }
1949 } else { 2066 } else {
1950 // We have to do all render views for the process |child_id|. 2067 // We have to do all render frames for the process |child_id|.
1951 // Note that we have to do this in 2 passes as we cannot call 2068 // Note that we have to do this in 2 passes as we cannot call
1952 // CancelBlockedRequestsForRoute while iterating over 2069 // CancelBlockedRequestsForRoute while iterating over
1953 // blocked_loaders_map_, as it modifies it. 2070 // blocked_loaders_map_, as blocking requests modifies the map.
1954 std::set<int> route_ids; 2071 std::set<GlobalFrameRoutingId> routing_ids;
1955 for (const auto& blocked_loaders : blocked_loaders_map_) { 2072 for (const auto& blocked_loaders : blocked_loaders_map_) {
1956 if (blocked_loaders.first.child_id == child_id) 2073 if (blocked_loaders.first.child_id == child_id)
1957 route_ids.insert(blocked_loaders.first.route_id); 2074 routing_ids.insert(blocked_loaders.first);
1958 } 2075 }
1959 for (int route_id : route_ids) { 2076 for (const GlobalFrameRoutingId& route_id : routing_ids) {
1960 CancelBlockedRequestsForRoute(child_id, route_id); 2077 CancelBlockedRequestsForRoute(route_id);
1961 } 2078 }
1962 } 2079 }
1963 } 2080 }
1964 2081
1965 // Cancels the request and removes it from the list. 2082 // Cancels the request and removes it from the list.
1966 void ResourceDispatcherHostImpl::RemovePendingRequest(int child_id, 2083 void ResourceDispatcherHostImpl::RemovePendingRequest(int child_id,
1967 int request_id) { 2084 int request_id) {
1968 LoaderMap::iterator i = pending_loaders_.find( 2085 LoaderMap::iterator i = pending_loaders_.find(
1969 GlobalRequestID(child_id, request_id)); 2086 GlobalRequestID(child_id, request_id));
1970 if (i == pending_loaders_.end()) { 2087 if (i == pending_loaders_.end()) {
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
2297 IncrementOutstandingRequestsMemory(-1, *info); 2414 IncrementOutstandingRequestsMemory(-1, *info);
2298 2415
2299 // A ResourceHandler must not outlive its associated URLRequest. 2416 // A ResourceHandler must not outlive its associated URLRequest.
2300 handler.reset(); 2417 handler.reset();
2301 return; 2418 return;
2302 } 2419 }
2303 2420
2304 scoped_ptr<ResourceLoader> loader( 2421 scoped_ptr<ResourceLoader> loader(
2305 new ResourceLoader(std::move(request), std::move(handler), this)); 2422 new ResourceLoader(std::move(request), std::move(handler), this));
2306 2423
2307 GlobalRoutingID id(info->GetGlobalRoutingID()); 2424 GlobalFrameRoutingId id(info->GetChildID(), info->GetRenderFrameID());
2308 BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.find(id); 2425 BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.find(id);
2309 if (iter != blocked_loaders_map_.end()) { 2426 if (iter != blocked_loaders_map_.end()) {
2310 // The request should be blocked. 2427 // The request should be blocked.
2311 iter->second->push_back(std::move(loader)); 2428 iter->second->push_back(std::move(loader));
2312 return; 2429 return;
2313 } 2430 }
2314 2431
2315 StartLoading(info, std::move(loader)); 2432 StartLoading(info, std::move(loader));
2316 } 2433 }
2317 2434
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
2421 update_load_states_timer_->Stop(); 2538 update_load_states_timer_->Stop();
2422 return; 2539 return;
2423 } 2540 }
2424 2541
2425 BrowserThread::PostTask( 2542 BrowserThread::PostTask(
2426 BrowserThread::UI, FROM_HERE, 2543 BrowserThread::UI, FROM_HERE,
2427 base::Bind(&ResourceDispatcherHostImpl::UpdateLoadInfoOnUIThread, 2544 base::Bind(&ResourceDispatcherHostImpl::UpdateLoadInfoOnUIThread,
2428 base::Passed(&info_map))); 2545 base::Passed(&info_map)));
2429 } 2546 }
2430 2547
2431 void ResourceDispatcherHostImpl::BlockRequestsForRoute(int child_id, 2548 void ResourceDispatcherHostImpl::BlockRequestsForRoute(
2432 int route_id) { 2549 const GlobalFrameRoutingId& global_routing_id) {
2433 DCHECK_CURRENTLY_ON(BrowserThread::IO); 2550 DCHECK_CURRENTLY_ON(BrowserThread::IO);
2434 GlobalRoutingID key(child_id, route_id); 2551 DCHECK(blocked_loaders_map_.find(global_routing_id) ==
2435 DCHECK(blocked_loaders_map_.find(key) == blocked_loaders_map_.end()) << 2552 blocked_loaders_map_.end())
2436 "BlockRequestsForRoute called multiple time for the same RVH"; 2553 << "BlockRequestsForRoute called multiple time for the same RFH";
2437 blocked_loaders_map_[key] = make_scoped_ptr(new BlockedLoadersList()); 2554 blocked_loaders_map_[global_routing_id] =
2555 make_scoped_ptr(new BlockedLoadersList());
2438 } 2556 }
2439 2557
2440 void ResourceDispatcherHostImpl::ResumeBlockedRequestsForRoute(int child_id, 2558 void ResourceDispatcherHostImpl::ResumeBlockedRequestsForRoute(
2441 int route_id) { 2559 const GlobalFrameRoutingId& global_routing_id) {
2442 ProcessBlockedRequestsForRoute(child_id, route_id, false); 2560 ProcessBlockedRequestsForRoute(global_routing_id, false);
2443 } 2561 }
2444 2562
2445 void ResourceDispatcherHostImpl::CancelBlockedRequestsForRoute(int child_id, 2563 void ResourceDispatcherHostImpl::CancelBlockedRequestsForRoute(
2446 int route_id) { 2564 const GlobalFrameRoutingId& global_routing_id) {
2447 ProcessBlockedRequestsForRoute(child_id, route_id, true); 2565 ProcessBlockedRequestsForRoute(global_routing_id, true);
2448 } 2566 }
2449 2567
2450 void ResourceDispatcherHostImpl::ProcessBlockedRequestsForRoute( 2568 void ResourceDispatcherHostImpl::ProcessBlockedRequestsForRoute(
2451 int child_id, 2569 const GlobalFrameRoutingId& global_routing_id,
2452 int route_id,
2453 bool cancel_requests) { 2570 bool cancel_requests) {
2454 BlockedLoadersMap::iterator iter = blocked_loaders_map_.find( 2571 BlockedLoadersMap::iterator iter =
2455 GlobalRoutingID(child_id, route_id)); 2572 blocked_loaders_map_.find(global_routing_id);
2456 if (iter == blocked_loaders_map_.end()) { 2573 if (iter == blocked_loaders_map_.end()) {
2457 // It's possible to reach here if the renderer crashed while an interstitial 2574 // It's possible to reach here if the renderer crashed while an interstitial
2458 // page was showing. 2575 // page was showing.
2459 return; 2576 return;
2460 } 2577 }
2461 2578
2462 BlockedLoadersList* loaders = iter->second.get(); 2579 BlockedLoadersList* loaders = iter->second.get();
2463 scoped_ptr<BlockedLoadersList> deleter(std::move(iter->second)); 2580 scoped_ptr<BlockedLoadersList> deleter(std::move(iter->second));
2464 2581
2465 // Removing the vector from the map unblocks any subsequent requests. 2582 // Removing the vector from the map unblocks any subsequent requests.
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
2561 load_flags |= net::LOAD_PREFETCH; 2678 load_flags |= net::LOAD_PREFETCH;
2562 } 2679 }
2563 2680
2564 if (is_sync_load) 2681 if (is_sync_load)
2565 load_flags |= net::LOAD_IGNORE_LIMITS; 2682 load_flags |= net::LOAD_IGNORE_LIMITS;
2566 2683
2567 return load_flags; 2684 return load_flags;
2568 } 2685 }
2569 2686
2570 } // namespace content 2687 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698