OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |