Commit 4c6cd83c authored by John Abd-El-Malek's avatar John Abd-El-Malek

Set the prefetch load flag without a resource throttle for compatibility with the network service.

This was originally added in 440645 using a resource throttle. Since resource throttles don't work
with the network service (as net runs out of process), instead do this in the same
ContentBrowserClient callback which is used to add extra headers for prerendering requests.

Also convert a few prefetch tests for this to use the new URLLoaderInterceptor so that they pass
with the network service.

Bug: 769401
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_mojo
Change-Id: I993912ff991dda33c0fb58ae8e38f88fd16ee4ac
Reviewed-on: https://chromium-review.googlesource.com/802996Reviewed-by: default avatarEgor Pasko <pasko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#521034}
parent a0837521
...@@ -1973,12 +1973,22 @@ bool ChromeContentBrowserClient::IsDataSaverEnabled( ...@@ -1973,12 +1973,22 @@ bool ChromeContentBrowserClient::IsDataSaverEnabled(
return prefs && prefs->GetBoolean(prefs::kDataSaverEnabled); return prefs && prefs->GetBoolean(prefs::kDataSaverEnabled);
} }
std::unique_ptr<net::HttpRequestHeaders> void ChromeContentBrowserClient::NavigationRequestStarted(
ChromeContentBrowserClient::GetAdditionalNavigationRequestHeaders( int frame_tree_node_id,
content::BrowserContext* context, const GURL& url,
const GURL& url) const { std::unique_ptr<net::HttpRequestHeaders>* extra_headers,
return client_hints::GetAdditionalNavigationRequestClientHintsHeaders(context, int* extra_load_flags) {
url); WebContents* web_contents =
WebContents::FromFrameTreeNodeId(frame_tree_node_id);
*extra_headers =
client_hints::GetAdditionalNavigationRequestClientHintsHeaders(
web_contents->GetBrowserContext(), url);
prerender::PrerenderContents* prerender_contents =
prerender::PrerenderContents::FromWebContents(web_contents);
if (prerender_contents) {
if (prerender_contents->prerender_mode() == prerender::PREFETCH_ONLY)
*extra_load_flags = net::LOAD_PREFETCH;
}
} }
bool ChromeContentBrowserClient::AllowAppCache( bool ChromeContentBrowserClient::AllowAppCache(
......
...@@ -160,9 +160,11 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient { ...@@ -160,9 +160,11 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient {
std::string GetAcceptLangs(content::BrowserContext* context) override; std::string GetAcceptLangs(content::BrowserContext* context) override;
const gfx::ImageSkia* GetDefaultFavicon() override; const gfx::ImageSkia* GetDefaultFavicon() override;
bool IsDataSaverEnabled(content::BrowserContext* context) override; bool IsDataSaverEnabled(content::BrowserContext* context) override;
std::unique_ptr<net::HttpRequestHeaders> void NavigationRequestStarted(
GetAdditionalNavigationRequestHeaders(content::BrowserContext* context, int frame_tree_node_id,
const GURL& url) const override; const GURL& url,
std::unique_ptr<net::HttpRequestHeaders>* extra_headers,
int* extra_load_flags) override;
bool AllowAppCache(const GURL& manifest_url, bool AllowAppCache(const GURL& manifest_url,
const GURL& first_party, const GURL& first_party,
content::ResourceContext* context) override; content::ResourceContext* context) override;
......
...@@ -29,12 +29,14 @@ ...@@ -29,12 +29,14 @@
#include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_switches.h"
#include "chrome/test/base/ui_test_utils.h" #include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/appcache_service.h" #include "content/public/browser/appcache_service.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host.h"
#include "content/public/browser/storage_partition.h" #include "content/public/browser/storage_partition.h"
#include "content/public/common/content_features.h" #include "content/public/common/content_features.h"
#include "content/public/common/result_codes.h" #include "content/public/common/result_codes.h"
#include "content/public/common/url_constants.h" #include "content/public/common/url_constants.h"
#include "content/public/test/browser_test_utils.h" #include "content/public/test/browser_test_utils.h"
#include "content/public/test/url_loader_interceptor.h"
#include "net/base/escape.h" #include "net/base/escape.h"
#include "net/base/load_flags.h" #include "net/base/load_flags.h"
#include "net/dns/mock_host_resolver.h" #include "net/dns/mock_host_resolver.h"
...@@ -161,6 +163,15 @@ class NoStatePrefetchBrowserTest ...@@ -161,6 +163,15 @@ class NoStatePrefetchBrowserTest
expected_final_status); expected_final_status);
} }
content::StoragePartition* GetStoragePartition() {
return browser()
->tab_strip_model()
->GetActiveWebContents()
->GetMainFrame()
->GetProcess()
->GetStoragePartition();
}
private: private:
// Schedule a task to retrieve AppCacheInfo from |appcache_service|. This sets // Schedule a task to retrieve AppCacheInfo from |appcache_service|. This sets
// |found_manifest| if an appcache exists for |manifest_url|. |callback| will // |found_manifest| if an appcache exists for |manifest_url|. |callback| will
...@@ -221,29 +232,38 @@ IN_PROC_BROWSER_TEST_P(NoStatePrefetchBrowserTest, PrefetchSimple) { ...@@ -221,29 +232,38 @@ IN_PROC_BROWSER_TEST_P(NoStatePrefetchBrowserTest, PrefetchSimple) {
// Check that the LOAD_PREFETCH flag is set. // Check that the LOAD_PREFETCH flag is set.
IN_PROC_BROWSER_TEST_P(NoStatePrefetchBrowserTest, PrefetchLoadFlag) { IN_PROC_BROWSER_TEST_P(NoStatePrefetchBrowserTest, PrefetchLoadFlag) {
// TODO(jam): use URLLoaderFactory for subresource. GURL prefetch_page = src_server()->GetURL(kPrefetchPage);
// This will need a separate code path for network service: GURL prefetch_script = src_server()->GetURL(kPrefetchScript);
// -add way for the
// storage_partition->GetNetworkContext()->CreateURLLoaderFactory bool use_interceptor_for_frame_requests =
// to return test defined factoory base::FeatureList::IsEnabled(features::kNetworkService);
// -also add a URLLoader unittest to verify that if ResourceRequest has that if (!use_interceptor_for_frame_requests) {
// flag it is passed to the net::URLRequest // Until http://crbug.com/747130 is fixed, navigation requests won't go
RequestCounter main_counter; // through URLLoader.
RequestCounter script_counter; prerender::test_utils::InterceptRequest(
auto verify_prefetch_only = base::Bind([](net::URLRequest* request) { prefetch_page,
EXPECT_TRUE(request->load_flags() & net::LOAD_PREFETCH); base::Bind([](net::URLRequest* request) {
}); EXPECT_TRUE(request->load_flags() & net::LOAD_PREFETCH);
}));
}
prerender::test_utils::InterceptRequestAndCount( content::URLLoaderInterceptor interceptor(
src_server()->GetURL(kPrefetchPage), &main_counter, verify_prefetch_only); base::Bind(
prerender::test_utils::InterceptRequestAndCount( [](const GURL& prefetch_page, const GURL& prefetch_script,
src_server()->GetURL(kPrefetchScript), &script_counter, content::URLLoaderInterceptor::RequestParams* params) {
verify_prefetch_only); if (params->url_request.url == prefetch_page ||
params->url_request.url == prefetch_script) {
EXPECT_TRUE(params->url_request.load_flags & net::LOAD_PREFETCH);
}
return false;
},
prefetch_page, prefetch_script),
GetStoragePartition(), use_interceptor_for_frame_requests, true);
std::unique_ptr<TestPrerender> test_prerender = std::unique_ptr<TestPrerender> test_prerender =
PrefetchFromFile(kPrefetchPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); PrefetchFromFile(kPrefetchPage, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
main_counter.WaitForCount(1); WaitForRequestCount(prefetch_page, 1);
script_counter.WaitForCount(1); WaitForRequestCount(prefetch_script, 1);
// Verify that the page load did not happen. // Verify that the page load did not happen.
test_prerender->WaitForLoads(0); test_prerender->WaitForLoads(0);
...@@ -384,18 +404,33 @@ IN_PROC_BROWSER_TEST_P(NoStatePrefetchBrowserTest, Prefetch301LoadFlags) { ...@@ -384,18 +404,33 @@ IN_PROC_BROWSER_TEST_P(NoStatePrefetchBrowserTest, Prefetch301LoadFlags) {
"/server-redirect/?" + net::EscapeQueryParamValue(kPrefetchPage, false); "/server-redirect/?" + net::EscapeQueryParamValue(kPrefetchPage, false);
GURL redirect_url = src_server()->GetURL(redirect_path); GURL redirect_url = src_server()->GetURL(redirect_path);
GURL page_url = src_server()->GetURL(kPrefetchPage); GURL page_url = src_server()->GetURL(kPrefetchPage);
RequestCounter redirect_counter;
auto verify_prefetch_only = base::Bind([](net::URLRequest* request) { auto verify_prefetch_only = base::Bind([](net::URLRequest* request) {
EXPECT_TRUE(request->load_flags() & net::LOAD_PREFETCH); EXPECT_TRUE(request->load_flags() & net::LOAD_PREFETCH);
}); });
prerender::test_utils::InterceptRequestAndCount(
redirect_url, &redirect_counter, verify_prefetch_only); bool use_interceptor = false;
RequestCounter page_counter; if (base::FeatureList::IsEnabled(features::kNetworkService)) {
prerender::test_utils::InterceptRequestAndCount(page_url, &page_counter, use_interceptor = true;
verify_prefetch_only); } else {
// Until http://crbug.com/747130 is fixed, navigation requests won't go
// through URLLoader.
prerender::test_utils::InterceptRequest(page_url, verify_prefetch_only);
}
content::URLLoaderInterceptor interceptor(
base::Bind(
[](const GURL& page_url,
content::URLLoaderInterceptor::RequestParams* params) {
if (params->url_request.url == page_url)
EXPECT_TRUE(params->url_request.load_flags & net::LOAD_PREFETCH);
return false;
},
redirect_url),
GetStoragePartition(), use_interceptor, false);
PrefetchFromFile(redirect_path, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); PrefetchFromFile(redirect_path, FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
redirect_counter.WaitForCount(1); WaitForRequestCount(redirect_url, 1);
page_counter.WaitForCount(1); WaitForRequestCount(page_url, 1);
} }
// Checks that a subresource 301 redirect is followed. // Checks that a subresource 301 redirect is followed.
......
...@@ -85,7 +85,6 @@ void PrerenderResourceThrottle::OverridePrerenderContentsForTesting( ...@@ -85,7 +85,6 @@ void PrerenderResourceThrottle::OverridePrerenderContentsForTesting(
PrerenderResourceThrottle::PrerenderResourceThrottle(net::URLRequest* request) PrerenderResourceThrottle::PrerenderResourceThrottle(net::URLRequest* request)
: request_(request), : request_(request),
load_flags_(net::LOAD_NORMAL),
prerender_throttle_info_(new PrerenderThrottleInfo()) { prerender_throttle_info_(new PrerenderThrottleInfo()) {
// Priorities for prerendering requests are lowered, to avoid competing with // Priorities for prerendering requests are lowered, to avoid competing with
// other page loads, except on Android where this is less likely to be a // other page loads, except on Android where this is less likely to be a
...@@ -170,7 +169,6 @@ const char* PrerenderResourceThrottle::GetNameForLogging() const { ...@@ -170,7 +169,6 @@ const char* PrerenderResourceThrottle::GetNameForLogging() const {
void PrerenderResourceThrottle::ResumeHandler() { void PrerenderResourceThrottle::ResumeHandler() {
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
request_->SetLoadFlags(request_->load_flags() | load_flags_);
Resume(); Resume();
} }
...@@ -201,10 +199,6 @@ void PrerenderResourceThrottle::WillStartRequestOnUI( ...@@ -201,10 +199,6 @@ void PrerenderResourceThrottle::WillStartRequestOnUI(
prerender_throttle_info->Set(prerender_contents->prerender_mode(), prerender_throttle_info->Set(prerender_contents->prerender_mode(),
prerender_contents->origin(), prerender_contents->origin(),
prerender_contents->prerender_manager()); prerender_contents->prerender_manager());
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::BindOnce(&PrerenderResourceThrottle::SetPrerenderMode, throttle,
prerender_contents->prerender_mode()));
// Abort any prerenders that spawn requests that use unsupported HTTP // Abort any prerenders that spawn requests that use unsupported HTTP
// methods or schemes. // methods or schemes.
...@@ -329,9 +323,4 @@ PrerenderContents* PrerenderResourceThrottle::PrerenderContentsFromGetter( ...@@ -329,9 +323,4 @@ PrerenderContents* PrerenderResourceThrottle::PrerenderContentsFromGetter(
return PrerenderContents::FromWebContents(web_contents_getter.Run()); return PrerenderContents::FromWebContents(web_contents_getter.Run());
} }
void PrerenderResourceThrottle::SetPrerenderMode(PrerenderMode mode) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
load_flags_ = (mode == PREFETCH_ONLY) ? net::LOAD_PREFETCH : net::LOAD_NORMAL;
}
} // namespace prerender } // namespace prerender
...@@ -89,11 +89,7 @@ class PrerenderResourceThrottle ...@@ -89,11 +89,7 @@ class PrerenderResourceThrottle
const content::ResourceRequestInfo::WebContentsGetter& const content::ResourceRequestInfo::WebContentsGetter&
web_contents_getter); web_contents_getter);
// Sets the prerender mode. Must be called before |ResumeHandler()|.
void SetPrerenderMode(PrerenderMode mode);
net::URLRequest* request_; net::URLRequest* request_;
int load_flags_; // Load flags to be OR'ed with the existing request flags.
// The throttle changes most request priorities to IDLE during prerendering. // The throttle changes most request priorities to IDLE during prerendering.
// The priority is reset back to the original priority when prerendering is // The priority is reset back to the original priority when prerendering is
......
...@@ -107,16 +107,19 @@ class CountingInterceptor : public net::URLRequestInterceptor { ...@@ -107,16 +107,19 @@ class CountingInterceptor : public net::URLRequestInterceptor {
class CountingInterceptorWithCallback : public net::URLRequestInterceptor { class CountingInterceptorWithCallback : public net::URLRequestInterceptor {
public: public:
// Inserts the interceptor object to intercept requests to |url|. Can be // Inserts the interceptor object to intercept requests to |url|. Can be
// called on any thread. Assumes that |counter| lives on the UI thread. The // called on any thread. Assumes that |counter| (if non-null) lives on the UI
// |callback_io| will be called on IO thread with the net::URLrequest // thread. The |callback_io| will be called on IO thread with the
// provided. // net::URLrequest provided.
static void Initialize(const GURL& url, static void Initialize(const GURL& url,
RequestCounter* counter, RequestCounter* counter,
base::Callback<void(net::URLRequest*)> callback_io) { base::Callback<void(net::URLRequest*)> callback_io) {
base::WeakPtr<RequestCounter> weakptr;
if (counter)
weakptr = counter->AsWeakPtr();
content::BrowserThread::PostTask( content::BrowserThread::PostTask(
content::BrowserThread::IO, FROM_HERE, content::BrowserThread::IO, FROM_HERE,
base::BindOnce(&CountingInterceptorWithCallback::CreateAndAddOnIO, url, base::BindOnce(&CountingInterceptorWithCallback::CreateAndAddOnIO, url,
counter->AsWeakPtr(), callback_io)); weakptr, callback_io));
} }
// net::URLRequestInterceptor: // net::URLRequestInterceptor:
...@@ -853,6 +856,11 @@ void CreateCountingInterceptorOnIO( ...@@ -853,6 +856,11 @@ void CreateCountingInterceptorOnIO(
url, base::MakeUnique<CountingInterceptor>(file, counter)); url, base::MakeUnique<CountingInterceptor>(file, counter));
} }
void InterceptRequest(const GURL& url,
base::Callback<void(net::URLRequest*)> callback_io) {
CountingInterceptorWithCallback::Initialize(url, nullptr, callback_io);
}
void InterceptRequestAndCount( void InterceptRequestAndCount(
const GURL& url, const GURL& url,
RequestCounter* counter, RequestCounter* counter,
......
...@@ -433,6 +433,12 @@ void CreateCountingInterceptorOnIO( ...@@ -433,6 +433,12 @@ void CreateCountingInterceptorOnIO(
const base::FilePath& file, const base::FilePath& file,
const base::WeakPtr<RequestCounter>& counter); const base::WeakPtr<RequestCounter>& counter);
// When the |url| hits the net::URLRequestFilter (on the IO thread), executes
// the |callback_io| providing the request to it. Does not modify the behavior
// or the request job.
void InterceptRequest(const GURL& url,
base::Callback<void(net::URLRequest*)> callback_io);
// When the |url| hits the net::URLRequestFilter (on the IO thread), executes // When the |url| hits the net::URLRequestFilter (on the IO thread), executes
// the |callback_io| providing the request to it, also pings the |counter| on UI // the |callback_io| providing the request to it, also pings the |counter| on UI
// thread. Does not modify the behavior or the request job. // thread. Does not modify the behavior or the request job.
......
...@@ -135,13 +135,15 @@ bool NeedsHTTPOrigin(net::HttpRequestHeaders* headers, ...@@ -135,13 +135,15 @@ bool NeedsHTTPOrigin(net::HttpRequestHeaders* headers,
// TODO(clamy): This should match what's happening in // TODO(clamy): This should match what's happening in
// blink::FrameFetchContext::addAdditionalRequestHeaders. // blink::FrameFetchContext::addAdditionalRequestHeaders.
void AddAdditionalRequestHeaders(net::HttpRequestHeaders* headers, void AddAdditionalRequestHeaders(
const GURL& url, net::HttpRequestHeaders* headers,
FrameMsg_Navigate_Type::Value navigation_type, std::unique_ptr<net::HttpRequestHeaders> embedder_additional_headers,
BrowserContext* browser_context, const GURL& url,
const std::string& method, FrameMsg_Navigate_Type::Value navigation_type,
const std::string user_agent_override, BrowserContext* browser_context,
FrameTreeNode* frame_tree_node) { const std::string& method,
const std::string user_agent_override,
FrameTreeNode* frame_tree_node) {
if (!url.SchemeIsHTTPOrHTTPS()) if (!url.SchemeIsHTTPOrHTTPS())
return; return;
...@@ -158,9 +160,6 @@ void AddAdditionalRequestHeaders(net::HttpRequestHeaders* headers, ...@@ -158,9 +160,6 @@ void AddAdditionalRequestHeaders(net::HttpRequestHeaders* headers,
} }
// Attach additional request headers specified by embedder. // Attach additional request headers specified by embedder.
std::unique_ptr<net::HttpRequestHeaders> embedder_additional_headers =
GetContentClient()->browser()->GetAdditionalNavigationRequestHeaders(
browser_context, url);
if (embedder_additional_headers) if (embedder_additional_headers)
headers->MergeFrom(*(embedder_additional_headers.get())); headers->MergeFrom(*(embedder_additional_headers.get()));
...@@ -394,10 +393,18 @@ NavigationRequest::NavigationRequest( ...@@ -394,10 +393,18 @@ NavigationRequest::NavigationRequest(
frame_tree_node_->navigator()->GetDelegate()->GetUserAgentOverride(); frame_tree_node_->navigator()->GetDelegate()->GetUserAgentOverride();
} }
std::unique_ptr<net::HttpRequestHeaders> embedder_additional_headers;
int additional_load_flags = 0;
GetContentClient()->browser()->NavigationRequestStarted(
frame_tree_node->frame_tree_node_id(), common_params_.url,
&embedder_additional_headers, &additional_load_flags);
begin_params_->load_flags |= additional_load_flags;
net::HttpRequestHeaders headers; net::HttpRequestHeaders headers;
headers.AddHeadersFromString(begin_params_->headers); headers.AddHeadersFromString(begin_params_->headers);
AddAdditionalRequestHeaders( AddAdditionalRequestHeaders(
&headers, common_params_.url, common_params_.navigation_type, &headers, std::move(embedder_additional_headers), common_params_.url,
common_params_.navigation_type,
frame_tree_node_->navigator()->GetController()->GetBrowserContext(), frame_tree_node_->navigator()->GetController()->GetBrowserContext(),
common_params.method, user_agent_override, frame_tree_node); common_params.method, user_agent_override, frame_tree_node);
......
...@@ -232,13 +232,6 @@ bool ContentBrowserClient::IsDataSaverEnabled(BrowserContext* context) { ...@@ -232,13 +232,6 @@ bool ContentBrowserClient::IsDataSaverEnabled(BrowserContext* context) {
return false; return false;
} }
std::unique_ptr<net::HttpRequestHeaders>
ContentBrowserClient::GetAdditionalNavigationRequestHeaders(
BrowserContext* context,
const GURL& url) const {
return nullptr;
}
bool ContentBrowserClient::AllowGetCookie(const GURL& url, bool ContentBrowserClient::AllowGetCookie(const GURL& url,
const GURL& first_party, const GURL& first_party,
const net::CookieList& cookie_list, const net::CookieList& cookie_list,
......
...@@ -416,10 +416,12 @@ class CONTENT_EXPORT ContentBrowserClient { ...@@ -416,10 +416,12 @@ class CONTENT_EXPORT ContentBrowserClient {
virtual bool IsDataSaverEnabled(BrowserContext* context); virtual bool IsDataSaverEnabled(BrowserContext* context);
// Allow the embedder to return additional headers that should be sent when // Allow the embedder to return additional headers that should be sent when
// fetching |url|. May return a nullptr. // fetching |url| as well as add extra load flags.
virtual std::unique_ptr<net::HttpRequestHeaders> virtual void NavigationRequestStarted(
GetAdditionalNavigationRequestHeaders(BrowserContext* context, int frame_tree_node_id,
const GURL& url) const; const GURL& url,
std::unique_ptr<net::HttpRequestHeaders>* extra_headers,
int* extra_load_flags) {}
// Allow the embedder to control if the given cookie can be read. // Allow the embedder to control if the given cookie can be read.
// This is called on the IO thread. // This is called on the IO thread.
......
...@@ -901,7 +901,3 @@ ...@@ -901,7 +901,3 @@
# TODO(jam): switch the tests to hook in via URLLoaderFactory to check load flags. # TODO(jam): switch the tests to hook in via URLLoaderFactory to check load flags.
-NoStatePrefetchBrowserTest/NoStatePrefetchBrowserTest.IssuesIdlePriorityRequests/0 -NoStatePrefetchBrowserTest/NoStatePrefetchBrowserTest.IssuesIdlePriorityRequests/0
-NoStatePrefetchBrowserTest/NoStatePrefetchBrowserTest.IssuesIdlePriorityRequests/1 -NoStatePrefetchBrowserTest/NoStatePrefetchBrowserTest.IssuesIdlePriorityRequests/1
-NoStatePrefetchBrowserTest/NoStatePrefetchBrowserTest.Prefetch301LoadFlags/0
-NoStatePrefetchBrowserTest/NoStatePrefetchBrowserTest.Prefetch301LoadFlags/1
-NoStatePrefetchBrowserTest/NoStatePrefetchBrowserTest.PrefetchLoadFlag/0
-NoStatePrefetchBrowserTest/NoStatePrefetchBrowserTest.PrefetchLoadFlag/1
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