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

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

Issue 2764683002: Remove stale-while-revalidate from content and chrome (Closed)
Patch Set: rebase Created 3 years, 9 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 26 matching lines...) Expand all
37 #include "content/browser/appcache/appcache_navigation_handle_core.h" 37 #include "content/browser/appcache/appcache_navigation_handle_core.h"
38 #include "content/browser/appcache/chrome_appcache_service.h" 38 #include "content/browser/appcache/chrome_appcache_service.h"
39 #include "content/browser/bad_message.h" 39 #include "content/browser/bad_message.h"
40 #include "content/browser/blob_storage/chrome_blob_storage_context.h" 40 #include "content/browser/blob_storage/chrome_blob_storage_context.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/frame_host/frame_tree.h" 42 #include "content/browser/frame_host/frame_tree.h"
43 #include "content/browser/frame_host/navigation_handle_impl.h" 43 #include "content/browser/frame_host/navigation_handle_impl.h"
44 #include "content/browser/frame_host/navigation_request_info.h" 44 #include "content/browser/frame_host/navigation_request_info.h"
45 #include "content/browser/frame_host/navigator.h" 45 #include "content/browser/frame_host/navigator.h"
46 #include "content/browser/loader/async_resource_handler.h" 46 #include "content/browser/loader/async_resource_handler.h"
47 #include "content/browser/loader/async_revalidation_manager.h"
48 #include "content/browser/loader/detachable_resource_handler.h" 47 #include "content/browser/loader/detachable_resource_handler.h"
49 #include "content/browser/loader/intercepting_resource_handler.h" 48 #include "content/browser/loader/intercepting_resource_handler.h"
50 #include "content/browser/loader/loader_delegate.h" 49 #include "content/browser/loader/loader_delegate.h"
51 #include "content/browser/loader/mime_sniffing_resource_handler.h" 50 #include "content/browser/loader/mime_sniffing_resource_handler.h"
52 #include "content/browser/loader/mojo_async_resource_handler.h" 51 #include "content/browser/loader/mojo_async_resource_handler.h"
53 #include "content/browser/loader/navigation_resource_handler.h" 52 #include "content/browser/loader/navigation_resource_handler.h"
54 #include "content/browser/loader/navigation_resource_throttle.h" 53 #include "content/browser/loader/navigation_resource_throttle.h"
55 #include "content/browser/loader/navigation_url_loader_impl_core.h" 54 #include "content/browser/loader/navigation_url_loader_impl_core.h"
56 #include "content/browser/loader/null_resource_controller.h" 55 #include "content/browser/loader/null_resource_controller.h"
57 #include "content/browser/loader/power_save_block_resource_throttle.h" 56 #include "content/browser/loader/power_save_block_resource_throttle.h"
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 ANNOTATE_BENIGN_RACE( 438 ANNOTATE_BENIGN_RACE(
440 &last_user_gesture_time_, 439 &last_user_gesture_time_,
441 "We don't care about the precise value, see http://crbug.com/92889"); 440 "We don't care about the precise value, see http://crbug.com/92889");
442 441
443 BrowserThread::PostTask(BrowserThread::IO, 442 BrowserThread::PostTask(BrowserThread::IO,
444 FROM_HERE, 443 FROM_HERE,
445 base::Bind(&ResourceDispatcherHostImpl::OnInit, 444 base::Bind(&ResourceDispatcherHostImpl::OnInit,
446 base::Unretained(this))); 445 base::Unretained(this)));
447 446
448 update_load_states_timer_.reset(new base::RepeatingTimer()); 447 update_load_states_timer_.reset(new base::RepeatingTimer());
449
450 // stale-while-revalidate currently doesn't work with browser-side navigation.
451 // Only enable stale-while-revalidate if browser navigation is not enabled.
452 //
453 // TODO(ricea): Make stale-while-revalidate and browser-side navigation work
454 // together. Or disable stale-while-revalidate completely before browser-side
455 // navigation becomes the default. crbug.com/561610
456 if (!IsBrowserSideNavigationEnabled() &&
457 base::FeatureList::IsEnabled(features::kStaleWhileRevalidate)) {
458 async_revalidation_manager_.reset(new AsyncRevalidationManager);
459 }
460 } 448 }
461 449
462 ResourceDispatcherHostImpl::ResourceDispatcherHostImpl() 450 ResourceDispatcherHostImpl::ResourceDispatcherHostImpl()
463 : ResourceDispatcherHostImpl(CreateDownloadHandlerIntercept()) {} 451 : ResourceDispatcherHostImpl(CreateDownloadHandlerIntercept()) {}
464 452
465 ResourceDispatcherHostImpl::~ResourceDispatcherHostImpl() { 453 ResourceDispatcherHostImpl::~ResourceDispatcherHostImpl() {
466 DCHECK(outstanding_requests_stats_map_.empty()); 454 DCHECK(outstanding_requests_stats_map_.empty());
467 DCHECK(g_resource_dispatcher_host); 455 DCHECK(g_resource_dispatcher_host);
468 DCHECK_CURRENTLY_ON(BrowserThread::UI); 456 DCHECK_CURRENTLY_ON(BrowserThread::UI);
469 g_resource_dispatcher_host = NULL; 457 g_resource_dispatcher_host = NULL;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 loader->GetRequestInfo()->IsDownload() || 569 loader->GetRequestInfo()->IsDownload() ||
582 loader->GetRequestInfo()->is_stream() || 570 loader->GetRequestInfo()->is_stream() ||
583 (loader->GetRequestInfo()->detachable_handler() && 571 (loader->GetRequestInfo()->detachable_handler() &&
584 loader->GetRequestInfo()->detachable_handler()->is_detached()) || 572 loader->GetRequestInfo()->detachable_handler()->is_detached()) ||
585 loader->GetRequestInfo()->requester_info()->IsBrowserSideNavigation() || 573 loader->GetRequestInfo()->requester_info()->IsBrowserSideNavigation() ||
586 loader->is_transferring()); 574 loader->is_transferring());
587 } 575 }
588 #endif 576 #endif
589 577
590 loaders_to_cancel.clear(); 578 loaders_to_cancel.clear();
591
592 if (async_revalidation_manager_) {
593 // Cancelling async revalidations should not result in the creation of new
594 // requests. Do it before the CHECKs to ensure this does not happen.
595 async_revalidation_manager_->CancelAsyncRevalidationsForResourceContext(
596 context);
597 }
598 } 579 }
599 580
600 void ResourceDispatcherHostImpl::ClearLoginDelegateForRequest( 581 void ResourceDispatcherHostImpl::ClearLoginDelegateForRequest(
601 net::URLRequest* request) { 582 net::URLRequest* request) {
602 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request); 583 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request);
603 if (info) { 584 if (info) {
604 ResourceLoader* loader = GetLoader(info->GetGlobalRequestID()); 585 ResourceLoader* loader = GetLoader(info->GetGlobalRequestID());
605 if (loader) 586 if (loader)
606 loader->ClearLoginDelegate(); 587 loader->ClearLoginDelegate();
607 } 588 }
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
730 void ResourceDispatcherHostImpl::DidReceiveRedirect( 711 void ResourceDispatcherHostImpl::DidReceiveRedirect(
731 ResourceLoader* loader, 712 ResourceLoader* loader,
732 const GURL& new_url, 713 const GURL& new_url,
733 ResourceResponse* response) { 714 ResourceResponse* response) {
734 ResourceRequestInfoImpl* info = loader->GetRequestInfo(); 715 ResourceRequestInfoImpl* info = loader->GetRequestInfo();
735 if (delegate_) { 716 if (delegate_) {
736 delegate_->OnRequestRedirected( 717 delegate_->OnRequestRedirected(
737 new_url, loader->request(), info->GetContext(), response); 718 new_url, loader->request(), info->GetContext(), response);
738 } 719 }
739 720
740 net::URLRequest* request = loader->request();
741 if (request->response_info().async_revalidation_required) {
742 // Async revalidation is only supported for the first redirect leg.
743 DCHECK_EQ(request->url_chain().size(), 1u);
744 DCHECK(async_revalidation_manager_);
745
746 async_revalidation_manager_->BeginAsyncRevalidation(request,
747 scheduler_.get());
748 }
749
750 // Remove the LOAD_SUPPORT_ASYNC_REVALIDATION flag if it is present.
751 // It is difficult to create a URLRequest with the correct flags and headers
752 // for redirect legs other than the first one. Since stale-while-revalidate in
753 // combination with redirects isn't needed for experimental use, punt on it
754 // for now.
755 // TODO(ricea): Fix this before launching the feature.
756 if (request->load_flags() & net::LOAD_SUPPORT_ASYNC_REVALIDATION) {
757 int new_load_flags =
758 request->load_flags() & ~net::LOAD_SUPPORT_ASYNC_REVALIDATION;
759 request->SetLoadFlags(new_load_flags);
760 }
761
762 // Don't notify WebContents observers for requests known to be 721 // Don't notify WebContents observers for requests known to be
763 // downloads; they aren't really associated with the Webcontents. 722 // downloads; they aren't really associated with the Webcontents.
764 // Note that not all downloads are known before content sniffing. 723 // Note that not all downloads are known before content sniffing.
765 if (info->IsDownload()) 724 if (info->IsDownload())
766 return; 725 return;
767 726
768 // Notify the observers on the UI thread. 727 // Notify the observers on the UI thread.
728 net::URLRequest* request = loader->request();
769 std::unique_ptr<ResourceRedirectDetails> detail(new ResourceRedirectDetails( 729 std::unique_ptr<ResourceRedirectDetails> detail(new ResourceRedirectDetails(
770 loader->request(), 730 loader->request(),
771 !!request->ssl_info().cert, 731 !!request->ssl_info().cert,
772 new_url)); 732 new_url));
773 loader_delegate_->DidGetRedirectForResourceRequest( 733 loader_delegate_->DidGetRedirectForResourceRequest(
774 info->GetWebContentsGetterForRequest(), std::move(detail)); 734 info->GetWebContentsGetterForRequest(), std::move(detail));
775 } 735 }
776 736
777 void ResourceDispatcherHostImpl::DidReceiveResponse( 737 void ResourceDispatcherHostImpl::DidReceiveResponse(
778 ResourceLoader* loader, 738 ResourceLoader* loader,
779 ResourceResponse* response) { 739 ResourceResponse* response) {
780 ResourceRequestInfoImpl* info = loader->GetRequestInfo(); 740 ResourceRequestInfoImpl* info = loader->GetRequestInfo();
781 net::URLRequest* request = loader->request(); 741 net::URLRequest* request = loader->request();
782 if (request->was_fetched_via_proxy() && 742 if (request->was_fetched_via_proxy() &&
783 request->was_fetched_via_spdy() && 743 request->was_fetched_via_spdy() &&
784 request->url().SchemeIs(url::kHttpScheme)) { 744 request->url().SchemeIs(url::kHttpScheme)) {
785 scheduler_->OnReceivedSpdyProxiedHttpResponse( 745 scheduler_->OnReceivedSpdyProxiedHttpResponse(
786 info->GetChildID(), info->GetRouteID()); 746 info->GetChildID(), info->GetRouteID());
787 } 747 }
788 748
789 if (request->response_info().async_revalidation_required) {
790 DCHECK(async_revalidation_manager_);
791 async_revalidation_manager_->BeginAsyncRevalidation(request,
792 scheduler_.get());
793 }
794
795 ProcessRequestForLinkHeaders(request); 749 ProcessRequestForLinkHeaders(request);
796 750
797 if (delegate_) 751 if (delegate_)
798 delegate_->OnResponseStarted(request, info->GetContext(), response); 752 delegate_->OnResponseStarted(request, info->GetContext(), response);
799 753
800 // Don't notify WebContents observers for requests known to be 754 // Don't notify WebContents observers for requests known to be
801 // downloads; they aren't really associated with the Webcontents. 755 // downloads; they aren't really associated with the Webcontents.
802 // Note that not all downloads are known before content sniffing. 756 // Note that not all downloads are known before content sniffing.
803 if (info->IsDownload()) 757 if (info->IsDownload())
804 return; 758 return;
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after
1480 // Only block image loads, as the attack applies largely to the "src" 1434 // Only block image loads, as the attack applies largely to the "src"
1481 // property of the <img> tag. It is common for web properties to allow 1435 // property of the <img> tag. It is common for web properties to allow
1482 // untrusted values for <img src>; this is considered a fair thing for an 1436 // untrusted values for <img src>; this is considered a fair thing for an
1483 // HTML sanitizer to do. Conversely, any HTML sanitizer that didn't 1437 // HTML sanitizer to do. Conversely, any HTML sanitizer that didn't
1484 // filter sources for <script>, <link>, <embed>, <object>, <iframe> tags 1438 // filter sources for <script>, <link>, <embed>, <object>, <iframe> tags
1485 // would be considered vulnerable in and of itself. 1439 // would be considered vulnerable in and of itself.
1486 do_not_prompt_for_login = true; 1440 do_not_prompt_for_login = true;
1487 load_flags |= net::LOAD_DO_NOT_USE_EMBEDDED_IDENTITY; 1441 load_flags |= net::LOAD_DO_NOT_USE_EMBEDDED_IDENTITY;
1488 } 1442 }
1489 1443
1490 bool support_async_revalidation =
1491 !is_sync_load && async_revalidation_manager_ &&
1492 AsyncRevalidationManager::QualifiesForAsyncRevalidation(request_data);
1493
1494 if (support_async_revalidation)
1495 load_flags |= net::LOAD_SUPPORT_ASYNC_REVALIDATION;
1496
1497 // Sync loads should have maximum priority and should be the only 1444 // Sync loads should have maximum priority and should be the only
1498 // requets that have the ignore limits flag set. 1445 // requets that have the ignore limits flag set.
1499 if (is_sync_load) { 1446 if (is_sync_load) {
1500 DCHECK_EQ(request_data.priority, net::MAXIMUM_PRIORITY); 1447 DCHECK_EQ(request_data.priority, net::MAXIMUM_PRIORITY);
1501 DCHECK_NE(load_flags & net::LOAD_IGNORE_LIMITS, 0); 1448 DCHECK_NE(load_flags & net::LOAD_IGNORE_LIMITS, 0);
1502 } else { 1449 } else {
1503 DCHECK_EQ(load_flags & net::LOAD_IGNORE_LIMITS, 0); 1450 DCHECK_EQ(load_flags & net::LOAD_IGNORE_LIMITS, 0);
1504 } 1451 }
1505 new_request->SetLoadFlags(load_flags); 1452 new_request->SetLoadFlags(load_flags);
1506 1453
1507 // Make extra info and read footer (contains request ID). 1454 // Make extra info and read footer (contains request ID).
1508 ResourceRequestInfoImpl* extra_info = new ResourceRequestInfoImpl( 1455 ResourceRequestInfoImpl* extra_info = new ResourceRequestInfoImpl(
1509 requester_info, route_id, 1456 requester_info, route_id,
1510 -1, // frame_tree_node_id 1457 -1, // frame_tree_node_id
1511 request_data.origin_pid, request_id, request_data.render_frame_id, 1458 request_data.origin_pid, request_id, request_data.render_frame_id,
1512 request_data.is_main_frame, request_data.parent_is_main_frame, 1459 request_data.is_main_frame, request_data.parent_is_main_frame,
1513 request_data.resource_type, request_data.transition_type, 1460 request_data.resource_type, request_data.transition_type,
1514 request_data.should_replace_current_entry, 1461 request_data.should_replace_current_entry,
1515 false, // is download 1462 false, // is download
1516 false, // is stream 1463 false, // is stream
1517 allow_download, request_data.has_user_gesture, 1464 allow_download, request_data.has_user_gesture,
1518 request_data.enable_load_timing, request_data.enable_upload_progress, 1465 request_data.enable_load_timing, request_data.enable_upload_progress,
1519 do_not_prompt_for_login, request_data.referrer_policy, 1466 do_not_prompt_for_login, request_data.referrer_policy,
1520 request_data.visibility_state, resource_context, report_raw_headers, 1467 request_data.visibility_state, resource_context, report_raw_headers,
1521 !is_sync_load, 1468 !is_sync_load,
1522 GetPreviewsState(request_data.previews_state, delegate_, *new_request, 1469 GetPreviewsState(request_data.previews_state, delegate_, *new_request,
1523 resource_context, 1470 resource_context,
1524 request_data.resource_type == RESOURCE_TYPE_MAIN_FRAME), 1471 request_data.resource_type == RESOURCE_TYPE_MAIN_FRAME),
1525 support_async_revalidation ? request_data.headers : std::string(),
1526 request_data.request_body, request_data.initiated_in_secure_context); 1472 request_data.request_body, request_data.initiated_in_secure_context);
1527 // Request takes ownership. 1473 // Request takes ownership.
1528 extra_info->AssociateWithRequest(new_request.get()); 1474 extra_info->AssociateWithRequest(new_request.get());
1529 1475
1530 if (new_request->url().SchemeIs(url::kBlobScheme)) { 1476 if (new_request->url().SchemeIs(url::kBlobScheme)) {
1531 // Hang on to a reference to ensure the blob is not released prior 1477 // Hang on to a reference to ensure the blob is not released prior
1532 // to the job being started. 1478 // to the job being started.
1533 storage::BlobProtocolHandler::SetRequestedBlobDataHandle( 1479 storage::BlobProtocolHandler::SetRequestedBlobDataHandle(
1534 new_request.get(), requester_info->blob_storage_context() 1480 new_request.get(), requester_info->blob_storage_context()
1535 ->context() 1481 ->context()
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
1829 download, // allow_download 1775 download, // allow_download
1830 false, // has_user_gesture 1776 false, // has_user_gesture
1831 false, // enable_load_timing 1777 false, // enable_load_timing
1832 false, // enable_upload_progress 1778 false, // enable_upload_progress
1833 false, // do_not_prompt_for_login 1779 false, // do_not_prompt_for_login
1834 blink::WebReferrerPolicyDefault, blink::WebPageVisibilityStateVisible, 1780 blink::WebReferrerPolicyDefault, blink::WebPageVisibilityStateVisible,
1835 context, 1781 context,
1836 false, // report_raw_headers 1782 false, // report_raw_headers
1837 true, // is_async 1783 true, // is_async
1838 previews_state, // previews_state 1784 previews_state, // previews_state
1839 std::string(), // original_headers
1840 nullptr, // body 1785 nullptr, // body
1841 false); // initiated_in_secure_context 1786 false); // initiated_in_secure_context
1842 } 1787 }
1843 1788
1844 void ResourceDispatcherHostImpl::OnRenderViewHostCreated(int child_id, 1789 void ResourceDispatcherHostImpl::OnRenderViewHostCreated(int child_id,
1845 int route_id) { 1790 int route_id) {
1846 scheduler_->OnClientCreated(child_id, route_id); 1791 scheduler_->OnClientCreated(child_id, route_id);
1847 } 1792 }
1848 1793
1849 void ResourceDispatcherHostImpl::OnRenderViewHostDeleted(int child_id, 1794 void ResourceDispatcherHostImpl::OnRenderViewHostDeleted(int child_id,
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
2196 false, // is stream 2141 false, // is stream
2197 info.common_params.allow_download, info.begin_params.has_user_gesture, 2142 info.common_params.allow_download, info.begin_params.has_user_gesture,
2198 true, // enable_load_timing 2143 true, // enable_load_timing
2199 false, // enable_upload_progress 2144 false, // enable_upload_progress
2200 false, // do_not_prompt_for_login 2145 false, // do_not_prompt_for_login
2201 info.common_params.referrer.policy, info.page_visibility_state, 2146 info.common_params.referrer.policy, info.page_visibility_state,
2202 resource_context, info.report_raw_headers, 2147 resource_context, info.report_raw_headers,
2203 true, // is_async 2148 true, // is_async
2204 GetPreviewsState(info.common_params.previews_state, delegate_, 2149 GetPreviewsState(info.common_params.previews_state, delegate_,
2205 *new_request, resource_context, info.is_main_frame), 2150 *new_request, resource_context, info.is_main_frame),
2206 // The original_headers field is for stale-while-revalidate but the
2207 // feature doesn't work with PlzNavigate, so it's just a placeholder
2208 // here.
2209 // TODO(ricea): Make the feature work with stale-while-revalidate
2210 // and clean this up.
2211 std::string(), // original_headers
2212 info.common_params.post_data, 2151 info.common_params.post_data,
2213 // TODO(mek): Currently initiated_in_secure_context is only used for 2152 // TODO(mek): Currently initiated_in_secure_context is only used for
2214 // subresource requests, so it doesn't matter what value it gets here. 2153 // subresource requests, so it doesn't matter what value it gets here.
2215 // If in the future this changes this should be updated to somehow get a 2154 // If in the future this changes this should be updated to somehow get a
2216 // meaningful value. 2155 // meaningful value.
2217 false); // initiated_in_secure_context 2156 false); // initiated_in_secure_context
2218 extra_info->set_navigation_ui_data(std::move(navigation_ui_data)); 2157 extra_info->set_navigation_ui_data(std::move(navigation_ui_data));
2219 2158
2220 // Request takes ownership. 2159 // Request takes ownership.
2221 extra_info->AssociateWithRequest(new_request.get()); 2160 extra_info->AssociateWithRequest(new_request.get());
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2255 info.begin_params.mixed_content_context_type, 2194 info.begin_params.mixed_content_context_type,
2256 appcache_handle_core ? appcache_handle_core->GetAppCacheService() 2195 appcache_handle_core ? appcache_handle_core->GetAppCacheService()
2257 : nullptr, 2196 : nullptr,
2258 -1, // child_id 2197 -1, // child_id
2259 -1, // route_id 2198 -1, // route_id
2260 std::move(handler)); 2199 std::move(handler));
2261 2200
2262 BeginRequestInternal(std::move(new_request), std::move(handler)); 2201 BeginRequestInternal(std::move(new_request), std::move(handler));
2263 } 2202 }
2264 2203
2265 void ResourceDispatcherHostImpl::EnableStaleWhileRevalidateForTesting() {
2266 if (!async_revalidation_manager_)
2267 async_revalidation_manager_.reset(new AsyncRevalidationManager);
2268 }
2269
2270 void ResourceDispatcherHostImpl::SetLoaderDelegate( 2204 void ResourceDispatcherHostImpl::SetLoaderDelegate(
2271 LoaderDelegate* loader_delegate) { 2205 LoaderDelegate* loader_delegate) {
2272 loader_delegate_ = loader_delegate; 2206 loader_delegate_ = loader_delegate;
2273 } 2207 }
2274 2208
2275 void ResourceDispatcherHostImpl::OnRenderFrameDeleted( 2209 void ResourceDispatcherHostImpl::OnRenderFrameDeleted(
2276 const GlobalFrameRoutingId& global_routing_id) { 2210 const GlobalFrameRoutingId& global_routing_id) {
2277 CancelRequestsForRoute(global_routing_id); 2211 CancelRequestsForRoute(global_routing_id);
2278 } 2212 }
2279 2213
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after
2792 &throttles); 2726 &throttles);
2793 if (!throttles.empty()) { 2727 if (!throttles.empty()) {
2794 handler.reset(new ThrottlingResourceHandler(std::move(handler), request, 2728 handler.reset(new ThrottlingResourceHandler(std::move(handler), request,
2795 std::move(throttles))); 2729 std::move(throttles)));
2796 } 2730 }
2797 } 2731 }
2798 return handler; 2732 return handler;
2799 } 2733 }
2800 2734
2801 } // namespace content 2735 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/resource_dispatcher_host_impl.h ('k') | content/browser/loader/resource_request_info_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698