Commit 7516d388 authored by Robert Ogden's avatar Robert Ogden Committed by Commit Bot

Remove Loading Predictor preconnect for Prerenders

This has the potential to leak user information during an isolated
prerender and isn't otherwise beneficial in the context of a prerender.

Bug: 1103392
Change-Id: Ic1806bcdf3476bc2c864f91028125d380b0b1be1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2300805Reviewed-by: default avatarSophie Chang <sophiechang@chromium.org>
Reviewed-by: default avatarTarun Bansal <tbansal@chromium.org>
Commit-Queue: Robert Ogden <robertogden@chromium.org>
Cr-Commit-Position: refs/heads/master@{#789562}
parent 28b73639
......@@ -31,6 +31,9 @@
#include "chrome/browser/predictors/preconnect_manager.h"
#include "chrome/browser/predictors/predictors_enums.h"
#include "chrome/browser/predictors/predictors_features.h"
#include "chrome/browser/prerender/prerender_handle.h"
#include "chrome/browser/prerender/prerender_manager.h"
#include "chrome/browser/prerender/prerender_manager_factory.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/common/chrome_switches.h"
......@@ -717,6 +720,71 @@ IN_PROC_BROWSER_TEST_F(LoadingPredictorBrowserTest,
preconnect_manager_observer()->HasOriginAttemptedToPreconnect(GURL()));
}
namespace {
class TestPrerenderStopObserver : public prerender::PrerenderHandle::Observer {
public:
explicit TestPrerenderStopObserver(base::OnceClosure on_stop_closure)
: on_stop_closure_(std::move(on_stop_closure)) {}
~TestPrerenderStopObserver() override = default;
void OnPrerenderStop(prerender::PrerenderHandle* contents) override {
if (on_stop_closure_) {
std::move(on_stop_closure_).Run();
}
}
void OnPrerenderStart(prerender::PrerenderHandle* handle) override {}
void OnPrerenderStopLoading(prerender::PrerenderHandle* handle) override {}
void OnPrerenderDomContentLoaded(
prerender::PrerenderHandle* handle) override {}
void OnPrerenderNetworkBytesChanged(
prerender::PrerenderHandle* handle) override {}
private:
base::OnceClosure on_stop_closure_;
};
} // namespace
// Tests that the LoadingPredictor doesn't preconnect during a prerender.
IN_PROC_BROWSER_TEST_F(LoadingPredictorBrowserTest,
PrepareForPageLoadDuringPrerender) {
GURL url("http://test.com");
base::RunLoop prerender_run_loop;
TestPrerenderStopObserver prerender_observer(
prerender_run_loop.QuitClosure());
prerender::PrerenderManager* prerender_manager =
prerender::PrerenderManagerFactory::GetForBrowserContext(
browser()->profile());
std::unique_ptr<prerender::PrerenderHandle> handle =
prerender_manager->AddPrerenderFromNavigationPredictor(
url,
browser()
->tab_strip_model()
->GetActiveWebContents()
->GetController()
.GetDefaultSessionStorageNamespace(),
gfx::Size(640, 480));
ASSERT_TRUE(handle);
handle->SetObserver(&prerender_observer);
prerender_run_loop.Run();
url::Origin origin = url::Origin::Create(url);
net::NetworkIsolationKey network_isolation_key(origin, origin);
// Ensure that the prerender does not make a host lookup or attempt to
// preconnect.
base::RunLoop().RunUntilIdle();
EXPECT_FALSE(preconnect_manager_observer()->HasHostBeenLookedUp(
url.host(), network_isolation_key));
EXPECT_FALSE(preconnect_manager_observer()->HasHostBeenLookedUp(
"", network_isolation_key));
EXPECT_FALSE(preconnect_manager_observer()->HasOriginAttemptedToPreconnect(
url.GetOrigin()));
EXPECT_FALSE(
preconnect_manager_observer()->HasOriginAttemptedToPreconnect(GURL()));
}
// Tests that the LoadingPredictor preconnects to the main frame origin even if
// it doesn't have any prediction for this origin.
IN_PROC_BROWSER_TEST_F(LoadingPredictorBrowserTest,
......
......@@ -14,6 +14,8 @@
#include "chrome/browser/predictors/loading_predictor_factory.h"
#include "chrome/browser/predictors/predictors_enums.h"
#include "chrome/browser/predictors/predictors_features.h"
#include "chrome/browser/prerender/prerender_manager.h"
#include "chrome/browser/prerender/prerender_manager_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "components/optimization_guide/optimization_guide_decider.h"
#include "components/optimization_guide/proto/hints.pb.h"
......@@ -67,6 +69,16 @@ net::RequestPriority GetRequestPriority(
}
bool IsHandledNavigation(content::NavigationHandle* navigation_handle) {
content::WebContents* web_contents = navigation_handle->GetWebContents();
prerender::PrerenderManager* prerender_manager =
prerender::PrerenderManagerFactory::GetForBrowserContext(
web_contents->GetBrowserContext());
if (prerender_manager &&
prerender_manager->IsWebContentsPrerendering(web_contents, nullptr)) {
return false;
}
return navigation_handle->IsInMainFrame() &&
!navigation_handle->IsSameDocument() &&
navigation_handle->GetURL().SchemeIsHTTPOrHTTPS();
......
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