Commit d3c5ed40 authored by Hiroki Nakagawa's avatar Hiroki Nakagawa Committed by Chromium LUCI CQ

Prerender: Add a test for disallow of activation on a page that has a pop-up window

A page that has a pop-up window should not activate a prerendered page.
This behavior was already implemented by the previous CL
(https://crrev.com/c/2560362). This CL adds a browser test for the
behavior.

Bug: 1138723
Change-Id: I205daba93d6998f03047f19aa5eb149e1dc6eb6f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2635381
Commit-Queue: Hiroki Nakagawa <nhiroki@chromium.org>
Reviewed-by: default avatarMatt Falkenhagen <falken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#844450}
parent 98d04533
...@@ -318,66 +318,86 @@ IN_PROC_BROWSER_TEST_P(PrerenderBrowserTest, LinkRelPrerender_Duplicate) { ...@@ -318,66 +318,86 @@ IN_PROC_BROWSER_TEST_P(PrerenderBrowserTest, LinkRelPrerender_Duplicate) {
} }
} }
// Makes sure that activations on navigations for iframes don't happen. // Makes sure that activation on navigation for an iframes doesn't happen.
IN_PROC_BROWSER_TEST_P(PrerenderBrowserTest, Activation_iFrame) { IN_PROC_BROWSER_TEST_P(PrerenderBrowserTest, Activation_iFrame) {
const GURL kInitialUrl = GetUrl("/prerender/add_prerender.html");
const GURL kPrerenderingUrl = GetUrl("/empty.html");
// Navigate to an initial page. // Navigate to an initial page.
const GURL kInitialUrl = GetUrl("/prerender/add_prerender.html");
ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl)); ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
ASSERT_EQ(shell()->web_contents()->GetURL(), kInitialUrl);
// Add <link rel=prerender> that will prerender `kPrerenderingUrl`. // Start a prerender.
ASSERT_EQ(GetRequestCount(kPrerenderingUrl), 0); const GURL kPrerenderingUrl = GetUrl("/empty.html");
AddPrerender(kPrerenderingUrl); AddPrerender(kPrerenderingUrl);
EXPECT_EQ(GetRequestCount(kPrerenderingUrl), 1);
// A prerender host for the URL should be registered.
PrerenderHostRegistry& registry = GetPrerenderHostRegistry(); PrerenderHostRegistry& registry = GetPrerenderHostRegistry();
PrerenderHost* prerender_host = PrerenderHost* prerender_host =
registry.FindHostByUrlForTesting(kPrerenderingUrl); registry.FindHostByUrlForTesting(kPrerenderingUrl);
EXPECT_TRUE(prerender_host); ASSERT_TRUE(prerender_host);
// Attempt to activate the prerendered page for an iframe. This should fail // Attempt to activate the prerendered page for an iframe. This should fail
// and fallback to network request. // and fallback to network request.
ASSERT_EQ(GetRequestCount(kPrerenderingUrl), 1);
EXPECT_EQ("LOADED", EvalJs(shell()->web_contents(), EXPECT_EQ("LOADED", EvalJs(shell()->web_contents(),
JsReplace("add_iframe($1)", kPrerenderingUrl))); JsReplace("add_iframe($1)", kPrerenderingUrl)));
EXPECT_EQ(GetRequestCount(kPrerenderingUrl), 2);
// Activation shouldn't happen, so the prerender host should not be consumed, // Activation shouldn't happen, so the prerender host should not be consumed.
// and navigation for the iframe should issue a request again.
EXPECT_EQ(registry.FindHostByUrlForTesting(kPrerenderingUrl), prerender_host); EXPECT_EQ(registry.FindHostByUrlForTesting(kPrerenderingUrl), prerender_host);
EXPECT_EQ(GetRequestCount(kPrerenderingUrl), 2);
} }
// Makes sure that activations on navigations for pop-up windows don't happen. // Makes sure that activation on navigation for a pop-up window doesn't happen.
IN_PROC_BROWSER_TEST_P(PrerenderBrowserTest, Activation_PopUpWindow) { IN_PROC_BROWSER_TEST_P(PrerenderBrowserTest, Activation_PopUpWindow) {
const GURL kInitialUrl = GetUrl("/prerender/add_prerender.html");
const GURL kPrerenderingUrl = GetUrl("/empty.html");
// Navigate to an initial page. // Navigate to an initial page.
const GURL kInitialUrl = GetUrl("/prerender/add_prerender.html");
ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl)); ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
ASSERT_EQ(shell()->web_contents()->GetURL(), kInitialUrl);
// Add <link rel=prerender> that will prerender `kPrerenderingUrl`. // Start a prerender.
ASSERT_EQ(GetRequestCount(kPrerenderingUrl), 0); const GURL kPrerenderingUrl = GetUrl("/empty.html");
AddPrerender(kPrerenderingUrl); AddPrerender(kPrerenderingUrl);
EXPECT_EQ(GetRequestCount(kPrerenderingUrl), 1);
// A prerender host for the URL should be registered.
PrerenderHostRegistry& registry = GetPrerenderHostRegistry(); PrerenderHostRegistry& registry = GetPrerenderHostRegistry();
PrerenderHost* prerender_host = PrerenderHost* prerender_host =
registry.FindHostByUrlForTesting(kPrerenderingUrl); registry.FindHostByUrlForTesting(kPrerenderingUrl);
EXPECT_TRUE(prerender_host); ASSERT_TRUE(prerender_host);
// Attempt to activate the prerendered page for a pop-up window. This should // Attempt to activate the prerendered page for a pop-up window. This should
// fail and fallback to network request. // fail and fallback to network request.
ASSERT_EQ(GetRequestCount(kPrerenderingUrl), 1);
EXPECT_EQ("LOADED", EvalJs(shell()->web_contents(), EXPECT_EQ("LOADED", EvalJs(shell()->web_contents(),
JsReplace("open_window($1)", kPrerenderingUrl))); JsReplace("open_window($1)", kPrerenderingUrl)));
EXPECT_EQ(GetRequestCount(kPrerenderingUrl), 2);
// Activation shouldn't happen, so the prerender host should not be consumed, // Activation shouldn't happen, so the prerender host should not be consumed.
// and navigation for the pop-up window should issue a request again.
EXPECT_EQ(registry.FindHostByUrlForTesting(kPrerenderingUrl), prerender_host); EXPECT_EQ(registry.FindHostByUrlForTesting(kPrerenderingUrl), prerender_host);
}
// Makes sure that activation on navigation for a page that has a pop-up window
// doesn't happen.
IN_PROC_BROWSER_TEST_P(PrerenderBrowserTest, Activation_PageWithPopUpWindow) {
// Navigate to an initial page.
const GURL kInitialUrl = GetUrl("/prerender/add_prerender.html");
ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
// Start a prerender.
const GURL kPrerenderingUrl = GetUrl("/empty.html?next");
AddPrerender(kPrerenderingUrl);
PrerenderHostRegistry& registry = GetPrerenderHostRegistry();
ASSERT_TRUE(registry.FindHostByUrlForTesting(kPrerenderingUrl));
// Open a pop-up window.
const GURL kWindowUrl = GetUrl("/empty.html?window");
EXPECT_EQ("LOADED", EvalJs(shell()->web_contents(),
JsReplace("open_window($1)", kWindowUrl)));
// Attempt to activate the prerendered page for the top-level frame. This
// should fail and fallback to network request because the pop-up window
// exists.
ASSERT_EQ(GetRequestCount(kPrerenderingUrl), 1);
NavigateWithLocation(kPrerenderingUrl);
EXPECT_EQ(shell()->web_contents()->GetURL(), kPrerenderingUrl);
EXPECT_EQ(GetRequestCount(kPrerenderingUrl), 2); EXPECT_EQ(GetRequestCount(kPrerenderingUrl), 2);
// Activation shouldn't happen, so the prerender host should not be consumed.
// However, we don't check the existence of the prerender host here unlike
// other activation tests because navigating the frame that triggered
// prerendering abandons the prerendered page regardless of activation.
} }
// Tests that back-forward history is preserved after activation. // Tests that back-forward history is preserved after activation.
......
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