diff options
author | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-07-14 17:41:05 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2016-08-04 12:37:36 +0000 |
commit | 399c965b6064c440ddcf4015f5f8e9d131c7a0a6 (patch) | |
tree | 6b06b60ff365abef0e13b3503d593a0df48d20e8 /chromium/content/browser/loader | |
parent | 7366110654eec46f21b6824f302356426f48cd74 (diff) | |
download | qtwebengine-chromium-399c965b6064c440ddcf4015f5f8e9d131c7a0a6.tar.gz |
BASELINE: Update Chromium to 52.0.2743.76 and Ninja to 1.7.1
Change-Id: I382f51b959689505a60f8b707255ecb344f7d8b4
Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/content/browser/loader')
36 files changed, 1249 insertions, 336 deletions
diff --git a/chromium/content/browser/loader/DEPS b/chromium/content/browser/loader/DEPS new file mode 100644 index 00000000000..188bb2b8214 --- /dev/null +++ b/chromium/content/browser/loader/DEPS @@ -0,0 +1,284 @@ +# The core loading code in this directory is being transitioned into a separate +# Mojo networking service. See http://crbug.com/598073. The first stage is to +# decouple the code that will be moved from the rest of content. These rules +# help ensure that we don't add more includes, and can progressively reduce the +# code's dependencies. +# +# For each file, the first section shows includes that are allowed (i.e. because +# they are for files that will be moving as well). The second section, separated +# by a comment, lists files that we will have to decouple. +specific_include_rules = { + "async_resource_handler\.(cc|h)": [ + "-content", + "+content/browser/loader/async_resource_handler.h", + "+content/browser/loader/netlog_observer.h", + "+content/browser/loader/resource_buffer.h", + "+content/browser/loader/resource_dispatcher_host_impl.h", + "+content/browser/loader/resource_handler.h", + "+content/browser/loader/resource_message_delegate.h", + "+content/browser/loader/resource_message_filter.h", + "+content/browser/loader/resource_request_info_impl.h", + "+content/common/content_export.h", + "+content/public/browser/resource_dispatcher_host_delegate.h", + "+content/public/common/resource_response.h", + + # TODO: these all have to be removed. + "+content/browser/host_zoom_map_impl.h", + "+content/browser/resource_context_impl.h", + "+content/public/common/content_features.h", + + # TODO: To be replaced by mojo. + "+content/common/resource_messages.h", + "+content/common/resource_request_completion_status.h", + "+content/common/view_messages.h", + ], + "async_revalidation_driver\.(cc|h)": [ + "-content", + "+content/browser/loader/async_revalidation_driver.h", + "+content/common/content_export.h", + "+content/public/browser/resource_controller.h", + "+content/public/browser/resource_throttle.h", + ], + "async_revalidation_driver_unittest\.cc": [ + "-content", + "+content/browser/loader/async_revalidation_driver.h", + + # TODO: these all have to be removed. + # Only one test needs these, so that can stay in content while the other + # tests move. + "+content/public/browser/client_certificate_delegate.h", + "+content/public/common/content_client.h", + "+content/public/test/test_browser_thread_bundle.h", + "+content/test/test_content_browser_client.h", + ], + "async_revalidation_manager\.(cc|h)": [ + "-content", + "+content/browser/loader/async_revalidation_driver.h", + "+content/browser/loader/async_revalidation_manager.h", + "+content/browser/loader/resource_message_filter.h", + "+content/browser/loader/resource_request_info_impl.h", + "+content/browser/loader/resource_scheduler.h", + "+content/public/browser/resource_throttle.h", + + # TODO: To be replaced by mojo. + "+content/common/resource_messages.h", + "+content/common/resource_request.h", + ], + "resource_buffer.*\.(cc|h)": [ + "-content", + "+content/browser/loader/resource_buffer.h", + "+content/common/content_export.h", + ], + "global_routing_id\.h": [ + "-content", + ], + "layered_resource_handler\.(cc|h)": [ + "-content", + "+content/browser/loader/layered_resource_handler.h", + "+content/browser/loader/resource_handler.h", + "+content/common/content_export.h", + ], + "netlog_observer\.(cc|h)": [ + "-content", + "+content/browser/loader/netlog_observer.h", + "+content/browser/loader/resource_request_info_impl.h", + "+content/public/common/resource_response.h", + + # TODO: These all have to be removed. + "+content/public/browser/browser_thread.h", # Only for DCHECK. + "+content/public/browser/content_browser_client.h", # To get NetLog. + "+content/public/common/resource_devtools_info.h", + ], + "power_save_block_resource_throttle\.(cc|h)": [ + "-content", + "+content/browser/loader/power_save_block_resource_throttle.h", + "+content/public/browser/resource_throttle.h", + + # TODO: these all have to be removed. + "+content/public/browser/power_save_blocker.h", + ], + "resource_dispatcher_host_impl\.(cc|h)": [ + "-content", + "+content/browser/loader/async_resource_handler.h", + "+content/browser/loader/async_revalidation_manager.h", + "+content/browser/loader/global_routing_id.h", + "+content/browser/loader/power_save_block_resource_throttle.h", + "+content/browser/loader/resource_dispatcher_host_impl.h", + "+content/browser/loader/resource_loader.h", + "+content/browser/loader/resource_loader_delegate.h", + "+content/browser/loader/resource_message_filter.h", + "+content/browser/loader/resource_request_info_impl.h", + "+content/browser/loader/resource_scheduler.h", + "+content/browser/loader/stream_resource_handler.h", + "+content/browser/loader/sync_resource_handler.h", + "+content/browser/loader/throttling_resource_handler.h", + "+content/public/browser/global_request_id.h", + "+content/public/browser/resource_dispatcher_host.h", + "+content/public/browser/resource_dispatcher_host_delegate.h", + "+content/public/browser/resource_throttle.h", + + # TODO: These all have to be removed. + "+content/browser/appcache/appcache_interceptor.h", + "+content/browser/appcache/chrome_appcache_service.h", + "+content/browser/bad_message.h", + "+content/browser/blob_storage/chrome_blob_storage_context.h", + "+content/browser/cert_store_impl.h", + "+content/browser/child_process_security_policy_impl.h", + "+content/browser/download/download_resource_handler.h", + "+content/browser/download/save_file_manager.h", + "+content/browser/download/save_file_resource_handler.h", + "+content/browser/download/save_types.h", + "+content/browser/frame_host/frame_tree.h", + "+content/browser/frame_host/navigation_request_info.h", + "+content/browser/frame_host/navigator.h", + "+content/browser/loader/cross_site_resource_handler.h", + "+content/browser/loader/detachable_resource_handler.h", + "+content/browser/loader/mime_type_resource_handler.h", + "+content/browser/loader/navigation_resource_handler.h", + "+content/browser/loader/navigation_resource_throttle.h", + "+content/browser/loader/navigation_url_loader_impl_core.h", + "+content/browser/loader/redirect_to_file_resource_handler.h", + "+content/browser/loader/upload_data_stream_builder.h", + "+content/browser/renderer_host/render_view_host_delegate.h", + "+content/browser/renderer_host/render_view_host_impl.h", + "+content/browser/resource_context_impl.h", + "+content/browser/service_worker/foreign_fetch_request_handler.h", + "+content/browser/service_worker/link_header_support.h", + "+content/browser/service_worker/service_worker_request_handler.h", + "+content/browser/streams/stream.h", + "+content/browser/streams/stream_context.h", + "+content/browser/streams/stream_registry.h", + "+content/browser/web_contents/web_contents_impl.h", + "+content/common/appcache_interfaces.h", + "+content/common/content_export.h", + "+content/common/navigation_params.h", + "+content/common/net/url_request_service_worker_data.h", + "+content/common/resource_request_body.h", + "+content/common/site_isolation_policy.h", + "+content/common/ssl_status_serialization.h", + "+content/public/browser/browser_thread.h", + "+content/public/browser/child_process_data.h", + "+content/public/browser/content_browser_client.h", + "+content/public/browser/download_item.h", + "+content/public/browser/download_manager.h", + "+content/public/browser/download_url_parameters.h", + "+content/public/browser/notification_types.h", + "+content/public/browser/plugin_service.h", + "+content/public/browser/resource_request_details.h", + "+content/public/browser/stream_handle.h", + "+content/public/browser/stream_info.h", + "+content/public/browser/user_metrics.h", + "+content/public/browser/web_contents_observer.h", + "+content/public/common/browser_side_navigation_policy.h", + "+content/public/common/content_features.h", + "+content/public/common/content_switches.h", + "+content/public/common/process_type.h", + "+content/public/common/resource_type.h", + + # TODO: To be replaced by mojo. + "+content/common/resource_messages.h", + "+content/common/resource_request.h", + "+content/common/resource_request_completion_status.h", + "+content/common/view_messages.h", + ], + "resource_handler\.(cc|h)": [ + "-content", + "+content/browser/loader/resource_handler.h", + "+content/browser/loader/resource_request_info_impl.h", + "+content/common/content_export.h", + ], + "resource_loader\.(cc|h)": [ + "-content", + "+content/browser/loader/resource_handler.h", + "+content/browser/loader/resource_loader.h", + "+content/browser/loader/resource_loader_delegate.h", + "+content/browser/loader/resource_request_info_impl.h", + "+content/common/content_export.h", + "+content/public/browser/resource_controller.h", + "+content/public/browser/resource_dispatcher_host_login_delegate.h", + "+content/public/common/resource_response.h", + + # TODO: these all have to be removed. + "+content/browser/appcache/appcache_interceptor.h", + "+content/browser/child_process_security_policy_impl.h", + "+content/browser/loader/cross_site_resource_handler.h", + "+content/browser/loader/detachable_resource_handler.h", + "+content/browser/service_worker/service_worker_request_handler.h", + "+content/browser/service_worker/service_worker_response_info.h", + "+content/browser/ssl/ssl_client_auth_handler.h", + "+content/browser/ssl/ssl_error_handler.h", + "+content/browser/ssl/ssl_manager.h", + "+content/browser/ssl/ssl_policy.h", + "+content/common/ssl_status_serialization.h", + "+content/public/browser/cert_store.h", + "+content/public/browser/resource_context.h", + "+content/public/browser/signed_certificate_timestamp_store.h", + "+content/public/common/content_client.h", + "+content/public/common/content_switches.h", + "+content/public/common/process_type.h", + "+content/public/common/security_style.h", + "+content/public/common/signed_certificate_timestamp_id_and_status.h", + ], + "resource_handler_delegate\.h": [ + "-content", + ], + "resource_request_info_impl\.(cc|h)": [ + "-content", + "+content/browser/loader/global_routing_id.h", + "+content/browser/loader/resource_handler.h", + "+content/browser/loader/resource_message_filter.h", + "+content/browser/loader/resource_request_info_impl.h", + "+content/common/content_export.h", + "+content/public/browser/global_request_id.h", + "+content/public/browser/resource_request_info.h", + "+content/public/common/referrer.h", + "+content/public/common/resource_type.h", + + # TODO: these all have to be removed. + "+content/browser/frame_host/frame_tree_node.h", + "+content/browser/web_contents/web_contents_impl.h", + "+content/common/net/url_request_service_worker_data.h", + "+content/common/net/url_request_user_data.h", + "+content/public/browser/browser_thread.h", + "+content/public/common/browser_side_navigation_policy.h", + "+content/public/common/process_type.h", + ], + "resource_scheduler\.(cc|h)": [ + "-content", + "+content/browser/loader/resource_scheduler.h", + "+content/common/content_export.h", + "+content/public/browser/resource_controller.h", + "+content/public/browser/resource_request_info.h", + "+content/public/browser/resource_throttle.h", + + # TODO: To be replaced by mojo. + "+content/common/resource_messages.h", + ], + "resource_scheduler_filter\.(cc|h)": [ + "-content", + "+content/browser/loader/resource_dispatcher_host_impl.h", + "+content/browser/loader/resource_scheduler.h", + "+content/browser/loader/resource_scheduler_filter.h", + + # TODO: To be replaced by mojo. + "+content/common/frame_messages.h", + "+content/common/view_messages.h", + "+content/public/browser/browser_message_filter.h", + ], + "sync_resource_handler\.(cc|h)": [ + "-content", + "+content/browser/loader/netlog_observer.h", + "+content/browser/loader/resource_dispatcher_host_impl.h", + "+content/browser/loader/resource_handler.h", + "+content/browser/loader/resource_message_filter.h", + "+content/browser/loader/resource_request_info_impl.h", + "+content/browser/loader/sync_resource_handler.h", + "+content/public/browser/resource_dispatcher_host_delegate.h", + "+content/public/browser/resource_request_info.h", + "+content/public/common/resource_response.h", + + + # TODO: To be replaced by mojo. + "+content/common/resource_messages.h", + ], +} diff --git a/chromium/content/browser/loader/OWNERS b/chromium/content/browser/loader/OWNERS index 747dc150159..1af39dd3dd9 100644 --- a/chromium/content/browser/loader/OWNERS +++ b/chromium/content/browser/loader/OWNERS @@ -1 +1,2 @@ -mmenke@chromium.org
\ No newline at end of file +mmenke@chromium.org +rdsmith@chromium.org diff --git a/chromium/content/browser/loader/async_resource_handler.cc b/chromium/content/browser/loader/async_resource_handler.cc index 599767b01c1..f570cea606b 100644 --- a/chromium/content/browser/loader/async_resource_handler.cc +++ b/chromium/content/browser/loader/async_resource_handler.cc @@ -17,14 +17,15 @@ #include "base/metrics/histogram_macros.h" #include "base/strings/string_number_conversions.h" #include "base/time/time.h" -#include "content/browser/devtools/devtools_netlog_observer.h" #include "content/browser/host_zoom_map_impl.h" +#include "content/browser/loader/netlog_observer.h" #include "content/browser/loader/resource_buffer.h" #include "content/browser/loader/resource_dispatcher_host_impl.h" #include "content/browser/loader/resource_message_filter.h" #include "content/browser/loader/resource_request_info_impl.h" #include "content/browser/resource_context_impl.h" #include "content/common/resource_messages.h" +#include "content/common/resource_request_completion_status.h" #include "content/common/view_messages.h" #include "content/public/browser/resource_dispatcher_host_delegate.h" #include "content/public/common/content_features.h" @@ -46,7 +47,7 @@ static int kMaxAllocationSize = 1024 * 32; // The interval for calls to ReportUploadProgress. static int kUploadProgressIntervalMsec = 10; -// Used when kOptimizeIPCForSmallResource is enabled. +// Used when kOptimizeLoadingIPCForSmallResources is enabled. // Small resource typically issues two Read call: one for the content itself // and another for getting zero response to detect EOF. // Inline these two into the IPC message to avoid allocating an expensive @@ -74,7 +75,7 @@ void InitializeResourceBufferConstants() { } // namespace -// Used when kOptimizeIPCForSmallResource is enabled. +// Used when kOptimizeLoadingIPCForSmallResources is enabled. // The instance hooks the buffer allocation of AsyncResourceHandler, and // determine if we should use SharedMemory or should inline the data into // the IPC message. @@ -103,7 +104,8 @@ class AsyncResourceHandler::InliningHelper { // fall back to the regular resource loading path in that case. if (!inlining_applicable_ || num_allocation_ > kNumLeadingChunk || - !base::FeatureList::IsEnabled(features::kOptimizeIPCForSmallResource)) { + !base::FeatureList::IsEnabled( + features::kOptimizeLoadingIPCForSmallResources)) { return false; } @@ -301,7 +303,7 @@ bool AsyncResourceHandler::OnRequestRedirected( redirect_info.new_url, request(), info->GetContext(), response); } - DevToolsNetLogObserver::PopulateResponseInfo(request(), response); + NetLogObserver::PopulateResponseInfo(request(), response); response->head.encoded_data_length = request()->GetTotalReceivedBytes(); reported_transfer_size_ = 0; response->head.request_start = request()->creation_time(); @@ -342,7 +344,7 @@ bool AsyncResourceHandler::OnResponseStarted(ResourceResponse* response, request(), info->GetContext(), response, info->filter()); } - DevToolsNetLogObserver::PopulateResponseInfo(request(), response); + NetLogObserver::PopulateResponseInfo(request(), response); const HostZoomMapImpl* host_zoom_map = static_cast<const HostZoomMapImpl*>(info->filter()->GetHostZoomMap()); @@ -523,7 +525,7 @@ void AsyncResourceHandler::OnResponseCompleted( error_code = net::ERR_FAILED; } - ResourceMsg_RequestCompleteData request_complete_data; + ResourceRequestCompletionStatus request_complete_data; request_complete_data.error_code = error_code; request_complete_data.was_ignored_by_handler = was_ignored_by_handler; request_complete_data.exists_in_cache = request()->response_info().was_cached; diff --git a/chromium/content/browser/loader/async_revalidation_driver.cc b/chromium/content/browser/loader/async_revalidation_driver.cc index b04d32af91f..ffc8ce30d6c 100644 --- a/chromium/content/browser/loader/async_revalidation_driver.cc +++ b/chromium/content/browser/loader/async_revalidation_driver.cc @@ -13,7 +13,7 @@ #include "base/metrics/histogram_macros.h" #include "base/metrics/sparse_histogram.h" #include "base/single_thread_task_runner.h" -#include "base/thread_task_runner_handle.h" +#include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "net/base/net_errors.h" #include "net/url_request/url_request_status.h" diff --git a/chromium/content/browser/loader/async_revalidation_manager.cc b/chromium/content/browser/loader/async_revalidation_manager.cc index 4b364023e37..6b417ab4a00 100644 --- a/chromium/content/browser/loader/async_revalidation_manager.cc +++ b/chromium/content/browser/loader/async_revalidation_manager.cc @@ -13,6 +13,7 @@ #include "content/browser/loader/resource_request_info_impl.h" #include "content/browser/loader/resource_scheduler.h" #include "content/common/resource_messages.h" +#include "content/common/resource_request.h" #include "content/public/browser/resource_throttle.h" #include "net/base/load_flags.h" #include "net/http/http_transaction_factory.h" @@ -164,7 +165,7 @@ void AsyncRevalidationManager::CancelAsyncRevalidationsForResourceContext( } bool AsyncRevalidationManager::QualifiesForAsyncRevalidation( - const ResourceHostMsg_Request& request) { + const ResourceRequest& request) { if (request.load_flags & (net::LOAD_BYPASS_CACHE | net::LOAD_DISABLE_CACHE | net::LOAD_VALIDATE_CACHE | net::LOAD_PREFERRING_CACHE | diff --git a/chromium/content/browser/loader/async_revalidation_manager.h b/chromium/content/browser/loader/async_revalidation_manager.h index e866b4abc97..cf6f6c57aef 100644 --- a/chromium/content/browser/loader/async_revalidation_manager.h +++ b/chromium/content/browser/loader/async_revalidation_manager.h @@ -12,7 +12,6 @@ #include "base/macros.h" class GURL; -struct ResourceHostMsg_Request; namespace net { class URLRequest; @@ -24,6 +23,7 @@ namespace content { class AsyncRevalidationDriver; class ResourceContext; class ResourceScheduler; +struct ResourceRequest; // One instance of this class manages all active AsyncRevalidationDriver objects // for all profiles. It is created by and owned by @@ -44,8 +44,7 @@ class AsyncRevalidationManager { void CancelAsyncRevalidationsForResourceContext( ResourceContext* resource_context); - static bool QualifiesForAsyncRevalidation( - const ResourceHostMsg_Request& request); + static bool QualifiesForAsyncRevalidation(const ResourceRequest& request); private: // The key of the map of pending async revalidations. This key has a distinct diff --git a/chromium/content/browser/loader/async_revalidation_manager_unittest.cc b/chromium/content/browser/loader/async_revalidation_manager_unittest.cc index 09a70929d88..f299ad54d0f 100644 --- a/chromium/content/browser/loader/async_revalidation_manager_unittest.cc +++ b/chromium/content/browser/loader/async_revalidation_manager_unittest.cc @@ -21,6 +21,7 @@ #include "content/browser/loader/resource_message_filter.h" #include "content/common/child_process_host_impl.h" #include "content/common/resource_messages.h" +#include "content/common/resource_request.h" #include "content/public/browser/resource_context.h" #include "content/public/common/appcache_info.h" #include "content/public/common/process_type.h" @@ -240,10 +241,10 @@ class BlackholeFilter : public ResourceMessageFilter { DISALLOW_COPY_AND_ASSIGN(BlackholeFilter); }; -ResourceHostMsg_Request CreateResourceRequest(const char* method, - ResourceType type, - const GURL& url) { - ResourceHostMsg_Request request; +ResourceRequest CreateResourceRequest(const char* method, + ResourceType type, + const GURL& url) { + ResourceRequest request; request.method = std::string(method); request.url = url; request.first_party_for_cookies = url; // Bypass third-party cookie blocking. @@ -301,7 +302,7 @@ class AsyncRevalidationManagerTest : public ::testing::Test { // Creates a request using the current test object as the filter and // SubResource as the resource type. void MakeTestRequest(int render_view_id, int request_id, const GURL& url) { - ResourceHostMsg_Request request = + ResourceRequest request = CreateResourceRequest("GET", RESOURCE_TYPE_SUB_RESOURCE, url); ResourceHostMsg_RequestResource msg(render_view_id, request_id, request); host_.OnMessageReceived(msg, filter_.get()); @@ -337,7 +338,7 @@ TEST_F(AsyncRevalidationManagerTest, SupportsAsyncRevalidation) { TEST_F(AsyncRevalidationManagerTest, AsyncRevalidationNotSupportedForPOST) { SetResponse(net::URLRequestTestJob::test_headers(), "delay complete"); // Create POST request. - ResourceHostMsg_Request request = CreateResourceRequest( + ResourceRequest request = CreateResourceRequest( "POST", RESOURCE_TYPE_SUB_RESOURCE, GURL("http://example.com/baz.php")); ResourceHostMsg_RequestResource msg(0, 1, request); host_.OnMessageReceived(msg, filter_.get()); diff --git a/chromium/content/browser/loader/cross_site_resource_handler.cc b/chromium/content/browser/loader/cross_site_resource_handler.cc index c645670d25c..67d364a0ec0 100644 --- a/chromium/content/browser/loader/cross_site_resource_handler.cc +++ b/chromium/content/browser/loader/cross_site_resource_handler.cc @@ -69,7 +69,7 @@ void OnCrossSiteResponseHelper(const CrossSiteResponseParams& params) { RenderFrameHostImpl* rfh = RenderFrameHostImpl::FromID(params.global_request_id.child_id, params.render_frame_id); - if (rfh) { + if (rfh && rfh->is_active()) { if (rfh->GetParent()) { // We should only swap processes for subframes in --site-per-process mode. // CrossSiteResourceHandler is not installed on subframe requests in @@ -80,7 +80,7 @@ void OnCrossSiteResponseHelper(const CrossSiteResponseParams& params) { params.global_request_id, std::move(cross_site_transferring_request), params.transfer_url_chain, params.referrer, params.page_transition, params.should_replace_current_entry); - } else if (leak_requests_for_testing_ && cross_site_transferring_request) { + } else if (leak_requests_for_testing_) { // Some unit tests expect requests to be leaked in this case, so they can // pass them along manually. cross_site_transferring_request->ReleaseRequest(); @@ -97,7 +97,7 @@ CheckNavigationPolicyOnUI(GURL real_url, int process_id, int render_frame_id) { // Without a valid RFH against which to check, we must cancel the request, // to prevent the resource at |url| from being delivered to a potentially // unsuitable renderer process. - if (!rfh) + if (!rfh || !rfh->is_active()) return CrossSiteResourceHandler::NavigationDecision::CANCEL_REQUEST; RenderFrameHostManager* manager = rfh->frame_tree_node()->render_manager(); diff --git a/chromium/content/browser/loader/cross_site_resource_handler_browsertest.cc b/chromium/content/browser/loader/cross_site_resource_handler_browsertest.cc index eea52307c73..d245cca7cfa 100644 --- a/chromium/content/browser/loader/cross_site_resource_handler_browsertest.cc +++ b/chromium/content/browser/loader/cross_site_resource_handler_browsertest.cc @@ -7,7 +7,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/single_thread_task_runner.h" -#include "base/thread_task_runner_handle.h" +#include "base/threading/thread_task_runner_handle.h" #include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/loader/resource_dispatcher_host_impl.h" #include "content/browser/web_contents/web_contents_impl.h" diff --git a/chromium/content/browser/loader/mime_type_resource_handler.cc b/chromium/content/browser/loader/mime_type_resource_handler.cc index 2d23d131502..6cf84d58612 100644 --- a/chromium/content/browser/loader/mime_type_resource_handler.cc +++ b/chromium/content/browser/loader/mime_type_resource_handler.cc @@ -13,7 +13,7 @@ #include "base/metrics/histogram_macros.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_util.h" -#include "base/thread_task_runner_handle.h" +#include "base/threading/thread_task_runner_handle.h" #include "components/mime_util/mime_util.h" #include "content/browser/download/download_resource_handler.h" #include "content/browser/download/download_stats.h" diff --git a/chromium/content/browser/loader/navigation_resource_handler.cc b/chromium/content/browser/loader/navigation_resource_handler.cc index 6e1694be6cd..82c5c0686e7 100644 --- a/chromium/content/browser/loader/navigation_resource_handler.cc +++ b/chromium/content/browser/loader/navigation_resource_handler.cc @@ -4,14 +4,18 @@ #include "content/browser/loader/navigation_resource_handler.h" +#include <memory> + #include "base/logging.h" -#include "content/browser/devtools/devtools_netlog_observer.h" #include "content/browser/loader/navigation_url_loader_impl_core.h" +#include "content/browser/loader/netlog_observer.h" #include "content/browser/loader/resource_request_info_impl.h" #include "content/browser/resource_context_impl.h" #include "content/browser/streams/stream.h" #include "content/browser/streams/stream_context.h" +#include "content/public/browser/navigation_data.h" #include "content/public/browser/resource_controller.h" +#include "content/public/browser/resource_dispatcher_host_delegate.h" #include "content/public/browser/stream_handle.h" #include "content/public/common/resource_response.h" #include "net/base/net_errors.h" @@ -21,9 +25,11 @@ namespace content { NavigationResourceHandler::NavigationResourceHandler( net::URLRequest* request, - NavigationURLLoaderImplCore* core) + NavigationURLLoaderImplCore* core, + ResourceDispatcherHostDelegate* resource_dispatcher_host_delegate) : ResourceHandler(request), - core_(core) { + core_(core), + resource_dispatcher_host_delegate_(resource_dispatcher_host_delegate) { core_->set_resource_handler(this); writer_.set_immediate_mode(true); } @@ -64,7 +70,7 @@ bool NavigationResourceHandler::OnRequestRedirected( // TODO(davidben): Perform a CSP check here, and anything else that would have // been done renderer-side. - DevToolsNetLogObserver::PopulateResponseInfo(request(), response); + NetLogObserver::PopulateResponseInfo(request(), response); core_->NotifyRequestRedirected(redirect_info, response); *defer = true; return true; @@ -91,9 +97,23 @@ bool NavigationResourceHandler::OnResponseStarted(ResourceResponse* response, writer_.InitializeStream(stream_context->registry(), request()->url().GetOrigin()); - DevToolsNetLogObserver::PopulateResponseInfo(request(), response); - core_->NotifyResponseStarted(response, writer_.stream()->CreateHandle()); + NetLogObserver::PopulateResponseInfo(request(), response); + + std::unique_ptr<NavigationData> cloned_data; + if (resource_dispatcher_host_delegate_) { + // Ask the embedder for a NavigationData instance. + NavigationData* navigation_data = + resource_dispatcher_host_delegate_->GetNavigationData(request()); + + // Clone the embedder's NavigationData before moving it to the UI thread. + if (navigation_data) + cloned_data = navigation_data->Clone(); + } + + core_->NotifyResponseStarted(response, writer_.stream()->CreateHandle(), + std::move(cloned_data)); *defer = true; + return true; } diff --git a/chromium/content/browser/loader/navigation_resource_handler.h b/chromium/content/browser/loader/navigation_resource_handler.h index b5ba53572ca..cf8fc026bc9 100644 --- a/chromium/content/browser/loader/navigation_resource_handler.h +++ b/chromium/content/browser/loader/navigation_resource_handler.h @@ -12,12 +12,15 @@ namespace content { class NavigationURLLoaderImplCore; +class ResourceDispatcherHostDelegate; // PlzNavigate: The leaf ResourceHandler used with NavigationURLLoaderImplCore. class NavigationResourceHandler : public ResourceHandler { public: - NavigationResourceHandler(net::URLRequest* request, - NavigationURLLoaderImplCore* core); + NavigationResourceHandler( + net::URLRequest* request, + NavigationURLLoaderImplCore* core, + ResourceDispatcherHostDelegate* resource_dispatcher_host_delegate); ~NavigationResourceHandler() override; // Called by the loader the cancel the request. @@ -53,6 +56,7 @@ class NavigationResourceHandler : public ResourceHandler { NavigationURLLoaderImplCore* core_; StreamWriter writer_; + ResourceDispatcherHostDelegate* resource_dispatcher_host_delegate_; DISALLOW_COPY_AND_ASSIGN(NavigationResourceHandler); }; diff --git a/chromium/content/browser/loader/navigation_resource_throttle.cc b/chromium/content/browser/loader/navigation_resource_throttle.cc index 63210620c9f..3c0f5121c4c 100644 --- a/chromium/content/browser/loader/navigation_resource_throttle.cc +++ b/chromium/content/browser/loader/navigation_resource_throttle.cc @@ -4,6 +4,8 @@ #include "content/browser/loader/navigation_resource_throttle.h" +#include <memory> + #include "base/bind.h" #include "base/callback.h" #include "base/location.h" @@ -11,8 +13,10 @@ #include "content/browser/frame_host/navigation_handle_impl.h" #include "content/browser/frame_host/render_frame_host_impl.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/navigation_data.h" #include "content/public/browser/resource_context.h" #include "content/public/browser/resource_controller.h" +#include "content/public/browser/resource_dispatcher_host_delegate.h" #include "content/public/browser/resource_request_info.h" #include "content/public/common/referrer.h" #include "net/url_request/redirect_info.h" @@ -38,7 +42,7 @@ void SendCheckResultToIOThread(UIChecksPerformedCallback callback, void CheckWillStartRequestOnUIThread(UIChecksPerformedCallback callback, int render_process_id, int render_frame_host_id, - bool is_post, + const std::string& method, const Referrer& sanitized_referrer, bool has_user_gesture, ui::PageTransition transition, @@ -59,7 +63,7 @@ void CheckWillStartRequestOnUIThread(UIChecksPerformedCallback callback, } navigation_handle->WillStartRequest( - is_post, sanitized_referrer, has_user_gesture, transition, + method, sanitized_referrer, has_user_gesture, transition, is_external_protocol, base::Bind(&SendCheckResultToIOThread, callback)); } @@ -68,7 +72,7 @@ void CheckWillRedirectRequestOnUIThread( int render_process_id, int render_frame_host_id, const GURL& new_url, - bool new_method_is_post, + const std::string& new_method, const GURL& new_referrer_url, bool new_is_external_protocol, scoped_refptr<net::HttpResponseHeaders> headers) { @@ -91,16 +95,16 @@ void CheckWillRedirectRequestOnUIThread( RenderProcessHost::FromID(render_process_id) ->FilterURL(false, &new_validated_url); navigation_handle->WillRedirectRequest( - new_validated_url, new_method_is_post, new_referrer_url, - new_is_external_protocol, headers, - base::Bind(&SendCheckResultToIOThread, callback)); + new_validated_url, new_method, new_referrer_url, new_is_external_protocol, + headers, base::Bind(&SendCheckResultToIOThread, callback)); } void WillProcessResponseOnUIThread( UIChecksPerformedCallback callback, int render_process_id, int render_frame_host_id, - scoped_refptr<net::HttpResponseHeaders> headers) { + scoped_refptr<net::HttpResponseHeaders> headers, + std::unique_ptr<NavigationData> navigation_data) { DCHECK_CURRENTLY_ON(BrowserThread::UI); RenderFrameHostImpl* render_frame_host = RenderFrameHostImpl::FromID(render_process_id, render_frame_host_id); @@ -116,6 +120,9 @@ void WillProcessResponseOnUIThread( return; } + if (navigation_data) + navigation_handle->set_navigation_data(std::move(navigation_data)); + navigation_handle->WillProcessResponse( render_frame_host, headers, base::Bind(&SendCheckResultToIOThread, callback)); @@ -123,8 +130,12 @@ void WillProcessResponseOnUIThread( } // namespace -NavigationResourceThrottle::NavigationResourceThrottle(net::URLRequest* request) - : request_(request), weak_ptr_factory_(this) {} +NavigationResourceThrottle::NavigationResourceThrottle( + net::URLRequest* request, + ResourceDispatcherHostDelegate* resource_dispatcher_host_delegate) + : request_(request), + resource_dispatcher_host_delegate_(resource_dispatcher_host_delegate), + weak_ptr_factory_(this) {} NavigationResourceThrottle::~NavigationResourceThrottle() {} @@ -148,7 +159,7 @@ void NavigationResourceThrottle::WillStartRequest(bool* defer) { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&CheckWillStartRequestOnUIThread, callback, render_process_id, - render_frame_id, request_->method() == "POST", + render_frame_id, request_->method(), Referrer::SanitizeForRequest( request_->url(), Referrer(GURL(request_->referrer()), info->GetReferrerPolicy())), @@ -191,9 +202,8 @@ void NavigationResourceThrottle::WillRedirectRequest( BrowserThread::UI, FROM_HERE, base::Bind(&CheckWillRedirectRequestOnUIThread, callback, render_process_id, render_frame_id, redirect_info.new_url, - redirect_info.new_method == "POST", - GURL(redirect_info.new_referrer), new_is_external_protocol, - response_headers)); + redirect_info.new_method, GURL(redirect_info.new_referrer), + new_is_external_protocol, response_headers)); *defer = true; } @@ -215,6 +225,17 @@ void NavigationResourceThrottle::WillProcessResponse(bool* defer) { request_->response_headers()->raw_headers()); } + std::unique_ptr<NavigationData> cloned_data; + if (resource_dispatcher_host_delegate_) { + // Ask the embedder for a NavigationData instance. + NavigationData* navigation_data = + resource_dispatcher_host_delegate_->GetNavigationData(request_); + + // Clone the embedder's NavigationData before moving it to the UI thread. + if (navigation_data) + cloned_data = navigation_data->Clone(); + } + UIChecksPerformedCallback callback = base::Bind(&NavigationResourceThrottle::OnUIChecksPerformed, weak_ptr_factory_.GetWeakPtr()); @@ -222,7 +243,8 @@ void NavigationResourceThrottle::WillProcessResponse(bool* defer) { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&WillProcessResponseOnUIThread, callback, render_process_id, - render_frame_id, response_headers)); + render_frame_id, response_headers, + base::Passed(&cloned_data))); *defer = true; } diff --git a/chromium/content/browser/loader/navigation_resource_throttle.h b/chromium/content/browser/loader/navigation_resource_throttle.h index 6357b20aad4..45e9830e6fc 100644 --- a/chromium/content/browser/loader/navigation_resource_throttle.h +++ b/chromium/content/browser/loader/navigation_resource_throttle.h @@ -16,12 +16,16 @@ class URLRequest; namespace content { +class ResourceDispatcherHostDelegate; + // This ResourceThrottle is used to convey throttling information to the UI // thread during navigations. The UI thread can then use its NavigationThrottle // mechanism to interact with the navigation. class NavigationResourceThrottle : public ResourceThrottle { public: - NavigationResourceThrottle(net::URLRequest* request); + NavigationResourceThrottle( + net::URLRequest* request, + ResourceDispatcherHostDelegate* resource_dispatcher_host_delegate); ~NavigationResourceThrottle() override; // ResourceThrottle overrides: @@ -35,6 +39,7 @@ class NavigationResourceThrottle : public ResourceThrottle { void OnUIChecksPerformed(NavigationThrottle::ThrottleCheckResult result); net::URLRequest* request_; + ResourceDispatcherHostDelegate* resource_dispatcher_host_delegate_; base::WeakPtrFactory<NavigationResourceThrottle> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(NavigationResourceThrottle); diff --git a/chromium/content/browser/loader/navigation_url_loader_delegate.h b/chromium/content/browser/loader/navigation_url_loader_delegate.h index 201fa86297e..6f6cf1db2fb 100644 --- a/chromium/content/browser/loader/navigation_url_loader_delegate.h +++ b/chromium/content/browser/loader/navigation_url_loader_delegate.h @@ -17,6 +17,7 @@ struct RedirectInfo; namespace content { +class NavigationData; class StreamHandle; struct ResourceResponse; @@ -31,10 +32,11 @@ class CONTENT_EXPORT NavigationURLLoaderDelegate { // Called when the request receives its response. No further calls will be // made to the delegate. The response body is returned as a stream in - // |body_stream|. + // |body_stream|. |navigation_data| is passed to the NavigationHandle. virtual void OnResponseStarted( const scoped_refptr<ResourceResponse>& response, - std::unique_ptr<StreamHandle> body_stream) = 0; + std::unique_ptr<StreamHandle> body_stream, + std::unique_ptr<NavigationData> navigation_data) = 0; // Called if the request fails before receving a response. |net_error| is a // network error code for the failure. |has_stale_copy_in_cache| is true if diff --git a/chromium/content/browser/loader/navigation_url_loader_impl.cc b/chromium/content/browser/loader/navigation_url_loader_impl.cc index 8b4c670242e..bd0199c99e2 100644 --- a/chromium/content/browser/loader/navigation_url_loader_impl.cc +++ b/chromium/content/browser/loader/navigation_url_loader_impl.cc @@ -15,6 +15,7 @@ #include "content/browser/service_worker/service_worker_navigation_handle.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/navigation_data.h" #include "content/public/browser/stream_handle.h" namespace content { @@ -81,10 +82,12 @@ void NavigationURLLoaderImpl::NotifyRequestRedirected( void NavigationURLLoaderImpl::NotifyResponseStarted( const scoped_refptr<ResourceResponse>& response, - std::unique_ptr<StreamHandle> body) { + std::unique_ptr<StreamHandle> body, + std::unique_ptr<NavigationData> navigation_data) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - delegate_->OnResponseStarted(response, std::move(body)); + delegate_->OnResponseStarted(response, std::move(body), + std::move(navigation_data)); } void NavigationURLLoaderImpl::NotifyRequestFailed(bool in_cache, diff --git a/chromium/content/browser/loader/navigation_url_loader_impl.h b/chromium/content/browser/loader/navigation_url_loader_impl.h index 51131cc12d0..d3d2d38e713 100644 --- a/chromium/content/browser/loader/navigation_url_loader_impl.h +++ b/chromium/content/browser/loader/navigation_url_loader_impl.h @@ -20,6 +20,7 @@ struct RedirectInfo; namespace content { class NavigationURLLoaderImplCore; +class NavigationData; class ServiceWorkerNavigationHandle; class StreamHandle; struct ResourceResponse; @@ -46,7 +47,8 @@ class NavigationURLLoaderImpl : public NavigationURLLoader { // Notifies the delegate that the response has started. void NotifyResponseStarted(const scoped_refptr<ResourceResponse>& response, - std::unique_ptr<StreamHandle> body); + std::unique_ptr<StreamHandle> body, + std::unique_ptr<NavigationData> navigation_data); // Notifies the delegate the request failed to return a response. void NotifyRequestFailed(bool in_cache, int net_error); diff --git a/chromium/content/browser/loader/navigation_url_loader_impl_core.cc b/chromium/content/browser/loader/navigation_url_loader_impl_core.cc index 84001faae57..c7a215d0dd8 100644 --- a/chromium/content/browser/loader/navigation_url_loader_impl_core.cc +++ b/chromium/content/browser/loader/navigation_url_loader_impl_core.cc @@ -13,6 +13,7 @@ #include "content/browser/service_worker/service_worker_navigation_handle_core.h" #include "content/common/navigation_params.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/navigation_data.h" #include "content/public/browser/stream_handle.h" #include "content/public/common/resource_response.h" #include "net/base/net_errors.h" @@ -94,7 +95,8 @@ void NavigationURLLoaderImplCore::NotifyRequestRedirected( void NavigationURLLoaderImplCore::NotifyResponseStarted( ResourceResponse* response, - std::unique_ptr<StreamHandle> body) { + std::unique_ptr<StreamHandle> body, + std::unique_ptr<NavigationData> navigation_data) { DCHECK_CURRENTLY_ON(BrowserThread::IO); TRACE_EVENT_ASYNC_END0("navigation", "Navigation redirectDelay", this); TRACE_EVENT_ASYNC_END2("navigation", "Navigation timeToResponseStarted", this, @@ -112,7 +114,8 @@ void NavigationURLLoaderImplCore::NotifyResponseStarted( BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&NavigationURLLoaderImpl::NotifyResponseStarted, loader_, - response->DeepCopy(), base::Passed(&body))); + response->DeepCopy(), base::Passed(&body), + base::Passed(&navigation_data))); } void NavigationURLLoaderImplCore::NotifyRequestFailed(bool in_cache, diff --git a/chromium/content/browser/loader/navigation_url_loader_impl_core.h b/chromium/content/browser/loader/navigation_url_loader_impl_core.h index 67a2925dc19..46c46c20755 100644 --- a/chromium/content/browser/loader/navigation_url_loader_impl_core.h +++ b/chromium/content/browser/loader/navigation_url_loader_impl_core.h @@ -20,6 +20,7 @@ namespace content { class FrameTreeNode; class NavigationResourceHandler; +class NavigationData; class ResourceContext; class ResourceHandler; class ResourceRequestBody; @@ -60,7 +61,8 @@ class NavigationURLLoaderImplCore { // Notifies |loader_| on the UI thread that the response started. void NotifyResponseStarted(ResourceResponse* response, - std::unique_ptr<StreamHandle> body); + std::unique_ptr<StreamHandle> body, + std::unique_ptr<NavigationData> navigation_data); // Notifies |loader_| on the UI thread that the request failed. void NotifyRequestFailed(bool in_cache, int net_error); diff --git a/chromium/content/browser/loader/navigation_url_loader_unittest.cc b/chromium/content/browser/loader/navigation_url_loader_unittest.cc index 8b7c5cccd06..8f4a9b9c10f 100644 --- a/chromium/content/browser/loader/navigation_url_loader_unittest.cc +++ b/chromium/content/browser/loader/navigation_url_loader_unittest.cc @@ -11,7 +11,6 @@ #include "base/memory/ref_counted.h" #include "base/run_loop.h" #include "content/browser/frame_host/navigation_request_info.h" -#include "content/browser/loader/navigation_url_loader_delegate.h" #include "content/browser/loader/navigation_url_loader_impl.h" #include "content/browser/loader/resource_dispatcher_host_impl.h" #include "content/browser/streams/stream.h" @@ -27,6 +26,7 @@ #include "content/public/common/resource_response.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_browser_thread_bundle.h" +#include "content/test/test_navigation_url_loader_delegate.h" #include "net/base/load_flags.h" #include "net/base/net_errors.h" #include "net/http/http_response_headers.h" @@ -64,84 +64,6 @@ class StreamProtocolHandler DISALLOW_COPY_AND_ASSIGN(StreamProtocolHandler); }; -class TestNavigationURLLoaderDelegate : public NavigationURLLoaderDelegate { - public: - TestNavigationURLLoaderDelegate() - : net_error_(0), on_request_handled_counter_(0) {} - - const net::RedirectInfo& redirect_info() const { return redirect_info_; } - ResourceResponse* redirect_response() const { - return redirect_response_.get(); - } - ResourceResponse* response() const { return response_.get(); } - StreamHandle* body() const { return body_.get(); } - int net_error() const { return net_error_; } - int on_request_handled_counter() const { return on_request_handled_counter_; } - - void WaitForRequestRedirected() { - request_redirected_.reset(new base::RunLoop); - request_redirected_->Run(); - request_redirected_.reset(); - } - - void WaitForResponseStarted() { - response_started_.reset(new base::RunLoop); - response_started_->Run(); - response_started_.reset(); - } - - void WaitForRequestFailed() { - request_failed_.reset(new base::RunLoop); - request_failed_->Run(); - request_failed_.reset(); - } - - void ReleaseBody() { - body_.reset(); - } - - // NavigationURLLoaderDelegate implementation. - void OnRequestRedirected( - const net::RedirectInfo& redirect_info, - const scoped_refptr<ResourceResponse>& response) override { - redirect_info_ = redirect_info; - redirect_response_ = response; - ASSERT_TRUE(request_redirected_); - request_redirected_->Quit(); - } - - void OnResponseStarted(const scoped_refptr<ResourceResponse>& response, - std::unique_ptr<StreamHandle> body) override { - response_ = response; - body_ = std::move(body); - ASSERT_TRUE(response_started_); - response_started_->Quit(); - } - - void OnRequestFailed(bool in_cache, int net_error) override { - net_error_ = net_error; - ASSERT_TRUE(request_failed_); - request_failed_->Quit(); - } - - void OnRequestStarted(base::TimeTicks timestamp) override { - ASSERT_FALSE(timestamp.is_null()); - ++on_request_handled_counter_; - } - - private: - net::RedirectInfo redirect_info_; - scoped_refptr<ResourceResponse> redirect_response_; - scoped_refptr<ResourceResponse> response_; - std::unique_ptr<StreamHandle> body_; - int net_error_; - int on_request_handled_counter_; - - std::unique_ptr<base::RunLoop> request_redirected_; - std::unique_ptr<base::RunLoop> response_started_; - std::unique_ptr<base::RunLoop> request_failed_; -}; - class RequestBlockingResourceDispatcherHostDelegate : public ResourceDispatcherHostDelegate { public: diff --git a/chromium/content/browser/loader/netlog_observer.cc b/chromium/content/browser/loader/netlog_observer.cc new file mode 100644 index 00000000000..8938ee6cd34 --- /dev/null +++ b/chromium/content/browser/loader/netlog_observer.cc @@ -0,0 +1,200 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/loader/netlog_observer.h" + +#include <stddef.h> + +#include "base/strings/string_util.h" +#include "base/values.h" +#include "content/browser/loader/resource_request_info_impl.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/content_browser_client.h" +#include "content/public/common/resource_response.h" +#include "net/base/load_flags.h" +#include "net/http/http_response_headers.h" +#include "net/http/http_util.h" +#include "net/spdy/spdy_header_block.h" +#include "net/url_request/url_request.h" +#include "net/url_request/url_request_netlog_params.h" + +namespace content { +const size_t kMaxNumEntries = 1000; + +NetLogObserver* NetLogObserver::instance_ = NULL; + +NetLogObserver::NetLogObserver() {} + +NetLogObserver::~NetLogObserver() {} + +NetLogObserver::ResourceInfo* NetLogObserver::GetResourceInfo(uint32_t id) { + RequestToInfoMap::iterator it = request_to_info_.find(id); + if (it != request_to_info_.end()) + return it->second.get(); + return NULL; +} + +void NetLogObserver::OnAddEntry(const net::NetLog::Entry& entry) { + // The events that the Observer is interested in only occur on the IO thread. + if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) + return; + + if (entry.source().type == net::NetLog::SOURCE_URL_REQUEST) + OnAddURLRequestEntry(entry); +} + +void NetLogObserver::OnAddURLRequestEntry(const net::NetLog::Entry& entry) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + + bool is_begin = entry.phase() == net::NetLog::PHASE_BEGIN; + bool is_end = entry.phase() == net::NetLog::PHASE_END; + + if (entry.type() == net::NetLog::TYPE_URL_REQUEST_START_JOB) { + if (is_begin) { + if (request_to_info_.size() > kMaxNumEntries) { + LOG(WARNING) << "The raw headers observer url request count has grown " + "larger than expected, resetting"; + request_to_info_.clear(); + } + + request_to_info_[entry.source().id] = new ResourceInfo(); + } + return; + } else if (entry.type() == net::NetLog::TYPE_REQUEST_ALIVE) { + // Cleanup records based on the TYPE_REQUEST_ALIVE entry. + if (is_end) + request_to_info_.erase(entry.source().id); + return; + } + + ResourceInfo* info = GetResourceInfo(entry.source().id); + if (!info) + return; + + switch (entry.type()) { + case net::NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST_HEADERS: { + std::unique_ptr<base::Value> event_params(entry.ParametersToValue()); + std::string request_line; + net::HttpRequestHeaders request_headers; + + if (!net::HttpRequestHeaders::FromNetLogParam( + event_params.get(), &request_headers, &request_line)) { + NOTREACHED(); + } + + // We need to clear headers in case the same url_request is reused for + // several http requests (e.g. see http://crbug.com/80157). + info->request_headers.clear(); + + for (net::HttpRequestHeaders::Iterator it(request_headers); + it.GetNext();) { + info->request_headers.push_back(std::make_pair(it.name(), it.value())); + } + info->request_headers_text = request_line + request_headers.ToString(); + break; + } + case net::NetLog::TYPE_HTTP_TRANSACTION_HTTP2_SEND_REQUEST_HEADERS: { + std::unique_ptr<base::Value> event_params(entry.ParametersToValue()); + net::SpdyHeaderBlock request_headers; + + if (!net::SpdyHeaderBlockFromNetLogParam(event_params.get(), + &request_headers)) { + NOTREACHED(); + } + + // We need to clear headers in case the same url_request is reused for + // several http requests (e.g. see http://crbug.com/80157). + info->request_headers.clear(); + + for (net::SpdyHeaderBlock::const_iterator it = request_headers.begin(); + it != request_headers.end(); ++it) { + info->request_headers.push_back( + std::make_pair(it->first.as_string(), it->second.as_string())); + } + info->request_headers_text = ""; + break; + } + case net::NetLog::TYPE_HTTP_TRANSACTION_READ_RESPONSE_HEADERS: { + std::unique_ptr<base::Value> event_params(entry.ParametersToValue()); + + scoped_refptr<net::HttpResponseHeaders> response_headers; + + if (!net::HttpResponseHeaders::FromNetLogParam(event_params.get(), + &response_headers)) { + NOTREACHED(); + } + + info->http_status_code = response_headers->response_code(); + info->http_status_text = response_headers->GetStatusText(); + std::string name, value; + + // We need to clear headers in case the same url_request is reused for + // several http requests (e.g. see http://crbug.com/80157). + info->response_headers.clear(); + + for (size_t it = 0; + response_headers->EnumerateHeaderLines(&it, &name, &value);) { + info->response_headers.push_back(std::make_pair(name, value)); + } + + if (!info->request_headers_text.empty()) { + info->response_headers_text = + net::HttpUtil::ConvertHeadersBackToHTTPResponse( + response_headers->raw_headers()); + } else { + // SPDY request. + info->response_headers_text = ""; + } + break; + } + default: + break; + } +} + +void NetLogObserver::Attach() { + DCHECK(!instance_); + net::NetLog* net_log = GetContentClient()->browser()->GetNetLog(); + if (net_log) { + instance_ = new NetLogObserver(); + net_log->DeprecatedAddObserver( + instance_, net::NetLogCaptureMode::IncludeCookiesAndCredentials()); + } +} + +void NetLogObserver::Detach() { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + + if (instance_) { + // Safest not to do this in the destructor to maintain thread safety across + // refactorings. + instance_->net_log()->DeprecatedRemoveObserver(instance_); + delete instance_; + instance_ = NULL; + } +} + +NetLogObserver* NetLogObserver::GetInstance() { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + + return instance_; +} + +// static +void NetLogObserver::PopulateResponseInfo(net::URLRequest* request, + ResourceResponse* response) { + const ResourceRequestInfoImpl* request_info = + ResourceRequestInfoImpl::ForRequest(request); + if (!request_info || !request_info->ShouldReportRawHeaders()) + return; + + uint32_t source_id = request->net_log().source().id; + NetLogObserver* dev_tools_net_log_observer = NetLogObserver::GetInstance(); + if (dev_tools_net_log_observer == NULL) + return; + response->head.devtools_info = + dev_tools_net_log_observer->GetResourceInfo(source_id); +} + +} // namespace content diff --git a/chromium/content/browser/loader/netlog_observer.h b/chromium/content/browser/loader/netlog_observer.h new file mode 100644 index 00000000000..330a502e50a --- /dev/null +++ b/chromium/content/browser/loader/netlog_observer.h @@ -0,0 +1,64 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_LOADER_NETLOG_OBSERVER_H_ +#define CONTENT_BROWSER_LOADER_NETLOG_OBSERVER_H_ + +#include <stdint.h> + +#include "base/containers/hash_tables.h" +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "content/public/common/resource_devtools_info.h" +#include "net/log/net_log.h" + +namespace net { +class URLRequest; +} // namespace net + +namespace content { +struct ResourceResponse; + +// NetLogObserver watches the NetLog event stream and collects the stuff that +// may be of interest to the client. Currently, this only includes actual +// HTTP/SPDY headers sent and received over the network. +// +// As NetLogObserver shares live data with objects that live on the IO Thread, +// it must also reside on the IO Thread. Only OnAddEntry can be called from +// other threads. +class NetLogObserver : public net::NetLog::ThreadSafeObserver { + typedef ResourceDevToolsInfo ResourceInfo; + + public: + // net::NetLog::ThreadSafeObserver implementation: + void OnAddEntry(const net::NetLog::Entry& entry) override; + + void OnAddURLRequestEntry(const net::NetLog::Entry& entry); + + static void Attach(); + static void Detach(); + + // Must be called on the IO thread. May return NULL if no observers + // are active. + static NetLogObserver* GetInstance(); + static void PopulateResponseInfo(net::URLRequest*, ResourceResponse*); + + private: + static NetLogObserver* instance_; + + NetLogObserver(); + ~NetLogObserver() override; + + ResourceInfo* GetResourceInfo(uint32_t id); + + typedef base::hash_map<uint32_t, scoped_refptr<ResourceInfo>> + RequestToInfoMap; + RequestToInfoMap request_to_info_; + + DISALLOW_COPY_AND_ASSIGN(NetLogObserver); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_LOADER_NETLOG_OBSERVER_H_ diff --git a/chromium/content/browser/loader/reload_cache_control_browsertest.cc b/chromium/content/browser/loader/reload_cache_control_browsertest.cc new file mode 100644 index 00000000000..38586762a6e --- /dev/null +++ b/chromium/content/browser/loader/reload_cache_control_browsertest.cc @@ -0,0 +1,151 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <memory> + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/feature_list.h" +#include "base/files/file_path.h" +#include "content/public/common/content_features.h" +#include "content/public/test/content_browser_test.h" +#include "content/public/test/content_browser_test_utils.h" +#include "content/shell/browser/shell.h" +#include "net/test/embedded_test_server/embedded_test_server.h" +#include "net/test/embedded_test_server/http_request.h" +#include "net/test/embedded_test_server/http_response.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace content { + +namespace { + +using net::test_server::HttpRequest; +using net::test_server::HttpResponse; + +const char kReloadTestPath[] = "/loader/reload.html"; +const char kReloadImagePath[] = "/loader/empty16x16.png"; + +const char kNoCacheControl[] = ""; +const char kMaxAgeCacheControl[] = "max-age=0"; +const char kNoCacheCacheControl[] = "no-cache"; + +struct RequestLog { + std::string relative_url; + std::string cache_control; +}; + +class ReloadCacheControlBrowserTest : public ContentBrowserTest { + protected: + ReloadCacheControlBrowserTest() = default; + ~ReloadCacheControlBrowserTest() override = default; + + void SetUpOnMainThread() override { + // ContentBrowserTest creates embedded_test_server instance with + // a registered HandleFileRequest for "content/test/data". + // Because the handler is registered as the first handler, MonitorHandler + // is needed to capture all requests. + embedded_test_server()->RegisterRequestMonitor(base::Bind( + &ReloadCacheControlBrowserTest::MonitorRequestHandler, this)); + + ASSERT_TRUE(embedded_test_server()->Start()); + } + + protected: + std::vector<RequestLog> request_log_; + + private: + void MonitorRequestHandler(const HttpRequest& request) { + RequestLog log; + log.relative_url = request.relative_url; + auto cache_control = request.headers.find("Cache-Control"); + log.cache_control = cache_control == request.headers.end() + ? kNoCacheControl + : cache_control->second; + request_log_.push_back(log); + } + + DISALLOW_COPY_AND_ASSIGN(ReloadCacheControlBrowserTest); +}; + +class ReloadCacheControlWithAnExperimentBrowserTest + : public ReloadCacheControlBrowserTest { + protected: + ReloadCacheControlWithAnExperimentBrowserTest() = default; + ~ReloadCacheControlWithAnExperimentBrowserTest() override = default; + + void SetUpOnMainThread() override { + base::FeatureList::ClearInstanceForTesting(); + std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); + feature_list->InitializeFromCommandLine( + features::kNonValidatingReloadOnNormalReload.name, std::string()); + base::FeatureList::SetInstance(std::move(feature_list)); + + ReloadCacheControlBrowserTest::SetUpOnMainThread(); + } + + DISALLOW_COPY_AND_ASSIGN(ReloadCacheControlWithAnExperimentBrowserTest); +}; + +IN_PROC_BROWSER_TEST_F(ReloadCacheControlBrowserTest, NormalReload) { + GURL url(embedded_test_server()->GetURL(kReloadTestPath)); + + EXPECT_TRUE(NavigateToURL(shell(), url)); + ReloadBlockUntilNavigationsComplete(shell(), 1); + + ASSERT_EQ(4UL, request_log_.size()); + EXPECT_EQ(kReloadTestPath, request_log_[0].relative_url); + EXPECT_EQ(kNoCacheControl, request_log_[0].cache_control); + EXPECT_EQ(kReloadImagePath, request_log_[1].relative_url); + EXPECT_EQ(kNoCacheControl, request_log_[1].cache_control); + + EXPECT_EQ(kReloadTestPath, request_log_[2].relative_url); + EXPECT_EQ(kMaxAgeCacheControl, request_log_[2].cache_control); + EXPECT_EQ(kReloadImagePath, request_log_[3].relative_url); + EXPECT_EQ(kMaxAgeCacheControl, request_log_[3].cache_control); +} + +IN_PROC_BROWSER_TEST_F(ReloadCacheControlBrowserTest, BypassingReload) { + GURL url(embedded_test_server()->GetURL(kReloadTestPath)); + + EXPECT_TRUE(NavigateToURL(shell(), url)); + ReloadBypassingCacheBlockUntilNavigationsComplete(shell(), 1); + + ASSERT_EQ(4UL, request_log_.size()); + EXPECT_EQ(kReloadTestPath, request_log_[0].relative_url); + EXPECT_EQ(kNoCacheControl, request_log_[0].cache_control); + EXPECT_EQ(kReloadImagePath, request_log_[1].relative_url); + EXPECT_EQ(kNoCacheControl, request_log_[1].cache_control); + + EXPECT_EQ(kReloadTestPath, request_log_[2].relative_url); + EXPECT_EQ(kNoCacheCacheControl, request_log_[2].cache_control); + EXPECT_EQ(kReloadImagePath, request_log_[3].relative_url); + EXPECT_EQ(kNoCacheCacheControl, request_log_[3].cache_control); +} + +IN_PROC_BROWSER_TEST_F(ReloadCacheControlWithAnExperimentBrowserTest, + ReloadMainResource) { + GURL url(embedded_test_server()->GetURL(kReloadTestPath)); + + EXPECT_TRUE(NavigateToURL(shell(), url)); + ReloadBlockUntilNavigationsComplete(shell(), 1); + + ASSERT_EQ(4UL, request_log_.size()); + EXPECT_EQ(kReloadTestPath, request_log_[0].relative_url); + EXPECT_EQ(kNoCacheControl, request_log_[0].cache_control); + EXPECT_EQ(kReloadImagePath, request_log_[1].relative_url); + EXPECT_EQ(kNoCacheControl, request_log_[1].cache_control); + + EXPECT_EQ(kReloadTestPath, request_log_[2].relative_url); + EXPECT_EQ(kMaxAgeCacheControl, request_log_[2].cache_control); + EXPECT_EQ(kReloadImagePath, request_log_[3].relative_url); + EXPECT_EQ(kNoCacheControl, request_log_[3].cache_control); +} + +// TODO(toyoshim): Add another set of reload tests with DevTools open. + +} // namespace + +} // namespace content diff --git a/chromium/content/browser/loader/resource_dispatcher_host_impl.cc b/chromium/content/browser/loader/resource_dispatcher_host_impl.cc index 1b55bf72760..cb64dc8880b 100644 --- a/chromium/content/browser/loader/resource_dispatcher_host_impl.cc +++ b/chromium/content/browser/loader/resource_dispatcher_host_impl.cc @@ -36,12 +36,12 @@ #include "content/browser/appcache/appcache_interceptor.h" #include "content/browser/appcache/chrome_appcache_service.h" #include "content/browser/bad_message.h" +#include "content/browser/blob_storage/chrome_blob_storage_context.h" #include "content/browser/cert_store_impl.h" #include "content/browser/child_process_security_policy_impl.h" #include "content/browser/download/download_resource_handler.h" #include "content/browser/download/save_file_manager.h" #include "content/browser/download/save_file_resource_handler.h" -#include "content/browser/fileapi/chrome_blob_storage_context.h" #include "content/browser/frame_host/frame_tree.h" #include "content/browser/frame_host/navigation_request_info.h" #include "content/browser/frame_host/navigator.h" @@ -75,6 +75,8 @@ #include "content/common/navigation_params.h" #include "content/common/net/url_request_service_worker_data.h" #include "content/common/resource_messages.h" +#include "content/common/resource_request.h" +#include "content/common/resource_request_completion_status.h" #include "content/common/site_isolation_policy.h" #include "content/common/ssl_status_serialization.h" #include "content/common/view_messages.h" @@ -235,7 +237,7 @@ void AbortRequestBeforeItStarts(ResourceMessageFilter* filter, filter->Send(sync_result); } else { // Tell the renderer that this request was disallowed. - ResourceMsg_RequestCompleteData request_complete_data; + ResourceRequestCompletionStatus request_complete_data; request_complete_data.error_code = net::ERR_ABORTED; request_complete_data.was_ignored_by_handler = false; request_complete_data.exists_in_cache = false; @@ -273,7 +275,6 @@ void SetReferrerForRequest(net::URLRequest* request, const Referrer& referrer) { net::URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN; break; case blink::WebReferrerPolicyDefault: - default: net_referrer_policy = command_line->HasSwitch(switches::kReducedReferrerGranularity) ? net::URLRequest:: @@ -281,6 +282,10 @@ void SetReferrerForRequest(net::URLRequest* request, const Referrer& referrer) { : net::URLRequest:: CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE; break; + case blink::WebReferrerPolicyNoReferrerWhenDowngradeOriginWhenCrossOrigin: + net_referrer_policy = net::URLRequest:: + REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN; + break; } request->set_referrer_policy(net_referrer_policy); } @@ -291,7 +296,7 @@ void SetReferrerForRequest(net::URLRequest* request, const Referrer& referrer) { // if the renderer is attempting to upload an unauthorized file. bool ShouldServiceRequest(int process_type, int child_id, - const ResourceHostMsg_Request& request_data, + const ResourceRequest& request_data, const net::HttpRequestHeaders& headers, ResourceMessageFilter* filter, ResourceContext* resource_context) { @@ -1212,7 +1217,7 @@ bool ResourceDispatcherHostImpl::OnMessageReceived( void ResourceDispatcherHostImpl::OnRequestResource( int routing_id, int request_id, - const ResourceHostMsg_Request& request_data) { + const ResourceRequest& request_data) { // TODO(pkasting): Remove ScopedTracker below once crbug.com/477117 is fixed. tracked_objects::ScopedTracker tracking_profile( FROM_HERE_WITH_EXPLICIT_FUNCTION( @@ -1244,10 +1249,9 @@ void ResourceDispatcherHostImpl::OnRequestResource( // // If sync_result is non-null, then a SyncLoad reply will be generated, else // a normal asynchronous set of response messages will be generated. -void ResourceDispatcherHostImpl::OnSyncLoad( - int request_id, - const ResourceHostMsg_Request& request_data, - IPC::Message* sync_result) { +void ResourceDispatcherHostImpl::OnSyncLoad(int request_id, + const ResourceRequest& request_data, + IPC::Message* sync_result) { BeginRequest(request_id, request_data, sync_result, sync_result->routing_id()); } @@ -1270,7 +1274,7 @@ void ResourceDispatcherHostImpl::UpdateRequestForTransfer( int child_id, int route_id, int request_id, - const ResourceHostMsg_Request& request_data, + const ResourceRequest& request_data, LoaderMap::iterator iter) { ResourceRequestInfoImpl* info = iter->second->GetRequestInfo(); GlobalFrameRoutingId old_routing_id(request_data.transferred_request_child_id, @@ -1362,7 +1366,7 @@ void ResourceDispatcherHostImpl::UpdateRequestForTransfer( void ResourceDispatcherHostImpl::BeginRequest( int request_id, - const ResourceHostMsg_Request& request_data, + const ResourceRequest& request_data, IPC::Message* sync_result, // only valid for sync int route_id) { int process_type = filter_->process_type(); @@ -1632,7 +1636,7 @@ void ResourceDispatcherHostImpl::BeginRequest( std::unique_ptr<ResourceHandler> ResourceDispatcherHostImpl::CreateResourceHandler( net::URLRequest* request, - const ResourceHostMsg_Request& request_data, + const ResourceRequest& request_data, IPC::Message* sync_result, int route_id, int process_type, @@ -1729,7 +1733,7 @@ ResourceDispatcherHostImpl::AddStandardHandlers( // PlzNavigate: the throttle is unnecessary as communication with the UI // thread is handled by the NavigationURLloader. if (!IsBrowserSideNavigationEnabled() && IsResourceTypeFrame(resource_type)) - throttles.push_back(new NavigationResourceThrottle(request)); + throttles.push_back(new NavigationResourceThrottle(request, delegate())); if (delegate_) { delegate_->RequestBeginning(request, @@ -2326,7 +2330,7 @@ void ResourceDispatcherHostImpl::BeginNavigationRequest( // TODO(davidben): Attach AppCacheInterceptor. std::unique_ptr<ResourceHandler> handler( - new NavigationResourceHandler(new_request.get(), loader)); + new NavigationResourceHandler(new_request.get(), loader, delegate())); // TODO(davidben): Pass in the appropriate appcache_service. Also fix the // dependency on child_id/route_id. Those are used by the ResourceScheduler; @@ -2644,7 +2648,7 @@ void ResourceDispatcherHostImpl::UnregisterResourceMessageDelegate( } int ResourceDispatcherHostImpl::BuildLoadFlagsForRequest( - const ResourceHostMsg_Request& request_data, + const ResourceRequest& request_data, int child_id, bool is_sync_load) { int load_flags = request_data.load_flags; diff --git a/chromium/content/browser/loader/resource_dispatcher_host_impl.h b/chromium/content/browser/loader/resource_dispatcher_host_impl.h index 086f39bea06..3d960faa85a 100644 --- a/chromium/content/browser/loader/resource_dispatcher_host_impl.h +++ b/chromium/content/browser/loader/resource_dispatcher_host_impl.h @@ -47,7 +47,6 @@ #include "net/url_request/url_request.h" class ResourceHandler; -struct ResourceHostMsg_Request; namespace base { class FilePath; @@ -80,6 +79,7 @@ struct CommonNavigationParams; struct DownloadSaveInfo; struct NavigationRequestInfo; struct Referrer; +struct ResourceRequest; // This class is responsible for notifying the IO thread (specifically, the // ResourceDispatcherHostImpl) of frame events. It has an interace for callers @@ -465,9 +465,9 @@ class CONTENT_EXPORT ResourceDispatcherHostImpl void OnRequestResource(int routing_id, int request_id, - const ResourceHostMsg_Request& request_data); + const ResourceRequest& request_data); void OnSyncLoad(int request_id, - const ResourceHostMsg_Request& request_data, + const ResourceRequest& request_data, IPC::Message* sync_result); bool IsRequestIDInUse(const GlobalRequestID& id) const; @@ -477,19 +477,19 @@ class CONTENT_EXPORT ResourceDispatcherHostImpl void UpdateRequestForTransfer(int child_id, int route_id, int request_id, - const ResourceHostMsg_Request& request_data, + const ResourceRequest& request_data, LoaderMap::iterator iter); void BeginRequest(int request_id, - const ResourceHostMsg_Request& request_data, + const ResourceRequest& request_data, IPC::Message* sync_result, // only valid for sync - int route_id); // only valid for async + int route_id); // only valid for async // Creates a ResourceHandler to be used by BeginRequest() for normal resource // loading. std::unique_ptr<ResourceHandler> CreateResourceHandler( net::URLRequest* request, - const ResourceHostMsg_Request& request_data, + const ResourceRequest& request_data, IPC::Message* sync_result, int route_id, int process_type, @@ -553,7 +553,7 @@ class CONTENT_EXPORT ResourceDispatcherHostImpl void UnregisterResourceMessageDelegate(const GlobalRequestID& id, ResourceMessageDelegate* delegate); - int BuildLoadFlagsForRequest(const ResourceHostMsg_Request& request_data, + int BuildLoadFlagsForRequest(const ResourceRequest& request_data, int child_id, bool is_sync_load); diff --git a/chromium/content/browser/loader/resource_dispatcher_host_unittest.cc b/chromium/content/browser/loader/resource_dispatcher_host_unittest.cc index 606da908983..18b98a88c6e 100644 --- a/chromium/content/browser/loader/resource_dispatcher_host_unittest.cc +++ b/chromium/content/browser/loader/resource_dispatcher_host_unittest.cc @@ -3,6 +3,8 @@ // found in the LICENSE file. #include <stddef.h> + +#include <memory> #include <utility> #include <vector> @@ -19,19 +21,23 @@ #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" -#include "base/thread_task_runner_handle.h" +#include "base/threading/thread_task_runner_handle.h" #include "content/browser/browser_thread_impl.h" #include "content/browser/cert_store_impl.h" #include "content/browser/child_process_security_policy_impl.h" +#include "content/browser/frame_host/navigation_request_info.h" #include "content/browser/loader/cross_site_resource_handler.h" #include "content/browser/loader/detachable_resource_handler.h" +#include "content/browser/loader/navigation_url_loader.h" #include "content/browser/loader/resource_dispatcher_host_impl.h" #include "content/browser/loader/resource_loader.h" #include "content/browser/loader/resource_message_filter.h" #include "content/browser/loader/resource_request_info_impl.h" #include "content/common/appcache_interfaces.h" #include "content/common/child_process_host_impl.h" +#include "content/common/navigation_params.h" #include "content/common/resource_messages.h" +#include "content/common/resource_request.h" #include "content/common/ssl_status_serialization.h" #include "content/common/view_messages.h" #include "content/public/browser/global_request_id.h" @@ -51,7 +57,9 @@ #include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_renderer_host.h" #include "content/test/test_content_browser_client.h" +#include "content/test/test_navigation_url_loader_delegate.h" #include "net/base/elements_upload_data_stream.h" +#include "net/base/load_flags.h" #include "net/base/net_errors.h" #include "net/base/request_priority.h" #include "net/base/test_data_directory.h" @@ -142,10 +150,10 @@ static int RequestIDForMessage(const IPC::Message& msg) { return request_id; } -static ResourceHostMsg_Request CreateResourceRequest(const char* method, - ResourceType type, - const GURL& url) { - ResourceHostMsg_Request request; +static ResourceRequest CreateResourceRequest(const char* method, + ResourceType type, + const GURL& url) { + ResourceRequest request; request.method = std::string(method); request.url = url; request.first_party_for_cookies = url; // bypass third-party cookie blocking @@ -865,6 +873,20 @@ class MockCertStore : public content::CertStore { int default_cert_id_; }; +void CheckRequestCompleteErrorCode(const IPC::Message& message, + int expected_error_code) { + // Verify the expected error code was received. + int request_id; + int error_code; + + ASSERT_EQ(ResourceMsg_RequestComplete::ID, message.type()); + + base::PickleIterator iter(message); + ASSERT_TRUE(IPC::ReadParam(&message, &iter, &request_id)); + ASSERT_TRUE(IPC::ReadParam(&message, &iter, &error_code)); + ASSERT_EQ(expected_error_code, error_code); +} + class ResourceDispatcherHostTest : public testing::TestWithParam<TestConfig>, public IPC::Sender { public: @@ -874,8 +896,8 @@ class ResourceDispatcherHostTest : public testing::TestWithParam<TestConfig>, ResourceDispatcherHostTest() : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), use_test_ssl_certificate_(false), - old_factory_(NULL), - send_data_received_acks_(false) { + send_data_received_acks_(false), + auto_advance_(false) { browser_context_.reset(new TestBrowserContext()); BrowserContext::EnsureResourceContextInitialized(browser_context_.get()); base::RunLoop().RunUntilIdle(); @@ -948,10 +970,10 @@ class ResourceDispatcherHostTest : public testing::TestWithParam<TestConfig>, case TestConfig::kOptimizeIPCForSmallResourceEnabled: { std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); feature_list->InitializeFromCommandLine( - features::kOptimizeIPCForSmallResource.name, std::string()); + features::kOptimizeLoadingIPCForSmallResources.name, std::string()); base::FeatureList::SetInstance(std::move(feature_list)); ASSERT_TRUE(base::FeatureList::IsEnabled( - features::kOptimizeIPCForSmallResource)); + features::kOptimizeLoadingIPCForSmallResources)); break; } } @@ -1106,6 +1128,55 @@ class ResourceDispatcherHostTest : public testing::TestWithParam<TestConfig>, host_.OnRenderFrameDeleted(global_routing_id); } + // Creates and drives a main resource request until completion. Then asserts + // that the expected_error_code has been emitted for the request. + void CompleteFailingMainResourceRequest(const GURL& url, + int expected_error_code) { + if (IsBrowserSideNavigationEnabled()) { + auto_advance_ = true; + + // Make a navigation request. + TestNavigationURLLoaderDelegate delegate; + BeginNavigationParams begin_params(std::string(), net::LOAD_NORMAL, false, + false, REQUEST_CONTEXT_TYPE_LOCATION); + CommonNavigationParams common_params; + common_params.url = url; + std::unique_ptr<NavigationRequestInfo> request_info( + new NavigationRequestInfo(common_params, begin_params, url, + url::Origin(url), true, false, -1, + scoped_refptr<ResourceRequestBody>())); + std::unique_ptr<NavigationURLLoader> test_loader = + NavigationURLLoader::Create(browser_context_.get(), + std::move(request_info), nullptr, + &delegate); + + // The navigation should fail with the expected error code. + delegate.WaitForRequestFailed(); + ASSERT_EQ(expected_error_code, delegate.net_error()); + return; + } + + MakeTestRequestWithResourceType(filter_.get(), 0, 1, url, + RESOURCE_TYPE_MAIN_FRAME); + + // Flush all pending requests. + while (net::URLRequestTestJob::ProcessOnePendingMessage()) { + } + base::MessageLoop::current()->RunUntilIdle(); + + // Sorts out all the messages we saw by request. + ResourceIPCAccumulator::ClassifiedMessages msgs; + accum_.GetClassifiedMessages(&msgs); + + // We should have gotten one RequestComplete message. + ASSERT_EQ(1U, msgs.size()); + ASSERT_EQ(1U, msgs[0].size()); + EXPECT_EQ(ResourceMsg_RequestComplete::ID, msgs[0][0].type()); + + // The RequestComplete message should have had the expected error code. + CheckRequestCompleteErrorCode(msgs[0][0], expected_error_code); + } + std::unique_ptr<LoadInfoTestRequestInfo> loader_test_request_info_; std::unique_ptr<base::RunLoop> wait_for_request_create_loop_; @@ -1123,12 +1194,12 @@ class ResourceDispatcherHostTest : public testing::TestWithParam<TestConfig>, std::string response_data_; bool use_test_ssl_certificate_; std::string scheme_; - net::URLRequest::ProtocolFactory* old_factory_; bool send_data_received_acks_; std::set<int> child_ids_; std::unique_ptr<base::RunLoop> wait_for_request_complete_loop_; RenderViewHostTestEnabler render_view_host_test_enabler_; MockCertStore mock_cert_store_; + bool auto_advance_; }; void ResourceDispatcherHostTest::MakeTestRequest(int render_view_id, @@ -1144,7 +1215,7 @@ void ResourceDispatcherHostTest::MakeTestRequestWithRenderFrame( int request_id, const GURL& url, ResourceType type) { - ResourceHostMsg_Request request = CreateResourceRequest("GET", type, url); + ResourceRequest request = CreateResourceRequest("GET", type, url); request.render_frame_id = render_frame_id; ResourceHostMsg_RequestResource msg(render_view_id, request_id, request); host_.OnMessageReceived(msg, filter_.get()); @@ -1157,8 +1228,7 @@ void ResourceDispatcherHostTest::MakeTestRequestWithResourceType( int request_id, const GURL& url, ResourceType type) { - ResourceHostMsg_Request request = - CreateResourceRequest("GET", type, url); + ResourceRequest request = CreateResourceRequest("GET", type, url); ResourceHostMsg_RequestResource msg(render_view_id, request_id, request); host_.OnMessageReceived(msg, filter); KickOffRequest(); @@ -1175,7 +1245,7 @@ void ResourceDispatcherHostTest:: MakeWebContentsAssociatedTestRequestWithResourceType(int request_id, const GURL& url, ResourceType type) { - ResourceHostMsg_Request request = CreateResourceRequest("GET", type, url); + ResourceRequest request = CreateResourceRequest("GET", type, url); request.origin_pid = web_contents_->GetRenderProcessHost()->GetID(); request.render_frame_id = web_contents_->GetMainFrame()->GetRoutingID(); ResourceHostMsg_RequestResource msg(web_contents_->GetRoutingID(), request_id, @@ -1197,7 +1267,7 @@ void ResourceDispatcherHostTest::MakeTestRequestWithPriorityAndRenderFrame( int render_frame_id, int request_id, net::RequestPriority priority) { - ResourceHostMsg_Request request = CreateResourceRequest( + ResourceRequest request = CreateResourceRequest( "GET", RESOURCE_TYPE_SUB_RESOURCE, GURL("http://example.com/priority")); request.render_frame_id = render_frame_id; request.priority = priority; @@ -1238,20 +1308,6 @@ void ResourceDispatcherHostTest::CompleteStartRequest( URLRequestTestDelayedStartJob::CompleteStart(req); } -void CheckRequestCompleteErrorCode(const IPC::Message& message, - int expected_error_code) { - // Verify the expected error code was received. - int request_id; - int error_code; - - ASSERT_EQ(ResourceMsg_RequestComplete::ID, message.type()); - - base::PickleIterator iter(message); - ASSERT_TRUE(IPC::ReadParam(&message, &iter, &request_id)); - ASSERT_TRUE(IPC::ReadParam(&message, &iter, &error_code)); - ASSERT_EQ(expected_error_code, error_code); -} - testing::AssertionResult ExtractInlinedChunkData( const IPC::Message& message, std::string* leading_chunk_data) { @@ -1308,7 +1364,8 @@ void CheckSuccessfulRequestWithErrorCode( const std::string& reference_data, int expected_error) { ASSERT_LT(2U, messages.size()); - if (base::FeatureList::IsEnabled(features::kOptimizeIPCForSmallResource) && + if (base::FeatureList::IsEnabled( + features::kOptimizeLoadingIPCForSmallResources) && messages[1].type() == ResourceMsg_InlinedDataChunkReceived::ID) { CheckSuccessfulRequestWithErrorCodeForInlinedCase( messages, reference_data, expected_error); @@ -1522,9 +1579,9 @@ TEST_P(ResourceDispatcherHostTest, DetachedResourceTimesOut) { // load. TEST_P(ResourceDispatcherHostTest, DeletedFilterDetached) { // test_url_1's data is available synchronously, so use 2 and 3. - ResourceHostMsg_Request request_prefetch = CreateResourceRequest( + ResourceRequest request_prefetch = CreateResourceRequest( "GET", RESOURCE_TYPE_PREFETCH, net::URLRequestTestJob::test_url_2()); - ResourceHostMsg_Request request_ping = CreateResourceRequest( + ResourceRequest request_ping = CreateResourceRequest( "GET", RESOURCE_TYPE_PING, net::URLRequestTestJob::test_url_3()); ResourceHostMsg_RequestResource msg_prefetch(0, 1, request_prefetch); @@ -1573,7 +1630,7 @@ TEST_P(ResourceDispatcherHostTest, DeletedFilterDetached) { // If the filter has disappeared (original process dies) then detachable // resources should continue to load, even when redirected. TEST_P(ResourceDispatcherHostTest, DeletedFilterDetachedRedirect) { - ResourceHostMsg_Request request = CreateResourceRequest( + ResourceRequest request = CreateResourceRequest( "GET", RESOURCE_TYPE_PREFETCH, net::URLRequestTestJob::test_url_redirect_to_url_2()); @@ -2468,32 +2525,25 @@ TEST_P(ResourceDispatcherHostTest, ForbiddenDownload) { HandleScheme("http"); - // Only MAIN_FRAMEs can trigger a download. - MakeTestRequestWithResourceType(filter_.get(), 0, 1, GURL("http:bla"), - RESOURCE_TYPE_MAIN_FRAME); - - // Flush all pending requests. - while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} - base::MessageLoop::current()->RunUntilIdle(); - - // Sorts out all the messages we saw by request. - ResourceIPCAccumulator::ClassifiedMessages msgs; - accum_.GetClassifiedMessages(&msgs); - - // We should have gotten one RequestComplete message. - ASSERT_EQ(1U, msgs.size()); - ASSERT_EQ(1U, msgs[0].size()); - EXPECT_EQ(ResourceMsg_RequestComplete::ID, msgs[0][0].type()); + int expected_error_code = net::ERR_INVALID_RESPONSE; + GURL forbidden_download_url = GURL("http:bla"); - // The RequestComplete message should have had the error code of - // ERR_INVALID_RESPONSE. - CheckRequestCompleteErrorCode(msgs[0][0], net::ERR_INVALID_RESPONSE); + CompleteFailingMainResourceRequest(forbidden_download_url, + expected_error_code); } // Test for http://crbug.com/76202 . We don't want to destroy a // download request prematurely when processing a cancellation from // the renderer. TEST_P(ResourceDispatcherHostTest, IgnoreCancelForDownloads) { + // PlzNavigate: A request that ends up being a download is a main resource + // request. Hence, it has been initiated by the browser and is not associated + // with a renderer. Therefore, it cannot be canceled by a renderer IPC. + if (IsBrowserSideNavigationEnabled()) { + SUCCEED() << "Not applicable with --enable-browser-side-navigation."; + return; + } + EXPECT_EQ(0, host_.pending_requests()); int render_view_id = 0; @@ -2549,29 +2599,67 @@ TEST_P(ResourceDispatcherHostTest, CancelRequestsForContext) { job_factory_->SetDelayedCompleteJobGeneration(true); HandleScheme("http"); - MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id, - GURL("http://example.com/blah"), - RESOURCE_TYPE_MAIN_FRAME); - // Return some data so that the request is identified as a download - // and the proper resource handlers are created. - EXPECT_TRUE(net::URLRequestTestJob::ProcessOnePendingMessage()); + const GURL download_url = GURL("http://example.com/blah"); - // And now simulate a cancellation coming from the renderer. - ResourceHostMsg_CancelRequest msg(request_id); - host_.OnMessageReceived(msg, filter_.get()); + if (IsBrowserSideNavigationEnabled()) { + // Create a NavigationRequest. + TestNavigationURLLoaderDelegate delegate; + BeginNavigationParams begin_params(std::string(), net::LOAD_NORMAL, false, + false, REQUEST_CONTEXT_TYPE_LOCATION); + CommonNavigationParams common_params; + common_params.url = download_url; + std::unique_ptr<NavigationRequestInfo> request_info( + new NavigationRequestInfo(common_params, begin_params, download_url, + url::Origin(download_url), true, false, -1, + scoped_refptr<ResourceRequestBody>())); + std::unique_ptr<NavigationURLLoader> loader = NavigationURLLoader::Create( + browser_context_.get(), std::move(request_info), nullptr, &delegate); + + // Wait until a response has been received and proceed with the response. + KickOffRequest(); + + // Return some data so that the request is identified as a download + // and the proper resource handlers are created. + EXPECT_TRUE(net::URLRequestTestJob::ProcessOnePendingMessage()); + base::MessageLoop::current()->RunUntilIdle(); - // Since the request had already started processing as a download, - // the cancellation above should have been ignored and the request - // should still be alive. - EXPECT_EQ(1, host_.pending_requests()); + // The UI thread will be informed that the navigation failed with an error + // code of ERR_ABORTED because the navigation turns out to be a download. + // The navigation is aborted, but the request goes on as a download. + EXPECT_EQ(delegate.net_error(), net::ERR_ABORTED); + EXPECT_EQ(1, host_.pending_requests()); - // Cancelling by other methods shouldn't work either. - host_.CancelRequestsForProcess(render_view_id); - EXPECT_EQ(1, host_.pending_requests()); + // In PlzNavigate, the renderer cannot cancel the request directly. + // However, cancelling by context should work. + host_.CancelRequestsForContext(browser_context_->GetResourceContext()); + EXPECT_EQ(0, host_.pending_requests()); - // Cancelling by context should work. - host_.CancelRequestsForContext(filter_->resource_context()); - EXPECT_EQ(0, host_.pending_requests()); + base::MessageLoop::current()->RunUntilIdle(); + } else { + MakeTestRequestWithResourceType(filter_.get(), render_view_id, request_id, + download_url, RESOURCE_TYPE_MAIN_FRAME); + + // Return some data so that the request is identified as a download + // and the proper resource handlers are created. + EXPECT_TRUE(net::URLRequestTestJob::ProcessOnePendingMessage()); + + // And now simulate a cancellation coming from the renderer. + ResourceHostMsg_CancelRequest msg(request_id); + host_.OnMessageReceived(msg, filter_.get()); + + // Since the request had already started processing as a download, + // the cancellation above should have been ignored and the request + // should still be alive. + EXPECT_EQ(1, host_.pending_requests()); + + // Cancelling by other methods shouldn't work either. + host_.CancelRequestsForProcess(render_view_id); + EXPECT_EQ(1, host_.pending_requests()); + + // Cancelling by context should work. + host_.CancelRequestsForContext(filter_->resource_context()); + EXPECT_EQ(0, host_.pending_requests()); + } } TEST_P(ResourceDispatcherHostTest, CancelRequestsForContextDetached) { @@ -2698,9 +2786,8 @@ TEST_P(ResourceDispatcherHostTest, TransferNavigationHtml) { int new_render_view_id = 1; int new_request_id = 2; - ResourceHostMsg_Request request = - CreateResourceRequest("GET", RESOURCE_TYPE_MAIN_FRAME, - GURL("http://other.com/blech")); + ResourceRequest request = CreateResourceRequest( + "GET", RESOURCE_TYPE_MAIN_FRAME, GURL("http://other.com/blech")); request.transferred_request_child_id = filter_->child_id(); request.transferred_request_request_id = request_id; @@ -2778,7 +2865,7 @@ TEST_P(ResourceDispatcherHostTest, TransferNavigationCertificateUpdate) { int new_render_view_id = 1; int new_request_id = 2; - ResourceHostMsg_Request request = CreateResourceRequest( + ResourceRequest request = CreateResourceRequest( "GET", RESOURCE_TYPE_MAIN_FRAME, GURL("https://example.com/blech")); request.transferred_request_child_id = filter_->child_id(); request.transferred_request_request_id = request_id; @@ -2866,9 +2953,8 @@ TEST_P(ResourceDispatcherHostTest, TransferTwoNavigationsHtml) { // Transfer the first request. int new_render_view_id = 1; int new_request_id = 5; - ResourceHostMsg_Request request = - CreateResourceRequest("GET", RESOURCE_TYPE_MAIN_FRAME, - GURL("http://example.com/blah")); + ResourceRequest request = CreateResourceRequest( + "GET", RESOURCE_TYPE_MAIN_FRAME, GURL("http://example.com/blah")); request.transferred_request_child_id = filter_->child_id(); request.transferred_request_request_id = request_id; @@ -2879,9 +2965,8 @@ TEST_P(ResourceDispatcherHostTest, TransferTwoNavigationsHtml) { // Transfer the second request. int new_second_request_id = 6; - ResourceHostMsg_Request second_request = - CreateResourceRequest("GET", RESOURCE_TYPE_MAIN_FRAME, - GURL("http://example.com/foo")); + ResourceRequest second_request = CreateResourceRequest( + "GET", RESOURCE_TYPE_MAIN_FRAME, GURL("http://example.com/foo")); request.transferred_request_child_id = filter_->child_id(); request.transferred_request_request_id = second_request_id; @@ -2955,9 +3040,8 @@ TEST_P(ResourceDispatcherHostTest, TransferNavigationText) { int new_render_view_id = 1; int new_request_id = 2; - ResourceHostMsg_Request request = - CreateResourceRequest("GET", RESOURCE_TYPE_MAIN_FRAME, - GURL("http://other.com/blech")); + ResourceRequest request = CreateResourceRequest( + "GET", RESOURCE_TYPE_MAIN_FRAME, GURL("http://other.com/blech")); request.transferred_request_child_id = filter_->child_id(); request.transferred_request_request_id = request_id; @@ -3007,9 +3091,8 @@ TEST_P(ResourceDispatcherHostTest, TransferNavigationWithProcessCrash) { scoped_refptr<ForwardingFilter> first_filter = MakeForwardingFilter(); first_child_id = first_filter->child_id(); - ResourceHostMsg_Request first_request = - CreateResourceRequest("GET", RESOURCE_TYPE_MAIN_FRAME, - GURL("http://example.com/blah")); + ResourceRequest first_request = CreateResourceRequest( + "GET", RESOURCE_TYPE_MAIN_FRAME, GURL("http://example.com/blah")); ResourceHostMsg_RequestResource first_request_msg( render_view_id, request_id, first_request); @@ -3043,9 +3126,8 @@ TEST_P(ResourceDispatcherHostTest, TransferNavigationWithProcessCrash) { int new_render_view_id = 1; int new_request_id = 2; - ResourceHostMsg_Request request = - CreateResourceRequest("GET", RESOURCE_TYPE_MAIN_FRAME, - GURL("http://other.com/blech")); + ResourceRequest request = CreateResourceRequest( + "GET", RESOURCE_TYPE_MAIN_FRAME, GURL("http://other.com/blech")); request.transferred_request_child_id = first_child_id; request.transferred_request_request_id = request_id; @@ -3126,9 +3208,8 @@ TEST_P(ResourceDispatcherHostTest, TransferNavigationWithTwoRedirects) { int new_render_view_id = 1; int new_request_id = 2; - ResourceHostMsg_Request request = - CreateResourceRequest("GET", RESOURCE_TYPE_MAIN_FRAME, - GURL("http://other.com/blech")); + ResourceRequest request = CreateResourceRequest( + "GET", RESOURCE_TYPE_MAIN_FRAME, GURL("http://other.com/blech")); request.transferred_request_child_id = filter_->child_id(); request.transferred_request_request_id = request_id; @@ -3164,23 +3245,10 @@ TEST_P(ResourceDispatcherHostTest, UnknownURLScheme) { HandleScheme("http"); - MakeTestRequestWithResourceType(filter_.get(), 0, 1, GURL("foo://bar"), - RESOURCE_TYPE_MAIN_FRAME); + const GURL invalid_sheme_url = GURL("foo://bar"); + const int expected_error_code = net::ERR_UNKNOWN_URL_SCHEME; - // Flush all pending requests. - while (net::URLRequestTestJob::ProcessOnePendingMessage()) {} - - // Sort all the messages we saw by request. - ResourceIPCAccumulator::ClassifiedMessages msgs; - accum_.GetClassifiedMessages(&msgs); - - // We should have gotten one RequestComplete message. - ASSERT_EQ(1U, msgs[0].size()); - EXPECT_EQ(ResourceMsg_RequestComplete::ID, msgs[0][0].type()); - - // The RequestComplete message should have the error code of - // ERR_UNKNOWN_URL_SCHEME. - CheckRequestCompleteErrorCode(msgs[0][0], net::ERR_UNKNOWN_URL_SCHEME); + CompleteFailingMainResourceRequest(invalid_sheme_url, expected_error_code); } TEST_P(ResourceDispatcherHostTest, DataReceivedACKs) { @@ -3446,7 +3514,7 @@ TEST_P(ResourceDispatcherHostTest, ReleaseTemporiesOnProcessExit) { TEST_P(ResourceDispatcherHostTest, DownloadToFile) { // Make a request which downloads to file. - ResourceHostMsg_Request request = CreateResourceRequest( + ResourceRequest request = CreateResourceRequest( "GET", RESOURCE_TYPE_SUB_RESOURCE, net::URLRequestTestJob::test_url_1()); request.download_to_file = true; ResourceHostMsg_RequestResource request_msg(0, 1, request); @@ -3791,7 +3859,8 @@ net::URLRequestJob* TestURLRequestJobFactory::MaybeCreateJobWithProtocolHandler( } else if (scheme == "big-job") { return new URLRequestBigJob(request, network_delegate); } else { - return new net::URLRequestTestJob(request, network_delegate); + return new net::URLRequestTestJob(request, network_delegate, + test_fixture_->auto_advance_); } } else { if (delay_start_) { @@ -3810,9 +3879,8 @@ net::URLRequestJob* TestURLRequestJobFactory::MaybeCreateJobWithProtocolHandler( test_fixture_->response_data_, false); } else { return new net::URLRequestTestJob( - request, network_delegate, - test_fixture_->response_headers_, test_fixture_->response_data_, - false); + request, network_delegate, test_fixture_->response_headers_, + test_fixture_->response_data_, test_fixture_->auto_advance_); } } } diff --git a/chromium/content/browser/loader/resource_hints_impl.cc b/chromium/content/browser/loader/resource_hints_impl.cc new file mode 100644 index 00000000000..694947881e6 --- /dev/null +++ b/chromium/content/browser/loader/resource_hints_impl.cc @@ -0,0 +1,60 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/public/browser/resource_hints.h" + +#include "content/public/browser/browser_thread.h" +#include "net/base/load_flags.h" +#include "net/http/http_network_session.h" +#include "net/http/http_request_info.h" +#include "net/http/http_stream_factory.h" +#include "net/http/http_transaction_factory.h" +#include "net/url_request/http_user_agent_settings.h" +#include "net/url_request/url_request_context.h" +#include "net/url_request/url_request_context_getter.h" + +namespace content { + +void PreconnectUrl(net::URLRequestContextGetter* getter, + const GURL& url, + const GURL& first_party_for_cookies, + int count, + bool allow_credentials, + net::HttpRequestInfo::RequestMotivation motivation) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK(getter); + + net::URLRequestContext* context = getter->GetURLRequestContext(); + net::HttpTransactionFactory* factory = context->http_transaction_factory(); + net::HttpNetworkSession* session = factory->GetSession(); + + std::string user_agent; + if (context->http_user_agent_settings()) + user_agent = context->http_user_agent_settings()->GetUserAgent(); + net::HttpRequestInfo request_info; + request_info.url = url; + request_info.method = "GET"; + request_info.extra_headers.SetHeader(net::HttpRequestHeaders::kUserAgent, + user_agent); + request_info.motivation = motivation; + + net::NetworkDelegate* delegate = context->network_delegate(); + if (delegate->CanEnablePrivacyMode(url, first_party_for_cookies)) + request_info.privacy_mode = net::PRIVACY_MODE_ENABLED; + + // TODO(yoav): Fix this layering violation, since when credentials are not + // allowed we should turn on a flag indicating that, rather then turn on + // private mode, even if lower layers would treat both the same. + if (!allow_credentials) { + request_info.privacy_mode = net::PRIVACY_MODE_ENABLED; + request_info.load_flags = net::LOAD_DO_NOT_SEND_COOKIES | + net::LOAD_DO_NOT_SAVE_COOKIES | + net::LOAD_DO_NOT_SEND_AUTH_DATA; + } + + net::HttpStreamFactory* http_stream_factory = session->http_stream_factory(); + http_stream_factory->PreconnectStreams(count, request_info); +} + +} // namespace content diff --git a/chromium/content/browser/loader/resource_loader.cc b/chromium/content/browser/loader/resource_loader.cc index 40e1f2a6074..2bc362262e8 100644 --- a/chromium/content/browser/loader/resource_loader.cc +++ b/chromium/content/browser/loader/resource_loader.cc @@ -11,7 +11,7 @@ #include "base/metrics/histogram.h" #include "base/profiler/scoped_tracker.h" #include "base/single_thread_task_runner.h" -#include "base/thread_task_runner_handle.h" +#include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "content/browser/appcache/appcache_interceptor.h" @@ -21,6 +21,7 @@ #include "content/browser/loader/resource_loader_delegate.h" #include "content/browser/loader/resource_request_info_impl.h" #include "content/browser/service_worker/service_worker_request_handler.h" +#include "content/browser/service_worker/service_worker_response_info.h" #include "content/browser/ssl/ssl_client_auth_handler.h" #include "content/browser/ssl/ssl_manager.h" #include "content/browser/ssl/ssl_policy.h" @@ -28,7 +29,6 @@ #include "content/public/browser/cert_store.h" #include "content/public/browser/resource_context.h" #include "content/public/browser/resource_dispatcher_host_login_delegate.h" -#include "content/public/browser/signed_certificate_timestamp_store.h" #include "content/public/common/content_client.h" #include "content/public/common/content_switches.h" #include "content/public/common/process_type.h" @@ -37,10 +37,12 @@ #include "net/base/io_buffer.h" #include "net/base/load_flags.h" #include "net/http/http_response_headers.h" +#include "net/nqe/network_quality_estimator.h" #include "net/ssl/client_cert_store.h" #include "net/ssl/ssl_platform_key.h" #include "net/ssl/ssl_private_key.h" #include "net/url_request/redirect_info.h" +#include "net/url_request/url_request_context.h" #include "net/url_request/url_request_status.h" using base::TimeDelta; @@ -49,20 +51,6 @@ using base::TimeTicks; namespace content { namespace { -void StoreSignedCertificateTimestamps( - const net::SignedCertificateTimestampAndStatusList& sct_list, - int process_id, - SignedCertificateTimestampIDStatusList* sct_ids) { - SignedCertificateTimestampStore* sct_store( - SignedCertificateTimestampStore::GetInstance()); - - for (auto iter = sct_list.begin(); iter != sct_list.end(); ++iter) { - const int sct_id(sct_store->Store(iter->sct.get(), process_id)); - sct_ids->push_back( - SignedCertificateTimestampIDAndStatus(sct_id, iter->status)); - } -} - void GetSSLStatusForRequest(const GURL& url, const net::SSLInfo& ssl_info, int child_id, @@ -71,13 +59,9 @@ void GetSSLStatusForRequest(const GURL& url, DCHECK(ssl_info.cert); int cert_id = cert_store->StoreCert(ssl_info.cert.get(), child_id); - SignedCertificateTimestampIDStatusList signed_certificate_timestamp_ids; - StoreSignedCertificateTimestamps(ssl_info.signed_certificate_timestamps, - child_id, &signed_certificate_timestamp_ids); - *ssl_status = SSLStatus(SSLPolicy::GetSecurityStyleForResource( url, cert_id, ssl_info.cert_status), - cert_id, signed_certificate_timestamp_ids, ssl_info); + cert_id, ssl_info); } void PopulateResourceResponse(ResourceRequestInfoImpl* info, @@ -98,15 +82,27 @@ void PopulateResourceResponse(ResourceRequestInfoImpl* info, response->head.connection_info = response_info.connection_info; response->head.was_fetched_via_proxy = request->was_fetched_via_proxy(); response->head.proxy_server = response_info.proxy_server; - response->head.socket_address = request->GetSocketAddress(); + response->head.socket_address = response_info.socket_address; const content::ResourceRequestInfo* request_info = content::ResourceRequestInfo::ForRequest(request); if (request_info) response->head.is_using_lofi = request_info->IsUsingLoFi(); - if (ServiceWorkerRequestHandler* handler = - ServiceWorkerRequestHandler::GetHandler(request)) { - handler->GetExtraResponseInfo(&response->head); + + response->head.effective_connection_type = + net::NetworkQualityEstimator::EFFECTIVE_CONNECTION_TYPE_UNKNOWN; + if (info->IsMainFrame()) { + net::NetworkQualityEstimator* estimator = + request->context()->network_quality_estimator(); + if (estimator) { + response->head.effective_connection_type = + estimator->GetEffectiveConnectionType(); + } } + + const ServiceWorkerResponseInfo* service_worker_info = + ServiceWorkerResponseInfo::ForRequest(request); + if (service_worker_info) + service_worker_info->GetExtraResponseInfo(&response->head); AppCacheInterceptor::GetExtraResponseInfo( request, &response->head.appcache_id, &response->head.appcache_manifest_url); @@ -121,6 +117,13 @@ void PopulateResourceResponse(ResourceRequestInfoImpl* info, response->head.has_major_certificate_errors = net::IsCertStatusError(ssl_status.cert_status) && !net::IsCertStatusMinorError(ssl_status.cert_status); + if (info->ShouldReportRawHeaders()) { + // Only pass the Signed Certificate Timestamps (SCTs) when the network + // panel of the DevTools is open, i.e. ShouldReportRawHeaders() is set. + // These data are used to populate the requests in the security panel too. + response->head.signed_certificate_timestamps = + request->ssl_info().signed_certificate_timestamps; + } } else { // We should not have any SSL state. DCHECK(!request->ssl_info().cert_status); @@ -743,6 +746,9 @@ void ResourceLoader::RecordHistograms() { } UMA_HISTOGRAM_ENUMERATION("Net.Prefetch.Pattern", status, STATUS_MAX); + } else if (request_->response_info().unused_since_prefetch) { + TimeDelta total_time = base::TimeTicks::Now() - request_->creation_time(); + UMA_HISTOGRAM_TIMES("Net.Prefetch.TimeSpentOnPrefetchHit", total_time); } } diff --git a/chromium/content/browser/loader/resource_loader.h b/chromium/content/browser/loader/resource_loader.h index 976111a7408..6eef282097e 100644 --- a/chromium/content/browser/loader/resource_loader.h +++ b/chromium/content/browser/loader/resource_loader.h @@ -15,7 +15,6 @@ #include "content/browser/ssl/ssl_error_handler.h" #include "content/common/content_export.h" #include "content/public/browser/resource_controller.h" -#include "content/public/common/signed_certificate_timestamp_id_and_status.h" #include "net/url_request/url_request.h" namespace net { @@ -95,14 +94,6 @@ class CONTENT_EXPORT ResourceLoader : public net::URLRequest::Delegate, void StartRequestInternal(); void CancelRequestInternal(int error, bool from_renderer); - // Stores the SignedCertificateTimestamps held in |sct_list| in the - // SignedCertificateTimestampStore singleton, associated with |process_id|. - // On return, |sct_ids| contains the assigned ID and verification status of - // each SignedCertificateTimestamp. - void StoreSignedCertificateTimestamps( - const net::SignedCertificateTimestampAndStatusList& sct_list, - int process_id, - SignedCertificateTimestampIDStatusList* sct_ids); void CompleteResponseStarted(); void StartReading(bool is_continuation); void ResumeReading(); diff --git a/chromium/content/browser/loader/resource_loader_unittest.cc b/chromium/content/browser/loader/resource_loader_unittest.cc index 32197c7bc1e..0da06a122fb 100644 --- a/chromium/content/browser/loader/resource_loader_unittest.cc +++ b/chromium/content/browser/loader/resource_loader_unittest.cc @@ -18,7 +18,7 @@ #include "base/memory/weak_ptr.h" #include "base/run_loop.h" #include "base/single_thread_task_runner.h" -#include "base/thread_task_runner_handle.h" +#include "base/threading/thread_task_runner_handle.h" #include "content/browser/browser_thread_impl.h" #include "content/browser/loader/redirect_to_file_resource_handler.h" #include "content/browser/loader/resource_loader_delegate.h" @@ -43,6 +43,7 @@ #include "net/base/test_data_directory.h" #include "net/base/upload_bytes_element_reader.h" #include "net/cert/x509_certificate.h" +#include "net/nqe/network_quality_estimator.h" #include "net/ssl/client_cert_store.h" #include "net/ssl/ssl_cert_request_info.h" #include "net/ssl/ssl_private_key.h" @@ -281,7 +282,9 @@ class ResourceHandlerStub : public ResourceHandler { received_eof_(false), received_response_completed_(false), received_request_redirected_(false), - total_bytes_downloaded_(0) {} + total_bytes_downloaded_(0), + observed_effective_connection_type_( + net::NetworkQualityEstimator::EFFECTIVE_CONNECTION_TYPE_UNKNOWN) {} // If true, defers the resource load in OnWillStart. void set_defer_request_on_will_start(bool defer_request_on_will_start) { @@ -314,6 +317,11 @@ class ResourceHandlerStub : public ResourceHandler { const net::URLRequestStatus& status() const { return status_; } int total_bytes_downloaded() const { return total_bytes_downloaded_; } + net::NetworkQualityEstimator::EffectiveConnectionType + observed_effective_connection_type() const { + return observed_effective_connection_type_; + } + void Resume() { controller()->Resume(); } @@ -329,6 +337,8 @@ class ResourceHandlerStub : public ResourceHandler { bool OnResponseStarted(ResourceResponse* response, bool* defer) override { EXPECT_FALSE(response_.get()); response_ = response; + observed_effective_connection_type_ = + response->head.effective_connection_type; return true; } @@ -429,6 +439,8 @@ class ResourceHandlerStub : public ResourceHandler { base::RunLoop deferred_run_loop_; base::RunLoop response_completed_run_loop_; std::unique_ptr<base::RunLoop> wait_for_progress_run_loop_; + net::NetworkQualityEstimator::EffectiveConnectionType + observed_effective_connection_type_; }; // Test browser client that captures calls to SelectClientCertificates and @@ -539,19 +551,52 @@ void CreateTemporaryError( } // namespace +class TestNetworkQualityEstimator : public net::NetworkQualityEstimator { + public: + TestNetworkQualityEstimator() + : net::NetworkQualityEstimator(nullptr, + std::map<std::string, std::string>()), + type_(net::NetworkQualityEstimator::EFFECTIVE_CONNECTION_TYPE_UNKNOWN) { + } + ~TestNetworkQualityEstimator() override {} + + net::NetworkQualityEstimator::EffectiveConnectionType + GetEffectiveConnectionType() const override { + return type_; + } + + void set_effective_connection_type( + net::NetworkQualityEstimator::EffectiveConnectionType type) { + type_ = type; + } + + private: + net::NetworkQualityEstimator::EffectiveConnectionType type_; + + DISALLOW_COPY_AND_ASSIGN(TestNetworkQualityEstimator); +}; + class ResourceLoaderTest : public testing::Test, public ResourceLoaderDelegate { protected: ResourceLoaderTest() - : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), - resource_context_(&test_url_request_context_), - raw_ptr_resource_handler_(NULL), - raw_ptr_to_request_(NULL) { + : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), + test_url_request_context_(true), + resource_context_(&test_url_request_context_), + raw_ptr_resource_handler_(NULL), + raw_ptr_to_request_(NULL) { test_url_request_context_.set_job_factory(&job_factory_); + test_url_request_context_.set_network_quality_estimator( + &network_quality_estimator_); + test_url_request_context_.Init(); } GURL test_url() const { return net::URLRequestTestJob::test_url_1(); } + TestNetworkQualityEstimator* network_quality_estimator() { + return &network_quality_estimator_; + } + std::string test_data() const { return net::URLRequestTestJob::test_data_1(); } @@ -568,16 +613,20 @@ class ResourceLoaderTest : public testing::Test, } // Replaces loader_ with a new one for |request|. - void SetUpResourceLoader(std::unique_ptr<net::URLRequest> request) { + void SetUpResourceLoader(std::unique_ptr<net::URLRequest> request, + bool is_main_frame) { raw_ptr_to_request_ = request.get(); + ResourceType resource_type = + is_main_frame ? RESOURCE_TYPE_MAIN_FRAME : RESOURCE_TYPE_SUB_FRAME; + RenderFrameHost* rfh = web_contents_->GetMainFrame(); ResourceRequestInfo::AllocateForTesting( - request.get(), RESOURCE_TYPE_MAIN_FRAME, &resource_context_, + request.get(), resource_type, &resource_context_, rfh->GetProcess()->GetID(), rfh->GetRenderViewHost()->GetRoutingID(), - rfh->GetRoutingID(), true /* is_main_frame */, - false /* parent_is_main_frame */, true /* allow_download */, - false /* is_async */, false /* is_using_lofi_ */); + rfh->GetRoutingID(), is_main_frame, false /* parent_is_main_frame */, + true /* allow_download */, false /* is_async */, + false /* is_using_lofi_ */); std::unique_ptr<ResourceHandlerStub> resource_handler( new ResourceHandlerStub(request.get())); raw_ptr_resource_handler_ = resource_handler.get(); @@ -599,7 +648,7 @@ class ResourceLoaderTest : public testing::Test, std::unique_ptr<net::URLRequest> request( resource_context_.GetRequestContext()->CreateRequest( test_url(), net::DEFAULT_PRIORITY, nullptr /* delegate */)); - SetUpResourceLoader(std::move(request)); + SetUpResourceLoader(std::move(request), true); } void TearDown() override { @@ -630,6 +679,7 @@ class ResourceLoaderTest : public testing::Test, RenderViewHostTestEnabler rvh_test_enabler_; net::URLRequestJobFactoryImpl job_factory_; + TestNetworkQualityEstimator network_quality_estimator_; net::TestURLRequestContext test_url_request_context_; ResourceContextStub resource_context_; std::unique_ptr<TestBrowserContext> browser_context_; @@ -1081,7 +1131,7 @@ TEST_F(HTTPSSecurityInfoResourceLoaderTest, SecurityInfoOnHTTPSResource) { std::unique_ptr<net::URLRequest> request( resource_context_.GetRequestContext()->CreateRequest( test_https_url(), net::DEFAULT_PRIORITY, nullptr /* delegate */)); - SetUpResourceLoader(std::move(request)); + SetUpResourceLoader(std::move(request), true); // Send the request and wait until it completes. loader_->StartRequest(); @@ -1120,7 +1170,7 @@ TEST_F(HTTPSSecurityInfoResourceLoaderTest, resource_context_.GetRequestContext()->CreateRequest( test_https_redirect_url(), net::DEFAULT_PRIORITY, nullptr /* delegate */)); - SetUpResourceLoader(std::move(request)); + SetUpResourceLoader(std::move(request), true); // Send the request and wait until it completes. loader_->StartRequest(); @@ -1152,4 +1202,51 @@ TEST_F(HTTPSSecurityInfoResourceLoaderTest, EXPECT_EQ(kTestSecurityBits, deserialized.security_bits); } +class EffectiveConnectionTypeResourceLoaderTest : public ResourceLoaderTest { + public: + void VerifyEffectiveConnectionType( + bool is_main_frame, + net::NetworkQualityEstimator::EffectiveConnectionType set_type, + net::NetworkQualityEstimator::EffectiveConnectionType expected_type) { + network_quality_estimator()->set_effective_connection_type(set_type); + + // Start the request and wait for it to finish. + std::unique_ptr<net::URLRequest> request( + resource_context_.GetRequestContext()->CreateRequest( + test_url(), net::DEFAULT_PRIORITY, nullptr /* delegate */)); + SetUpResourceLoader(std::move(request), is_main_frame); + + // Send the request and wait until it completes. + loader_->StartRequest(); + raw_ptr_resource_handler_->WaitForResponseComplete(); + ASSERT_EQ(net::URLRequestStatus::SUCCESS, + raw_ptr_to_request_->status().status()); + + EXPECT_EQ(expected_type, + raw_ptr_resource_handler_->observed_effective_connection_type()); + } +}; + +// Tests that the effective connection type is set on main frame requests. +TEST_F(EffectiveConnectionTypeResourceLoaderTest, Slow2G) { + VerifyEffectiveConnectionType( + true, net::NetworkQualityEstimator::EFFECTIVE_CONNECTION_TYPE_SLOW_2G, + net::NetworkQualityEstimator::EFFECTIVE_CONNECTION_TYPE_SLOW_2G); +} + +// Tests that the effective connection type is set on main frame requests. +TEST_F(EffectiveConnectionTypeResourceLoaderTest, 3G) { + VerifyEffectiveConnectionType( + true, net::NetworkQualityEstimator::EFFECTIVE_CONNECTION_TYPE_3G, + net::NetworkQualityEstimator::EFFECTIVE_CONNECTION_TYPE_3G); +} + +// Tests that the effective connection type is not set on non-main frame +// requests. +TEST_F(EffectiveConnectionTypeResourceLoaderTest, NotAMainFrame) { + VerifyEffectiveConnectionType( + false, net::NetworkQualityEstimator::EFFECTIVE_CONNECTION_TYPE_3G, + net::NetworkQualityEstimator::EFFECTIVE_CONNECTION_TYPE_UNKNOWN); +} + } // namespace content diff --git a/chromium/content/browser/loader/resource_message_filter.cc b/chromium/content/browser/loader/resource_message_filter.cc index 186bf66316e..3d62f2b362a 100644 --- a/chromium/content/browser/loader/resource_message_filter.cc +++ b/chromium/content/browser/loader/resource_message_filter.cc @@ -5,7 +5,7 @@ #include "content/browser/loader/resource_message_filter.h" #include "content/browser/appcache/chrome_appcache_service.h" -#include "content/browser/fileapi/chrome_blob_storage_context.h" +#include "content/browser/blob_storage/chrome_blob_storage_context.h" #include "content/browser/host_zoom_level_context.h" #include "content/browser/loader/resource_dispatcher_host_impl.h" #include "content/browser/service_worker/service_worker_context_wrapper.h" diff --git a/chromium/content/browser/loader/resource_message_filter.h b/chromium/content/browser/loader/resource_message_filter.h index 7047aa64735..bb2dadd66fa 100644 --- a/chromium/content/browser/loader/resource_message_filter.h +++ b/chromium/content/browser/loader/resource_message_filter.h @@ -10,12 +10,11 @@ #include "base/callback_forward.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "content/browser/host_zoom_level_context.h" #include "content/common/content_export.h" #include "content/public/browser/browser_message_filter.h" #include "content/public/common/resource_type.h" -struct ResourceHostMsg_Request; - namespace storage { class FileSystemContext; } // namespace storage @@ -28,8 +27,6 @@ class URLRequestContext; namespace content { class ChromeAppCacheService; class ChromeBlobStorageContext; -class HostZoomLevelContext; -class HostZoomMap; class ResourceContext; class ServiceWorkerContextWrapper; diff --git a/chromium/content/browser/loader/resource_scheduler.cc b/chromium/content/browser/loader/resource_scheduler.cc index ea4c6df775d..176f6034a18 100644 --- a/chromium/content/browser/loader/resource_scheduler.cc +++ b/chromium/content/browser/loader/resource_scheduler.cc @@ -27,6 +27,7 @@ #include "net/http/http_server_properties.h" #include "net/url_request/url_request.h" #include "net/url_request/url_request_context.h" +#include "url/scheme_host_port.h" namespace content { @@ -504,11 +505,10 @@ class ResourceScheduler::Client { // Resources below the non_delayable_threshold that are being requested // from a server that does not support native prioritization are // considered delayable. - net::HostPortPair host_port_pair = - net::HostPortPair::FromURL(request->url_request()->url()); + url::SchemeHostPort scheme_host_port(request->url_request()->url()); net::HttpServerProperties& http_server_properties = *request->url_request()->context()->http_server_properties(); - if (!http_server_properties.SupportsRequestPriority(host_port_pair)) + if (!http_server_properties.SupportsRequestPriority(scheme_host_port)) attributes |= kAttributeDelayable; } @@ -597,13 +597,14 @@ class ResourceScheduler::Client { net::HostPortPair host_port_pair = net::HostPortPair::FromURL(url_request.url()); + url::SchemeHostPort scheme_host_port(url_request.url()); net::HttpServerProperties& http_server_properties = *url_request.context()->http_server_properties(); // TODO(willchan): We should really improve this algorithm as described in // crbug.com/164101. Also, theoretically we should not count a // request-priority capable request against the delayable requests limit. - if (http_server_properties.SupportsRequestPriority(host_port_pair)) + if (http_server_properties.SupportsRequestPriority(scheme_host_port)) return START_REQUEST; // Non-delayable requests. diff --git a/chromium/content/browser/loader/resource_scheduler_unittest.cc b/chromium/content/browser/loader/resource_scheduler_unittest.cc index 59b6d0055b9..c9139385577 100644 --- a/chromium/content/browser/loader/resource_scheduler_unittest.cc +++ b/chromium/content/browser/loader/resource_scheduler_unittest.cc @@ -31,6 +31,7 @@ #include "net/url_request/url_request_test_util.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/events/latency_info.h" +#include "url/scheme_host_port.h" using std::string; @@ -337,7 +338,7 @@ TEST_F(ResourceSchedulerTest, LowDoesNotBlockCriticalComplete) { TEST_F(ResourceSchedulerTest, OneLowLoadsUntilBodyInsertedExceptSpdy) { http_server_properties_.SetSupportsSpdy( - net::HostPortPair("spdyhost", 443), true); + url::SchemeHostPort("https", "spdyhost", 443), true); std::unique_ptr<TestRequest> high( NewRequest("http://host/high", net::HIGHEST)); std::unique_ptr<TestRequest> low_spdy( @@ -665,7 +666,7 @@ TEST_F(ResourceSchedulerTest, NewSpdyHostInDelayableRequests) { std::unique_ptr<TestRequest> low1(NewRequest("http://host/low", net::LOWEST)); EXPECT_FALSE(low1->started()); http_server_properties_.SetSupportsSpdy( - net::HostPortPair("spdyhost1", 8080), true); + url::SchemeHostPort("http", "spdyhost1", 8080), true); low1_spdy.reset(); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(low1->started()); @@ -677,7 +678,7 @@ TEST_F(ResourceSchedulerTest, NewSpdyHostInDelayableRequests) { // Reprioritize a request after we learn the server supports SPDY. EXPECT_TRUE(low2_spdy->started()); http_server_properties_.SetSupportsSpdy( - net::HostPortPair("spdyhost2", 8080), true); + url::SchemeHostPort("http", "spdyhost2", 8080), true); ChangeRequestPriority(low2_spdy.get(), net::LOWEST); base::RunLoop().RunUntilIdle(); std::unique_ptr<TestRequest> low2(NewRequest("http://host/low", net::LOWEST)); @@ -716,7 +717,7 @@ TEST_F(ResourceSchedulerTest, InitializeScheduler(); http_server_properties_.SetSupportsSpdy( - net::HostPortPair("spdyhost", 443), true); + url::SchemeHostPort("https", "spdyhost", 443), true); // Throw in requests up to the above limit; make sure they are started. ScopedVector<TestRequest> requests; diff --git a/chromium/content/browser/loader/sync_resource_handler.cc b/chromium/content/browser/loader/sync_resource_handler.cc index ebb2a437533..36eec61d516 100644 --- a/chromium/content/browser/loader/sync_resource_handler.cc +++ b/chromium/content/browser/loader/sync_resource_handler.cc @@ -5,7 +5,7 @@ #include "content/browser/loader/sync_resource_handler.h" #include "base/logging.h" -#include "content/browser/devtools/devtools_netlog_observer.h" +#include "content/browser/loader/netlog_observer.h" #include "content/browser/loader/resource_dispatcher_host_impl.h" #include "content/browser/loader/resource_message_filter.h" #include "content/browser/loader/resource_request_info_impl.h" @@ -51,7 +51,7 @@ bool SyncResourceHandler::OnRequestRedirected( response); } - DevToolsNetLogObserver::PopulateResponseInfo(request(), response); + NetLogObserver::PopulateResponseInfo(request(), response); // TODO(darin): It would be much better if this could live in WebCore, but // doing so requires API changes at all levels. Similar code exists in // WebCore/platform/network/cf/ResourceHandleCFNet.cpp :-( @@ -77,7 +77,7 @@ bool SyncResourceHandler::OnResponseStarted( request(), info->GetContext(), response, info->filter()); } - DevToolsNetLogObserver::PopulateResponseInfo(request(), response); + NetLogObserver::PopulateResponseInfo(request(), response); // We don't care about copying the status here. result_.headers = response->head.headers; diff --git a/chromium/content/browser/loader/upload_data_stream_builder_unittest.cc b/chromium/content/browser/loader/upload_data_stream_builder_unittest.cc index 6db17f6cd4d..fc5cf956a36 100644 --- a/chromium/content/browser/loader/upload_data_stream_builder_unittest.cc +++ b/chromium/content/browser/loader/upload_data_stream_builder_unittest.cc @@ -13,7 +13,7 @@ #include "base/files/file_util.h" #include "base/macros.h" #include "base/run_loop.h" -#include "base/thread_task_runner_handle.h" +#include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "content/common/resource_request_body.h" #include "net/base/io_buffer.h" |