OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 // TabContents, at the end of a navigation caused by a call to | 165 // TabContents, at the end of a navigation caused by a call to |
166 // NavigateToURLImpl(). | 166 // NavigateToURLImpl(). |
167 if (final_status() == FINAL_STATUS_USED) | 167 if (final_status() == FINAL_STATUS_USED) |
168 EXPECT_TRUE(new_render_view_host_); | 168 EXPECT_TRUE(new_render_view_host_); |
169 | 169 |
170 EXPECT_EQ(should_be_shown_, was_shown_); | 170 EXPECT_EQ(should_be_shown_, was_shown_); |
171 | 171 |
172 // When the PrerenderContents is destroyed, quit the UI message loop. | 172 // When the PrerenderContents is destroyed, quit the UI message loop. |
173 // This happens on navigation to used prerendered pages, and soon | 173 // This happens on navigation to used prerendered pages, and soon |
174 // after cancellation of unused prerendered pages. | 174 // after cancellation of unused prerendered pages. |
175 if (quit_message_loop_on_destruction_) | 175 if (quit_message_loop_on_destruction_) { |
176 MessageLoopForUI::current()->Quit(); | 176 // The message loop may not be running if this is swapped in |
| 177 // synchronously on a Navigation. |
| 178 MessageLoop* loop = MessageLoopForUI::current(); |
| 179 if (loop->is_running()) |
| 180 loop->Quit(); |
| 181 } |
177 } | 182 } |
178 | 183 |
179 virtual void RenderViewGone(base::TerminationStatus status) OVERRIDE { | 184 virtual void RenderViewGone(base::TerminationStatus status) OVERRIDE { |
180 // On quit, it's possible to end up here when render processes are closed | 185 // On quit, it's possible to end up here when render processes are closed |
181 // before the PrerenderManager is destroyed. As a result, it's possible to | 186 // before the PrerenderManager is destroyed. As a result, it's possible to |
182 // get either FINAL_STATUS_APP_TERMINATING or FINAL_STATUS_RENDERER_CRASHED | 187 // get either FINAL_STATUS_APP_TERMINATING or FINAL_STATUS_RENDERER_CRASHED |
183 // on quit. | 188 // on quit. |
184 // | 189 // |
185 // It's also possible for this to be called after we've been notified of | 190 // It's also possible for this to be called after we've been notified of |
186 // app termination, but before we've been deleted, which is why the second | 191 // app termination, but before we've been deleted, which is why the second |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 expected_final_status); | 486 expected_final_status); |
482 PrerenderTestURL(html_file, | 487 PrerenderTestURL(html_file, |
483 expected_final_status_queue, | 488 expected_final_status_queue, |
484 expected_number_of_loads); | 489 expected_number_of_loads); |
485 } | 490 } |
486 | 491 |
487 void PrerenderTestURL( | 492 void PrerenderTestURL( |
488 const std::string& html_file, | 493 const std::string& html_file, |
489 const std::deque<FinalStatus>& expected_final_status_queue, | 494 const std::deque<FinalStatus>& expected_final_status_queue, |
490 int expected_number_of_loads) { | 495 int expected_number_of_loads) { |
491 PrerenderTestURLImpl(test_server()->GetURL(html_file), | 496 GURL url = test_server()->GetURL(html_file); |
| 497 PrerenderTestURLImpl(url, url, |
492 expected_final_status_queue, | 498 expected_final_status_queue, |
493 expected_number_of_loads); | 499 expected_number_of_loads); |
494 } | 500 } |
495 | 501 |
496 void PrerenderTestURL( | 502 void PrerenderTestURL( |
497 const GURL& url, | 503 const GURL& url, |
498 FinalStatus expected_final_status, | 504 FinalStatus expected_final_status, |
499 int expected_number_of_loads) { | 505 int expected_number_of_loads) { |
500 std::deque<FinalStatus> expected_final_status_queue(1, | 506 std::deque<FinalStatus> expected_final_status_queue(1, |
501 expected_final_status); | 507 expected_final_status); |
502 PrerenderTestURLImpl(url, | 508 PrerenderTestURLImpl(url, url, |
503 expected_final_status_queue, | 509 expected_final_status_queue, |
504 expected_number_of_loads); | 510 expected_number_of_loads); |
505 } | 511 } |
| 512 |
| 513 void PrerenderTestURL( |
| 514 const GURL& prerender_url, |
| 515 const GURL& destination_url, |
| 516 FinalStatus expected_final_status, |
| 517 int expected_number_of_loads) { |
| 518 std::deque<FinalStatus> expected_final_status_queue(1, |
| 519 expected_final_status); |
| 520 PrerenderTestURLImpl(prerender_url, destination_url, |
| 521 expected_final_status_queue, |
| 522 expected_number_of_loads); |
| 523 } |
506 | 524 |
507 void NavigateToDestURL() const { | 525 void NavigateToDestURL() const { |
508 NavigateToDestURLWithDisposition(CURRENT_TAB); | 526 NavigateToDestURLWithDisposition(CURRENT_TAB); |
509 } | 527 } |
510 | 528 |
511 // Opens the url in a new tab, with no opener. | 529 // Opens the url in a new tab, with no opener. |
512 void NavigateToDestURLWithDisposition( | 530 void NavigateToDestURLWithDisposition( |
513 WindowOpenDisposition disposition) const { | 531 WindowOpenDisposition disposition) const { |
514 NavigateToURLImpl(dest_url_, disposition); | 532 NavigateToURLImpl(dest_url_, disposition); |
515 } | 533 } |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 std::string url_str(base::StringPrintf( | 702 std::string url_str(base::StringPrintf( |
685 "http://%s:%d/%s", | 703 "http://%s:%d/%s", |
686 secondary_domain.c_str(), | 704 secondary_domain.c_str(), |
687 test_server()->host_port_pair().port(), | 705 test_server()->host_port_pair().port(), |
688 path.c_str())); | 706 path.c_str())); |
689 return GURL(url_str); | 707 return GURL(url_str); |
690 } | 708 } |
691 | 709 |
692 private: | 710 private: |
693 void PrerenderTestURLImpl( | 711 void PrerenderTestURLImpl( |
694 const GURL& url, | 712 const GURL& prerender_url, |
| 713 const GURL& destination_url, |
695 const std::deque<FinalStatus>& expected_final_status_queue, | 714 const std::deque<FinalStatus>& expected_final_status_queue, |
696 int expected_number_of_loads) { | 715 int expected_number_of_loads) { |
697 dest_url_ = url; | 716 // TODO(cbentzel): Remove dest_url_? |
| 717 dest_url_ = destination_url; |
698 | 718 |
699 std::vector<net::TestServer::StringPair> replacement_text; | 719 std::vector<net::TestServer::StringPair> replacement_text; |
700 replacement_text.push_back( | 720 replacement_text.push_back( |
701 make_pair("REPLACE_WITH_PRERENDER_URL", dest_url_.spec())); | 721 make_pair("REPLACE_WITH_PRERENDER_URL", prerender_url.spec())); |
| 722 replacement_text.push_back( |
| 723 make_pair("REPLACE_WITH_DESTINATION_URL", destination_url.spec())); |
702 std::string replacement_path; | 724 std::string replacement_path; |
703 ASSERT_TRUE(net::TestServer::GetFilePathWithReplacements( | 725 ASSERT_TRUE(net::TestServer::GetFilePathWithReplacements( |
704 loader_path_, | 726 loader_path_, |
705 replacement_text, | 727 replacement_text, |
706 &replacement_path)); | 728 &replacement_path)); |
707 | 729 |
708 net::TestServer* src_server = test_server(); | 730 net::TestServer* src_server = test_server(); |
709 scoped_ptr<net::TestServer> https_src_server; | 731 scoped_ptr<net::TestServer> https_src_server; |
710 if (use_https_src_server_) { | 732 if (use_https_src_server_) { |
711 https_src_server.reset( | 733 https_src_server.reset( |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
782 GetPrerenderContents()->prerender_contents()->web_contents(); | 804 GetPrerenderContents()->prerender_contents()->web_contents(); |
783 if (GetPrerenderContents()->number_of_loads() == 0) { | 805 if (GetPrerenderContents()->number_of_loads() == 0) { |
784 page_load_observer.reset( | 806 page_load_observer.reset( |
785 new ui_test_utils::WindowedNotificationObserver( | 807 new ui_test_utils::WindowedNotificationObserver( |
786 content::NOTIFICATION_LOAD_STOP, | 808 content::NOTIFICATION_LOAD_STOP, |
787 content::Source<NavigationController>( | 809 content::Source<NavigationController>( |
788 &web_contents->GetController()))); | 810 &web_contents->GetController()))); |
789 } | 811 } |
790 } | 812 } |
791 | 813 |
792 // ui_test_utils::NavigateToURL waits until DidStopLoading is called on | 814 // Navigate to the prerendered URL, but don't run the message loop. Browser |
793 // the current tab. As that tab is going to end up deleted, and may never | 815 // issued navigations to prerendered pages will synchronously swap in the |
794 // finish loading before that happens, exit the message loop on the deletion | 816 // prerendered page. |
795 // of the used prerender contents instead. | |
796 // | |
797 // As PrerenderTestURL waits until the prerendered page has completely | |
798 // loaded, there is no race between loading |dest_url| and swapping the | |
799 // prerendered TabContents into the tab. | |
800 ui_test_utils::NavigateToURLWithDisposition( | 817 ui_test_utils::NavigateToURLWithDisposition( |
801 browser(), dest_url, disposition, ui_test_utils::BROWSER_TEST_NONE); | 818 browser(), dest_url, disposition, ui_test_utils::BROWSER_TEST_NONE); |
802 ui_test_utils::RunMessageLoop(); | |
803 | 819 |
804 // Make sure the PrerenderContents found earlier was used or removed. | 820 // Make sure the PrerenderContents found earlier was used or removed. |
805 EXPECT_TRUE(GetPrerenderContents() == NULL); | 821 EXPECT_TRUE(GetPrerenderContents() == NULL); |
806 | 822 |
807 if (call_javascript_ && web_contents) { | 823 if (call_javascript_ && web_contents) { |
808 if (page_load_observer.get()) | 824 if (page_load_observer.get()) |
809 page_load_observer->Wait(); | 825 page_load_observer->Wait(); |
810 | 826 |
811 bool display_test_result = false; | 827 bool display_test_result = false; |
812 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 828 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
961 // This version navigates to the final destination page, rather than the | 977 // This version navigates to the final destination page, rather than the |
962 // page which does the redirection. | 978 // page which does the redirection. |
963 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 979 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
964 PrerenderClientRedirectNavigateToSecond) { | 980 PrerenderClientRedirectNavigateToSecond) { |
965 PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), | 981 PrerenderTestURL(CreateClientRedirect("files/prerender/prerender_page.html"), |
966 FINAL_STATUS_USED, | 982 FINAL_STATUS_USED, |
967 2); | 983 2); |
968 NavigateToURL("files/prerender/prerender_page.html"); | 984 NavigateToURL("files/prerender/prerender_page.html"); |
969 } | 985 } |
970 | 986 |
| 987 // Checks that client-issued redirects work with prerendering. |
| 988 // This version navigates to the final destination page, rather than the |
| 989 // page which does the redirection via a mouse click. |
| 990 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| 991 PrerenderClientRedirectNavigateToSecondViaClick) { |
| 992 GURL prerender_url = test_server()->GetURL( |
| 993 CreateClientRedirect("files/prerender/prerender_page.html")); |
| 994 GURL destination_url = test_server()->GetURL( |
| 995 "files/prerender/prerender_page.html"); |
| 996 PrerenderTestURL(prerender_url, destination_url, FINAL_STATUS_USED, 2); |
| 997 OpenDestURLViaClick(); |
| 998 } |
| 999 |
971 // Checks that a prerender for an https will prevent a prerender from happening. | 1000 // Checks that a prerender for an https will prevent a prerender from happening. |
972 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttps) { | 1001 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttps) { |
973 net::TestServer https_server(net::TestServer::TYPE_HTTPS, | 1002 net::TestServer https_server(net::TestServer::TYPE_HTTPS, |
974 net::TestServer::kLocalhost, | 1003 net::TestServer::kLocalhost, |
975 FilePath(FILE_PATH_LITERAL("chrome/test/data"))); | 1004 FilePath(FILE_PATH_LITERAL("chrome/test/data"))); |
976 ASSERT_TRUE(https_server.Start()); | 1005 ASSERT_TRUE(https_server.Start()); |
977 GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); | 1006 GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); |
978 PrerenderTestURL(https_url, | 1007 PrerenderTestURL(https_url, |
979 FINAL_STATUS_USED, | 1008 FINAL_STATUS_USED, |
980 1); | 1009 1); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1052 // This version navigates to the final destination page, rather than the | 1081 // This version navigates to the final destination page, rather than the |
1053 // page which does the redirection. | 1082 // page which does the redirection. |
1054 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 1083 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
1055 PrerenderServerRedirectNavigateToSecond) { | 1084 PrerenderServerRedirectNavigateToSecond) { |
1056 PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), | 1085 PrerenderTestURL(CreateServerRedirect("files/prerender/prerender_page.html"), |
1057 FINAL_STATUS_USED, | 1086 FINAL_STATUS_USED, |
1058 1); | 1087 1); |
1059 NavigateToURL("files/prerender/prerender_page.html"); | 1088 NavigateToURL("files/prerender/prerender_page.html"); |
1060 } | 1089 } |
1061 | 1090 |
| 1091 // Checks that server-issued redirects work with prerendering. |
| 1092 // This version navigates to the final destination page, rather than the |
| 1093 // page which does the redirection via a mouse click. |
| 1094 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| 1095 PrerenderServerRedirectNavigateToSecondViaClick) { |
| 1096 GURL prerender_url = test_server()->GetURL( |
| 1097 CreateServerRedirect("files/prerender/prerender_page.html")); |
| 1098 GURL destination_url = test_server()->GetURL( |
| 1099 "files/prerender/prerender_page.html"); |
| 1100 PrerenderTestURL(prerender_url, destination_url, FINAL_STATUS_USED, 1); |
| 1101 OpenDestURLViaClick(); |
| 1102 } |
| 1103 |
1062 // Checks that server-issued redirects from an http to an https | 1104 // Checks that server-issued redirects from an http to an https |
1063 // location will cancel prerendering. | 1105 // location will cancel prerendering. |
1064 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, | 1106 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
1065 PrerenderServerRedirectToHttps) { | 1107 PrerenderServerRedirectToHttps) { |
1066 net::TestServer https_server(net::TestServer::TYPE_HTTPS, | 1108 net::TestServer https_server(net::TestServer::TYPE_HTTPS, |
1067 net::TestServer::kLocalhost, | 1109 net::TestServer::kLocalhost, |
1068 FilePath(FILE_PATH_LITERAL("chrome/test/data"))); | 1110 FilePath(FILE_PATH_LITERAL("chrome/test/data"))); |
1069 ASSERT_TRUE(https_server.Start()); | 1111 ASSERT_TRUE(https_server.Start()); |
1070 GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); | 1112 GURL https_url = https_server.GetURL("files/prerender/prerender_page.html"); |
1071 PrerenderTestURL(CreateServerRedirect(https_url.spec()), | 1113 PrerenderTestURL(CreateServerRedirect(https_url.spec()), |
(...skipping 876 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1948 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MatchCompleteDummy) { | 1990 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, MatchCompleteDummy) { |
1949 std::deque<FinalStatus> expected_final_status_queue; | 1991 std::deque<FinalStatus> expected_final_status_queue; |
1950 expected_final_status_queue.push_back(FINAL_STATUS_JAVASCRIPT_ALERT); | 1992 expected_final_status_queue.push_back(FINAL_STATUS_JAVASCRIPT_ALERT); |
1951 expected_final_status_queue.push_back(FINAL_STATUS_WOULD_HAVE_BEEN_USED); | 1993 expected_final_status_queue.push_back(FINAL_STATUS_WOULD_HAVE_BEEN_USED); |
1952 PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", | 1994 PrerenderTestURL("files/prerender/prerender_alert_before_onload.html", |
1953 expected_final_status_queue, 1); | 1995 expected_final_status_queue, 1); |
1954 NavigateToDestURL(); | 1996 NavigateToDestURL(); |
1955 } | 1997 } |
1956 | 1998 |
1957 } // namespace prerender | 1999 } // namespace prerender |
OLD | NEW |