| Index: chrome/browser/prerender/prerender_browsertest.cc
|
| diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
|
| index 8cd4ecc326b8d9aeed8807a11a14a6bfe87bda67..82e8ebf6b20a08d6f5e230706c5f9cdbaa81cea5 100644
|
| --- a/chrome/browser/prerender/prerender_browsertest.cc
|
| +++ b/chrome/browser/prerender/prerender_browsertest.cc
|
| @@ -172,8 +172,13 @@ class TestPrerenderContents : public PrerenderContents {
|
| // When the PrerenderContents is destroyed, quit the UI message loop.
|
| // This happens on navigation to used prerendered pages, and soon
|
| // after cancellation of unused prerendered pages.
|
| - if (quit_message_loop_on_destruction_)
|
| - MessageLoopForUI::current()->Quit();
|
| + if (quit_message_loop_on_destruction_) {
|
| + // The message loop may not be running if this is swapped in
|
| + // synchronously on a Navigation.
|
| + MessageLoop* loop = MessageLoopForUI::current();
|
| + if (loop->is_running())
|
| + loop->Quit();
|
| + }
|
| }
|
|
|
| virtual void RenderViewGone(base::TerminationStatus status) OVERRIDE {
|
| @@ -488,7 +493,8 @@ class PrerenderBrowserTest : public InProcessBrowserTest {
|
| const std::string& html_file,
|
| const std::deque<FinalStatus>& expected_final_status_queue,
|
| int expected_number_of_loads) {
|
| - PrerenderTestURLImpl(test_server()->GetURL(html_file),
|
| + GURL url = test_server()->GetURL(html_file);
|
| + PrerenderTestURLImpl(url, url,
|
| expected_final_status_queue,
|
| expected_number_of_loads);
|
| }
|
| @@ -499,7 +505,19 @@ class PrerenderBrowserTest : public InProcessBrowserTest {
|
| int expected_number_of_loads) {
|
| std::deque<FinalStatus> expected_final_status_queue(1,
|
| expected_final_status);
|
| - PrerenderTestURLImpl(url,
|
| + PrerenderTestURLImpl(url, url,
|
| + expected_final_status_queue,
|
| + expected_number_of_loads);
|
| + }
|
| +
|
| + void PrerenderTestURL(
|
| + const GURL& prerender_url,
|
| + const GURL& destination_url,
|
| + FinalStatus expected_final_status,
|
| + int expected_number_of_loads) {
|
| + std::deque<FinalStatus> expected_final_status_queue(1,
|
| + expected_final_status);
|
| + PrerenderTestURLImpl(prerender_url, destination_url,
|
| expected_final_status_queue,
|
| expected_number_of_loads);
|
| }
|
| @@ -691,14 +709,18 @@ class PrerenderBrowserTest : public InProcessBrowserTest {
|
|
|
| private:
|
| void PrerenderTestURLImpl(
|
| - const GURL& url,
|
| + const GURL& prerender_url,
|
| + const GURL& destination_url,
|
| const std::deque<FinalStatus>& expected_final_status_queue,
|
| int expected_number_of_loads) {
|
| - dest_url_ = url;
|
| + // TODO(cbentzel): Remove dest_url_?
|
| + dest_url_ = destination_url;
|
|
|
| std::vector<net::TestServer::StringPair> replacement_text;
|
| replacement_text.push_back(
|
| - make_pair("REPLACE_WITH_PRERENDER_URL", dest_url_.spec()));
|
| + make_pair("REPLACE_WITH_PRERENDER_URL", prerender_url.spec()));
|
| + replacement_text.push_back(
|
| + make_pair("REPLACE_WITH_DESTINATION_URL", destination_url.spec()));
|
| std::string replacement_path;
|
| ASSERT_TRUE(net::TestServer::GetFilePathWithReplacements(
|
| loader_path_,
|
| @@ -789,17 +811,11 @@ class PrerenderBrowserTest : public InProcessBrowserTest {
|
| }
|
| }
|
|
|
| - // ui_test_utils::NavigateToURL waits until DidStopLoading is called on
|
| - // the current tab. As that tab is going to end up deleted, and may never
|
| - // finish loading before that happens, exit the message loop on the deletion
|
| - // of the used prerender contents instead.
|
| - //
|
| - // As PrerenderTestURL waits until the prerendered page has completely
|
| - // loaded, there is no race between loading |dest_url| and swapping the
|
| - // prerendered TabContents into the tab.
|
| + // Navigate to the prerendered URL, but don't run the message loop. Browser
|
| + // issued navigations to prerendered pages will synchronously swap in the
|
| + // prerendered page.
|
| ui_test_utils::NavigateToURLWithDisposition(
|
| browser(), dest_url, disposition, ui_test_utils::BROWSER_TEST_NONE);
|
| - ui_test_utils::RunMessageLoop();
|
|
|
| // Make sure the PrerenderContents found earlier was used or removed.
|
| EXPECT_TRUE(GetPrerenderContents() == NULL);
|
| @@ -968,6 +984,19 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
|
| NavigateToURL("files/prerender/prerender_page.html");
|
| }
|
|
|
| +// Checks that client-issued redirects work with prerendering.
|
| +// This version navigates to the final destination page, rather than the
|
| +// page which does the redirection via a mouse click.
|
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
|
| + PrerenderClientRedirectNavigateToSecondViaClick) {
|
| + GURL prerender_url = test_server()->GetURL(
|
| + CreateClientRedirect("files/prerender/prerender_page.html"));
|
| + GURL destination_url = test_server()->GetURL(
|
| + "files/prerender/prerender_page.html");
|
| + PrerenderTestURL(prerender_url, destination_url, FINAL_STATUS_USED, 2);
|
| + OpenDestURLViaClick();
|
| +}
|
| +
|
| // Checks that a prerender for an https will prevent a prerender from happening.
|
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttps) {
|
| net::TestServer https_server(net::TestServer::TYPE_HTTPS,
|
| @@ -1059,6 +1088,19 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
|
| NavigateToURL("files/prerender/prerender_page.html");
|
| }
|
|
|
| +// Checks that server-issued redirects work with prerendering.
|
| +// This version navigates to the final destination page, rather than the
|
| +// page which does the redirection via a mouse click.
|
| +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
|
| + PrerenderServerRedirectNavigateToSecondViaClick) {
|
| + GURL prerender_url = test_server()->GetURL(
|
| + CreateServerRedirect("files/prerender/prerender_page.html"));
|
| + GURL destination_url = test_server()->GetURL(
|
| + "files/prerender/prerender_page.html");
|
| + PrerenderTestURL(prerender_url, destination_url, FINAL_STATUS_USED, 1);
|
| + OpenDestURLViaClick();
|
| +}
|
| +
|
| // Checks that server-issued redirects from an http to an https
|
| // location will cancel prerendering.
|
| IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
|
|
|