summaryrefslogtreecommitdiff
path: root/chromium/content/browser/loader
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2016-07-14 17:41:05 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2016-08-04 12:37:36 +0000
commit399c965b6064c440ddcf4015f5f8e9d131c7a0a6 (patch)
tree6b06b60ff365abef0e13b3503d593a0df48d20e8 /chromium/content/browser/loader
parent7366110654eec46f21b6824f302356426f48cd74 (diff)
downloadqtwebengine-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')
-rw-r--r--chromium/content/browser/loader/DEPS284
-rw-r--r--chromium/content/browser/loader/OWNERS3
-rw-r--r--chromium/content/browser/loader/async_resource_handler.cc16
-rw-r--r--chromium/content/browser/loader/async_revalidation_driver.cc2
-rw-r--r--chromium/content/browser/loader/async_revalidation_manager.cc3
-rw-r--r--chromium/content/browser/loader/async_revalidation_manager.h5
-rw-r--r--chromium/content/browser/loader/async_revalidation_manager_unittest.cc13
-rw-r--r--chromium/content/browser/loader/cross_site_resource_handler.cc6
-rw-r--r--chromium/content/browser/loader/cross_site_resource_handler_browsertest.cc2
-rw-r--r--chromium/content/browser/loader/mime_type_resource_handler.cc2
-rw-r--r--chromium/content/browser/loader/navigation_resource_handler.cc32
-rw-r--r--chromium/content/browser/loader/navigation_resource_handler.h8
-rw-r--r--chromium/content/browser/loader/navigation_resource_throttle.cc50
-rw-r--r--chromium/content/browser/loader/navigation_resource_throttle.h7
-rw-r--r--chromium/content/browser/loader/navigation_url_loader_delegate.h6
-rw-r--r--chromium/content/browser/loader/navigation_url_loader_impl.cc7
-rw-r--r--chromium/content/browser/loader/navigation_url_loader_impl.h4
-rw-r--r--chromium/content/browser/loader/navigation_url_loader_impl_core.cc7
-rw-r--r--chromium/content/browser/loader/navigation_url_loader_impl_core.h4
-rw-r--r--chromium/content/browser/loader/navigation_url_loader_unittest.cc80
-rw-r--r--chromium/content/browser/loader/netlog_observer.cc200
-rw-r--r--chromium/content/browser/loader/netlog_observer.h64
-rw-r--r--chromium/content/browser/loader/reload_cache_control_browsertest.cc151
-rw-r--r--chromium/content/browser/loader/resource_dispatcher_host_impl.cc34
-rw-r--r--chromium/content/browser/loader/resource_dispatcher_host_impl.h16
-rw-r--r--chromium/content/browser/loader/resource_dispatcher_host_unittest.cc296
-rw-r--r--chromium/content/browser/loader/resource_hints_impl.cc60
-rw-r--r--chromium/content/browser/loader/resource_loader.cc56
-rw-r--r--chromium/content/browser/loader/resource_loader.h9
-rw-r--r--chromium/content/browser/loader/resource_loader_unittest.cc125
-rw-r--r--chromium/content/browser/loader/resource_message_filter.cc2
-rw-r--r--chromium/content/browser/loader/resource_message_filter.h5
-rw-r--r--chromium/content/browser/loader/resource_scheduler.cc9
-rw-r--r--chromium/content/browser/loader/resource_scheduler_unittest.cc9
-rw-r--r--chromium/content/browser/loader/sync_resource_handler.cc6
-rw-r--r--chromium/content/browser/loader/upload_data_stream_builder_unittest.cc2
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"