Commit fd6fa0b5 authored by Jay Civelli's avatar Jay Civelli Committed by Commit Bot

Add redirect info to ResourceLoadInfo

Adding information about redirects when notifying a resource was loaded.

Bug: 816684
Change-Id: Ice12ad0bad3e38fae0af60cd932e76a26d827ed4
Reviewed-on: https://chromium-review.googlesource.com/1014664Reviewed-by: default avatarTom Sepez <tsepez@chromium.org>
Reviewed-by: default avatarJohn Abd-El-Malek <jam@chromium.org>
Commit-Queue: Jay Civelli <jcivelli@chromium.org>
Cr-Commit-Position: refs/heads/master@{#551394}
parent 54d6642b
......@@ -738,7 +738,8 @@ IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
resource_url, /*referrer=*/page_url, "GET", content::RESOURCE_TYPE_SCRIPT,
"text/html", "127.0.0.1",
/*was_cached=*/false, /*first_network_request=*/false, before, after));
EXPECT_TRUE(observer.resource_load_infos()[1]->network_accessed);
EXPECT_TRUE(
observer.resource_load_infos()[1]->network_info->network_accessed);
EXPECT_TRUE(observer.memory_cached_loaded_urls().empty());
observer.Reset();
......@@ -773,7 +774,8 @@ IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
"text/html", "127.0.0.1",
/*was_cached=*/true, /*first_network_request=*/false, before, after));
EXPECT_TRUE(observer.memory_cached_loaded_urls().empty());
EXPECT_FALSE(observer.resource_load_infos()[1]->network_accessed);
EXPECT_FALSE(
observer.resource_load_infos()[1]->network_info->network_accessed);
}
IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
......@@ -783,15 +785,17 @@ IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
NavigateToURL(shell(),
GURL(embedded_test_server()->GetURL("/page_with_image.html")));
ASSERT_EQ(2U, observer.resource_load_infos().size());
EXPECT_TRUE(observer.resource_load_infos()[0]->network_accessed);
EXPECT_TRUE(observer.resource_load_infos()[1]->network_accessed);
EXPECT_TRUE(
observer.resource_load_infos()[0]->network_info->network_accessed);
EXPECT_TRUE(
observer.resource_load_infos()[1]->network_info->network_accessed);
observer.Reset();
NavigateToURL(shell(), GURL("chrome://gpu"));
ASSERT_LE(1U, observer.resource_load_infos().size());
for (const mojom::ResourceLoadInfoPtr& resource_load_info :
observer.resource_load_infos()) {
EXPECT_FALSE(resource_load_info->network_accessed);
EXPECT_FALSE(resource_load_info->network_info->network_accessed);
}
}
......@@ -863,7 +867,8 @@ IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
GURL cacheable_url(embedded_test_server()->GetURL("/set-header"));
NavigateToURL(shell(), cacheable_url);
ASSERT_EQ(1U, observer.resource_load_infos().size());
EXPECT_FALSE(observer.resource_load_infos()[0]->always_access_network);
EXPECT_FALSE(
observer.resource_load_infos()[0]->network_info->always_access_network);
observer.Reset();
std::array<std::string, 3> headers = {
......@@ -872,11 +877,47 @@ IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
GURL no_cache_url(embedded_test_server()->GetURL("/set-header?" + header));
NavigateToURL(shell(), no_cache_url);
ASSERT_EQ(1U, observer.resource_load_infos().size());
EXPECT_TRUE(observer.resource_load_infos()[0]->always_access_network);
EXPECT_TRUE(
observer.resource_load_infos()[0]->network_info->always_access_network);
observer.Reset();
}
}
IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
ResourceLoadCompleteWithRedirects) {
ResourceLoadObserver observer(shell());
ASSERT_TRUE(embedded_test_server()->Start());
GURL target_url(embedded_test_server()->GetURL("/title1.html"));
GURL intermediate_url(
embedded_test_server()->GetURL("/server-redirect?" + target_url.spec()));
GURL start_url(embedded_test_server()->GetURL("/server-redirect?" +
intermediate_url.spec()));
NavigateToURL(shell(), start_url);
ASSERT_EQ(1U, observer.resource_load_infos().size());
EXPECT_EQ(target_url, observer.resource_load_infos()[0]->url);
ASSERT_EQ(2U, observer.resource_load_infos()[0]->redirect_info_chain.size());
EXPECT_EQ(intermediate_url,
observer.resource_load_infos()[0]->redirect_info_chain[0]->url);
EXPECT_TRUE(observer.resource_load_infos()[0]
->redirect_info_chain[0]
->network_info->network_accessed);
EXPECT_FALSE(observer.resource_load_infos()[0]
->redirect_info_chain[0]
->network_info->always_access_network);
EXPECT_EQ(target_url,
observer.resource_load_infos()[0]->redirect_info_chain[1]->url);
EXPECT_TRUE(observer.resource_load_infos()[0]
->redirect_info_chain[1]
->network_info->network_accessed);
EXPECT_FALSE(observer.resource_load_infos()[0]
->redirect_info_chain[1]
->network_info->always_access_network);
}
struct LoadProgressDelegateAndObserver : public WebContentsDelegate,
public WebContentsObserver {
explicit LoadProgressDelegateAndObserver(Shell* shell)
......
......@@ -9,6 +9,25 @@ import "mojo/public/mojom/base/time.mojom";
import "net/interfaces/ip_address.mojom";
import "url/mojom/url.mojom";
// Network related information reported for loads and redirects.
struct CommonNetworkInfo {
// True if the request accessed the network in the process of retrieving data.
bool network_accessed;
// True if loading this resource always requires accessing the network, either
// because it should always be revalidated or because it should not be cached.
bool always_access_network;
};
// Information for a redirect.
struct RedirectInfo {
// The URL after the redirect.
url.mojom.Url url;
// Various network related information.
CommonNetworkInfo network_info;
};
// Information pertaining to resource loading.
// This will be passed to ResourceResponse callback methods.
struct ResourceLoadInfo {
......@@ -40,16 +59,16 @@ struct ResourceLoadInfo {
// True if the response was fetched from the network cache.
bool was_cached;
// True if the request accessed the network in the process of retrieving data.
bool network_accessed;
// True if loading this resource always requires accessing the network, either
// because it should always be revalidated or because it should not be cached.
bool always_access_network;
// Various network related information.
CommonNetworkInfo network_info;
// The network error code, net::OK if no error happened.
int32 net_error;
// The time at which the request was started.
mojo_base.mojom.TimeTicks request_start;
// The list of redirects that led to this resource load. Empty if there were
// no redirects.
array<RedirectInfo> redirect_info_chain;
};
......@@ -276,6 +276,15 @@ void ResourceDispatcher::OnReceivedRedirect(
request_info->response_method = redirect_info.new_method;
request_info->response_referrer = GURL(redirect_info.new_referrer);
request_info->has_pending_redirect = true;
mojom::RedirectInfoPtr net_redirect_info = mojom::RedirectInfo::New();
net_redirect_info->url = redirect_info.new_url;
net_redirect_info->network_info = mojom::CommonNetworkInfo::New();
net_redirect_info->network_info->network_accessed =
response_head.network_accessed;
net_redirect_info->network_info->always_access_network =
AlwaysAccessNetwork(response_head.headers);
request_info->redirect_info_chain.push_back(std::move(net_redirect_info));
if (!request_info->is_deferred)
FollowPendingRedirect(request_info);
} else {
......@@ -314,12 +323,17 @@ void ResourceDispatcher::OnRequestComplete(
if (request_info->parsed_ip.IsValid())
resource_load_info->ip = request_info->parsed_ip;
resource_load_info->mime_type = request_info->mime_type;
resource_load_info->network_accessed = request_info->network_accessed;
resource_load_info->always_access_network =
resource_load_info->network_info = mojom::CommonNetworkInfo::New();
resource_load_info->network_info->network_accessed =
request_info->network_accessed;
resource_load_info->network_info->always_access_network =
request_info->always_access_network;
resource_load_info->was_cached = status.exists_in_cache;
resource_load_info->net_error = status.error_code;
resource_load_info->request_start = request_info->request_start;
resource_load_info->redirect_info_chain =
std::move(request_info->redirect_info_chain);
NotifyResourceLoadComplete(RenderThreadImpl::DeprecatedGetMainTaskRunner(),
request_info->render_frame_id,
std::move(resource_load_info));
......
......@@ -12,6 +12,7 @@
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "base/containers/circular_deque.h"
#include "base/containers/hash_tables.h"
......@@ -22,6 +23,7 @@
#include "base/single_thread_task_runner.h"
#include "base/time/time.h"
#include "content/common/content_export.h"
#include "content/public/common/resource_load_info.mojom.h"
#include "content/public/common/resource_type.h"
#include "content/public/common/url_loader_throttle.h"
#include "mojo/public/cpp/system/data_pipe.h"
......@@ -213,6 +215,8 @@ class CONTENT_EXPORT ResourceDispatcher {
bool should_follow_redirect = true;
bool always_access_network = false;
std::vector<content::mojom::RedirectInfoPtr> redirect_info_chain;
// For mojo loading.
std::unique_ptr<ThrottlingURLLoader> url_loader;
std::unique_ptr<URLLoaderClientImpl> url_loader_client;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment