| 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 | |
| 11 #include <algorithm> | 10 #include <algorithm> |
| 12 #include <set> | 11 #include <set> |
| 12 #include <utility> |
| 13 #include <vector> | 13 #include <vector> |
| 14 | 14 |
| 15 #include "base/bind.h" | 15 #include "base/bind.h" |
| 16 #include "base/bind_helpers.h" | 16 #include "base/bind_helpers.h" |
| 17 #include "base/command_line.h" | 17 #include "base/command_line.h" |
| 18 #include "base/compiler_specific.h" | 18 #include "base/compiler_specific.h" |
| 19 #include "base/debug/alias.h" | 19 #include "base/debug/alias.h" |
| 20 #include "base/logging.h" | 20 #include "base/logging.h" |
| 21 #include "base/macros.h" | 21 #include "base/macros.h" |
| 22 #include "base/memory/scoped_ptr.h" | 22 #include "base/memory/scoped_ptr.h" |
| (...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 718 if (request->url().SchemeIs(url::kBlobScheme)) { | 718 if (request->url().SchemeIs(url::kBlobScheme)) { |
| 719 ChromeBlobStorageContext* blob_context = | 719 ChromeBlobStorageContext* blob_context = |
| 720 GetChromeBlobStorageContextForResourceContext(context); | 720 GetChromeBlobStorageContextForResourceContext(context); |
| 721 storage::BlobProtocolHandler::SetRequestedBlobDataHandle( | 721 storage::BlobProtocolHandler::SetRequestedBlobDataHandle( |
| 722 request.get(), | 722 request.get(), |
| 723 blob_context->context()->GetBlobDataFromPublicURL(request->url())); | 723 blob_context->context()->GetBlobDataFromPublicURL(request->url())); |
| 724 } | 724 } |
| 725 | 725 |
| 726 // From this point forward, the |DownloadResourceHandler| is responsible for | 726 // From this point forward, the |DownloadResourceHandler| is responsible for |
| 727 // |started_callback|. | 727 // |started_callback|. |
| 728 scoped_ptr<ResourceHandler> handler( | 728 scoped_ptr<ResourceHandler> handler(CreateResourceHandlerForDownload( |
| 729 CreateResourceHandlerForDownload(request.get(), is_content_initiated, | 729 request.get(), is_content_initiated, true, download_id, |
| 730 true, download_id, save_info.Pass(), | 730 std::move(save_info), started_callback)); |
| 731 started_callback)); | |
| 732 | 731 |
| 733 BeginRequestInternal(request.Pass(), handler.Pass()); | 732 BeginRequestInternal(std::move(request), std::move(handler)); |
| 734 | 733 |
| 735 return DOWNLOAD_INTERRUPT_REASON_NONE; | 734 return DOWNLOAD_INTERRUPT_REASON_NONE; |
| 736 } | 735 } |
| 737 | 736 |
| 738 void ResourceDispatcherHostImpl::ClearLoginDelegateForRequest( | 737 void ResourceDispatcherHostImpl::ClearLoginDelegateForRequest( |
| 739 net::URLRequest* request) { | 738 net::URLRequest* request) { |
| 740 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request); | 739 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request); |
| 741 if (info) { | 740 if (info) { |
| 742 ResourceLoader* loader = GetLoader(info->GetGlobalRequestID()); | 741 ResourceLoader* loader = GetLoader(info->GetGlobalRequestID()); |
| 743 if (loader) | 742 if (loader) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 754 } | 753 } |
| 755 | 754 |
| 756 scoped_ptr<ResourceHandler> | 755 scoped_ptr<ResourceHandler> |
| 757 ResourceDispatcherHostImpl::CreateResourceHandlerForDownload( | 756 ResourceDispatcherHostImpl::CreateResourceHandlerForDownload( |
| 758 net::URLRequest* request, | 757 net::URLRequest* request, |
| 759 bool is_content_initiated, | 758 bool is_content_initiated, |
| 760 bool must_download, | 759 bool must_download, |
| 761 uint32_t id, | 760 uint32_t id, |
| 762 scoped_ptr<DownloadSaveInfo> save_info, | 761 scoped_ptr<DownloadSaveInfo> save_info, |
| 763 const DownloadUrlParameters::OnStartedCallback& started_cb) { | 762 const DownloadUrlParameters::OnStartedCallback& started_cb) { |
| 764 scoped_ptr<ResourceHandler> handler( | 763 scoped_ptr<ResourceHandler> handler(new DownloadResourceHandler( |
| 765 new DownloadResourceHandler(id, request, started_cb, save_info.Pass())); | 764 id, request, started_cb, std::move(save_info))); |
| 766 if (delegate_) { | 765 if (delegate_) { |
| 767 const ResourceRequestInfoImpl* request_info( | 766 const ResourceRequestInfoImpl* request_info( |
| 768 ResourceRequestInfoImpl::ForRequest(request)); | 767 ResourceRequestInfoImpl::ForRequest(request)); |
| 769 | 768 |
| 770 ScopedVector<ResourceThrottle> throttles; | 769 ScopedVector<ResourceThrottle> throttles; |
| 771 delegate_->DownloadStarting( | 770 delegate_->DownloadStarting( |
| 772 request, request_info->GetContext(), request_info->GetChildID(), | 771 request, request_info->GetContext(), request_info->GetChildID(), |
| 773 request_info->GetRouteID(), request_info->GetRequestID(), | 772 request_info->GetRouteID(), request_info->GetRequestID(), |
| 774 is_content_initiated, must_download, &throttles); | 773 is_content_initiated, must_download, &throttles); |
| 775 if (!throttles.empty()) { | 774 if (!throttles.empty()) { |
| 776 handler.reset( | 775 handler.reset(new ThrottlingResourceHandler(std::move(handler), request, |
| 777 new ThrottlingResourceHandler( | 776 std::move(throttles))); |
| 778 handler.Pass(), request, throttles.Pass())); | |
| 779 } | 777 } |
| 780 } | 778 } |
| 781 return handler.Pass(); | 779 return handler; |
| 782 } | 780 } |
| 783 | 781 |
| 784 scoped_ptr<ResourceHandler> ResourceDispatcherHostImpl::MaybeInterceptAsStream( | 782 scoped_ptr<ResourceHandler> ResourceDispatcherHostImpl::MaybeInterceptAsStream( |
| 785 const base::FilePath& plugin_path, | 783 const base::FilePath& plugin_path, |
| 786 net::URLRequest* request, | 784 net::URLRequest* request, |
| 787 ResourceResponse* response, | 785 ResourceResponse* response, |
| 788 std::string* payload) { | 786 std::string* payload) { |
| 789 payload->clear(); | 787 payload->clear(); |
| 790 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request); | 788 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request); |
| 791 const std::string& mime_type = response->head.mime_type; | 789 const std::string& mime_type = response->head.mime_type; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 810 stream_info->handle = handler->stream()->CreateHandle(); | 808 stream_info->handle = handler->stream()->CreateHandle(); |
| 811 stream_info->original_url = request->url(); | 809 stream_info->original_url = request->url(); |
| 812 stream_info->mime_type = mime_type; | 810 stream_info->mime_type = mime_type; |
| 813 // Make a copy of the response headers so it is safe to pass across threads; | 811 // Make a copy of the response headers so it is safe to pass across threads; |
| 814 // the old handler (AsyncResourceHandler) may modify it in parallel via the | 812 // the old handler (AsyncResourceHandler) may modify it in parallel via the |
| 815 // ResourceDispatcherHostDelegate. | 813 // ResourceDispatcherHostDelegate. |
| 816 if (response->head.headers.get()) { | 814 if (response->head.headers.get()) { |
| 817 stream_info->response_headers = | 815 stream_info->response_headers = |
| 818 new net::HttpResponseHeaders(response->head.headers->raw_headers()); | 816 new net::HttpResponseHeaders(response->head.headers->raw_headers()); |
| 819 } | 817 } |
| 820 delegate_->OnStreamCreated(request, stream_info.Pass()); | 818 delegate_->OnStreamCreated(request, std::move(stream_info)); |
| 821 return handler.Pass(); | 819 return std::move(handler); |
| 822 } | 820 } |
| 823 | 821 |
| 824 ResourceDispatcherHostLoginDelegate* | 822 ResourceDispatcherHostLoginDelegate* |
| 825 ResourceDispatcherHostImpl::CreateLoginDelegate( | 823 ResourceDispatcherHostImpl::CreateLoginDelegate( |
| 826 ResourceLoader* loader, | 824 ResourceLoader* loader, |
| 827 net::AuthChallengeInfo* auth_info) { | 825 net::AuthChallengeInfo* auth_info) { |
| 828 if (!delegate_) | 826 if (!delegate_) |
| 829 return NULL; | 827 return NULL; |
| 830 | 828 |
| 831 return delegate_->CreateLoginDelegate(auth_info, loader->request()); | 829 return delegate_->CreateLoginDelegate(auth_info, loader->request()); |
| (...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1476 request_data.appcache_host_id, request_data.resource_type, | 1474 request_data.appcache_host_id, request_data.resource_type, |
| 1477 request_data.should_reset_appcache); | 1475 request_data.should_reset_appcache); |
| 1478 | 1476 |
| 1479 scoped_ptr<ResourceHandler> handler( | 1477 scoped_ptr<ResourceHandler> handler( |
| 1480 CreateResourceHandler( | 1478 CreateResourceHandler( |
| 1481 new_request.get(), | 1479 new_request.get(), |
| 1482 request_data, sync_result, route_id, process_type, child_id, | 1480 request_data, sync_result, route_id, process_type, child_id, |
| 1483 resource_context)); | 1481 resource_context)); |
| 1484 | 1482 |
| 1485 if (handler) | 1483 if (handler) |
| 1486 BeginRequestInternal(new_request.Pass(), handler.Pass()); | 1484 BeginRequestInternal(std::move(new_request), std::move(handler)); |
| 1487 } | 1485 } |
| 1488 | 1486 |
| 1489 scoped_ptr<ResourceHandler> ResourceDispatcherHostImpl::CreateResourceHandler( | 1487 scoped_ptr<ResourceHandler> ResourceDispatcherHostImpl::CreateResourceHandler( |
| 1490 net::URLRequest* request, | 1488 net::URLRequest* request, |
| 1491 const ResourceHostMsg_Request& request_data, | 1489 const ResourceHostMsg_Request& request_data, |
| 1492 IPC::Message* sync_result, | 1490 IPC::Message* sync_result, |
| 1493 int route_id, | 1491 int route_id, |
| 1494 int process_type, | 1492 int process_type, |
| 1495 int child_id, | 1493 int child_id, |
| 1496 ResourceContext* resource_context) { | 1494 ResourceContext* resource_context) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1507 return scoped_ptr<ResourceHandler>(); | 1505 return scoped_ptr<ResourceHandler>(); |
| 1508 } | 1506 } |
| 1509 | 1507 |
| 1510 handler.reset(new SyncResourceHandler(request, sync_result, this)); | 1508 handler.reset(new SyncResourceHandler(request, sync_result, this)); |
| 1511 } else { | 1509 } else { |
| 1512 handler.reset(new AsyncResourceHandler(request, this)); | 1510 handler.reset(new AsyncResourceHandler(request, this)); |
| 1513 | 1511 |
| 1514 // The RedirectToFileResourceHandler depends on being next in the chain. | 1512 // The RedirectToFileResourceHandler depends on being next in the chain. |
| 1515 if (request_data.download_to_file) { | 1513 if (request_data.download_to_file) { |
| 1516 handler.reset( | 1514 handler.reset( |
| 1517 new RedirectToFileResourceHandler(handler.Pass(), request)); | 1515 new RedirectToFileResourceHandler(std::move(handler), request)); |
| 1518 } | 1516 } |
| 1519 } | 1517 } |
| 1520 | 1518 |
| 1521 // Prefetches and <a ping> requests outlive their child process. | 1519 // Prefetches and <a ping> requests outlive their child process. |
| 1522 if (!sync_result && IsDetachableResourceType(request_data.resource_type)) { | 1520 if (!sync_result && IsDetachableResourceType(request_data.resource_type)) { |
| 1523 handler.reset(new DetachableResourceHandler( | 1521 handler.reset(new DetachableResourceHandler( |
| 1524 request, | 1522 request, |
| 1525 base::TimeDelta::FromMilliseconds(kDefaultDetachableCancelDelayMs), | 1523 base::TimeDelta::FromMilliseconds(kDefaultDetachableCancelDelayMs), |
| 1526 handler.Pass())); | 1524 std::move(handler))); |
| 1527 } | 1525 } |
| 1528 | 1526 |
| 1529 // PlzNavigate: If using --enable-browser-side-navigation, the | 1527 // PlzNavigate: If using --enable-browser-side-navigation, the |
| 1530 // CrossSiteResourceHandler is not needed. This codepath is not used for the | 1528 // CrossSiteResourceHandler is not needed. This codepath is not used for the |
| 1531 // actual navigation request, but only the subsequent blob URL load. This does | 1529 // actual navigation request, but only the subsequent blob URL load. This does |
| 1532 // not require request transfers. | 1530 // not require request transfers. |
| 1533 if (!IsBrowserSideNavigationEnabled()) { | 1531 if (!IsBrowserSideNavigationEnabled()) { |
| 1534 // Install a CrossSiteResourceHandler for all main frame requests. This will | 1532 // Install a CrossSiteResourceHandler for all main frame requests. This will |
| 1535 // check whether a transfer is required and, if so, pause for the UI thread | 1533 // check whether a transfer is required and, if so, pause for the UI thread |
| 1536 // to drive the transfer. | 1534 // to drive the transfer. |
| 1537 bool is_swappable_navigation = | 1535 bool is_swappable_navigation = |
| 1538 request_data.resource_type == RESOURCE_TYPE_MAIN_FRAME; | 1536 request_data.resource_type == RESOURCE_TYPE_MAIN_FRAME; |
| 1539 // If out-of-process iframes are possible, then all subframe requests need | 1537 // If out-of-process iframes are possible, then all subframe requests need |
| 1540 // to go through the CrossSiteResourceHandler to enforce the site isolation | 1538 // to go through the CrossSiteResourceHandler to enforce the site isolation |
| 1541 // policy. | 1539 // policy. |
| 1542 if (!is_swappable_navigation && | 1540 if (!is_swappable_navigation && |
| 1543 SiteIsolationPolicy::AreCrossProcessFramesPossible()) { | 1541 SiteIsolationPolicy::AreCrossProcessFramesPossible()) { |
| 1544 is_swappable_navigation = | 1542 is_swappable_navigation = |
| 1545 request_data.resource_type == RESOURCE_TYPE_SUB_FRAME; | 1543 request_data.resource_type == RESOURCE_TYPE_SUB_FRAME; |
| 1546 } | 1544 } |
| 1547 if (is_swappable_navigation && process_type == PROCESS_TYPE_RENDERER) | 1545 if (is_swappable_navigation && process_type == PROCESS_TYPE_RENDERER) |
| 1548 handler.reset(new CrossSiteResourceHandler(handler.Pass(), request)); | 1546 handler.reset(new CrossSiteResourceHandler(std::move(handler), request)); |
| 1549 } | 1547 } |
| 1550 | 1548 |
| 1551 return AddStandardHandlers(request, request_data.resource_type, | 1549 return AddStandardHandlers(request, request_data.resource_type, |
| 1552 resource_context, filter_->appcache_service(), | 1550 resource_context, filter_->appcache_service(), |
| 1553 child_id, route_id, handler.Pass()); | 1551 child_id, route_id, std::move(handler)); |
| 1554 } | 1552 } |
| 1555 | 1553 |
| 1556 scoped_ptr<ResourceHandler> ResourceDispatcherHostImpl::AddStandardHandlers( | 1554 scoped_ptr<ResourceHandler> ResourceDispatcherHostImpl::AddStandardHandlers( |
| 1557 net::URLRequest* request, | 1555 net::URLRequest* request, |
| 1558 ResourceType resource_type, | 1556 ResourceType resource_type, |
| 1559 ResourceContext* resource_context, | 1557 ResourceContext* resource_context, |
| 1560 AppCacheService* appcache_service, | 1558 AppCacheService* appcache_service, |
| 1561 int child_id, | 1559 int child_id, |
| 1562 int route_id, | 1560 int route_id, |
| 1563 scoped_ptr<ResourceHandler> handler) { | 1561 scoped_ptr<ResourceHandler> handler) { |
| 1564 // PlzNavigate: do not add ResourceThrottles for main resource requests from | 1562 // PlzNavigate: do not add ResourceThrottles for main resource requests from |
| 1565 // the renderer. Decisions about the navigation should have been done in the | 1563 // the renderer. Decisions about the navigation should have been done in the |
| 1566 // initial request. | 1564 // initial request. |
| 1567 if (IsBrowserSideNavigationEnabled() && IsResourceTypeFrame(resource_type) && | 1565 if (IsBrowserSideNavigationEnabled() && IsResourceTypeFrame(resource_type) && |
| 1568 child_id != -1) { | 1566 child_id != -1) { |
| 1569 DCHECK(request->url().SchemeIs(url::kBlobScheme)); | 1567 DCHECK(request->url().SchemeIs(url::kBlobScheme)); |
| 1570 return handler.Pass(); | 1568 return handler; |
| 1571 } | 1569 } |
| 1572 | 1570 |
| 1573 PluginService* plugin_service = nullptr; | 1571 PluginService* plugin_service = nullptr; |
| 1574 #if defined(ENABLE_PLUGINS) | 1572 #if defined(ENABLE_PLUGINS) |
| 1575 plugin_service = PluginService::GetInstance(); | 1573 plugin_service = PluginService::GetInstance(); |
| 1576 #endif | 1574 #endif |
| 1577 // Insert a buffered event handler before the actual one. | 1575 // Insert a buffered event handler before the actual one. |
| 1578 handler.reset(new MimeTypeResourceHandler(handler.Pass(), this, | 1576 handler.reset(new MimeTypeResourceHandler(std::move(handler), this, |
| 1579 plugin_service, request)); | 1577 plugin_service, request)); |
| 1580 | 1578 |
| 1581 ScopedVector<ResourceThrottle> throttles; | 1579 ScopedVector<ResourceThrottle> throttles; |
| 1582 | 1580 |
| 1583 // Add a NavigationResourceThrottle for navigations. | 1581 // Add a NavigationResourceThrottle for navigations. |
| 1584 // PlzNavigate: the throttle is unnecessary as communication with the UI | 1582 // PlzNavigate: the throttle is unnecessary as communication with the UI |
| 1585 // thread is handled by the NavigationURLloader. | 1583 // thread is handled by the NavigationURLloader. |
| 1586 if (!IsBrowserSideNavigationEnabled() && IsResourceTypeFrame(resource_type)) | 1584 if (!IsBrowserSideNavigationEnabled() && IsResourceTypeFrame(resource_type)) |
| 1587 throttles.push_back(new NavigationResourceThrottle(request)); | 1585 throttles.push_back(new NavigationResourceThrottle(request)); |
| 1588 | 1586 |
| 1589 if (delegate_) { | 1587 if (delegate_) { |
| 1590 delegate_->RequestBeginning(request, | 1588 delegate_->RequestBeginning(request, |
| 1591 resource_context, | 1589 resource_context, |
| 1592 appcache_service, | 1590 appcache_service, |
| 1593 resource_type, | 1591 resource_type, |
| 1594 &throttles); | 1592 &throttles); |
| 1595 } | 1593 } |
| 1596 | 1594 |
| 1597 if (request->has_upload()) { | 1595 if (request->has_upload()) { |
| 1598 // Block power save while uploading data. | 1596 // Block power save while uploading data. |
| 1599 throttles.push_back(new PowerSaveBlockResourceThrottle()); | 1597 throttles.push_back(new PowerSaveBlockResourceThrottle()); |
| 1600 } | 1598 } |
| 1601 | 1599 |
| 1602 // TODO(ricea): Stop looking this up so much. | 1600 // TODO(ricea): Stop looking this up so much. |
| 1603 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request); | 1601 ResourceRequestInfoImpl* info = ResourceRequestInfoImpl::ForRequest(request); |
| 1604 throttles.push_back(scheduler_->ScheduleRequest(child_id, route_id, | 1602 throttles.push_back(scheduler_->ScheduleRequest(child_id, route_id, |
| 1605 info->IsAsync(), request)); | 1603 info->IsAsync(), request)); |
| 1606 | 1604 |
| 1607 handler.reset( | 1605 handler.reset(new ThrottlingResourceHandler(std::move(handler), request, |
| 1608 new ThrottlingResourceHandler(handler.Pass(), request, throttles.Pass())); | 1606 std::move(throttles))); |
| 1609 | 1607 |
| 1610 return handler.Pass(); | 1608 return handler; |
| 1611 } | 1609 } |
| 1612 | 1610 |
| 1613 void ResourceDispatcherHostImpl::OnReleaseDownloadedFile(int request_id) { | 1611 void ResourceDispatcherHostImpl::OnReleaseDownloadedFile(int request_id) { |
| 1614 UnregisterDownloadedTempFile(filter_->child_id(), request_id); | 1612 UnregisterDownloadedTempFile(filter_->child_id(), request_id); |
| 1615 } | 1613 } |
| 1616 | 1614 |
| 1617 void ResourceDispatcherHostImpl::OnDidChangePriority( | 1615 void ResourceDispatcherHostImpl::OnDidChangePriority( |
| 1618 int request_id, | 1616 int request_id, |
| 1619 net::RequestPriority new_priority, | 1617 net::RequestPriority new_priority, |
| 1620 int intra_priority_value) { | 1618 int intra_priority_value) { |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1818 // Since we're just saving some resources we need, disallow downloading. | 1816 // Since we're just saving some resources we need, disallow downloading. |
| 1819 ResourceRequestInfoImpl* extra_info = | 1817 ResourceRequestInfoImpl* extra_info = |
| 1820 CreateRequestInfo(child_id, render_view_route_id, | 1818 CreateRequestInfo(child_id, render_view_route_id, |
| 1821 render_frame_route_id, false, context); | 1819 render_frame_route_id, false, context); |
| 1822 extra_info->AssociateWithRequest(request.get()); // Request takes ownership. | 1820 extra_info->AssociateWithRequest(request.get()); // Request takes ownership. |
| 1823 | 1821 |
| 1824 scoped_ptr<ResourceHandler> handler(new SaveFileResourceHandler( | 1822 scoped_ptr<ResourceHandler> handler(new SaveFileResourceHandler( |
| 1825 request.get(), save_item_id, save_package_id, child_id, | 1823 request.get(), save_item_id, save_package_id, child_id, |
| 1826 render_frame_route_id, url, save_file_manager_.get())); | 1824 render_frame_route_id, url, save_file_manager_.get())); |
| 1827 | 1825 |
| 1828 BeginRequestInternal(request.Pass(), handler.Pass()); | 1826 BeginRequestInternal(std::move(request), std::move(handler)); |
| 1829 } | 1827 } |
| 1830 | 1828 |
| 1831 void ResourceDispatcherHostImpl::MarkAsTransferredNavigation( | 1829 void ResourceDispatcherHostImpl::MarkAsTransferredNavigation( |
| 1832 const GlobalRequestID& id) { | 1830 const GlobalRequestID& id) { |
| 1833 GetLoader(id)->MarkAsTransferring(); | 1831 GetLoader(id)->MarkAsTransferring(); |
| 1834 } | 1832 } |
| 1835 | 1833 |
| 1836 void ResourceDispatcherHostImpl::CancelTransferringNavigation( | 1834 void ResourceDispatcherHostImpl::CancelTransferringNavigation( |
| 1837 const GlobalRequestID& id) { | 1835 const GlobalRequestID& id) { |
| 1838 // Request should still exist and be in the middle of a transfer. | 1836 // Request should still exist and be in the middle of a transfer. |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2198 info.begin_params.request_context_type, frame_type, info.request_body); | 2196 info.begin_params.request_context_type, frame_type, info.request_body); |
| 2199 | 2197 |
| 2200 // TODO(davidben): Attach AppCacheInterceptor. | 2198 // TODO(davidben): Attach AppCacheInterceptor. |
| 2201 | 2199 |
| 2202 scoped_ptr<ResourceHandler> handler(new NavigationResourceHandler( | 2200 scoped_ptr<ResourceHandler> handler(new NavigationResourceHandler( |
| 2203 new_request.get(), loader)); | 2201 new_request.get(), loader)); |
| 2204 | 2202 |
| 2205 // TODO(davidben): Pass in the appropriate appcache_service. Also fix the | 2203 // TODO(davidben): Pass in the appropriate appcache_service. Also fix the |
| 2206 // dependency on child_id/route_id. Those are used by the ResourceScheduler; | 2204 // dependency on child_id/route_id. Those are used by the ResourceScheduler; |
| 2207 // currently it's a no-op. | 2205 // currently it's a no-op. |
| 2208 handler = AddStandardHandlers(new_request.get(), resource_type, | 2206 handler = |
| 2209 resource_context, | 2207 AddStandardHandlers(new_request.get(), resource_type, resource_context, |
| 2210 nullptr, // appcache_service | 2208 nullptr, // appcache_service |
| 2211 -1, // child_id | 2209 -1, // child_id |
| 2212 -1, // route_id | 2210 -1, // route_id |
| 2213 handler.Pass()); | 2211 std::move(handler)); |
| 2214 | 2212 |
| 2215 BeginRequestInternal(new_request.Pass(), handler.Pass()); | 2213 BeginRequestInternal(std::move(new_request), std::move(handler)); |
| 2216 } | 2214 } |
| 2217 | 2215 |
| 2218 void ResourceDispatcherHostImpl::EnableStaleWhileRevalidateForTesting() { | 2216 void ResourceDispatcherHostImpl::EnableStaleWhileRevalidateForTesting() { |
| 2219 if (!async_revalidation_manager_) | 2217 if (!async_revalidation_manager_) |
| 2220 async_revalidation_manager_.reset(new AsyncRevalidationManager); | 2218 async_revalidation_manager_.reset(new AsyncRevalidationManager); |
| 2221 } | 2219 } |
| 2222 | 2220 |
| 2223 // static | 2221 // static |
| 2224 int ResourceDispatcherHostImpl::CalculateApproximateMemoryCost( | 2222 int ResourceDispatcherHostImpl::CalculateApproximateMemoryCost( |
| 2225 net::URLRequest* request) { | 2223 net::URLRequest* request) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2268 } | 2266 } |
| 2269 | 2267 |
| 2270 IncrementOutstandingRequestsMemory(-1, *info); | 2268 IncrementOutstandingRequestsMemory(-1, *info); |
| 2271 | 2269 |
| 2272 // A ResourceHandler must not outlive its associated URLRequest. | 2270 // A ResourceHandler must not outlive its associated URLRequest. |
| 2273 handler.reset(); | 2271 handler.reset(); |
| 2274 return; | 2272 return; |
| 2275 } | 2273 } |
| 2276 | 2274 |
| 2277 linked_ptr<ResourceLoader> loader( | 2275 linked_ptr<ResourceLoader> loader( |
| 2278 new ResourceLoader(request.Pass(), handler.Pass(), this)); | 2276 new ResourceLoader(std::move(request), std::move(handler), this)); |
| 2279 | 2277 |
| 2280 GlobalRoutingID id(info->GetGlobalRoutingID()); | 2278 GlobalRoutingID id(info->GetGlobalRoutingID()); |
| 2281 BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.find(id); | 2279 BlockedLoadersMap::const_iterator iter = blocked_loaders_map_.find(id); |
| 2282 if (iter != blocked_loaders_map_.end()) { | 2280 if (iter != blocked_loaders_map_.end()) { |
| 2283 // The request should be blocked. | 2281 // The request should be blocked. |
| 2284 iter->second->push_back(loader); | 2282 iter->second->push_back(loader); |
| 2285 return; | 2283 return; |
| 2286 } | 2284 } |
| 2287 | 2285 |
| 2288 StartLoading(info, loader); | 2286 StartLoading(info, loader); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2371 load_info.upload_position = upload_progress.position(); | 2369 load_info.upload_position = upload_progress.position(); |
| 2372 | 2370 |
| 2373 GlobalRoutingID id(loader.second->GetRequestInfo()->GetGlobalRoutingID()); | 2371 GlobalRoutingID id(loader.second->GetRequestInfo()->GetGlobalRoutingID()); |
| 2374 LoadInfoMap::iterator existing = info_map->find(id); | 2372 LoadInfoMap::iterator existing = info_map->find(id); |
| 2375 | 2373 |
| 2376 if (existing == info_map->end() || | 2374 if (existing == info_map->end() || |
| 2377 LoadInfoIsMoreInteresting(load_info, existing->second)) { | 2375 LoadInfoIsMoreInteresting(load_info, existing->second)) { |
| 2378 (*info_map)[id] = load_info; | 2376 (*info_map)[id] = load_info; |
| 2379 } | 2377 } |
| 2380 } | 2378 } |
| 2381 return info_map.Pass(); | 2379 return info_map; |
| 2382 } | 2380 } |
| 2383 | 2381 |
| 2384 void ResourceDispatcherHostImpl::UpdateLoadInfo() { | 2382 void ResourceDispatcherHostImpl::UpdateLoadInfo() { |
| 2385 scoped_ptr<LoadInfoMap> info_map(GetLoadInfoForAllRoutes()); | 2383 scoped_ptr<LoadInfoMap> info_map(GetLoadInfoForAllRoutes()); |
| 2386 | 2384 |
| 2387 // Stop the timer if there are no more pending requests. Future new requests | 2385 // Stop the timer if there are no more pending requests. Future new requests |
| 2388 // will restart it as necessary. | 2386 // will restart it as necessary. |
| 2389 // Also stop the timer if there are no loading clients, to avoid waking up | 2387 // Also stop the timer if there are no loading clients, to avoid waking up |
| 2390 // unnecessarily when there is a long running (hanging get) request. | 2388 // unnecessarily when there is a long running (hanging get) request. |
| 2391 if (info_map->empty() || !scheduler_->HasLoadingClients()) { | 2389 if (info_map->empty() || !scheduler_->HasLoadingClients()) { |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2535 load_flags |= net::LOAD_PREFETCH; | 2533 load_flags |= net::LOAD_PREFETCH; |
| 2536 } | 2534 } |
| 2537 | 2535 |
| 2538 if (is_sync_load) | 2536 if (is_sync_load) |
| 2539 load_flags |= net::LOAD_IGNORE_LIMITS; | 2537 load_flags |= net::LOAD_IGNORE_LIMITS; |
| 2540 | 2538 |
| 2541 return load_flags; | 2539 return load_flags; |
| 2542 } | 2540 } |
| 2543 | 2541 |
| 2544 } // namespace content | 2542 } // namespace content |
| OLD | NEW |