| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <deque> | 5 #include <deque> |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/path_service.h" | 8 #include "base/path_service.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "chrome/browser/prerender/prerender_contents.h" | 10 #include "chrome/browser/prerender/prerender_contents.h" |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 void PrerenderTestURL( | 168 void PrerenderTestURL( |
| 169 const std::string& html_file, | 169 const std::string& html_file, |
| 170 const std::deque<FinalStatus>& expected_final_status_queue, | 170 const std::deque<FinalStatus>& expected_final_status_queue, |
| 171 int total_navigations) { | 171 int total_navigations) { |
| 172 PrerenderTestURLImpl(html_file, | 172 PrerenderTestURLImpl(html_file, |
| 173 expected_final_status_queue, | 173 expected_final_status_queue, |
| 174 total_navigations); | 174 total_navigations); |
| 175 } | 175 } |
| 176 | 176 |
| 177 void NavigateToDestURL() const { | 177 void NavigateToDestURL() const { |
| 178 NavigateToURLImpl(dest_url_); | 178 ui_test_utils::NavigateToURL(browser(), dest_url_); |
| 179 } | |
| 180 | 179 |
| 181 // Should be const but test_server()->GetURL(...) is not const. | 180 // Make sure the PrerenderContents found earlier was used or removed |
| 182 void NavigateToURL(const std::string& dest_html_file) { | 181 EXPECT_TRUE(prerender_manager()->FindEntry(dest_url_) == NULL); |
| 183 GURL dest_url = test_server()->GetURL(dest_html_file); | 182 |
| 184 NavigateToURLImpl(dest_url); | 183 // Check if page behaved as expected when actually displayed. |
| 184 bool display_test_result = false; |
| 185 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
| 186 browser()->GetSelectedTabContents()->render_view_host(), L"", |
| 187 L"window.domAutomationController.send(DidDisplayPass())", |
| 188 &display_test_result)); |
| 189 EXPECT_TRUE(display_test_result); |
| 185 } | 190 } |
| 186 | 191 |
| 187 bool UrlIsInPrerenderManager(const std::string& html_file) { | 192 bool UrlIsInPrerenderManager(const std::string& html_file) { |
| 188 GURL dest_url = test_server()->GetURL(html_file); | 193 GURL dest_url = test_server()->GetURL(html_file); |
| 189 return (prerender_manager()->FindEntry(dest_url) != NULL); | 194 return (prerender_manager()->FindEntry(dest_url) != NULL); |
| 190 } | 195 } |
| 191 | 196 |
| 192 bool UrlIsInPrerenderManager(const GURL& url) { | 197 bool UrlIsInPrerenderManager(const GURL& url) { |
| 193 return (prerender_manager()->FindEntry(url) != NULL); | 198 return (prerender_manager()->FindEntry(url) != NULL); |
| 194 } | 199 } |
| 195 | 200 |
| 196 bool UrlIsPendingInPrerenderManager(const std::string& html_file) { | 201 bool UrlIsPendingInPrerenderManager(const std::string& html_file) { |
| 197 GURL dest_url = test_server()->GetURL(html_file); | 202 GURL dest_url = test_server()->GetURL(html_file); |
| 198 return (prerender_manager()->FindPendingEntry(dest_url) != NULL); | 203 return (prerender_manager()->FindPendingEntry(dest_url) != NULL); |
| 199 } | 204 } |
| 200 | 205 |
| 201 void set_use_https_src(bool use_https_src_server) { | 206 void set_use_https_src(bool use_https_src_server) { |
| 202 use_https_src_server_ = use_https_src_server; | 207 use_https_src_server_ = use_https_src_server; |
| 203 } | 208 } |
| 204 | 209 |
| 205 TaskManagerModel* model() const { | 210 TaskManagerModel* model() const { |
| 206 return TaskManager::GetInstance()->model(); | 211 return TaskManager::GetInstance()->model(); |
| 207 } | 212 } |
| 208 | 213 |
| 214 void set_dest_url(const GURL& dest_url) { dest_url_ = dest_url; } |
| 215 |
| 209 private: | 216 private: |
| 210 void PrerenderTestURLImpl( | 217 void PrerenderTestURLImpl( |
| 211 const std::string& html_file, | 218 const std::string& html_file, |
| 212 const std::deque<FinalStatus>& expected_final_status_queue, | 219 const std::deque<FinalStatus>& expected_final_status_queue, |
| 213 int total_navigations) { | 220 int total_navigations) { |
| 214 ASSERT_TRUE(test_server()->Start()); | 221 ASSERT_TRUE(test_server()->Start()); |
| 215 dest_url_ = test_server()->GetURL(html_file); | 222 dest_url_ = test_server()->GetURL(html_file); |
| 216 | 223 |
| 217 std::vector<net::TestServer::StringPair> replacement_text; | 224 std::vector<net::TestServer::StringPair> replacement_text; |
| 218 replacement_text.push_back( | 225 replacement_text.push_back( |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 break; | 279 break; |
| 273 } | 280 } |
| 274 default: | 281 default: |
| 275 // In the failure case, we should have removed dest_url_ from the | 282 // In the failure case, we should have removed dest_url_ from the |
| 276 // prerender_manager. | 283 // prerender_manager. |
| 277 EXPECT_TRUE(prerender_contents == NULL); | 284 EXPECT_TRUE(prerender_contents == NULL); |
| 278 break; | 285 break; |
| 279 } | 286 } |
| 280 } | 287 } |
| 281 | 288 |
| 282 void NavigateToURLImpl(const GURL& dest_url) const { | |
| 283 // Make sure in navigating we have a URL to use in the PrerenderManager. | |
| 284 EXPECT_TRUE(prerender_manager()->FindEntry(dest_url_) != NULL); | |
| 285 | |
| 286 ui_test_utils::NavigateToURL(browser(), dest_url); | |
| 287 | |
| 288 // Make sure the PrerenderContents found earlier was used or removed. | |
| 289 EXPECT_TRUE(prerender_manager()->FindEntry(dest_url_) == NULL); | |
| 290 | |
| 291 // Check if page behaved as expected when actually displayed. | |
| 292 bool display_test_result = false; | |
| 293 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | |
| 294 browser()->GetSelectedTabContents()->render_view_host(), L"", | |
| 295 L"window.domAutomationController.send(DidDisplayPass())", | |
| 296 &display_test_result)); | |
| 297 EXPECT_TRUE(display_test_result); | |
| 298 } | |
| 299 | |
| 300 PrerenderManager* prerender_manager() const { | 289 PrerenderManager* prerender_manager() const { |
| 301 Profile* profile = browser()->GetSelectedTabContents()->profile(); | 290 Profile* profile = browser()->GetSelectedTabContents()->profile(); |
| 302 PrerenderManager* prerender_manager = profile->GetPrerenderManager(); | 291 PrerenderManager* prerender_manager = profile->GetPrerenderManager(); |
| 303 return prerender_manager; | 292 return prerender_manager; |
| 304 } | 293 } |
| 305 | 294 |
| 306 WaitForLoadPrerenderContentsFactory* prc_factory_; | 295 WaitForLoadPrerenderContentsFactory* prc_factory_; |
| 307 GURL dest_url_; | 296 GURL dest_url_; |
| 308 bool use_https_src_server_; | 297 bool use_https_src_server_; |
| 309 }; | 298 }; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 | 362 |
| 374 // Checks that client-issued redirects work with prerendering. | 363 // Checks that client-issued redirects work with prerendering. |
| 375 // This version navigates to the final destination page, rather than the | 364 // This version navigates to the final destination page, rather than the |
| 376 // page which does the redirection. | 365 // page which does the redirection. |
| 377 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 366 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| 378 PrerenderClientRedirectNavigateToSecond) { | 367 PrerenderClientRedirectNavigateToSecond) { |
| 379 PrerenderTestURL( | 368 PrerenderTestURL( |
| 380 CreateClientRedirect("files/prerender/prerender_page.html"), | 369 CreateClientRedirect("files/prerender/prerender_page.html"), |
| 381 FINAL_STATUS_USED, | 370 FINAL_STATUS_USED, |
| 382 2); | 371 2); |
| 383 NavigateToURL("files/prerender/prerender_page.html"); | 372 set_dest_url(test_server()->GetURL("files/prerender/prerender_page.html")); |
| 373 NavigateToDestURL(); |
| 384 } | 374 } |
| 385 | 375 |
| 386 // Checks that client-issued redirects to an https page will cancel prerenders. | 376 // Checks that client-issued redirects to an https page will cancel prerenders. |
| 387 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClientRedirectToHttps) { | 377 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClientRedirectToHttps) { |
| 388 net::TestServer https_server(net::TestServer::TYPE_HTTPS, | 378 net::TestServer https_server(net::TestServer::TYPE_HTTPS, |
| 389 FilePath(FILE_PATH_LITERAL("chrome/test/data"))); | 379 FilePath(FILE_PATH_LITERAL("chrome/test/data"))); |
| 390 ASSERT_TRUE(https_server.Start()); | 380 ASSERT_TRUE(https_server.Start()); |
| 391 GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); | 381 GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); |
| 392 PrerenderTestURL(CreateClientRedirect(https_url.spec()), | 382 PrerenderTestURL(CreateClientRedirect(https_url.spec()), |
| 393 FINAL_STATUS_HTTPS, | 383 FINAL_STATUS_HTTPS, |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 // Checks that server-issued redirects work with prerendering. | 441 // Checks that server-issued redirects work with prerendering. |
| 452 // This version navigates to the final destination page, rather than the | 442 // This version navigates to the final destination page, rather than the |
| 453 // page which does the redirection. | 443 // page which does the redirection. |
| 454 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 444 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| 455 PrerenderServerRedirectNavigateToSecond) { | 445 PrerenderServerRedirectNavigateToSecond) { |
| 456 std::string redirect_path; | 446 std::string redirect_path; |
| 457 PrerenderTestURL( | 447 PrerenderTestURL( |
| 458 CreateServerRedirect("files/prerender/prerender_page.html"), | 448 CreateServerRedirect("files/prerender/prerender_page.html"), |
| 459 FINAL_STATUS_USED, | 449 FINAL_STATUS_USED, |
| 460 1); | 450 1); |
| 461 NavigateToURL("files/prerender/prerender_page.html"); | 451 set_dest_url(test_server()->GetURL("files/prerender/prerender_page.html")); |
| 452 NavigateToDestURL(); |
| 462 } | 453 } |
| 463 | 454 |
| 464 // TODO(cbentzel): Add server-redirect-to-https test. http://crbug.com/79182 | 455 // TODO(cbentzel): Add server-redirect-to-https test. http://crbug.com/79182 |
| 465 | 456 |
| 466 // Checks that server-issued redirects within an iframe in a prerendered | 457 // Checks that server-issued redirects within an iframe in a prerendered |
| 467 // page will not count as an "alias" for the prerendered page. | 458 // page will not count as an "alias" for the prerendered page. |
| 468 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderServerRedirectInIframe) { | 459 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderServerRedirectInIframe) { |
| 469 std::string redirect_path = CreateServerRedirect( | 460 std::string redirect_path = CreateServerRedirect( |
| 470 "/files/prerender/prerender_embedded_content.html"); | 461 "/files/prerender/prerender_embedded_content.html"); |
| 471 std::vector<net::TestServer::StringPair> replacement_text; | 462 std::vector<net::TestServer::StringPair> replacement_text; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 // Checks that popups on a prerendered page cause cancellation. | 542 // Checks that popups on a prerendered page cause cancellation. |
| 552 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPopup) { | 543 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPopup) { |
| 553 PrerenderTestURL("files/prerender/prerender_popup.html", | 544 PrerenderTestURL("files/prerender/prerender_popup.html", |
| 554 FINAL_STATUS_CREATE_NEW_WINDOW, | 545 FINAL_STATUS_CREATE_NEW_WINDOW, |
| 555 1); | 546 1); |
| 556 } | 547 } |
| 557 | 548 |
| 558 | 549 |
| 559 | 550 |
| 560 // Checks that renderers using excessive memory will be terminated. | 551 // Checks that renderers using excessive memory will be terminated. |
| 561 // Disabled, http://crbug.com/77870. | 552 // Disabled, http://crbug.com/80324. |
| 562 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 553 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| 563 DISABLED_PrerenderExcessiveMemory) { | 554 DISABLED_PrerenderExcessiveMemory) { |
| 564 PrerenderTestURL("files/prerender/prerender_excessive_memory.html", | 555 PrerenderTestURL("files/prerender/prerender_excessive_memory.html", |
| 565 FINAL_STATUS_MEMORY_LIMIT_EXCEEDED, | 556 FINAL_STATUS_MEMORY_LIMIT_EXCEEDED, |
| 566 1); | 557 1); |
| 567 } | 558 } |
| 568 | 559 |
| 569 // Checks that we don't prerender in an infinite loop. | 560 // Checks that we don't prerender in an infinite loop. |
| 570 // Disabled, http://crbug.com/80324. | 561 // Disabled, http://crbug.com/77323. |
| 571 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderInfiniteLoop) { | 562 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DISABLED_PrerenderInfiniteLoop) { |
| 572 const char* const kHtmlFileA = "prerender_infinite_a.html"; | 563 const char* const kHtmlFileA = "prerender_infinite_a.html"; |
| 573 const char* const kHtmlFileB = "prerender_infinite_b.html"; | 564 const char* const kHtmlFileB = "prerender_infinite_b.html"; |
| 574 | 565 |
| 575 std::deque<FinalStatus> expected_final_status_queue; | 566 std::deque<FinalStatus> expected_final_status_queue; |
| 576 expected_final_status_queue.push_back(FINAL_STATUS_USED); | 567 expected_final_status_queue.push_back(FINAL_STATUS_USED); |
| 577 expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); | 568 expected_final_status_queue.push_back(FINAL_STATUS_APP_TERMINATING); |
| 578 | 569 |
| 579 PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); | 570 PrerenderTestURL(kHtmlFileA, expected_final_status_queue, 1); |
| 580 | 571 |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 688 } | 679 } |
| 689 | 680 |
| 690 // Checks that prerenderers will terminate when the RenderView crashes. | 681 // Checks that prerenderers will terminate when the RenderView crashes. |
| 691 // Note that the prerendering RenderView will be redirected to about:crash. | 682 // Note that the prerendering RenderView will be redirected to about:crash. |
| 692 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRendererCrash) { | 683 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRendererCrash) { |
| 693 PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), | 684 PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), |
| 694 FINAL_STATUS_RENDERER_CRASHED, | 685 FINAL_STATUS_RENDERER_CRASHED, |
| 695 1); | 686 1); |
| 696 } | 687 } |
| 697 | 688 |
| 698 // Checks that we correctly use a prerendered page when navigating to a | |
| 699 // fragment. | |
| 700 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPageNavigateFragment) { | |
| 701 PrerenderTestURL("files/prerender/prerender_fragment.html", | |
| 702 FINAL_STATUS_USED, | |
| 703 1); | |
| 704 NavigateToURL("files/prerender/prerender_fragment.html#fragment"); | |
| 705 } | |
| 706 | |
| 707 // Checks that we correctly use a prerendered page when we prerender a fragment | |
| 708 // but navigate to the main page. | |
| 709 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderFragmentNavigatePage) { | |
| 710 PrerenderTestURL("files/prerender/prerender_page.html#fragment", | |
| 711 FINAL_STATUS_USED, | |
| 712 1); | |
| 713 NavigateToURL("files/prerender/prerender_page.html"); | |
| 714 } | |
| 715 | |
| 716 // Checks that we correctly use a prerendered page when we prerender a fragment | |
| 717 // but navigate to a different fragment on the same page. | |
| 718 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
| 719 PrerenderFragmentNavigateFragment) { | |
| 720 PrerenderTestURL("files/prerender/prerender_fragment.html#other_fragment", | |
| 721 FINAL_STATUS_USED, | |
| 722 1); | |
| 723 NavigateToURL("files/prerender/prerender_fragment.html#fragment"); | |
| 724 } | |
| 725 | |
| 726 // Checks that we correctly use a prerendered page when the page uses meta | |
| 727 // http-equiv to refresh to a fragment on the same page. | |
| 728 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
| 729 PrerenderClientRedirectToFragment) { | |
| 730 PrerenderTestURL( | |
| 731 CreateClientRedirect("files/prerender/prerender_fragment.html#fragment"), | |
| 732 FINAL_STATUS_USED, | |
| 733 2); | |
| 734 NavigateToURL( | |
| 735 CreateClientRedirect("files/prerender/prerender_fragment.html")); | |
| 736 } | |
| 737 | |
| 738 // Checks that we correctly use a prerendered page when the page uses JS to set | |
| 739 // the window.location.hash to a fragment on the same page. | |
| 740 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | |
| 741 PrerenderPageChangeFragmentLocationHash) { | |
| 742 PrerenderTestURL("files/prerender/prerender_fragment_location_hash.html", | |
| 743 FINAL_STATUS_USED, | |
| 744 1); | |
| 745 NavigateToURL("files/prerender/prerender_fragment_location_hash.html"); | |
| 746 } | |
| 747 | |
| 748 } // namespace prerender | 689 } // namespace prerender |
| OLD | NEW |